diff --git a/config/default.json b/config/default.json index 8a8f67d7f1..d87e2e7bab 100644 --- a/config/default.json +++ b/config/default.json @@ -13,6 +13,7 @@ "updatesPublicKey": "05fd7dd3de7149dc0a127909fee7de0f7620ddd0de061b37a2c303e37de802a401", "sfuUrl": "https://sfu.voip.signal.org/", "updatesEnabled": false, + "enableCI": false, "openDevTools": false, "buildExpiration": 0, "certificateAuthority": "-----BEGIN CERTIFICATE-----\nMIID7zCCAtegAwIBAgIJAIm6LatK5PNiMA0GCSqGSIb3DQEBBQUAMIGNMQswCQYD\nVQQGEwJVUzETMBEGA1UECAwKQ2FsaWZvcm5pYTEWMBQGA1UEBwwNU2FuIEZyYW5j\naXNjbzEdMBsGA1UECgwUT3BlbiBXaGlzcGVyIFN5c3RlbXMxHTAbBgNVBAsMFE9w\nZW4gV2hpc3BlciBTeXN0ZW1zMRMwEQYDVQQDDApUZXh0U2VjdXJlMB4XDTEzMDMy\nNTIyMTgzNVoXDTIzMDMyMzIyMTgzNVowgY0xCzAJBgNVBAYTAlVTMRMwEQYDVQQI\nDApDYWxpZm9ybmlhMRYwFAYDVQQHDA1TYW4gRnJhbmNpc2NvMR0wGwYDVQQKDBRP\ncGVuIFdoaXNwZXIgU3lzdGVtczEdMBsGA1UECwwUT3BlbiBXaGlzcGVyIFN5c3Rl\nbXMxEzARBgNVBAMMClRleHRTZWN1cmUwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAw\nggEKAoIBAQDBSWBpOCBDF0i4q2d4jAXkSXUGpbeWugVPQCjaL6qD9QDOxeW1afvf\nPo863i6Crq1KDxHpB36EwzVcjwLkFTIMeo7t9s1FQolAt3mErV2U0vie6Ves+yj6\ngrSfxwIDAcdsKmI0a1SQCZlr3Q1tcHAkAKFRxYNawADyps5B+Zmqcgf653TXS5/0\nIPPQLocLn8GWLwOYNnYfBvILKDMItmZTtEbucdigxEA9mfIvvHADEbteLtVgwBm9\nR5vVvtwrD6CCxI3pgH7EH7kMP0Od93wLisvn1yhHY7FuYlrkYqdkMvWUrKoASVw4\njb69vaeJCUdU+HCoXOSP1PQcL6WenNCHAgMBAAGjUDBOMB0GA1UdDgQWBBQBixjx\nP/s5GURuhYa+lGUypzI8kDAfBgNVHSMEGDAWgBQBixjxP/s5GURuhYa+lGUypzI8\nkDAMBgNVHRMEBTADAQH/MA0GCSqGSIb3DQEBBQUAA4IBAQB+Hr4hC56m0LvJAu1R\nK6NuPDbTMEN7/jMojFHxH4P3XPFfupjR+bkDq0pPOU6JjIxnrD1XD/EVmTTaTVY5\niOheyv7UzJOefb2pLOc9qsuvI4fnaESh9bhzln+LXxtCrRPGhkxA1IMIo3J/s2WF\n/KVYZyciu6b4ubJ91XPAuBNZwImug7/srWvbpk0hq6A6z140WTVSKtJG7EP41kJe\n/oF4usY5J7LPkxK3LWzMJnb5EIJDmRvyH8pyRwWg6Qm6qiGFaI4nL8QU4La1x2en\n4DGXRaLMPRwjELNgQPodR38zoCMuA8gHZfZYYoZ7D7Q1wNUiVHcxuFrEeBaYJbLE\nrwLV\n-----END CERTIFICATE-----\n", diff --git a/js/views/install_view.js b/js/views/install_view.js index a188abd486..58c4d796d5 100644 --- a/js/views/install_view.js +++ b/js/views/install_view.js @@ -193,17 +193,7 @@ this.setDeviceNameDefault(); return new Promise(resolve => { - this.$('#link-phone').submit(e => { - e.stopPropagation(); - e.preventDefault(); - - let name = this.$(DEVICE_NAME_SELECTOR).val(); - name = name.replace(/\0/g, ''); // strip unicode null - if (name.trim().length === 0) { - this.$(DEVICE_NAME_SELECTOR).focus(); - return null; - } - + const onDeviceName = name => { this.selectStep(Steps.PROGRESS_BAR); const finish = () => { @@ -227,6 +217,26 @@ ); return finish(); }); + }; + + if (window.CI) { + onDeviceName(window.CI.deviceName); + return; + } + + // eslint-disable-next-line consistent-return + this.$('#link-phone').submit(e => { + e.stopPropagation(); + e.preventDefault(); + + let name = this.$(DEVICE_NAME_SELECTOR).val(); + name = name.replace(/\0/g, ''); // strip unicode null + if (name.trim().length === 0) { + this.$(DEVICE_NAME_SELECTOR).focus(); + return null; + } + + onDeviceName(name); }); }); }, diff --git a/main.js b/main.js index d3554ec267..f147e5293f 100644 --- a/main.js +++ b/main.js @@ -81,6 +81,8 @@ const importMode = const development = config.environment === 'development' || config.environment === 'staging'; +const enableCI = Boolean(config.get('enableCI')); + // We generally want to pull in our own modules after this point, after the user // data directory has been set. const attachments = require('./app/attachments'); @@ -221,7 +223,8 @@ function prepareURL(pathSegments, moreKeys) { cdnUrl0: config.get('cdn').get('0'), cdnUrl2: config.get('cdn').get('2'), certificateAuthority: config.get('certificateAuthority'), - environment: config.environment, + environment: enableCI ? 'production' : config.environment, + enableCI, node_version: process.versions.node, hostname: os.hostname(), appInstance: process.env.NODE_APP_INSTANCE, @@ -432,7 +435,7 @@ async function createWindow() { mainWindow.loadURL(prepareURL([__dirname, 'background.html'], moreKeys)); } - if (config.get('openDevTools')) { + if (!enableCI && config.get('openDevTools')) { // Open the DevTools. mainWindow.webContents.openDevTools(); } @@ -956,7 +959,12 @@ app.on('ready', async () => { // We use this event only a single time to log the startup time of the app // from when it's first ready until the loading screen disappears. ipc.once('signal-app-loaded', () => { - console.log('App loaded - time:', Date.now() - startTime); + const loadTime = Date.now() - startTime; + console.log('App loaded - time:', loadTime); + + if (enableCI) { + console._log('ci: app_loaded=%j', { loadTime }); + } }); const userDataPath = await getRealPath(app.getPath('userData')); @@ -1292,6 +1300,12 @@ app.on('will-finish-launching', () => { }); }); +if (enableCI) { + ipc.on('set-provisioning-url', (event, provisioningURL) => { + console._log('ci: provisioning_url=%j', provisioningURL); + }); +} + ipc.on('set-badge-count', (event, count) => { app.badgeCount = count; }); diff --git a/preload.js b/preload.js index 04b7947627..830cbff02f 100644 --- a/preload.js +++ b/preload.js @@ -518,6 +518,10 @@ try { getRegionCode: () => window.storage.get('regionCode'), logger: window.log, }); + window.CI = config.enableCI && { + setProvisioningURL: url => ipc.send('set-provisioning-url', url), + deviceName: title, + }; // these need access to window.Signal: require('./ts/models/messages'); diff --git a/ts/textsecure/AccountManager.ts b/ts/textsecure/AccountManager.ts index 5e80cdbeaa..8adbaba81e 100644 --- a/ts/textsecure/AccountManager.ts +++ b/ts/textsecure/AccountManager.ts @@ -220,8 +220,9 @@ export default class AccountManager extends EventTarget { encodeURIComponent(btoa(utils.getString(pubKey))), ].join(''); - // eslint-disable-next-line no-console - console._log(`provisioning url ${url}`); + if (window.CI) { + window.CI.setProvisioningURL(url); + } setProvisioningUrl(url); request.respond(200, 'OK'); diff --git a/ts/util/lint/exceptions.json b/ts/util/lint/exceptions.json index 145eddb27d..be3032db49 100644 --- a/ts/util/lint/exceptions.json +++ b/ts/util/lint/exceptions.json @@ -879,7 +879,7 @@ "rule": "jQuery-$(", "path": "js/views/install_view.js", "line": " this.$('#link-phone').submit(e => {", - "lineNumber": 196, + "lineNumber": 228, "reasonCategory": "usageTrusted", "updated": "2020-03-24T19:03:04.861Z", "reasonDetail": "Protected from arbitrary input" @@ -888,7 +888,7 @@ "rule": "jQuery-$(", "path": "js/views/install_view.js", "line": " let name = this.$(DEVICE_NAME_SELECTOR).val();", - "lineNumber": 200, + "lineNumber": 232, "reasonCategory": "usageTrusted", "updated": "2020-03-24T19:03:04.861Z", "reasonDetail": "Protected from arbitrary input" @@ -897,7 +897,7 @@ "rule": "jQuery-$(", "path": "js/views/install_view.js", "line": " this.$(DEVICE_NAME_SELECTOR).focus();", - "lineNumber": 203, + "lineNumber": 235, "reasonCategory": "usageTrusted", "updated": "2020-03-24T19:03:04.861Z", "reasonDetail": "Protected from arbitrary input" diff --git a/ts/window.d.ts b/ts/window.d.ts index d3c8b9a210..980dacfaa2 100644 --- a/ts/window.d.ts +++ b/ts/window.d.ts @@ -259,6 +259,12 @@ declare global { }; Backbone: typeof Backbone; + CI: + | { + setProvisioningURL: (url: string) => void; + deviceName: string; + } + | undefined; Signal: { Backbone: any; AttachmentDownloads: {