From c8878f0a1926c617fbe0e64bd1a20f93486fdf29 Mon Sep 17 00:00:00 2001 From: Audric Ackermann Date: Mon, 31 May 2021 13:08:26 +1000 Subject: [PATCH] remove existing opengroups v1 from db along with every messages --- FSV1 TO CLEAN.txt | 21 +-- js/modules/loki_app_dot_net_api.d.ts | 10 - js/modules/loki_app_dot_net_api.js | 250 ------------------------- ts/components/session/ActionsPanel.tsx | 17 ++ ts/session/onions/onionSend.ts | 7 +- ts/window.d.ts | 1 - 6 files changed, 23 insertions(+), 283 deletions(-) delete mode 100644 js/modules/loki_app_dot_net_api.d.ts delete mode 100644 js/modules/loki_app_dot_net_api.js diff --git a/FSV1 TO CLEAN.txt b/FSV1 TO CLEAN.txt index 38da7a0d4..fbedc192d 100644 --- a/FSV1 TO CLEAN.txt +++ b/FSV1 TO CLEAN.txt @@ -1,33 +1,18 @@ A TESTER +move mentions user to redux for opengroups * MENTIONS opengroupv2 - - - lokiPublicChatAPI -dot_net_api - - +DELETED LokiPushNotificationServerApi - - - - channelAPI.sendMessage - - -getAllOpenGroupV1Conversations => migration to remove opengroupsv1 matching urls - - - - -DELETED +dot_net_api loki_public_chat_api tokenlessFileServerAdnAPI channelId diff --git a/js/modules/loki_app_dot_net_api.d.ts b/js/modules/loki_app_dot_net_api.d.ts deleted file mode 100644 index 94b057854..000000000 --- a/js/modules/loki_app_dot_net_api.d.ts +++ /dev/null @@ -1,10 +0,0 @@ -export interface LokiAppDotNetServerInterface { - serverRequest(endpoint: string): Promise; -} - -declare class LokiAppDotNetServerAPI implements LokiAppDotNetServerInterface { - public baseServerUrl: string; - constructor(ourKey: string, url: string); -} - -export default LokiAppDotNetServerAPI; diff --git a/js/modules/loki_app_dot_net_api.js b/js/modules/loki_app_dot_net_api.js deleted file mode 100644 index 2108c37de..000000000 --- a/js/modules/loki_app_dot_net_api.js +++ /dev/null @@ -1,250 +0,0 @@ -/* global log, libloki, Signal, StringView, window,, process */ - -const OnionSend = require('../../ts/session/onions/onionSend'); - -const LOKIFOUNDATION_APNS_PUBKEY = 'BWQqZYWRl0LlotTcUSRJZPvNi8qyt1YSQH3li4EHQNBJ'; - -const urlPubkeyMap = { - 'https://dev.apns.getsession.org': LOKIFOUNDATION_APNS_PUBKEY, - 'https://live.apns.getsession.org': LOKIFOUNDATION_APNS_PUBKEY, -}; - -// the core ADN class that handles all communication with a specific server -class LokiAppDotNetServerAPI { - constructor(ourKey, url) { - this.ourKey = ourKey; - this.tokenPromise = null; - this.baseServerUrl = url; - log.info(`LokiAppDotNetAPI registered server ${url}`); - } - - async open() { - // check token, we're not sure how long we were asleep, token may have expired - await this.getOrRefreshServerToken(); - // now that we have a working token, start up pollers - } - - async close() { - // match sure our pending requests are finished - // in case it's still starting up - if (this.tokenPromise) { - await this.tokenPromise; - } - } - - // set up pubKey & pubKeyHex properties - // optionally called for mainly file server comms - getPubKeyForUrl() { - if (!window.lokiFeatureFlags.useOnionRequests) { - // pubkeys don't matter - return ''; - } - - // Hard coded - let pubKeyAB; - if (urlPubkeyMap && urlPubkeyMap[this.baseServerUrl]) { - pubKeyAB = window.Signal.Crypto.base64ToArrayBuffer(urlPubkeyMap[this.baseServerUrl]); - } - - // do we have their pubkey locally? - // FIXME: this._server won't be set yet... - // can't really do this for the file server because we'll need the key - // before we can communicate with lsrpc - if (window.lokiFeatureFlags.useFileOnionRequests) { - if ( - window.lokiPublicChatAPI && - window.lokiPublicChatAPI.openGroupPubKeys && - window.lokiPublicChatAPI.openGroupPubKeys[this.baseServerUrl] - ) { - pubKeyAB = window.lokiPublicChatAPI.openGroupPubKeys[this.baseServerUrl]; - } - } - // else will fail validation later - - // now that key is loaded, lets verify - if (pubKeyAB && pubKeyAB.byteLength && pubKeyAB.byteLength !== 33) { - log.error('FILESERVER PUBKEY is invalid, length:', pubKeyAB.byteLength); - process.exit(1); - } - this.pubKey = pubKeyAB; - this.pubKeyHex = StringView.arrayBufferToHex(pubKeyAB); - - return pubKeyAB; - } - - // get active token for this server - async getOrRefreshServerToken(forceRefresh = false) { - let token; - if (!forceRefresh) { - if (this.token) { - return this.token; - } - token = await Signal.Data.getPublicServerTokenByServerUrl(this.baseServerUrl); - } - if (!token) { - token = await this.refreshServerToken(); - if (token) { - await Signal.Data.savePublicServerToken({ - serverUrl: this.baseServerUrl, - token, - }); - } - } - this.token = token; - - // if no token to verify, just bail now - if (!token) { - // if we haven't forced it - if (!forceRefresh) { - // try one more time with requesting a fresh token - token = await this.getOrRefreshServerToken(true); - } - return token; - } - - // verify token info - const tokenRes = await this.serverRequest('token'); - // if no problems and we have data - if ( - !tokenRes.err && - tokenRes.response && - tokenRes.response.data && - tokenRes.response.data.user - ) { - // get our profile name - // this should be primaryDevicePubKey - // because the rest of the profile system uses that... - const ourNumber = window.libsession.Utils.UserUtils.getOurPubKeyStrFromCache(); - const profileConvo = window.getConversationController().get(ourNumber); - const profile = profileConvo && profileConvo.getLokiProfile(); - const profileName = profile && profile.displayName; - // if doesn't match, write it to the network - if (tokenRes.response.data.user.name !== profileName) { - // update our profile name if it got out of sync - this.setProfileName(profileName); - } - } - if (tokenRes.err) { - log.error(`token err`, tokenRes); - // didn't already try && this specific error - if ( - !forceRefresh && - tokenRes.response && - tokenRes.response.meta && - tokenRes.response.meta.code === 401 - ) { - // this token is not good - this.token = ''; // remove from object - await Signal.Data.savePublicServerToken({ - serverUrl: this.baseServerUrl, - token: '', - }); - token = await this.getOrRefreshServerToken(true); - } - } - - return token; - } - - // get active token from server (but only allow one request at a time) - async refreshServerToken() { - // if currently not in progress - if (this.tokenPromise === null) { - // FIXME: add timeout - // a broken/stuck token endpoint can prevent you from removing channels - // set lock - this.tokenPromise = new Promise(async res => { - // request the token - const token = await this.requestToken(); - if (!token) { - res(null); - return; - } - // activate the token - const registered = await this.submitToken(token); - if (!registered) { - res(null); - return; - } - // resolve promise to release lock - res(token); - }); - } - // wait until we have it set - const token = await this.tokenPromise; - // clear lock - this.tokenPromise = null; - return token; - } - - // request an token from the server - async requestToken() { - let res; - try { - const params = { - pubKey: this.ourKey, - }; - res = await this.serverRequest('loki/v1/get_challenge', { - method: 'GET', - params, - }); - } catch (e) { - // should we retry here? - // no, this is the low level function - // not really an error, from a client's pov, network servers can fail... - if (e.code === 'ECONNREFUSED') { - // down - log.warn('requestToken request can not connect', this.baseServerUrl, e.message); - } else if (e.code === 'ECONNRESET') { - // got disconnected - log.warn('requestToken request lost connection', this.baseServerUrl, e.message); - } else { - log.error('requestToken request failed', this.baseServerUrl, e.code, e.message); - } - return null; - } - if (!res.ok) { - log.error('requestToken request failed'); - return null; - } - const body = res.response; - const token = await libloki.crypto.decryptToken(body); - return token; - } - - // activate token - async submitToken(token) { - try { - const res = await this.serverRequest('loki/v1/submit_challenge', { - method: 'POST', - objBody: { - pubKey: this.ourKey, - token, - }, - noJson: true, - }); - return res.ok; - } catch (e) { - log.error('submitToken serverRequest failure', e.code, e.message); - return false; - } - } - - // make a request to the server - async serverRequest(endpoint, options = {}) { - if (options.forceFreshToken) { - await this.getOrRefreshServerToken(true); - } - return OnionSend.serverRequest(`${this.baseServerUrl}/${endpoint}`, { - ...options, - token: this.token, - srvPubKey: this.pubKeyHex, - }); - } -} - -LokiAppDotNetServerAPI.serverRequest = OnionSend.serverRequest; - -// These files are expected to be in commonjs so we can't use es6 syntax :( -// If we move these to TS then we should be able to use es6 -module.exports = LokiAppDotNetServerAPI; diff --git a/ts/components/session/ActionsPanel.tsx b/ts/components/session/ActionsPanel.tsx index fa9ec184f..98d89803f 100644 --- a/ts/components/session/ActionsPanel.tsx +++ b/ts/components/session/ActionsPanel.tsx @@ -10,6 +10,7 @@ import { syncConfigurationIfNeeded } from '../../session/utils/syncUtils'; import { createOrUpdateItem, generateAttachmentKeyIfEmpty, + getAllOpenGroupV1Conversations, getItemById, hasSyncedInitialConfigurationItem, lastAvatarUploadTimestamp, @@ -171,6 +172,21 @@ const triggerSyncIfNeeded = async () => { } }; +const removeAllV1OpenGroups = async () => { + const allV1Convos = (await getAllOpenGroupV1Conversations()).models || []; + await Promise.all( + allV1Convos.map(async v1Convo => { + try { + window.log.info('removing v1Convo: ', v1Convo.id); + // calling this here rather than in a migration because it takes care of removing the attachments, the messages, the profile images, etc. + await ConversationController.getInstance().deleteContact(v1Convo.id); + } catch (e) { + window.log.warn('failed to delete opengroupv1'); + } + }) + ); +}; + const triggerAvatarReUploadIfNeeded = async () => { const lastTimeStampAvatarUpload = (await getItemById(lastAvatarUploadTimestamp))?.value || 0; @@ -266,6 +282,7 @@ const doAppStartUp = (dispatch: Dispatch) => { // remove existing prekeys, sign prekeys and sessions // FIXME audric, make this in a migration so we can remove this line void clearSessionsAndPreKeys(); + void removeAllV1OpenGroups(); // this generates the key to encrypt attachments locally void generateAttachmentKeyIfEmpty(); diff --git a/ts/session/onions/onionSend.ts b/ts/session/onions/onionSend.ts index 446ed49cc..d768ecd88 100644 --- a/ts/session/onions/onionSend.ts +++ b/ts/session/onions/onionSend.ts @@ -14,7 +14,6 @@ import { PROTOCOLS } from '../constants'; import { toHex } from '../utils/String'; import pRetry from 'p-retry'; -// FIXME: replace with something on urlPubkeyMap... const FILESERVER_HOSTS = [ 'file-dev.lokinet.org', 'file.lokinet.org', @@ -280,7 +279,7 @@ export const serverRequest = async ( fetchOptions.agent = snodeHttpsAgent; } } catch (e) { - window?.log?.error('loki_app_dot_net:::serverRequest - set up error:', e.code, e.message); + window?.log?.error('onionSend:::serverRequest - set up error:', e.code, e.message); return { err: e, ok: false, @@ -330,7 +329,7 @@ export const serverRequest = async ( } catch (e) { if (txtResponse) { window?.log?.error( - `loki_app_dot_net:::serverRequest - ${mode} error`, + `onionSend:::serverRequest - ${mode} error`, e.code, e.message, `json: ${txtResponse}`, @@ -339,7 +338,7 @@ export const serverRequest = async ( ); } else { window?.log?.error( - `loki_app_dot_net:::serverRequest - ${mode} error`, + `onionSend:::serverRequest - ${mode} error`, e.code, e.message, 'attempting connection to', diff --git a/ts/window.d.ts b/ts/window.d.ts index dbf2c4947..9789167f0 100644 --- a/ts/window.d.ts +++ b/ts/window.d.ts @@ -26,7 +26,6 @@ declare global { CONSTANTS: any; Events: any; Lodash: any; - LokiAppDotNetServerAPI: any; LokiSnodeAPI: any; Session: any; Signal: SignalInterface;