From 2a38664dc88566b05b7c0b0700a9f349ff5e1e84 Mon Sep 17 00:00:00 2001 From: Diego Mello Date: Thu, 3 Feb 2022 18:22:13 -0300 Subject: [PATCH 1/3] Migrating logout --- app/definitions/ICertificate.ts | 4 ++++ app/definitions/IRocketChat.ts | 9 +++++++ app/definitions/index.ts | 2 ++ app/lib/methods/{logout.js => logout.ts} | 30 ++++++++++++++---------- app/utils/sslPinning.ts | 6 +---- 5 files changed, 33 insertions(+), 18 deletions(-) create mode 100644 app/definitions/ICertificate.ts create mode 100644 app/definitions/IRocketChat.ts rename app/lib/methods/{logout.js => logout.ts} (75%) diff --git a/app/definitions/ICertificate.ts b/app/definitions/ICertificate.ts new file mode 100644 index 00000000000..025b6a96fcb --- /dev/null +++ b/app/definitions/ICertificate.ts @@ -0,0 +1,4 @@ +export interface ICertificate { + path: string; + password: string; +} diff --git a/app/definitions/IRocketChat.ts b/app/definitions/IRocketChat.ts new file mode 100644 index 00000000000..ff59a5b28d6 --- /dev/null +++ b/app/definitions/IRocketChat.ts @@ -0,0 +1,9 @@ +import rocketchat from '../lib/rocketchat'; + +type TRocketChat = typeof rocketchat; + +export interface IRocketChatThis extends TRocketChat { + sdk: any; + activeUsersSubTimeout: any; + roomsSub: any; +} diff --git a/app/definitions/index.ts b/app/definitions/index.ts index 1c154388e67..9512c7cf90c 100644 --- a/app/definitions/index.ts +++ b/app/definitions/index.ts @@ -21,6 +21,8 @@ export * from './IUser'; export * from './IServer'; export * from './ILoggedUser'; export * from './IServerHistory'; +export * from './IRocketChat'; +export * from './ICertificate'; export interface IBaseScreen, S extends string> { navigation: StackNavigationProp; diff --git a/app/lib/methods/logout.js b/app/lib/methods/logout.ts similarity index 75% rename from app/lib/methods/logout.js rename to app/lib/methods/logout.ts index c108a996552..78a4dbee64f 100644 --- a/app/lib/methods/logout.js +++ b/app/lib/methods/logout.ts @@ -1,5 +1,6 @@ import * as FileSystem from 'expo-file-system'; import { Rocketchat as RocketchatClient } from '@rocket.chat/sdk'; +import Model from '@nozbe/watermelondb/Model'; import { getDeviceToken } from '../../notifications/push'; import { extractHostname } from '../../utils/server'; @@ -9,21 +10,24 @@ import RocketChat from '../rocketchat'; import { useSsl } from '../../utils/url'; import { E2E_PRIVATE_KEY, E2E_PUBLIC_KEY, E2E_RANDOM_PASSWORD_KEY } from '../encryption/constants'; import UserPreferences from '../userPreferences'; +import { ICertificate, IRocketChatThis } from '../../definitions'; -async function removeServerKeys({ server, userId }) { +async function removeServerKeys({ server, userId }: { server: string; userId: string | null }) { await UserPreferences.removeItem(`${RocketChat.TOKEN_KEY}-${server}`); - await UserPreferences.removeItem(`${RocketChat.TOKEN_KEY}-${userId}`); + if (userId) { + await UserPreferences.removeItem(`${RocketChat.TOKEN_KEY}-${userId}`); + } await UserPreferences.removeItem(`${BASIC_AUTH_KEY}-${server}`); await UserPreferences.removeItem(`${server}-${E2E_PUBLIC_KEY}`); await UserPreferences.removeItem(`${server}-${E2E_PRIVATE_KEY}`); await UserPreferences.removeItem(`${server}-${E2E_RANDOM_PASSWORD_KEY}`); } -async function removeSharedCredentials({ server }) { +async function removeSharedCredentials({ server }: { server: string }) { // clear certificate for server - SSL Pinning try { - const certificate = await UserPreferences.getMapAsync(extractHostname(server)); - if (certificate && certificate.path) { + const certificate = (await UserPreferences.getMapAsync(extractHostname(server))) as ICertificate | null; + if (certificate?.path) { await UserPreferences.removeItem(extractHostname(server)); await FileSystem.deleteAsync(certificate.path); } @@ -32,9 +36,9 @@ async function removeSharedCredentials({ server }) { } } -async function removeServerData({ server }) { +async function removeServerData({ server }: { server: string }) { try { - const batch = []; + const batch: Model[] = []; const serversDB = database.servers; const userId = await UserPreferences.getStringAsync(`${RocketChat.TOKEN_KEY}-${server}`); @@ -47,9 +51,9 @@ async function removeServerData({ server }) { const serverRecord = await serverCollection.find(server); batch.push(serverRecord.prepareDestroyPermanently()); - await serversDB.action(() => serversDB.batch(...batch)); + await serversDB.write(() => serversDB.batch(...batch)); await removeSharedCredentials({ server }); - await removeServerKeys({ server }); + await removeServerKeys({ server, userId }); } catch (e) { console.log('removeServerData', e); } @@ -59,16 +63,16 @@ async function removeCurrentServer() { await UserPreferences.removeItem(RocketChat.CURRENT_SERVER); } -async function removeServerDatabase({ server }) { +async function removeServerDatabase({ server }: { server: string }) { try { const db = getDatabase(server); - await db.action(() => db.unsafeResetDatabase()); + await db.write(() => db.unsafeResetDatabase()); } catch (e) { console.log(e); } } -export async function removeServer({ server }) { +export async function removeServer({ server }: { server: string }): Promise { try { const userId = await UserPreferences.getStringAsync(`${RocketChat.TOKEN_KEY}-${server}`); if (userId) { @@ -92,7 +96,7 @@ export async function removeServer({ server }) { } } -export default async function logout({ server }) { +export default async function logout(this: IRocketChatThis, { server }: { server: string }): Promise { if (this.roomsSub) { this.roomsSub.stop(); this.roomsSub = null; diff --git a/app/utils/sslPinning.ts b/app/utils/sslPinning.ts index 42245c98af0..27b1002288b 100644 --- a/app/utils/sslPinning.ts +++ b/app/utils/sslPinning.ts @@ -5,6 +5,7 @@ import * as FileSystem from 'expo-file-system'; import UserPreferences from '../lib/userPreferences'; import I18n from '../i18n'; import { extractHostname } from './server'; +import { ICertificate } from '../definitions'; const { SSLPinning } = NativeModules; const { documentDirectory } = FileSystem; @@ -13,11 +14,6 @@ const extractFileScheme = (path: string) => path.replace('file://', ''); // file const getPath = (name: string) => `${documentDirectory}/${name}`; -interface ICertificate { - path: string; - password: string; -} - const persistCertificate = async (name: string, password: string) => { const certificatePath = getPath(name); const certificate: ICertificate = { From babe94eb70001fb0f2eb2ffb18e3f1662275893d Mon Sep 17 00:00:00 2001 From: Diego Mello Date: Mon, 7 Feb 2022 17:56:00 -0300 Subject: [PATCH 2/3] Use log rather than console.log --- app/lib/methods/logout.ts | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/app/lib/methods/logout.ts b/app/lib/methods/logout.ts index 78a4dbee64f..df77c83b923 100644 --- a/app/lib/methods/logout.ts +++ b/app/lib/methods/logout.ts @@ -8,6 +8,7 @@ import { BASIC_AUTH_KEY } from '../../utils/fetch'; import database, { getDatabase } from '../database'; import RocketChat from '../rocketchat'; import { useSsl } from '../../utils/url'; +import log from '../../utils/log'; import { E2E_PRIVATE_KEY, E2E_PUBLIC_KEY, E2E_RANDOM_PASSWORD_KEY } from '../encryption/constants'; import UserPreferences from '../userPreferences'; import { ICertificate, IRocketChatThis } from '../../definitions'; @@ -32,7 +33,7 @@ async function removeSharedCredentials({ server }: { server: string }) { await FileSystem.deleteAsync(certificate.path); } } catch (e) { - console.log('removeSharedCredentials', e); + log(e); } } @@ -55,7 +56,7 @@ async function removeServerData({ server }: { server: string }) { await removeSharedCredentials({ server }); await removeServerKeys({ server, userId }); } catch (e) { - console.log('removeServerData', e); + log(e); } } @@ -68,7 +69,7 @@ async function removeServerDatabase({ server }: { server: string }) { const db = getDatabase(server); await db.write(() => db.unsafeResetDatabase()); } catch (e) { - console.log(e); + log(e); } } @@ -92,7 +93,7 @@ export async function removeServer({ server }: { server: string }): Promise Date: Mon, 7 Feb 2022 18:05:19 -0300 Subject: [PATCH 3/3] Resolve conflicts --- app/definitions/IRocketChat.ts | 6 ++++-- app/lib/methods/logout.ts | 4 ++-- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/app/definitions/IRocketChat.ts b/app/definitions/IRocketChat.ts index ff59a5b28d6..29d25cf528e 100644 --- a/app/definitions/IRocketChat.ts +++ b/app/definitions/IRocketChat.ts @@ -1,9 +1,11 @@ +import { Rocketchat } from '@rocket.chat/sdk'; + import rocketchat from '../lib/rocketchat'; type TRocketChat = typeof rocketchat; -export interface IRocketChatThis extends TRocketChat { - sdk: any; +export interface IRocketChat extends TRocketChat { + sdk: typeof Rocketchat; activeUsersSubTimeout: any; roomsSub: any; } diff --git a/app/lib/methods/logout.ts b/app/lib/methods/logout.ts index df77c83b923..fefd1769b5f 100644 --- a/app/lib/methods/logout.ts +++ b/app/lib/methods/logout.ts @@ -11,7 +11,7 @@ import { useSsl } from '../../utils/url'; import log from '../../utils/log'; import { E2E_PRIVATE_KEY, E2E_PUBLIC_KEY, E2E_RANDOM_PASSWORD_KEY } from '../encryption/constants'; import UserPreferences from '../userPreferences'; -import { ICertificate, IRocketChatThis } from '../../definitions'; +import { ICertificate, IRocketChat } from '../../definitions'; async function removeServerKeys({ server, userId }: { server: string; userId: string | null }) { await UserPreferences.removeItem(`${RocketChat.TOKEN_KEY}-${server}`); @@ -97,7 +97,7 @@ export async function removeServer({ server }: { server: string }): Promise { +export default async function logout(this: IRocketChat, { server }: { server: string }): Promise { if (this.roomsSub) { this.roomsSub.stop(); this.roomsSub = null;