diff --git a/packages/mobile/.eslintrc b/packages/mobile/.eslintrc index f4039e912..63d4b65e9 100644 --- a/packages/mobile/.eslintrc +++ b/packages/mobile/.eslintrc @@ -8,7 +8,8 @@ "no-console": "warn", "@typescript-eslint/no-explicit-any": "warn", "@typescript-eslint/no-var-requires": "off", - "eqeqeq": ["off"] + "eqeqeq": ["off"], + "no-void": ["off"] }, "ignorePatterns": ["metro.config.js"] } diff --git a/packages/mobile/package.json b/packages/mobile/package.json index 6f81bf4ac..d160369aa 100644 --- a/packages/mobile/package.json +++ b/packages/mobile/package.json @@ -11,11 +11,12 @@ "ios-dev": "react-native run-ios --scheme StandardNotesDev", "ios-prod": "react-native run-ios --scheme StandardNotes", "clear-cache": "watchman watch-del-all && rm -rf $TMPDIR/react-native-packager-cache-* && rm -rf $TMPDIR/metro-bundler-cache-*", - "lint": "yarn eslint . --ext .ts,.tsx", + "lint": "yarn tsc && yarn eslint . --ext .ts,.tsx", "lint:fix": "yarn lint --fix", "format": "prettier ./src", "format:fix": "yarn format --write", "build": "yarn android:bundle && yarn install:pods", + "pods": "yarn install:pods", "tsc": "tsc --noEmit", "start": "react-native start", "install:pods": "yarn pod-install ios", diff --git a/packages/mobile/src/Lib/Interface.ts b/packages/mobile/src/Lib/Interface.ts index a82ce0648..d8401a944 100644 --- a/packages/mobile/src/Lib/Interface.ts +++ b/packages/mobile/src/Lib/Interface.ts @@ -5,6 +5,7 @@ import { ApplicationIdentifier, DeviceInterface, Environment, + LegacyMobileKeychainStructure, LegacyRawKeychainValue, NamespacedRootKeyInKeychain, RawKeychainValue, @@ -30,6 +31,12 @@ const isLegacyIdentifier = function (identifier: ApplicationIdentifier) { return identifier && identifier === LEGACY_IDENTIFIER } +function isLegacyMobileKeychain( + x: LegacyMobileKeychainStructure | RawKeychainValue, +): x is LegacyMobileKeychainStructure { + return x.ak != undefined +} + const showLoadFailForItemIds = (failedItemIds: string[]) => { let text = 'The following items could not be loaded. This may happen if you are in low-memory conditions, or if the note is very large in size. We recommend breaking up large notes into smaller chunks using the desktop or web app.\n\nItems:\n' @@ -227,25 +234,23 @@ export class MobileDeviceInterface implements DeviceInterface { ): Promise { const keychain = await this.getRawKeychainValue() - if (isLegacyIdentifier(identifier)) { - return keychain as unknown as NamespacedRootKeyInKeychain - } - if (!keychain) { return } - return keychain[identifier] + const namespacedValue = keychain[identifier] + + if (!namespacedValue && isLegacyIdentifier(identifier)) { + return keychain as unknown as NamespacedRootKeyInKeychain + } + + return namespacedValue } async setNamespacedKeychainValue( value: NamespacedRootKeyInKeychain, identifier: ApplicationIdentifier, ): Promise { - if (isLegacyIdentifier(identifier)) { - await Keychain.setKeys(value) - } - let keychain = await this.getRawKeychainValue() if (!keychain) { @@ -259,16 +264,17 @@ export class MobileDeviceInterface implements DeviceInterface { } async clearNamespacedKeychainValue(identifier: ApplicationIdentifier): Promise { - if (isLegacyIdentifier(identifier)) { - await this.clearRawKeychainValue() - } - const keychain = await this.getRawKeychainValue() if (!keychain) { return } + if (!keychain[identifier] && isLegacyIdentifier(identifier) && isLegacyMobileKeychain(keychain)) { + await this.clearRawKeychainValue() + return + } + delete keychain[identifier] await Keychain.setKeys(keychain) }