2017-08-15 13:54:22 +02:00
const Promise = require ( 'bluebird' )
const path = require ( "path" )
const fs = Promise . Promise . promisifyAll ( require ( "fs-extra" ) )
global . window = undefined
function getUrls ( env ) {
if ( env . staticUrl ) {
return env . staticUrl + " ws" + env . staticUrl . substring ( 4 )
} else {
return ""
}
}
/ * *
* Renders the initial HTML page to bootstrap Tutanota for different environments
* /
module . exports . renderHtml = function ( scripts , env ) {
global . window = require ( "mithril/test-utils/browserMock" ) ( )
const m = require ( 'mithril' )
const render = require ( 'mithril-node-render' )
let html = '<!DOCTYPE html>\n' + render (
2018-07-18 16:07:25 +02:00
m ( "html" , [
m ( "head" , [
m ( "meta[charset=utf-8]" ) ,
2018-07-19 11:13:16 +02:00
cors ( m , env ) ,
2018-07-18 16:07:25 +02:00
m ( "meta[name=apple-mobile-web-app-capable][content=yes]" ) ,
m ( "meta[name=mobile-web-app-capable][content=yes]" ) ,
m ( "meta[name=referrer][content=no-referrer]" ) ,
2018-10-24 10:46:52 +02:00
m ( "meta[name=viewport][content=width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no, viewport-fit=cover]" ) ,
2018-07-18 16:07:25 +02:00
scripts . map ( script => m ( ` script[src= ${ script } ][defer] ` ) ) ,
m . trust ( "<!-- TutanotaTags -->" ) , // everything from here to </head> is replaced at runtime for custom domains with defined metaTags
2018-11-01 13:37:58 +01:00
m ( "title" , "Mail. Done. Right. Tutanota Login & Sign up" ) , // keep in sync with Env.
m ( "meta[name=description][content=Mail. Done. Right. Register with the secure mail service Tutanota for free & take back your privacy. Tutanota encrypts mails and contacts automatically.]" ) ,
2018-10-24 10:46:52 +02:00
m ( "link[rel=shortcut icon][type=image/x-icon][href=/images/logo-favicon-152.png]" ) ,
2018-07-18 16:07:25 +02:00
m ( "meta[name=application-name][content=Tutanota]" ) ,
m ( "link[rel=apple-touch-icon][sizes=152x152][href=/images/logo-favicon-152.png]" ) ,
m ( "link[rel=icon][sizes=192x192][href=/images/logo-favicon-192.png]" ) ,
2017-08-15 13:54:22 +02:00
2018-07-18 16:07:25 +02:00
// twitter
m ( "meta[name=twitter:card][content=summary]" ) ,
m ( "meta[name=twitter:site][content=@TutanotaTeam]" ) ,
m ( "meta[name=twitter:domain][content=tutanota.com]" ) ,
m ( "meta[name=twitter:image][content=https://tutanota.com/images/share_image.png]" ) ,
2017-08-15 13:54:22 +02:00
2018-07-18 16:07:25 +02:00
// facebook
m ( "meta[stream=og:site_name][content=Tutanota]" ) ,
m ( "meta[stream=og:title][content=Secure Emails Become a Breeze]" ) ,
m ( "meta[stream=og:description][content=Get your encrypted mailbox for free and show the Internet spies that you won't make it easy for them! Why? Because you simply can.]" ) ,
m ( "meta[stream=og:locale][content=en_US]" ) ,
m ( "meta[stream=og:url][content=https://tutanota.com/]" ) ,
m ( "meta[stream=og:image][content=https://tutanota.com/images/share_image.png]" ) ,
m ( "meta[stream=article:publisher][content=https://www.facebook.com/tutanota]" ) ,
2017-08-15 13:54:22 +02:00
2018-07-18 16:07:25 +02:00
// google +
m ( "meta[itemprop=name][content=Secure Emails Become a Breeze.]" ) ,
m ( "meta[itemprop=description][content=Get your encrypted mailbox for free and show the Internet spies that you won't make it easy for them! Why? Because you simply can.]" ) ,
m ( "meta[itemprop=image][content=https://tutanota.com/images/share_image.png]" ) ,
2017-08-15 13:54:22 +02:00
2018-07-18 16:07:25 +02:00
m ( "meta[name=apple-itunes-app][content=app-id=id922429609, affiliate-data=10lSfb]" ) ,
] ) ,
m ( "body" , m ( "noscript" ,
"Tutanota requires javascript to be enabled. Please, activate it in the settings of your browser." ) )
] )
)
2017-08-15 13:54:22 +02:00
global . window = undefined // we have to reset the window stream as it leads to problems with system js builder, otherwise
return html
}
2018-07-19 11:13:16 +02:00
const cors = ( m , env ) => {
2018-07-18 16:07:25 +02:00
if ( env . dist && env . mode === "App" ) {
2018-10-23 15:25:51 +02:00
// differences in comparison to web csp:
// * Content Security Policies delivered via a <meta> element may not contain the frame-ancestors directive.
2018-11-14 17:08:05 +01:00
return m ( "meta[http-equiv=Content-Security-Policy][content=default-src 'none'; script-src 'self'; child-src 'self'; font-src 'self'; img-src http: data: *; " +
2018-10-23 15:25:51 +02:00
` style-src 'unsafe-inline'; base-uri 'none'; connect-src 'self' ${ getUrls ( env ) } ;] ` )
2018-07-18 16:07:25 +02:00
} else {
2018-07-19 11:13:16 +02:00
return null
2018-07-18 16:07:25 +02:00
}
}
2017-08-15 13:54:22 +02:00
module . exports . renderTestHtml = function ( scripts ) {
global . window = require ( "mithril/test-utils/browserMock" ) ( )
const m = require ( 'mithril' )
const render = require ( 'mithril-node-render' )
let html = '<!DOCTYPE html>\n' + render (
2018-07-18 16:07:25 +02:00
m ( "html" , [
m ( "head" , [
m ( "meta[charset=utf-8]" ) ,
m ( "title" , "Test" ) ,
scripts . map ( script => m ( ` script[src= ${ script } ] ` ) )
] ) ,
m ( "body" , "Open the console (F12) for test output!" )
] )
)
2017-08-15 13:54:22 +02:00
global . window = undefined // we have to reset the window stream as it leads to problems with system js builder, otherwise
return html
}
function _writeFile ( targetFile , content ) {
return fs . mkdirsAsync ( path . dirname ( targetFile ) ) . then ( ( ) => fs . writeFileAsync ( targetFile , content , 'utf-8' ) )
}
class ExternalScript {
constructor ( url ) {
this . url = url
}
}