diff --git a/ios/AuthsignalPushModule.m b/ios/AuthsignalPushModule.m index 2207b72..290de69 100644 --- a/ios/AuthsignalPushModule.m +++ b/ios/AuthsignalPushModule.m @@ -12,6 +12,7 @@ @interface RCT_EXTERN_MODULE(AuthsignalPushModule, NSObject) rejecter:(RCTPromiseRejectBlock)reject) RCT_EXTERN_METHOD(addCredential:(NSString)token + withKeychainAccess:(NSString)keychainAccess resolver:(RCTPromiseResolveBlock)resolve rejecter:(RCTPromiseRejectBlock)reject) diff --git a/ios/AuthsignalPushModule.swift b/ios/AuthsignalPushModule.swift index 504f65c..b4ecc95 100644 --- a/ios/AuthsignalPushModule.swift +++ b/ios/AuthsignalPushModule.swift @@ -51,6 +51,7 @@ class AuthsignalPushModule: NSObject { @objc func addCredential( _ token: NSString?, + withKeychainAccess keychainAccess: NSString, resolver resolve: @escaping RCTPromiseResolveBlock, rejecter reject: @escaping RCTPromiseRejectBlock ) -> Void { @@ -60,7 +61,8 @@ class AuthsignalPushModule: NSObject { } let tokenStr = token as String? - let keychainAccess: KeychainAccess = .whenUnlockedThisDeviceOnly + + let keychainAccess = getKeychainAccess(value: keychainAccess as String?) Task.init { let response = await authsignal.addCredential(token: tokenStr, keychainAccess: keychainAccess) @@ -154,4 +156,26 @@ class AuthsignalPushModule: NSObject { } } } + + func getKeychainAccess(value: String?) -> KeychainAccess { + switch value { + case "afterFirstUnlock": + return .afterFirstUnlock + + case "afterFirstUnlockThisDeviceOnly": + return .afterFirstUnlockThisDeviceOnly + + case "whenUnlocked": + return .whenUnlocked + + case "whenUnlockedThisDeviceOnly": + return .whenUnlockedThisDeviceOnly + + case "afterFirstUnlock": + return .whenPasscodeSetThisDeviceOnly + + default: + return .whenUnlockedThisDeviceOnly + } + } } diff --git a/package.json b/package.json index 84ef048..eca8619 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "react-native-authsignal", - "version": "1.3.1", + "version": "1.3.2", "description": "The official Authsignal React Native library.", "main": "lib/commonjs/index", "module": "lib/module/index", diff --git a/src/push.ts b/src/push.ts index 0d8a5b7..e04b7a8 100644 --- a/src/push.ts +++ b/src/push.ts @@ -1,7 +1,8 @@ -import { NativeModules } from 'react-native'; +import { NativeModules, Platform } from 'react-native'; import { handleErrorCodes, LINKING_ERROR } from './error'; import type { AuthsignalResponse, + KeychainAccess, PushChallenge, PushCredential, } from './types'; @@ -27,6 +28,7 @@ const AuthsignalPushModule = NativeModules.AuthsignalPushModule interface AddCredentialInput { token?: string; + keychainAccess?: KeychainAccess; } interface UpdateChallengeInput { @@ -62,13 +64,17 @@ export class AuthsignalPush { } } - async addCredential({ token }: AddCredentialInput = {}): Promise< - AuthsignalResponse - > { + async addCredential({ + token, + keychainAccess, + }: AddCredentialInput = {}): Promise> { await this.ensureModuleIsInitialized(); try { - const data = await AuthsignalPushModule.addCredential(token); + const data = + Platform.OS === 'ios' + ? await AuthsignalPushModule.addCredential(token, keychainAccess) + : await AuthsignalPushModule.addCredential(token); return { data }; } catch (ex) { diff --git a/src/types.ts b/src/types.ts index 76236a6..6d8cd54 100644 --- a/src/types.ts +++ b/src/types.ts @@ -87,3 +87,11 @@ export interface VerifyDeviceResponse { userAuthenticatorId: string; username?: string; } + +export enum KeychainAccess { + afterFirstUnlock = 'afterFirstUnlock', + afterFirstUnlockThisDeviceOnly = 'afterFirstUnlockThisDeviceOnly', + whenUnlocked = 'whenUnlocked', + whenUnlockedThisDeviceOnly = 'whenUnlockedThisDeviceOnly', + whenPasscodeSetThisDeviceOnly = 'whenPasscodeSetThisDeviceOnly', +}