Просмотр исходного кода

moved jsconfig code into initScript

Danny Coates 6 лет назад
Родитель
Сommit
d4528848d9
7 измененных файлов с 101 добавлено и 96 удалено
  1. 65 7
      server/initScript.js
  2. 0 1
      server/layout.js
  3. 0 1
      server/routes/index.js
  4. 0 72
      server/routes/jsconfig.js
  5. 17 11
      server/routes/pages.js
  6. 12 1
      server/state.js
  7. 7 3
      test/frontend/routes.js

+ 65 - 7
server/initScript.js

@@ -1,17 +1,75 @@
 const html = require('choo/html');
 const html = require('choo/html');
 const raw = require('choo/html/raw');
 const raw = require('choo/html/raw');
+const config = require('./config');
+
+let sentry = '';
+if (config.sentry_id) {
+  //eslint-disable-next-line node/no-missing-require
+  const version = require('../../dist/version.json');
+  sentry = `
+var RAVEN_CONFIG = {
+  release: '${version.version}',
+  tags: {
+    commit: '${version.commit}'
+  },
+  dataCallback: function (data) {
+    var hash = window.location.hash;
+    if (hash) {
+      return JSON.parse(JSON.stringify(data).replace(new RegExp(hash.slice(1), 'g'), ''));
+    }
+    return data;
+  }
+}
+var SENTRY_ID = '${config.sentry_id}';
+`;
+}
+
+let ga = '';
+if (config.analytics_id) {
+  ga = `var GOOGLE_ANALYTICS_ID = '${config.analytics_id}';`;
+}
 
 
 module.exports = function(state) {
 module.exports = function(state) {
-  // return '';
+  const authConfig = state.authConfig
+    ? `var AUTH_CONFIG = ${JSON.stringify(state.authConfig)};`
+    : '';
+
+  /* eslint-disable no-useless-escape */
+  const jsconfig = `
+  var isIE = /trident\\\/7\.|msie/i.test(navigator.userAgent);
+  var isUnsupportedPage = /\\\/unsupported/.test(location.pathname);
+  if (isIE && !isUnsupportedPage) {
+    window.location.replace('/unsupported/ie');
+  }
+  var LIMITS = {
+    ANON: {
+      MAX_FILE_SIZE: ${config.anon_max_file_size},
+      MAX_DOWNLOADS: ${config.anon_max_downloads},
+      MAX_EXPIRE_SECONDS: ${config.anon_max_expire_seconds},
+    },
+    MAX_FILE_SIZE: ${config.max_file_size},
+    MAX_DOWNLOADS: ${config.max_downloads},
+    MAX_EXPIRE_SECONDS: ${config.max_expire_seconds},
+    MAX_FILES_PER_ARCHIVE: ${config.max_files_per_archive},
+    MAX_ARCHIVES_PER_USER: ${config.max_archives_per_user}
+  };
+  var DEFAULTS = {
+    DOWNLOAD_COUNTS: ${JSON.stringify(config.download_counts)},
+    EXPIRE_TIMES_SECONDS: ${JSON.stringify(config.expire_times_seconds)},
+    EXPIRE_SECONDS: ${config.default_expire_seconds}
+  };
+  const LOCALE = '${state.locale}';
+  const downloadMetadata = ${
+    state.downloadMetadata ? raw(JSON.stringify(state.downloadMetadata)) : '{}'
+  };
+  ${authConfig};
+  ${ga}
+  ${sentry}
+  `;
   return state.cspNonce
   return state.cspNonce
     ? html`
     ? html`
         <script nonce="${state.cspNonce}">
         <script nonce="${state.cspNonce}">
-          const LOCALE = '${state.locale}';
-          const downloadMetadata = ${
-            state.downloadMetadata
-              ? raw(JSON.stringify(state.downloadMetadata))
-              : '{}'
-          };
+          ${raw(jsconfig)};
         </script>
         </script>
       `
       `
     : '';
     : '';

+ 0 - 1
server/layout.js

@@ -96,7 +96,6 @@ module.exports = function(state, body = '') {
         <meta name="msapplication-config" content="/browserconfig.xml" />
         <meta name="msapplication-config" content="/browserconfig.xml" />
 
 
         ${firaTag}
         ${firaTag}
-        <script defer src="/jsconfig.js"></script>
         <script defer src="${assets.get('cryptofill.js')}"></script>
         <script defer src="${assets.get('cryptofill.js')}"></script>
         <script defer src="${assets.get('app.js')}"></script>
         <script defer src="${assets.get('app.js')}"></script>
       </head>
       </head>

+ 0 - 1
server/routes/index.js

@@ -69,7 +69,6 @@ module.exports = function(app) {
   app.get('/', language, pages.index);
   app.get('/', language, pages.index);
   app.get('/oauth', language, pages.blank);
   app.get('/oauth', language, pages.blank);
   app.get('/legal', language, pages.legal);
   app.get('/legal', language, pages.legal);
-  app.get('/jsconfig.js', require('./jsconfig'));
   app.get('/app.webmanifest', language, require('./webmanifest'));
   app.get('/app.webmanifest', language, require('./webmanifest'));
   app.get(`/download/:id${ID_REGEX}`, language, pages.download);
   app.get(`/download/:id${ID_REGEX}`, language, pages.download);
   app.get('/unsupported/:reason', language, pages.unsupported);
   app.get('/unsupported/:reason', language, pages.unsupported);

+ 0 - 72
server/routes/jsconfig.js

@@ -1,72 +0,0 @@
-const config = require('../config');
-const { getFxaConfig } = require('../fxa');
-
-let sentry = '';
-if (config.sentry_id) {
-  //eslint-disable-next-line node/no-missing-require
-  const version = require('../../dist/version.json');
-  sentry = `
-var RAVEN_CONFIG = {
-  release: '${version.version}',
-  tags: {
-    commit: '${version.commit}'
-  },
-  dataCallback: function (data) {
-    var hash = window.location.hash;
-    if (hash) {
-      return JSON.parse(JSON.stringify(data).replace(new RegExp(hash.slice(1), 'g'), ''));
-    }
-    return data;
-  }
-}
-var SENTRY_ID = '${config.sentry_id}';
-`;
-}
-
-let ga = '';
-if (config.analytics_id) {
-  ga = `var GOOGLE_ANALYTICS_ID = '${config.analytics_id}';`;
-}
-
-module.exports = async function(req, res) {
-  let authConfig = '';
-  if (config.fxa_client_id) {
-    try {
-      const fxaConfig = await getFxaConfig();
-      fxaConfig.client_id = config.fxa_client_id;
-      authConfig = `var AUTH_CONFIG = ${JSON.stringify(fxaConfig)};`;
-    } catch (e) {
-      // continue without accounts
-    }
-  }
-  /* eslint-disable no-useless-escape */
-  const jsconfig = `
-  var isIE = /trident\\\/7\.|msie/i.test(navigator.userAgent);
-  var isUnsupportedPage = /\\\/unsupported/.test(location.pathname);
-  if (isIE && !isUnsupportedPage) {
-    window.location.replace('/unsupported/ie');
-  }
-  var LIMITS = {
-    ANON: {
-      MAX_FILE_SIZE: ${config.anon_max_file_size},
-      MAX_DOWNLOADS: ${config.anon_max_downloads},
-      MAX_EXPIRE_SECONDS: ${config.anon_max_expire_seconds},
-    },
-    MAX_FILE_SIZE: ${config.max_file_size},
-    MAX_DOWNLOADS: ${config.max_downloads},
-    MAX_EXPIRE_SECONDS: ${config.max_expire_seconds},
-    MAX_FILES_PER_ARCHIVE: ${config.max_files_per_archive},
-    MAX_ARCHIVES_PER_USER: ${config.max_archives_per_user}
-  };
-  var DEFAULTS = {
-    DOWNLOAD_COUNTS: ${JSON.stringify(config.download_counts)},
-    EXPIRE_TIMES_SECONDS: ${JSON.stringify(config.expire_times_seconds)},
-    EXPIRE_SECONDS: ${config.default_expire_seconds}
-  };
-  ${authConfig};
-  ${ga}
-  ${sentry}
-  `;
-  res.set('Content-Type', 'application/javascript');
-  res.send(jsconfig);
-};

+ 17 - 11
server/routes/pages.js

@@ -9,16 +9,19 @@ function stripEvents(str) {
 }
 }
 
 
 module.exports = {
 module.exports = {
-  index: function(req, res) {
-    res.send(stripEvents(routes().toString('/', state(req))));
+  index: async function(req, res) {
+    const appState = await state(req);
+    res.send(stripEvents(routes().toString('/', appState)));
   },
   },
 
 
-  blank: function(req, res) {
-    res.send(stripEvents(routes().toString('/blank', state(req))));
+  blank: async function(req, res) {
+    const appState = await state(req);
+    res.send(stripEvents(routes().toString('/blank', appState)));
   },
   },
 
 
   download: async function(req, res, next) {
   download: async function(req, res, next) {
     const id = req.params.id;
     const id = req.params.id;
+    const appState = await state(req);
     try {
     try {
       const { nonce, pwd } = await storage.metadata(id);
       const { nonce, pwd } = await storage.metadata(id);
       res.set('WWW-Authenticate', `send-v1 ${nonce}`);
       res.set('WWW-Authenticate', `send-v1 ${nonce}`);
@@ -26,7 +29,7 @@ module.exports = {
         stripEvents(
         stripEvents(
           routes().toString(
           routes().toString(
             `/download/${id}`,
             `/download/${id}`,
-            Object.assign(state(req), {
+            Object.assign(appState, {
               downloadMetadata: { nonce, pwd }
               downloadMetadata: { nonce, pwd }
             })
             })
           )
           )
@@ -37,22 +40,25 @@ module.exports = {
     }
     }
   },
   },
 
 
-  unsupported: function(req, res) {
+  unsupported: async function(req, res) {
+    const appState = await state(req);
     res.send(
     res.send(
       stripEvents(
       stripEvents(
         routes().toString(
         routes().toString(
           `/unsupported/${req.params.reason}`,
           `/unsupported/${req.params.reason}`,
-          Object.assign(state(req), { fira: true })
+          Object.assign(appState, { fira: true })
         )
         )
       )
       )
     );
     );
   },
   },
 
 
-  legal: function(req, res) {
-    res.send(stripEvents(routes().toString('/legal', state(req))));
+  legal: async function(req, res) {
+    const appState = await state(req);
+    res.send(stripEvents(routes().toString('/legal', appState)));
   },
   },
 
 
-  notfound: function(req, res) {
-    res.status(404).send(stripEvents(routes().toString('/404', state(req))));
+  notfound: async function(req, res) {
+    const appState = await state(req);
+    res.status(404).send(stripEvents(routes().toString('/404', appState)));
   }
   }
 };
 };

+ 12 - 1
server/state.js

@@ -2,9 +2,19 @@ const config = require('./config');
 const layout = require('./layout');
 const layout = require('./layout');
 const assets = require('../common/assets');
 const assets = require('../common/assets');
 const getTranslator = require('./locale');
 const getTranslator = require('./locale');
+const { getFxaConfig } = require('./fxa');
 
 
-module.exports = function(req) {
+module.exports = async function(req) {
   const locale = req.language || 'en-US';
   const locale = req.language || 'en-US';
+  let authConfig = null;
+  if (config.fxa_client_id) {
+    try {
+      authConfig = await getFxaConfig();
+      authConfig.client_id = config.fxa_client_id;
+    } catch (e) {
+      // continue without accounts
+    }
+  }
   return {
   return {
     locale,
     locale,
     capabilities: { account: false },
     capabilities: { account: false },
@@ -21,6 +31,7 @@ module.exports = function(req) {
     fileInfo: {},
     fileInfo: {},
     cspNonce: req.cspNonce,
     cspNonce: req.cspNonce,
     user: { avatar: assets.get('user.svg'), loggedIn: false },
     user: { avatar: assets.get('user.svg'), loggedIn: false },
+    authConfig,
     layout
     layout
   };
   };
 };
 };

+ 7 - 3
test/frontend/routes.js

@@ -1,5 +1,6 @@
 const html = require('choo/html');
 const html = require('choo/html');
 const assets = require('../../common/assets');
 const assets = require('../../common/assets');
+const initScript = require('../../server/initScript');
 
 
 module.exports = function(app) {
 module.exports = function(app) {
   app.get('/mocha.css', function(req, res) {
   app.get('/mocha.css', function(req, res) {
@@ -29,10 +30,13 @@ module.exports = function(app) {
                 timeout: 5000
                 timeout: 5000
               });
               });
             </script>
             </script>
-            <script src="/jsconfig.js"></script>
+            ${
+              initScript({
+                cspNonce: 'test',
+                locale: 'en-US'
+              })
+            }
             <script src="${assets.get('cryptofill.js')}"></script>
             <script src="${assets.get('cryptofill.js')}"></script>
-            <!-- <script src="${assets.get('runtime.js')}"></script> -->
-            <script src="${assets.get('vendor.js')}"></script>
             <script src="${assets.get('tests.js')}"></script>
             <script src="${assets.get('tests.js')}"></script>
           </head>
           </head>
           <body>
           <body>