From 9d2417c2f62941baf447c78f1f9ecc5b4c53e1e0 Mon Sep 17 00:00:00 2001 From: Mikunj Date: Tue, 31 Mar 2020 13:24:06 +1100 Subject: [PATCH] Removed proxy-agent and web-socket. Trimmed down web_api.js to most basic functions we are using. This needs to be completely removed in the future. --- js/background.js | 39 -- js/modules/loki_snode_api.js | 2 +- js/modules/refresh_sender_certificate.js | 120 ----- js/modules/signal.js | 2 - js/modules/web_api.js | 574 +---------------------- libtextsecure/account_manager.js | 38 +- libtextsecure/message_receiver.js | 79 +--- libtextsecure/outgoing_message.js | 4 - libtextsecure/sendmessage.js | 17 +- libtextsecure/test/fake_web_api.js | 47 +- package.json | 4 +- preload.js | 8 +- yarn.lock | 232 +-------- 13 files changed, 40 insertions(+), 1126 deletions(-) delete mode 100644 js/modules/refresh_sender_certificate.js diff --git a/js/background.js b/js/background.js index 1b77e422a..8db812708 100644 --- a/js/background.js +++ b/js/background.js @@ -569,12 +569,6 @@ // listeners Whisper.RotateSignedPreKeyListener.init(Whisper.events, newVersion); - // window.Signal.RefreshSenderCertificate.initialize({ - // events: Whisper.events, - // storage, - // navigator, - // logger: window.log, - // }); connect(true); }); @@ -597,12 +591,6 @@ ) { // listeners Whisper.RotateSignedPreKeyListener.init(Whisper.events, newVersion); - // window.Signal.RefreshSenderCertificate.initialize({ - // events: Whisper.events, - // storage, - // navigator, - // logger: window.log, - // }); connect(); appView.openInbox({ @@ -1547,35 +1535,8 @@ textsecure.storage.user.getDeviceId() != '1' ) { window.getSyncRequest(); - - try { - const manager = window.getAccountManager(); - await Promise.all([ - manager.maybeUpdateDeviceName(), - manager.maybeDeleteSignalingKey(), - ]); - } catch (e) { - window.log.error( - 'Problem with account manager updates after starting new version: ', - e && e.stack ? e.stack : e - ); - } } - // const udSupportKey = 'hasRegisterSupportForUnauthenticatedDelivery'; - // if (!storage.get(udSupportKey)) { - // const server = WebAPI.connect({ username: USERNAME, password: PASSWORD }); - // try { - // await server.registerSupportForUnauthenticatedDelivery(); - // storage.put(udSupportKey, true); - // } catch (error) { - // window.log.error( - // 'Error: Unable to register for unauthenticated delivery support.', - // error && error.stack ? error.stack : error - // ); - // } - // } - const deviceId = textsecure.storage.user.getDeviceId(); if (firstRun === true && deviceId !== '1') { const hasThemeSetting = Boolean(storage.get('theme-setting')); diff --git a/js/modules/loki_snode_api.js b/js/modules/loki_snode_api.js index 9642d64e0..42096a74e 100644 --- a/js/modules/loki_snode_api.js +++ b/js/modules/loki_snode_api.js @@ -19,7 +19,7 @@ const timeoutDelay = ms => new Promise(resolve => setTimeout(resolve, ms)); class LokiSnodeAPI { constructor({ serverUrl, localUrl }) { if (!is.string(serverUrl)) { - throw new Error('WebAPI.initialize: Invalid server url'); + throw new Error('LokiSnodeAPI.initialize: Invalid server url'); } this.serverUrl = serverUrl; // random.snode this.localUrl = localUrl; // localhost.loki diff --git a/js/modules/refresh_sender_certificate.js b/js/modules/refresh_sender_certificate.js deleted file mode 100644 index 275453fda..000000000 --- a/js/modules/refresh_sender_certificate.js +++ /dev/null @@ -1,120 +0,0 @@ -/* global window, setTimeout, clearTimeout, textsecure, WebAPI, ConversationController */ - -module.exports = { - initialize, -}; - -const ONE_DAY = 24 * 60 * 60 * 1000; // one day -const MINIMUM_TIME_LEFT = 2 * 60 * 60 * 1000; // two hours - -let timeout = null; -let scheduledTime = null; -let scheduleNext = null; - -// We need to refresh our own profile regularly to account for newly-added devices which -// do not support unidentified delivery. -function refreshOurProfile() { - const ourNumber = textsecure.storage.user.getNumber(); - const conversation = ConversationController.getOrCreate(ourNumber, 'private'); - conversation.getProfiles(); -} - -function initialize({ events, storage, navigator, logger }) { - // We don't want to set up all of the below functions, but we do want to ensure that our - // refresh timer is up-to-date. - if (scheduleNext) { - scheduleNext(); - return; - } - - runWhenOnline(); - - events.on('timetravel', scheduleNextRotation); - - function scheduleNextRotation() { - const now = Date.now(); - const certificate = storage.get('senderCertificate'); - if (!certificate) { - setTimeoutForNextRun(now); - - return; - } - - // The useful information in a SenderCertificate is all serialized, so we - // need to do another layer of decoding. - const decoded = textsecure.protobuf.SenderCertificate.Certificate.decode( - certificate.certificate - ); - const expires = decoded.expires.toNumber(); - - const time = Math.min(now + ONE_DAY, expires - MINIMUM_TIME_LEFT); - - setTimeoutForNextRun(time); - } - - // Keeping this entrypoint around so more inialize() calls just kick the timing - scheduleNext = scheduleNextRotation; - - async function run() { - logger.info('refreshSenderCertificate: Getting new certificate...'); - try { - const username = storage.get('number_id'); - const password = storage.get('password'); - const server = WebAPI.connect({ username, password }); - - const { certificate } = await server.getSenderCertificate(); - const arrayBuffer = window.Signal.Crypto.base64ToArrayBuffer(certificate); - const decoded = textsecure.protobuf.SenderCertificate.decode(arrayBuffer); - - decoded.certificate = decoded.certificate.toArrayBuffer(); - decoded.signature = decoded.signature.toArrayBuffer(); - decoded.serialized = arrayBuffer; - - storage.put('senderCertificate', decoded); - scheduleNextRotation(); - } catch (error) { - logger.error( - 'refreshSenderCertificate: Get failed. Trying again in two minutes...', - error && error.stack ? error.stack : error - ); - setTimeout(runWhenOnline, 2 * 60 * 1000); - } - - refreshOurProfile(); - } - - function runWhenOnline() { - if (navigator.onLine) { - run(); - } else { - logger.info( - 'refreshSenderCertificate: Offline. Will update certificate when online...' - ); - const listener = () => { - logger.info( - 'refreshSenderCertificate: Online. Now updating certificate...' - ); - window.removeEventListener('online', listener); - run(); - }; - window.addEventListener('online', listener); - } - } - - function setTimeoutForNextRun(time = Date.now()) { - const now = Date.now(); - - if (scheduledTime !== time || !timeout) { - logger.info( - 'Next sender certificate refresh scheduled for', - new Date(time).toISOString() - ); - } - - scheduledTime = time; - const waitTime = Math.max(0, time - now); - - clearTimeout(timeout); - timeout = setTimeout(runWhenOnline, waitTime); - } -} diff --git a/js/modules/signal.js b/js/modules/signal.js index f5ddc198b..c676c5845 100644 --- a/js/modules/signal.js +++ b/js/modules/signal.js @@ -13,7 +13,6 @@ const Settings = require('./settings'); const Util = require('../../ts/util'); const { migrateToSQL } = require('./migrate_to_sql'); const Metadata = require('./metadata/SecretSessionCipher'); -const RefreshSenderCertificate = require('./refresh_sender_certificate'); const LinkPreviews = require('./link_previews'); const AttachmentDownloads = require('./attachment_downloads'); @@ -379,7 +378,6 @@ exports.setup = (options = {}) => { Migrations, Notifications, OS, - RefreshSenderCertificate, Settings, State, Types, diff --git a/js/modules/web_api.js b/js/modules/web_api.js index c92681b05..2e58c2013 100644 --- a/js/modules/web_api.js +++ b/js/modules/web_api.js @@ -1,6 +1,4 @@ -const WebSocket = require('websocket').w3cwebsocket; const fetch = require('node-fetch'); -const ProxyAgent = require('proxy-agent'); const { Agent } = require('https'); const FormData = require('form-data'); @@ -39,89 +37,6 @@ function _getString(thing) { return thing; } -function _b64ToUint6(nChr) { - return nChr > 64 && nChr < 91 - ? nChr - 65 - : nChr > 96 && nChr < 123 - ? nChr - 71 - : nChr > 47 && nChr < 58 - ? nChr + 4 - : nChr === 43 - ? 62 - : nChr === 47 - ? 63 - : 0; -} - -function _getStringable(thing) { - return ( - typeof thing === 'string' || - typeof thing === 'number' || - typeof thing === 'boolean' || - (thing === Object(thing) && - (_call(thing) === ArrayBufferToString || - _call(thing) === Uint8ArrayToString)) - ); -} - -function _ensureStringed(thing) { - if (_getStringable(thing)) { - return _getString(thing); - } else if (thing instanceof Array) { - const res = []; - for (let i = 0; i < thing.length; i += 1) { - res[i] = _ensureStringed(thing[i]); - } - return res; - } else if (thing === Object(thing)) { - const res = {}; - // eslint-disable-next-line guard-for-in, no-restricted-syntax - for (const key in thing) { - res[key] = _ensureStringed(thing[key]); - } - return res; - } else if (thing === null) { - return null; - } else if (thing === undefined) { - return undefined; - } - throw new Error(`unsure of how to jsonify object of type ${typeof thing}`); -} - -function _jsonThing(thing) { - return JSON.stringify(_ensureStringed(thing)); -} - -function _base64ToBytes(sBase64, nBlocksSize) { - const sB64Enc = sBase64.replace(/[^A-Za-z0-9+/]/g, ''); - const nInLen = sB64Enc.length; - const nOutLen = nBlocksSize - ? Math.ceil(((nInLen * 3 + 1) >> 2) / nBlocksSize) * nBlocksSize - : (nInLen * 3 + 1) >> 2; - const aBBytes = new ArrayBuffer(nOutLen); - const taBytes = new Uint8Array(aBBytes); - - for ( - let nMod3, nMod4, nUint24 = 0, nOutIdx = 0, nInIdx = 0; - nInIdx < nInLen; - nInIdx += 1 - ) { - nMod4 = nInIdx & 3; - nUint24 |= _b64ToUint6(sB64Enc.charCodeAt(nInIdx)) << (18 - 6 * nMod4); - if (nMod4 === 3 || nInLen - nInIdx === 1) { - for ( - nMod3 = 0; - nMod3 < 3 && nOutIdx < nOutLen; - nMod3 += 1, nOutIdx += 1 - ) { - taBytes[nOutIdx] = (nUint24 >>> ((16 >>> nMod3) & 24)) & 255; - } - nUint24 = 0; - } - } - return aBBytes; -} - function _validateResponse(response, schema) { try { // eslint-disable-next-line guard-for-in, no-restricted-syntax @@ -144,30 +59,6 @@ function _validateResponse(response, schema) { return true; } -function _createSocket(url, { certificateAuthority, proxyUrl, signature }) { - let requestOptions; - if (proxyUrl) { - requestOptions = { - ca: certificateAuthority, - agent: new ProxyAgent(proxyUrl), - }; - } else { - requestOptions = { - ca: certificateAuthority, - }; - } - // TODO: sign a timestamp - let headers; - if (signature) { - headers = { - signature, - }; - } - - // eslint-disable-next-line new-cap - return new WebSocket(url, null, null, headers, requestOptions); -} - const FIVE_MINUTES = 1000 * 60 * 5; const agents = { unauth: null, @@ -210,9 +101,7 @@ function _promiseAjax(providedUrl, options) { log.info(`Cycling agent for type ${cacheKey}`); } agents[cacheKey] = { - agent: proxyUrl - ? new ProxyAgent(proxyUrl) - : new Agent({ keepAlive: true }), + agent: new Agent({ keepAlive: true }), timestamp: Date.now(), }; } @@ -394,45 +283,12 @@ function HTTPError(message, providedCode, response, stack) { return e; } -const URL_CALLS = { - accounts: 'v1/accounts', - updateDeviceName: 'v1/accounts/name', - removeSignalingKey: 'v1/accounts/signaling_key', - attachment: 'v1/attachments', - deliveryCert: 'v1/certificate/delivery', - supportUnauthenticatedDelivery: 'v1/devices/unauthenticated_delivery', - devices: 'v1/devices', - keys: 'v2/keys', - messages: 'v1/messages', - profile: 'v1/profile', - signed: 'v2/keys/signed', -}; - module.exports = { initialize, }; // We first set up the data that won't change during this session of the app -function initialize({ - url, - cdnUrl, - certificateAuthority, - contentProxyUrl, - proxyUrl, -}) { - if (!is.string(url)) { - throw new Error('WebAPI.initialize: Invalid server url'); - } - if (!is.string(cdnUrl)) { - throw new Error('WebAPI.initialize: Invalid cdnUrl'); - } - if (!is.string(certificateAuthority)) { - throw new Error('WebAPI.initialize: Invalid certificateAuthority'); - } - if (!is.string(contentProxyUrl)) { - throw new Error('WebAPI.initialize: Invalid contentProxyUrl'); - } - +function initialize() { // Thanks to function-hoisting, we can put this return statement before all of the // below function definitions. return { @@ -442,413 +298,19 @@ function initialize({ // Then we connect to the server with user-specific information. This is the only API // exposed to the browser context, ensuring that it can't connect to arbitrary // locations. - function connect({ username: initialUsername, password: initialPassword }) { - let username = initialUsername; - let password = initialPassword; - + function connect() { // Thanks, function hoisting! return { - confirmCode, getAttachment, - getAvatar, - getDevices, - getKeysForNumber, - getKeysForNumberUnauth, - getMessageSocket, - getMyKeys, - getProfile, - getProfileUnauth, - getProvisioningSocket, getProxiedSize, - getSenderCertificate, makeProxiedRequest, putAttachment, putAvatar, - registerKeys, - registerSupportForUnauthenticatedDelivery, - removeSignalingKey, - requestVerificationSMS, - requestVerificationVoice, - sendMessages, - sendMessagesUnauth, - setSignedPreKey, - updateDeviceName, }; - function _ajax(param) { - if (!param.urlParameters) { - // eslint-disable-next-line no-param-reassign - param.urlParameters = ''; - } - return _outerAjax(null, { - certificateAuthority, - contentType: 'application/json; charset=utf-8', - data: param.jsonData && _jsonThing(param.jsonData), - host: url, - password, - path: URL_CALLS[param.call] + param.urlParameters, - proxyUrl, - responseType: param.responseType, - timeout: param.timeout, - type: param.httpType, - user: username, - validateResponse: param.validateResponse, - unauthenticated: param.unauthenticated, - accessKey: param.accessKey, - }).catch(e => { - const { code } = e; - if (code === 200) { - // happens sometimes when we get no response - // (TODO: Fix server to return 204? instead) - return null; - } - let message; - switch (code) { - case -1: - message = - 'Failed to connect to the server, please check your network connection.'; - break; - case 413: - message = 'Rate limit exceeded, please try again later.'; - break; - case 403: - message = 'Invalid code, please try again.'; - break; - case 417: - // TODO: This shouldn't be a thing?, but its in the API doc? - message = 'Number already registered.'; - break; - case 401: - message = - 'Invalid authentication, most likely someone re-registered and invalidated our registration.'; - break; - case 404: - message = 'Number is not registered.'; - break; - default: - message = - 'The server rejected our query, please file a bug report.'; - } - e.message = `${message} (original: ${e.message})`; - throw e; - }); - } - - function getSenderCertificate() { - return _ajax({ - call: 'deliveryCert', - httpType: 'GET', - responseType: 'json', - schema: { certificate: 'string' }, - }); - } - - function registerSupportForUnauthenticatedDelivery() { - return _ajax({ - call: 'supportUnauthenticatedDelivery', - httpType: 'PUT', - responseType: 'json', - }); - } - - function getProfile(number) { - return _ajax({ - call: 'profile', - httpType: 'GET', - urlParameters: `/${number}`, - responseType: 'json', - }); - } - function getProfileUnauth(number, { accessKey } = {}) { - return _ajax({ - call: 'profile', - httpType: 'GET', - urlParameters: `/${number}`, - responseType: 'json', - unauthenticated: true, - accessKey, - }); - } - - function getAvatar(path) { - // Using _outerAJAX, since it's not hardcoded to the Signal Server. Unlike our - // attachment CDN, it uses our self-signed certificate, so we pass it in. - return _outerAjax(`${cdnUrl}/${path}`, { - certificateAuthority, - contentType: 'application/octet-stream', - proxyUrl, - responseType: 'arraybuffer', - timeout: 0, - type: 'GET', - }); - } - - function requestVerificationSMS(number) { - return _ajax({ - call: 'accounts', - httpType: 'GET', - urlParameters: `/sms/code/${number}`, - }); - } - - function requestVerificationVoice(number) { - return _ajax({ - call: 'accounts', - httpType: 'GET', - urlParameters: `/voice/code/${number}`, - }); - } - - async function confirmCode( - number, - code, - newPassword, - registrationId, - deviceName, - options = {} - ) { - const { accessKey } = options; - const jsonData = { - supportsSms: false, - fetchesMessages: true, - registrationId, - unidentifiedAccessKey: accessKey - ? _btoa(_getString(accessKey)) - : undefined, - unrestrictedUnidentifiedAccess: false, - }; - - let call; - let urlPrefix; - let schema; - let responseType; - - if (deviceName) { - jsonData.name = deviceName; - call = 'devices'; - urlPrefix = '/'; - schema = { deviceId: 'number' }; - responseType = 'json'; - } else { - call = 'accounts'; - urlPrefix = '/code/'; - } - - // We update our saved username and password, since we're creating a new account - username = number; - password = newPassword; - - const response = await _ajax({ - call, - httpType: 'PUT', - urlParameters: urlPrefix + code, - jsonData, - responseType, - validateResponse: schema, - }); - - // From here on out, our username will be our phone number combined with device - username = `${number}.${response.deviceId || 1}`; - - return response; - } - - function updateDeviceName(deviceName) { - return _ajax({ - call: 'updateDeviceName', - httpType: 'PUT', - jsonData: { - deviceName, - }, - }); - } - - function removeSignalingKey() { - return _ajax({ - call: 'removeSignalingKey', - httpType: 'DELETE', - }); - } - - function getDevices() { - return _ajax({ - call: 'devices', - httpType: 'GET', - }); - } - - function registerKeys(genKeys) { - const keys = {}; - keys.identityKey = _btoa(_getString(genKeys.identityKey)); - keys.signedPreKey = { - keyId: genKeys.signedPreKey.keyId, - publicKey: _btoa(_getString(genKeys.signedPreKey.publicKey)), - signature: _btoa(_getString(genKeys.signedPreKey.signature)), - }; - - keys.preKeys = []; - let j = 0; - // eslint-disable-next-line guard-for-in, no-restricted-syntax - for (const i in genKeys.preKeys) { - keys.preKeys[j] = { - keyId: genKeys.preKeys[i].keyId, - publicKey: _btoa(_getString(genKeys.preKeys[i].publicKey)), - }; - j += 1; - } - - // This is just to make the server happy - // (v2 clients should choke on publicKey) - keys.lastResortKey = { keyId: 0x7fffffff, publicKey: _btoa('42') }; - - return _ajax({ - call: 'keys', - httpType: 'PUT', - jsonData: keys, - }); - } - - function setSignedPreKey(signedPreKey) { - return _ajax({ - call: 'signed', - httpType: 'PUT', - jsonData: { - keyId: signedPreKey.keyId, - publicKey: _btoa(_getString(signedPreKey.publicKey)), - signature: _btoa(_getString(signedPreKey.signature)), - }, - }); - } - - function getMyKeys() { - return _ajax({ - call: 'keys', - httpType: 'GET', - responseType: 'json', - validateResponse: { count: 'number' }, - }).then(res => res.count); - } - - function handleKeys(res) { - if (!Array.isArray(res.devices)) { - throw new Error('Invalid response'); - } - res.identityKey = _base64ToBytes(res.identityKey); - res.devices.forEach(device => { - if ( - !_validateResponse(device, { signedPreKey: 'object' }) || - !_validateResponse(device.signedPreKey, { - publicKey: 'string', - signature: 'string', - }) - ) { - throw new Error('Invalid signedPreKey'); - } - if (device.preKey) { - if ( - !_validateResponse(device, { preKey: 'object' }) || - !_validateResponse(device.preKey, { publicKey: 'string' }) - ) { - throw new Error('Invalid preKey'); - } - // eslint-disable-next-line no-param-reassign - device.preKey.publicKey = _base64ToBytes(device.preKey.publicKey); - } - // eslint-disable-next-line no-param-reassign - device.signedPreKey.publicKey = _base64ToBytes( - device.signedPreKey.publicKey - ); - // eslint-disable-next-line no-param-reassign - device.signedPreKey.signature = _base64ToBytes( - device.signedPreKey.signature - ); - }); - return res; - } - - function getKeysForNumber(number, deviceId = '*') { - return _ajax({ - call: 'keys', - httpType: 'GET', - urlParameters: `/${number}/${deviceId}`, - responseType: 'json', - validateResponse: { identityKey: 'string', devices: 'object' }, - }).then(handleKeys); - } - - function getKeysForNumberUnauth( - number, - deviceId = '*', - { accessKey } = {} - ) { - return _ajax({ - call: 'keys', - httpType: 'GET', - urlParameters: `/${number}/${deviceId}`, - responseType: 'json', - validateResponse: { identityKey: 'string', devices: 'object' }, - unauthenticated: true, - accessKey, - }).then(handleKeys); - } - - function sendMessagesUnauth( - destination, - messageArray, - timestamp, - silent, - online, - { accessKey } = {} - ) { - const jsonData = { messages: messageArray, timestamp }; - - if (silent) { - jsonData.silent = true; - } - if (online) { - jsonData.online = true; - } - - return _ajax({ - call: 'messages', - httpType: 'PUT', - urlParameters: `/${destination}`, - jsonData, - responseType: 'json', - unauthenticated: true, - accessKey, - }); - } - - function sendMessages( - destination, - messageArray, - timestamp, - silent, - online - ) { - const jsonData = { messages: messageArray, timestamp }; - - if (silent) { - jsonData.silent = true; - } - if (online) { - jsonData.online = true; - } - - return _ajax({ - call: 'messages', - httpType: 'PUT', - urlParameters: `/${destination}`, - jsonData, - responseType: 'json', - }); - } - function getAttachment(fileUrl) { return _outerAjax(fileUrl, { contentType: 'application/octet-stream', - proxyUrl, responseType: 'arraybuffer', timeout: 0, type: 'GET', @@ -884,7 +346,7 @@ function initialize({ const result = await _outerAjax(url, { processData: false, responseType: 'arraybufferwithdetails', - proxyUrl: contentProxyUrl, + proxyUrl: '', type: 'HEAD', disableLogs: true, }); @@ -912,38 +374,12 @@ function initialize({ return _outerAjax(url, { processData: false, responseType: returnArrayBuffer ? 'arraybufferwithdetails' : null, - proxyUrl: contentProxyUrl, + proxyUrl: '', type: 'GET', redirect: 'follow', disableLogs: true, headers, }); } - - function getMessageSocket() { - log.info('opening message socket', url); - const fixedScheme = url - .replace('https://', 'wss://') - .replace('http://', 'ws://'); - const login = encodeURIComponent(username); - const pass = encodeURIComponent(password); - - return _createSocket( - `${fixedScheme}/v1/websocket/?login=${login}&password=${pass}&agent=OWD`, - { certificateAuthority, proxyUrl } - ); - } - - function getProvisioningSocket() { - log.info('opening provisioning socket', url); - const fixedScheme = url - .replace('https://', 'wss://') - .replace('http://', 'ws://'); - - return _createSocket( - `${fixedScheme}/v1/websocket/provisioning/?agent=OWD`, - { certificateAuthority, proxyUrl } - ); - } } } diff --git a/libtextsecure/account_manager.js b/libtextsecure/account_manager.js index 737bf363c..e037305c5 100644 --- a/libtextsecure/account_manager.js +++ b/libtextsecure/account_manager.js @@ -28,7 +28,6 @@ const ARCHIVE_AGE = 7 * 24 * 60 * 60 * 1000; function AccountManager(username, password) { - // this.server = window.WebAPI.connect({ username, password }); this.pending = Promise.resolve(); } @@ -48,12 +47,8 @@ AccountManager.prototype = new textsecure.EventTarget(); AccountManager.prototype.extend({ constructor: AccountManager, - requestVoiceVerification(number) { - // return this.server.requestVerificationVoice(number); - }, - requestSMSVerification(number) { - // return this.server.requestVerificationSMS(number); - }, + requestVoiceVerification(number) {}, + requestSMSVerification(number) {}, async encryptDeviceName(name, providedIdentityKey) { if (!name) { return null; @@ -98,23 +93,13 @@ return name; }, async maybeUpdateDeviceName() { - const isNameEncrypted = textsecure.storage.user.getDeviceNameEncrypted(); - if (isNameEncrypted) { - return; - } - const deviceName = await textsecure.storage.user.getDeviceName(); - const base64 = await this.encryptDeviceName(deviceName); - - await this.server.updateDeviceName(base64); + throw new Error('Signal method called: maybeUpdateDeviceName'); }, async deviceNameIsEncrypted() { await textsecure.storage.user.setDeviceNameEncrypted(); }, async maybeDeleteSignalingKey() { - const key = await textsecure.storage.user.getSignalingKey(); - if (key) { - await this.server.removeSignalingKey(); - } + throw new Error('Signal method called: maybeDeleteSignalingKey'); }, registerSingleDevice(mnemonic, mnemonicLanguage, profileName) { const createAccount = this.createAccount.bind(this); @@ -212,19 +197,7 @@ 'account_manager: registerSecondDevice has not been implemented!' ); }, - refreshPreKeys() { - // const generateKeys = this.generateKeys.bind(this, 0); - // const registerKeys = this.server.registerKeys.bind(this.server); - // return this.queueTask(() => - // this.server.getMyKeys().then(preKeyCount => { - // window.log.info(`prekey count ${preKeyCount}`); - // if (preKeyCount < 10) { - // return generateKeys().then(registerKeys); - // } - // return null; - // }) - // ); - }, + refreshPreKeys() {}, rotateSignedPreKey() { return this.queueTask(() => { const signedKeyId = textsecure.storage.get('signedKeyId', 1); @@ -512,7 +485,6 @@ keyId: res.keyId, publicKey: res.keyPair.pubKey, signature: res.signature, - // server.registerKeys doesn't use keyPair, confirmKeys does keyPair: res.keyPair, }; }) diff --git a/libtextsecure/message_receiver.js b/libtextsecure/message_receiver.js index ab0f9afb9..bbf753c57 100644 --- a/libtextsecure/message_receiver.js +++ b/libtextsecure/message_receiver.js @@ -32,14 +32,7 @@ function MessageReceiver(username, password, signalingKey, options = {}) { this.signalingKey = signalingKey; this.username = username; this.password = password; - this.server = WebAPI.connect({ username, password }); - - if (!options.serverTrustRoot) { - throw new Error('Server trust root is required!'); - } - this.serverTrustRoot = window.Signal.Crypto.base64ToArrayBuffer( - options.serverTrustRoot - ); + this.server = WebAPI.connect(); const address = libsignal.SignalProtocolAddress.fromString(username); this.number = address.getName(); @@ -110,31 +103,6 @@ MessageReceiver.prototype.extend({ feed.on('rssMessage', this.handleUnencryptedMessage.bind(this)); }); - // TODO: Rework this socket stuff to work with online messaging - const useWebSocket = false; - if (useWebSocket) { - if (this.socket && this.socket.readyState !== WebSocket.CLOSED) { - this.socket.close(); - this.wsr.close(); - } - // initialize the socket and start listening for messages - this.socket = this.server.getMessageSocket(); - this.socket.onclose = this.onclose.bind(this); - this.socket.onerror = this.onerror.bind(this); - this.socket.onopen = this.onopen.bind(this); - this.wsr = new WebSocketResource(this.socket, { - handleRequest: this.handleRequest.bind(this), - keepalive: { - path: '/v1/keepalive', - disconnect: true, - }, - }); - - // Because sometimes the socket doesn't properly emit its close event - this._onClose = this.onclose.bind(this); - this.wsr.addEventListener('close', this._onClose); - } - // Ensures that an immediate 'empty' event from the websocket will fire only after // all cached envelopes are processed. this.incoming = [this.pending]; @@ -163,29 +131,11 @@ MessageReceiver.prototype.extend({ this.stoppingProcessing = true; return this.close(); }, - shutdown() { - if (this.socket) { - this.socket.onclose = null; - this.socket.onerror = null; - this.socket.onopen = null; - this.socket = null; - } - - if (this.wsr) { - this.wsr.removeEventListener('close', this._onClose); - this.wsr = null; - } - }, + shutdown() {}, async close() { window.log.info('MessageReceiver.close()'); this.calledClose = true; - // Our WebSocketResource instance will close the socket and emit a 'close' event - // if the socket doesn't emit one quickly enough. - if (this.wsr) { - this.wsr.close(3000, 'called close'); - } - // stop polling all open group rooms if (lokiPublicChatAPI) { await lokiPublicChatAPI.close(); @@ -220,27 +170,6 @@ MessageReceiver.prototype.extend({ 'calledClose:', this.calledClose ); - // TODO: handle properly - // this.shutdown(); - - // if (this.calledClose) { - // return Promise.resolve(); - // } - // if (ev.code === 3000) { - // return Promise.resolve(); - // } - // if (ev.code === 3001) { - // this.onEmpty(); - // } - // // possible 403 or network issue. Make an request to confirm - // return this.server - // .getDevices(this.number) - // .then(this.connect.bind(this)) // No HTTP error? Reconnect - // .catch(e => { - // const event = new Event('error'); - // event.error = e; - // return this.dispatchAndWait(event); - // }); }, handleRequest(request, options) { const { onSuccess, onFailure } = options; @@ -637,9 +566,7 @@ MessageReceiver.prototype.extend({ ? WebSocket.OPEN : WebSocket.CLOSED; } - if (this.socket) { - return this.socket.readyState; - } else if (this.hasConnected) { + if (this.hasConnected) { return WebSocket.CLOSED; } return -1; diff --git a/libtextsecure/outgoing_message.js b/libtextsecure/outgoing_message.js index 369f8ecee..5feb6d648 100644 --- a/libtextsecure/outgoing_message.js +++ b/libtextsecure/outgoing_message.js @@ -178,10 +178,6 @@ OutgoingMessage.prototype = { return false; }) ); - // TODO: check if still applicable - // if (updateDevices === undefined) { - // return this.server.getKeysForNumber(number, '*').then(handleResult); - // } let promise = Promise.resolve(true); updateDevices.forEach(device => { promise = promise.then(() => diff --git a/libtextsecure/sendmessage.js b/libtextsecure/sendmessage.js index 8775c9987..a0bfe4267 100644 --- a/libtextsecure/sendmessage.js +++ b/libtextsecure/sendmessage.js @@ -184,8 +184,8 @@ Message.prototype = { }, }; -function MessageSender(username, password) { - this.server = WebAPI.connect({ username, password }); +function MessageSender() { + this.server = WebAPI.connect(); this.pendingMessages = {}; } @@ -595,16 +595,8 @@ MessageSender.prototype = { ); }, - async getProfile(number, { accessKey } = {}) { - if (accessKey) { - return this.server.getProfileUnauth(number, { accessKey }); - } - - return this.server.getProfile(number); - }, - - getAvatar(path) { - return this.server.getAvatar(path); + async getProfile() { + throw new Error('Signal code called. This needs to be removed'); }, uploadAvatar(attachment) { @@ -1338,7 +1330,6 @@ textsecure.MessageSender = function MessageSenderWrapper(username, password) { this.leaveGroup = sender.leaveGroup.bind(sender); this.sendSyncMessage = sender.sendSyncMessage.bind(sender); this.getProfile = sender.getProfile.bind(sender); - this.getAvatar = sender.getAvatar.bind(sender); this.uploadAvatar = sender.uploadAvatar.bind(sender); this.syncReadMessages = sender.syncReadMessages.bind(sender); this.syncVerification = sender.syncVerification.bind(sender); diff --git a/libtextsecure/test/fake_web_api.js b/libtextsecure/test/fake_web_api.js index 29e2a932f..3c38a806d 100644 --- a/libtextsecure/test/fake_web_api.js +++ b/libtextsecure/test/fake_web_api.js @@ -1,56 +1,11 @@ window.setImmediate = window.nodeSetImmediate; -const getKeysForNumberMap = {}; -const messagesSentMap = {}; - const fakeCall = () => Promise.resolve(); const fakeAPI = { - confirmCode: fakeCall, getAttachment: fakeCall, - getAvatar: fakeCall, - getDevices: fakeCall, - // getKeysForNumber: fakeCall, - getMessageSocket: fakeCall, - getMyKeys: fakeCall, - getProfile: fakeCall, - getProvisioningSocket: fakeCall, putAttachment: fakeCall, - registerKeys: fakeCall, - requestVerificationSMS: fakeCall, - requestVerificationVoice: fakeCall, - // sendMessages: fakeCall, - setSignedPreKey: fakeCall, - - getKeysForNumber(number) { - const res = getKeysForNumberMap[number]; - if (res !== undefined) { - delete getKeysForNumberMap[number]; - return Promise.resolve(res); - } - throw new Error('getKeysForNumber of unknown/used number'); - }, - - sendMessages(destination, messageArray) { - for (let i = 0, max = messageArray.length; i < max; i += 1) { - const msg = messageArray[i]; - if ( - (msg.type !== 1 && msg.type !== 3) || - msg.destinationDeviceId === undefined || - msg.destinationRegistrationId === undefined || - msg.body === undefined || - msg.timestamp === undefined || - msg.relay !== undefined || - msg.destination !== undefined - ) { - throw new Error('Invalid message'); - } - - messagesSentMap[ - `${destination}.${messageArray[i].destinationDeviceId}` - ] = msg; - } - }, + putAvatar: fakeCall, }; window.WebAPI = { diff --git a/package.json b/package.json index 0e64f76ec..2b0964733 100644 --- a/package.json +++ b/package.json @@ -95,7 +95,6 @@ "os-locale": "2.1.0", "pify": "3.0.0", "protobufjs": "6.8.6", - "proxy-agent": "3.0.3", "rc-slider": "^8.7.1", "react": "16.8.3", "react-contextmenu": "2.11.0", @@ -116,8 +115,7 @@ "tmp": "0.0.33", "to-arraybuffer": "1.0.1", "underscore": "1.9.0", - "uuid": "3.3.2", - "websocket": "1.0.28" + "uuid": "3.3.2" }, "devDependencies": { "@types/chai": "4.1.2", diff --git a/preload.js b/preload.js index ed8800aa8..d4130d90a 100644 --- a/preload.js +++ b/preload.js @@ -292,13 +292,7 @@ window.nodeSetImmediate = setImmediate; const { initialize: initializeWebAPI } = require('./js/modules/web_api'); -window.WebAPI = initializeWebAPI({ - url: config.serverUrl, - cdnUrl: config.cdnUrl, - certificateAuthority: config.certificateAuthority, - contentProxyUrl: config.contentProxyUrl, - proxyUrl: config.proxyUrl, -}); +window.WebAPI = initializeWebAPI(); window.seedNodeList = JSON.parse(config.seedNodeList); const LokiSnodeAPI = require('./js/modules/loki_snode_api'); diff --git a/yarn.lock b/yarn.lock index ce4913277..cb0fcfaab 100644 --- a/yarn.lock +++ b/yarn.lock @@ -516,20 +516,6 @@ address@^1.0.1: resolved "https://registry.yarnpkg.com/address/-/address-1.1.2.tgz#bf1116c9c758c51b7a933d296b72c221ed9428b6" integrity sha512-aT6camzM4xEA54YVJYSqxz1kv4IHnQZRtThJJHhUMRExaU5spC7jX5ugSwTaTgJliIgs4VhZOk7htClvQ/LmRA== -agent-base@4, agent-base@^4.2.0, agent-base@^4.3.0: - version "4.3.0" - resolved "https://registry.yarnpkg.com/agent-base/-/agent-base-4.3.0.tgz#8165f01c436009bccad0b1d122f05ed770efc6ee" - integrity sha512-salcGninV0nPrwpGNn4VTXBb1SOuXQBiqbrNXoeizJsHrsL6ERFM2Ne3JUSBWRE6aeNJI2ROP/WEEIDUiDe3cg== - dependencies: - es6-promisify "^5.0.0" - -agent-base@~4.2.1: - version "4.2.1" - resolved "https://registry.yarnpkg.com/agent-base/-/agent-base-4.2.1.tgz#d89e5999f797875674c07d87f260fc41e83e8ca9" - integrity sha512-JVwXMr9nHYTUXsBFKUqhJwvlcYU/blreOEUkhNR2eXZIvwd+c+o5V4MgDPKWnMS/56awN3TRzIP+KoPn+roQtg== - dependencies: - es6-promisify "^5.0.0" - ajv-keywords@^3.0.0, ajv-keywords@^3.1.0: version "3.4.1" resolved "https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-3.4.1.tgz#ef916e271c64ac12171fd8384eaae6b2345854da" @@ -900,11 +886,6 @@ ast-types@0.9.11: resolved "https://registry.yarnpkg.com/ast-types/-/ast-types-0.9.11.tgz#371177bb59232ff5ceaa1d09ee5cad705b1a5aa9" integrity sha1-NxF3u1kjL/XOqh0J7lytcFsaWqk= -ast-types@0.x.x: - version "0.13.2" - resolved "https://registry.yarnpkg.com/ast-types/-/ast-types-0.13.2.tgz#df39b677a911a83f3a049644fb74fdded23cea48" - integrity sha512-uWMHxJxtfj/1oZClOxDEV1sQ1HCDkA4MG8Gr69KKeBjEVH0R84WlejZ0y2DcwyBlpAEMltmVYkVgqfLFb2oyiA== - ast-types@^0.7.2: version "0.7.8" resolved "https://registry.yarnpkg.com/ast-types/-/ast-types-0.7.8.tgz#902d2e0d60d071bdcd46dc115e1809ed11c138a9" @@ -2511,11 +2492,6 @@ dashdash@1.14.1, dashdash@^1.12.0: dependencies: assert-plus "^1.0.0" -data-uri-to-buffer@1: - version "1.2.0" - resolved "https://registry.yarnpkg.com/data-uri-to-buffer/-/data-uri-to-buffer-1.2.0.tgz#77163ea9c20d8641b4707e8f18abdf9a78f34835" - integrity sha512-vKQ9DTQPN1FLYiiEEOQ6IBGFqvjCa5rSK3cWMy/Nespm5d/x3dGFT9UBZnkLxCwua/IXBi2TYnwTEpsOvhC4UQ== - dateformat@~1.0.12: version "1.0.12" resolved "https://registry.yarnpkg.com/dateformat/-/dateformat-1.0.12.tgz#9f124b67594c937ff706932e4a642cca8dbbfee9" @@ -2529,7 +2505,7 @@ debug-log@^1.0.1: resolved "https://registry.yarnpkg.com/debug-log/-/debug-log-1.0.1.tgz#2307632d4c04382b8df8a32f70b895046d52745f" integrity sha1-IwdjLUwEOCuN+KMvcLiVBG1SdF8= -debug@2, debug@2.6.9, debug@^2.1.3, debug@^2.2.0, debug@^2.3.3, debug@^2.6.0, debug@^2.6.6, debug@^2.6.8, debug@^2.6.9: +debug@2.6.9, debug@^2.1.3, debug@^2.2.0, debug@^2.3.3, debug@^2.6.0, debug@^2.6.6, debug@^2.6.8, debug@^2.6.9: version "2.6.9" resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA== @@ -2686,15 +2662,6 @@ defined@^1.0.0: resolved "https://registry.yarnpkg.com/defined/-/defined-1.0.0.tgz#c98d9bcef75674188e110969151199e39b1fa693" integrity sha1-yY2bzvdWdBiOEQlpFRGZ45sfppM= -degenerator@^1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/degenerator/-/degenerator-1.0.4.tgz#fcf490a37ece266464d9cc431ab98c5819ced095" - integrity sha1-/PSQo37OJmRk2cxDGrmMWBnO0JU= - dependencies: - ast-types "0.x.x" - escodegen "1.x.x" - esprima "3.x.x" - del@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/del/-/del-3.0.0.tgz#53ecf699ffcbcb39637691ab13baf160819766e5" @@ -3202,13 +3169,6 @@ es6-promise@^4.0.3, es6-promise@^4.2.4: resolved "https://registry.yarnpkg.com/es6-promise/-/es6-promise-4.2.8.tgz#4eb21594c972bc40553d276e510539143db53e0a" integrity sha512-HJDGx5daxeIvxdBxvG2cb9g4tEvwIk3i8+nhX0yGrYmZUzbkdg8QbDevheDB8gd0//uPj4c1EQua8Q+MViT0/w== -es6-promisify@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/es6-promisify/-/es6-promisify-5.0.0.tgz#5109d62f3e56ea967c4b63505aef08291c8a5203" - integrity sha1-UQnWLz5W6pZ8S2NQWu8IKRyKUgM= - dependencies: - es6-promise "^4.0.3" - escape-goat@^2.0.0: version "2.1.1" resolved "https://registry.yarnpkg.com/escape-goat/-/escape-goat-2.1.1.tgz#1b2dc77003676c457ec760b2dc68edb648188675" @@ -3229,7 +3189,7 @@ escape-string-regexp@^2.0.0: resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz#a30304e99daa32e23b2fd20f51babd07cffca344" integrity sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w== -escodegen@1.x.x, escodegen@^1.9.1: +escodegen@^1.9.1: version "1.14.1" resolved "https://registry.yarnpkg.com/escodegen/-/escodegen-1.14.1.tgz#ba01d0c8278b5e95a9a45350142026659027a457" integrity sha512-Bmt7NcRySdIfNPfU2ZoXDrrXsG9ZjvDxcAlMfDUgRBjLOWTuIACXPBFJH7Z+cLb40JeQco5toikyc9t9P8E9SQ== @@ -3368,11 +3328,6 @@ espree@^3.5.2: acorn "^5.5.0" acorn-jsx "^3.0.0" -esprima@3.x.x: - version "3.1.3" - resolved "https://registry.yarnpkg.com/esprima/-/esprima-3.1.3.tgz#fdca51cee6133895e3c88d535ce49dbff62a4633" - integrity sha1-/cpRzuYTOJXjyI1TXOSdv/YqRjM= - esprima@^2.1.0, esprima@^2.6.0: version "2.7.3" resolved "https://registry.yarnpkg.com/esprima/-/esprima-2.7.3.tgz#96e3b70d5779f6ad49cd032673d1c312767ba581" @@ -3703,7 +3658,7 @@ file-type@^3.1.0: resolved "https://registry.yarnpkg.com/file-type/-/file-type-3.9.0.tgz#257a078384d1db8087bc449d107d52a52672b9e9" integrity sha1-JXoHg4TR24CHvESdEH1SpSZyuek= -file-uri-to-path@1, file-uri-to-path@1.0.0: +file-uri-to-path@1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz#553a7b8446ff6f684359c445f1e37a05dacc33dd" integrity sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw== @@ -4024,14 +3979,6 @@ fstream@^1.0.0, fstream@^1.0.12: mkdirp ">=0.5 0" rimraf "2" -ftp@~0.3.10: - version "0.3.10" - resolved "https://registry.yarnpkg.com/ftp/-/ftp-0.3.10.tgz#9197d861ad8142f3e63d5a83bfe4c59f7330885d" - integrity sha1-kZfYYa2BQvPmPVqDv+TFn3MwiF0= - dependencies: - readable-stream "1.1.x" - xregexp "2.0.0" - function-bind@^1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d" @@ -4117,18 +4064,6 @@ get-stream@^5.1.0: dependencies: pump "^3.0.0" -get-uri@^2.0.0: - version "2.0.4" - resolved "https://registry.yarnpkg.com/get-uri/-/get-uri-2.0.4.tgz#d4937ab819e218d4cb5ae18e4f5962bef169cc6a" - integrity sha512-v7LT/s8kVjs+Tx0ykk1I+H/rbpzkHvuIq87LmeXptcf5sNWm9uQiwjNAt94SJPA1zOlCntmnOlJvVWKmzsxG8Q== - dependencies: - data-uri-to-buffer "1" - debug "2" - extend "~3.0.2" - file-uri-to-path "1" - ftp "~0.3.10" - readable-stream "2" - get-value@^2.0.3, get-value@^2.0.6: version "2.0.6" resolved "https://registry.yarnpkg.com/get-value/-/get-value-2.0.6.tgz#dc15ca1c672387ca76bd37ac0a395ba2042a2c28" @@ -4737,17 +4672,6 @@ http-errors@1.7.2: statuses ">= 1.5.0 < 2" toidentifier "1.0.0" -http-errors@1.7.3, http-errors@~1.7.2: - version "1.7.3" - resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.7.3.tgz#6c619e4f9c60308c38519498c14fbb10aacebb06" - integrity sha512-ZTTX0MWrsQ2ZAhA1cejAwDLycFsd7I7nVtnkT3Ol0aqodaKW+0CTZDQ1uBv5whptCnc8e8HeRRJxRs0kmm/Qfw== - dependencies: - depd "~1.1.2" - inherits "2.0.4" - setprototypeof "1.1.1" - statuses ">= 1.5.0 < 2" - toidentifier "1.0.0" - http-errors@~1.3.1: version "1.3.1" resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.3.1.tgz#197e22cdebd4198585e8694ef6786197b91ed942" @@ -4766,19 +4690,22 @@ http-errors@~1.6.2: setprototypeof "1.1.0" statuses ">= 1.4.0 < 2" +http-errors@~1.7.2: + version "1.7.3" + resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.7.3.tgz#6c619e4f9c60308c38519498c14fbb10aacebb06" + integrity sha512-ZTTX0MWrsQ2ZAhA1cejAwDLycFsd7I7nVtnkT3Ol0aqodaKW+0CTZDQ1uBv5whptCnc8e8HeRRJxRs0kmm/Qfw== + dependencies: + depd "~1.1.2" + inherits "2.0.4" + setprototypeof "1.1.1" + statuses ">= 1.5.0 < 2" + toidentifier "1.0.0" + "http-parser-js@>=0.4.0 <0.4.11": version "0.4.10" resolved "https://registry.yarnpkg.com/http-parser-js/-/http-parser-js-0.4.10.tgz#92c9c1374c35085f75db359ec56cc257cbb93fa4" integrity sha1-ksnBN0w1CF912zWexWzCV8u5P6Q= -http-proxy-agent@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/http-proxy-agent/-/http-proxy-agent-2.1.0.tgz#e4821beef5b2142a2026bd73926fe537631c5405" - integrity sha512-qwHbBLV7WviBl0rQsOzH6o5lwyOIvwp/BdFnvVxXORldu5TmjFfjzBcWUWS5kWAZhmv+JtiDhSuQCp4sBfbIgg== - dependencies: - agent-base "4" - debug "3.1.0" - http-proxy-middleware@^0.19.1: version "0.19.1" resolved "https://registry.yarnpkg.com/http-proxy-middleware/-/http-proxy-middleware-0.19.1.tgz#183c7dc4aa1479150306498c210cdaf96080a43a" @@ -4812,22 +4739,6 @@ https-browserify@^1.0.0: resolved "https://registry.yarnpkg.com/https-browserify/-/https-browserify-1.0.0.tgz#ec06c10e0a34c0f2faf199f7fd7fc78fffd03c73" integrity sha1-7AbBDgo0wPL68Zn3/X/Hj//QPHM= -https-proxy-agent@^2.2.1: - version "2.2.4" - resolved "https://registry.yarnpkg.com/https-proxy-agent/-/https-proxy-agent-2.2.4.tgz#4ee7a737abd92678a293d9b34a1af4d0d08c787b" - integrity sha512-OmvfoQ53WLjtA9HeYP9RNrWMJzzAz1JGaSFr1nijg0PVR1JaD/xbJq1mdEIIlxGpXp9eSe/O2LgU9DJmTPd0Eg== - dependencies: - agent-base "^4.3.0" - debug "^3.1.0" - -https-proxy-agent@^3.0.0: - version "3.0.1" - resolved "https://registry.yarnpkg.com/https-proxy-agent/-/https-proxy-agent-3.0.1.tgz#b8c286433e87602311b01c8ea34413d856a4af81" - integrity sha512-+ML2Rbh6DAuee7d07tYGEKOEi2voWPUGan+ExdPbPW6Z3svq+JCqr0v8WmKPOkz1vOVykPCBSuobe7G8GJUtVg== - dependencies: - agent-base "^4.3.0" - debug "^3.1.0" - hyphenate-style-name@^1.0.2: version "1.0.3" resolved "https://registry.yarnpkg.com/hyphenate-style-name/-/hyphenate-style-name-1.0.3.tgz#097bb7fa0b8f1a9cf0bd5c734cf95899981a9b48" @@ -5009,7 +4920,7 @@ ip-regex@^1.0.1: resolved "https://registry.yarnpkg.com/ip-regex/-/ip-regex-1.0.3.tgz#dc589076f659f419c222039a33316f1c7387effd" integrity sha1-3FiQdvZZ9BnCIgOaMzFvHHOH7/0= -ip@1.1.5, ip@^1.1.0, ip@^1.1.5: +ip@^1.1.0, ip@^1.1.5: version "1.1.5" resolved "https://registry.yarnpkg.com/ip/-/ip-1.1.5.tgz#bdded70114290828c0a039e72ef25f5aaec4354a" integrity sha1-vd7XARQpCCjAoDnnLvJfWq7ENUo= @@ -6057,7 +5968,7 @@ lowercase-keys@^2.0.0: resolved "https://registry.yarnpkg.com/lowercase-keys/-/lowercase-keys-2.0.0.tgz#2603e78b7b4b0006cbca2fbcc8a3202558ac9479" integrity sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA== -lru-cache@^4.0.1, lru-cache@^4.1.1, lru-cache@^4.1.2: +lru-cache@^4.0.1, lru-cache@^4.1.1: version "4.1.5" resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-4.1.5.tgz#8bbe50ea85bed59bc9e33dcab8235ee9bcf443cd" integrity sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g== @@ -6550,7 +6461,7 @@ mz@^2.3.1: object-assign "^4.0.1" thenify-all "^1.0.0" -nan@^2.10.0, nan@^2.11.0, nan@^2.12.1, nan@^2.14.0: +nan@^2.10.0, nan@^2.12.1, nan@^2.14.0: version "2.14.0" resolved "https://registry.yarnpkg.com/nan/-/nan-2.14.0.tgz#7818f722027b2459a86f0295d434d1fc2336c52c" integrity sha512-INOFj37C7k3AfaNTtX8RhsTw7qRy7eLET14cROi9+5HAVbbHuIWUHEauBv5qT4Av2tWasiTY1Jw6puUNqRJXQg== @@ -6608,11 +6519,6 @@ neo-async@^2.5.0, neo-async@^2.6.0: resolved "https://registry.yarnpkg.com/neo-async/-/neo-async-2.6.1.tgz#ac27ada66167fa8849a6addd837f6b189ad2081c" integrity sha512-iyam8fBuCUpWeKPGpaNMetEocMt364qkCsfL9JuhjXX6dRnguRVOfk2GZaDpPjcOKiiXCPINZC1GczQ7iTq3Zw== -netmask@^1.0.6: - version "1.0.6" - resolved "https://registry.yarnpkg.com/netmask/-/netmask-1.0.6.tgz#20297e89d86f6f6400f250d9f4f6b4c1945fcd35" - integrity sha1-ICl+idhvb2QA8lDZ9Pa0wZRfzTU= - nise@^1.2.0: version "1.5.3" resolved "https://registry.yarnpkg.com/nise/-/nise-1.5.3.tgz#9d2cfe37d44f57317766c6e9408a359c5d3ac1f7" @@ -7164,31 +7070,6 @@ p-try@^2.0.0: resolved "https://registry.yarnpkg.com/p-try/-/p-try-2.2.0.tgz#cb2868540e313d61de58fafbe35ce9004d5540e6" integrity sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ== -pac-proxy-agent@^3.0.0: - version "3.0.1" - resolved "https://registry.yarnpkg.com/pac-proxy-agent/-/pac-proxy-agent-3.0.1.tgz#115b1e58f92576cac2eba718593ca7b0e37de2ad" - integrity sha512-44DUg21G/liUZ48dJpUSjZnFfZro/0K5JTyFYLBcmh9+T6Ooi4/i4efwUiEy0+4oQusCBqWdhv16XohIj1GqnQ== - dependencies: - agent-base "^4.2.0" - debug "^4.1.1" - get-uri "^2.0.0" - http-proxy-agent "^2.1.0" - https-proxy-agent "^3.0.0" - pac-resolver "^3.0.0" - raw-body "^2.2.0" - socks-proxy-agent "^4.0.1" - -pac-resolver@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/pac-resolver/-/pac-resolver-3.0.0.tgz#6aea30787db0a891704deb7800a722a7615a6f26" - integrity sha512-tcc38bsjuE3XZ5+4vP96OfhOugrX+JcnpUbhfuc4LuXBLQhoTthOstZeoQJBDnQUDYzYmdImKsbz0xSl1/9qeA== - dependencies: - co "^4.6.0" - degenerator "^1.0.4" - ip "^1.1.5" - netmask "^1.0.6" - thunkify "^2.1.2" - package-json@^6.3.0: version "6.5.0" resolved "https://registry.yarnpkg.com/package-json/-/package-json-6.5.0.tgz#6feedaca35e75725876d0b0e64974697fed145b0" @@ -7903,25 +7784,6 @@ proxy-addr@~2.0.5: forwarded "~0.1.2" ipaddr.js "1.9.1" -proxy-agent@3.0.3: - version "3.0.3" - resolved "https://registry.yarnpkg.com/proxy-agent/-/proxy-agent-3.0.3.tgz#1c1a33db60ef5f2e9e35b876fd63c2bc681c611d" - integrity sha512-PXVVVuH9tiQuxQltFJVSnXWuDtNr+8aNBP6XVDDCDiUuDN8eRCm+ii4/mFWmXWEA0w8jjJSlePa4LXlM4jIzNA== - dependencies: - agent-base "^4.2.0" - debug "^3.1.0" - http-proxy-agent "^2.1.0" - https-proxy-agent "^2.2.1" - lru-cache "^4.1.2" - pac-proxy-agent "^3.0.0" - proxy-from-env "^1.0.0" - socks-proxy-agent "^4.0.1" - -proxy-from-env@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/proxy-from-env/-/proxy-from-env-1.1.0.tgz#e102f16ca355424865755d2c9e8ea4f24d58c3e2" - integrity sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg== - prr@~1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/prr/-/prr-1.0.1.tgz#d3fc114ba06995a45ec6893f484ceb1d78f5f476" @@ -8114,16 +7976,6 @@ raw-body@2.4.0: iconv-lite "0.4.24" unpipe "1.0.0" -raw-body@^2.2.0: - version "2.4.1" - resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-2.4.1.tgz#30ac82f98bb5ae8c152e67149dac8d55153b168c" - integrity sha512-9WmIKF6mkvA0SLmA2Knm9+qj89e+j1zqgyn8aXGd7+nAduPoqgI9lO57SAZNn/Byzo5P7JhXTyg9PzaJbH73bA== - dependencies: - bytes "3.1.0" - http-errors "1.7.3" - iconv-lite "0.4.24" - unpipe "1.0.0" - raw-body@~2.1.5: version "2.1.7" resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-2.1.7.tgz#adfeace2e4fb3098058014d08c072dcc59758774" @@ -8495,7 +8347,7 @@ read-pkg@^2.0.0: normalize-package-data "^2.3.2" path-type "^2.0.0" -"readable-stream@1 || 2", readable-stream@2, readable-stream@^2.0.0, readable-stream@^2.0.1, readable-stream@^2.0.2, readable-stream@^2.0.5, readable-stream@^2.0.6, readable-stream@^2.1.5, readable-stream@^2.2.2, readable-stream@^2.3.0, readable-stream@^2.3.3, readable-stream@^2.3.5, readable-stream@^2.3.6, readable-stream@~2.3.6: +"readable-stream@1 || 2", readable-stream@^2.0.0, readable-stream@^2.0.1, readable-stream@^2.0.2, readable-stream@^2.0.5, readable-stream@^2.0.6, readable-stream@^2.1.5, readable-stream@^2.2.2, readable-stream@^2.3.0, readable-stream@^2.3.3, readable-stream@^2.3.5, readable-stream@^2.3.6, readable-stream@~2.3.6: version "2.3.7" resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.7.tgz#1eca1cf711aef814c04f62252a36a62f6cb23b57" integrity sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw== @@ -8508,7 +8360,7 @@ read-pkg@^2.0.0: string_decoder "~1.1.1" util-deprecate "~1.0.1" -readable-stream@1.1.x, readable-stream@^1.1.8, readable-stream@~1.1.9: +readable-stream@^1.1.8, readable-stream@~1.1.9: version "1.1.14" resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-1.1.14.tgz#7cf4c54ef648e3813084c636dd2079e166c081d9" integrity sha1-fPTFTvZI44EwhMY23SB54WbAgdk= @@ -9341,11 +9193,6 @@ slide@^1.1.5: resolved "https://registry.yarnpkg.com/slide/-/slide-1.1.6.tgz#56eb027d65b4d2dce6cb2e2d32c4d4afc9e1d707" integrity sha1-VusCfWW00tzmyy4tMsTUr8nh1wc= -smart-buffer@^4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/smart-buffer/-/smart-buffer-4.1.0.tgz#91605c25d91652f4661ea69ccf45f1b331ca21ba" - integrity sha512-iVICrxOzCynf/SNaBQCw34eM9jROU/s5rzIhpOvzhzuYHfJR/DhZfDkXiZSgKXfgv26HT3Yni3AV/DGw0cGnnw== - snapdragon-node@^2.0.1: version "2.1.1" resolved "https://registry.yarnpkg.com/snapdragon-node/-/snapdragon-node-2.1.1.tgz#6c175f86ff14bdb0724563e8f3c1b021a286853b" @@ -9396,22 +9243,6 @@ sockjs@0.3.19: faye-websocket "^0.10.0" uuid "^3.0.1" -socks-proxy-agent@^4.0.1: - version "4.0.2" - resolved "https://registry.yarnpkg.com/socks-proxy-agent/-/socks-proxy-agent-4.0.2.tgz#3c8991f3145b2799e70e11bd5fbc8b1963116386" - integrity sha512-NT6syHhI9LmuEMSK6Kd2V7gNv5KFZoLE7V5udWmn0de+3Mkj3UMA/AJPLyeNUVmElCurSHtUdM3ETpR3z770Wg== - dependencies: - agent-base "~4.2.1" - socks "~2.3.2" - -socks@~2.3.2: - version "2.3.3" - resolved "https://registry.yarnpkg.com/socks/-/socks-2.3.3.tgz#01129f0a5d534d2b897712ed8aceab7ee65d78e3" - integrity sha512-o5t52PCNtVdiOvzMry7wU4aOqYWL0PeCXRWBEiJow4/i/wr+wpsJQ9awEu1EonLIqsfGd5qSgDdxEOvCdmBEpA== - dependencies: - ip "1.1.5" - smart-buffer "^4.1.0" - sort-keys@^1.0.0: version "1.1.2" resolved "https://registry.yarnpkg.com/sort-keys/-/sort-keys-1.1.2.tgz#441b6d4d346798f1b4e49e8920adfba0e543f9ad" @@ -10065,11 +9896,6 @@ through@2, through@^2.3.6: resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5" integrity sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU= -thunkify@^2.1.2: - version "2.1.2" - resolved "https://registry.yarnpkg.com/thunkify/-/thunkify-2.1.2.tgz#faa0e9d230c51acc95ca13a361ac05ca7e04553d" - integrity sha1-+qDp0jDFGsyVyhOjYawFyn4EVT0= - thunky@^1.0.2: version "1.1.0" resolved "https://registry.yarnpkg.com/thunky/-/thunky-1.1.0.tgz#5abaf714a9405db0504732bbccd2cedd9ef9537d" @@ -10908,16 +10734,6 @@ websocket-extensions@>=0.1.1: resolved "https://registry.yarnpkg.com/websocket-extensions/-/websocket-extensions-0.1.3.tgz#5d2ff22977003ec687a4b87073dfbbac146ccf29" integrity sha512-nqHUnMXmBzT0w570r2JpJxfiSD1IzoI+HGVdd3aZ0yNi3ngvQ4jv1dtHt5VGxfI2yj5yqImPhOK4vmIh2xMbGg== -websocket@1.0.28: - version "1.0.28" - resolved "https://registry.yarnpkg.com/websocket/-/websocket-1.0.28.tgz#9e5f6fdc8a3fe01d4422647ef93abdd8d45a78d3" - integrity sha512-00y/20/80P7H4bCYkzuuvvfDvh+dgtXi5kzDf3UcZwN6boTYaKvsrtZ5lIYm1Gsg48siMErd9M4zjSYfYFHTrA== - dependencies: - debug "^2.2.0" - nan "^2.11.0" - typedarray-to-buffer "^3.1.5" - yaeti "^0.0.6" - wgxpath@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/wgxpath/-/wgxpath-1.0.0.tgz#eef8a4b9d558cc495ad3a9a2b751597ecd9af690" @@ -11076,11 +10892,6 @@ xmlbuilder@~11.0.0: resolved "https://registry.yarnpkg.com/xmlbuilder/-/xmlbuilder-11.0.1.tgz#be9bae1c8a046e76b31127726347d0ad7002beb3" integrity sha512-fDlsI/kFEx7gLvbecc0/ohLG50fugQp8ryHzMTuW9vSa1GJ0XYWKnhsUx7oie3G98+r56aTQIUB4kht42R3JvA== -xregexp@2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/xregexp/-/xregexp-2.0.0.tgz#52a63e56ca0b84a7f3a5f3d61872f126ad7a5943" - integrity sha1-UqY+VsoLhKfzpfPWGHLxJq16WUM= - xtend@^4.0.0, xtend@^4.0.1, xtend@~4.0.1: version "4.0.2" resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.2.tgz#bb72779f5fa465186b1f438f674fa347fdb5db54" @@ -11103,11 +10914,6 @@ y18n@^4.0.0: resolved "https://registry.yarnpkg.com/y18n/-/y18n-4.0.0.tgz#95ef94f85ecc81d007c264e190a120f0a3c8566b" integrity sha512-r9S/ZyXu/Xu9q1tYlpsLIsa3EeLXXk0VwlxqTcFRfg9EhMW+17kbt9G0NrgCmhGb5vT2hyhJZLfDGx+7+5Uj/w== -yaeti@^0.0.6: - version "0.0.6" - resolved "https://registry.yarnpkg.com/yaeti/-/yaeti-0.0.6.tgz#f26f484d72684cf42bedfb76970aa1608fbf9577" - integrity sha1-8m9ITXJoTPQr7ft2lwqhYI+/lXc= - yallist@^2.1.2: version "2.1.2" resolved "https://registry.yarnpkg.com/yallist/-/yallist-2.1.2.tgz#1c11f9218f076089a47dd512f93c6699a6a81d52"