From 3af0976a434c2457ccaaac97e0ec317aa77e95b1 Mon Sep 17 00:00:00 2001 From: Ilya Daynatovich Date: Wed, 19 Apr 2017 17:31:40 +0300 Subject: [PATCH] Beautify URLProcessor --- modules/config/URLProcessor.js | 132 +++++++++++------- .../features/base/lib-jitsi-meet/functions.js | 6 +- 2 files changed, 82 insertions(+), 56 deletions(-) diff --git a/modules/config/URLProcessor.js b/modules/config/URLProcessor.js index a9b9af912..23c0c40e8 100644 --- a/modules/config/URLProcessor.js +++ b/modules/config/URLProcessor.js @@ -1,69 +1,93 @@ /* global config, interfaceConfig, loggingConfig */ -const logger = require("jitsi-meet-logger").getLogger(__filename); - -import { getConfigParamsFromUrl } from '../../react/features/base/config'; +import { parseURLParams } from '../../react/features/base/config'; import configUtils from './Util'; -// Parsing config params from URL hash. -const URL_PARAMS = getConfigParamsFromUrl(window.location); +const logger = require("jitsi-meet-logger").getLogger(__filename); -var URLProcessor = { - setConfigParametersFromUrl: function () { - // Convert 'params' to JSON object - // We have: - // { - // "config.disableAudioLevels": false, - // "config.channelLastN": -1, - // "interfaceConfig.APP_NAME": "Jitsi Meet" - // } - // We want to have: - // { - // "config": { - // "disableAudioLevels": false, - // "channelLastN": -1 - // }, - // interfaceConfig: { - // APP_NAME: "Jitsi Meet" - // } - // } - var configJSON = { - config: {}, - interfaceConfig: {}, - loggingConfig: {} - }; - for (var key in URL_PARAMS) { - if (typeof key !== "string") { - logger.warn("Invalid config key: ", key); - continue; - } - var confObj = null, confKey; - if (key.indexOf("config.") === 0) { +/** + * URL params with this prefix should be merged to config. + */ +const CONFIG_PREFIX = 'config.'; + +/** + * URL params with this prefix should be merged to interface config. + */ +const INTERFACE_CONFIG_PREFIX = 'interfaceConfig.'; + +/** + * Config keys to be ignored. + * + * @type Set + */ +const KEYS_TO_IGNORE = new Set([ + 'analyticsScriptUrls', + 'callStatsCustomScriptUrl' +]); + +/** + * URL params with this prefix should be merged to logging config. + */ +const LOGGING_CONFIG_PREFIX = 'loggingConfig.'; + +/** + * Convert 'URL_PARAMS' to JSON object + * We have: + * { + * "config.disableAudioLevels": false, + * "config.channelLastN": -1, + * "interfaceConfig.APP_NAME": "Jitsi Meet" + * } + * We want to have: + * { + * "config": { + * "disableAudioLevels": false, + * "channelLastN": -1 + * }, + * interfaceConfig: { + * "APP_NAME": "Jitsi Meet" + * } + * } + */ +export function setConfigParametersFromUrl() { + // Parsing config params from URL hash. + const params = parseURLParams(window.location); + + const configJSON = { + config: {}, + interfaceConfig: {}, + loggingConfig: {} + }; + + for (const key in params) { + if (typeof key === 'string') { + let confObj = null; + let confKey; + + if (key.indexOf(CONFIG_PREFIX) === 0) { confObj = configJSON.config; - confKey = key.substr("config.".length); + confKey = key.substr(CONFIG_PREFIX.length); - // prevent passing some parameters which can inject scripts - if (confKey === 'analyticsScriptUrls' - || confKey === 'callStatsCustomScriptUrl') - continue; - - } else if (key.indexOf("interfaceConfig.") === 0) { + } else if (key.indexOf(INTERFACE_CONFIG_PREFIX) === 0) { confObj = configJSON.interfaceConfig; - confKey = key.substr("interfaceConfig.".length); - } else if (key.indexOf("loggingConfig.") === 0) { + confKey + = key.substr(INTERFACE_CONFIG_PREFIX.length); + } else if (key.indexOf(LOGGING_CONFIG_PREFIX) === 0) { confObj = configJSON.loggingConfig; - confKey = key.substr("loggingConfig.".length); + confKey = key.substr(LOGGING_CONFIG_PREFIX.length); } - if (!confObj) - continue; - - confObj[confKey] = URL_PARAMS[key]; + // prevent passing some parameters which can inject scripts + if (confObj && !KEYS_TO_IGNORE.has(confKey)) { + confObj[confKey] = params[key]; + } + } else { + logger.warn('Invalid config key: ', key); } - configUtils.overrideConfigJSON( - config, interfaceConfig, loggingConfig, configJSON); } -}; -module.exports = URLProcessor; + configUtils.overrideConfigJSON( + config, interfaceConfig, loggingConfig, + configJSON); +} diff --git a/react/features/base/lib-jitsi-meet/functions.js b/react/features/base/lib-jitsi-meet/functions.js index 6b5b2cfd2..a5eb353d4 100644 --- a/react/features/base/lib-jitsi-meet/functions.js +++ b/react/features/base/lib-jitsi-meet/functions.js @@ -1,6 +1,8 @@ import { loadScript } from '../../base/util'; -import URLProcessor from '../../../../modules/config/URLProcessor'; +import { + setConfigParametersFromUrl +} from '../../../../modules/config/URLProcessor'; import JitsiMeetJS from './_'; @@ -44,7 +46,7 @@ export function loadConfig(host: string, path: string = '/config.js') { // but URLProcessor still deals with the global variables config, // interfaceConfig, and loggingConfig and loadConfig. As the latter will // surely change in the future, so will the former then. - URLProcessor.setConfigParametersFromUrl(); + setConfigParametersFromUrl(); return Promise.resolve(window.config); }