Skip to content

Commit 97717e7

Browse files
feat: add accessGroup support for get credentials (#722)
Co-authored-by: Dorian Mazur <46839236+DorianMazur@users.noreply.github.com>
1 parent 0f7f94f commit 97717e7

File tree

2 files changed

+32
-9
lines changed

2 files changed

+32
-9
lines changed

ios/RNKeychainManager/RNKeychainManager.m

Lines changed: 28 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -273,11 +273,16 @@ - (void)hasCredentialsWithSecClass:(CFTypeRef)secClass
273273
rejecter:(RCTPromiseRejectBlock)reject
274274
{
275275
CFBooleanRef cloudSync = cloudSyncValue(options);
276+
NSString *accessGroup = accessGroupValue(options);
276277
NSMutableDictionary *queryParts = [[NSMutableDictionary alloc] init];
277278
queryParts[(__bridge NSString *)kSecClass] = (__bridge id)(secClass),
278279
queryParts[(__bridge NSString *)kSecMatchLimit] = (__bridge NSString *)kSecMatchLimitOne;
279280
queryParts[(__bridge NSString *)kSecAttrSynchronizable] = (__bridge id)(cloudSync);
280281

282+
if (accessGroup != nil) {
283+
queryParts[(__bridge NSString *)kSecAttrAccessGroup] = accessGroup;
284+
}
285+
281286
if (secClass == kSecClassInternetPassword) {
282287
queryParts[(__bridge NSString *)kSecAttrServer] = serverValue(options);
283288
} else {
@@ -310,13 +315,19 @@ - (OSStatus)deletePasswordsForOptions:(NSDictionary *)options
310315
{
311316
NSString *service = serviceValue(options);
312317
CFBooleanRef cloudSync = cloudSyncValue(options);
313-
NSDictionary *query = @{
318+
NSString *accessGroup = accessGroupValue(options);
319+
320+
NSMutableDictionary *query = [@{
314321
(__bridge NSString *)kSecClass: (__bridge id)(kSecClassGenericPassword),
315322
(__bridge NSString *)kSecAttrService: service,
316323
(__bridge NSString *)kSecAttrSynchronizable: (__bridge id)cloudSync,
317324
(__bridge NSString *)kSecReturnAttributes: (__bridge id)kCFBooleanTrue,
318325
(__bridge NSString *)kSecReturnData: (__bridge id)kCFBooleanFalse
319-
};
326+
} mutableCopy];
327+
328+
if (accessGroup != nil) {
329+
query[(__bridge NSString *)kSecAttrAccessGroup] = accessGroup;
330+
}
320331

321332
return SecItemDelete((__bridge CFDictionaryRef) query);
322333
}
@@ -443,16 +454,21 @@ - (OSStatus)deleteCredentialsForServer:(NSString *)server withOptions:(NSDiction
443454
NSString *service = serviceValue(options);
444455
NSString *authenticationPrompt = authenticationPromptValue(options);
445456
CFBooleanRef cloudSync = cloudSyncValue(options);
457+
NSString *accessGroup = accessGroupValue(options);
446458

447-
NSDictionary *query = @{
459+
NSMutableDictionary *query = [@{
448460
(__bridge NSString *)kSecClass: (__bridge id)(kSecClassGenericPassword),
449461
(__bridge NSString *)kSecAttrService: service,
450462
(__bridge NSString *)kSecAttrSynchronizable: (__bridge id)(cloudSync),
451463
(__bridge NSString *)kSecReturnAttributes: (__bridge id)kCFBooleanTrue,
452464
(__bridge NSString *)kSecReturnData: (__bridge id)kCFBooleanTrue,
453465
(__bridge NSString *)kSecMatchLimit: (__bridge NSString *)kSecMatchLimitOne,
454466
(__bridge NSString *)kSecUseOperationPrompt: authenticationPrompt
455-
};
467+
} mutableCopy];
468+
469+
if (accessGroup != nil) {
470+
query[(__bridge NSString *)kSecAttrAccessGroup] = accessGroup;
471+
}
456472

457473
// Look up service in the keychain
458474
NSDictionary *found = nil;
@@ -550,15 +566,21 @@ - (OSStatus)deleteCredentialsForServer:(NSString *)server withOptions:(NSDiction
550566
{
551567
CFBooleanRef cloudSync = cloudSyncValue(options);
552568
NSString *authenticationPrompt = authenticationPromptValue(options);
553-
NSDictionary *query = @{
569+
NSString *accessGroup = accessGroupValue(options);
570+
571+
NSMutableDictionary *query = [@{
554572
(__bridge NSString *)kSecClass: (__bridge id)(kSecClassInternetPassword),
555573
(__bridge NSString *)kSecAttrServer: server,
556574
(__bridge NSString *)kSecReturnAttributes: (__bridge id)kCFBooleanTrue,
557575
(__bridge NSString *)kSecAttrSynchronizable: (__bridge id)(cloudSync),
558576
(__bridge NSString *)kSecReturnData: (__bridge id)kCFBooleanTrue,
559577
(__bridge NSString *)kSecMatchLimit: (__bridge NSString *)kSecMatchLimitOne,
560578
(__bridge NSString *)kSecUseOperationPrompt: authenticationPrompt
561-
};
579+
} mutableCopy];
580+
581+
if (accessGroup != nil) {
582+
query[(__bridge NSString *)kSecAttrAccessGroup] = accessGroup;
583+
}
562584

563585
// Look up server in the keychain
564586
NSDictionary *found = nil;

src/types.ts

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -37,13 +37,14 @@ export type BaseOptions = {
3737
* @platform iOS
3838
*/
3939
cloudSync?: boolean;
40-
};
41-
42-
export type SetOptions = {
4340
/** The access group to share keychain items between apps.
4441
* @platform iOS, visionOS
4542
*/
4643
accessGroup?: string;
44+
};
45+
46+
/** Base options for keychain functions. */
47+
export type SetOptions = {
4748
/** Specifies when a keychain item is accessible.
4849
* @platform iOS, visionOS
4950
* @default ACCESSIBLE.AFTER_FIRST_UNLOCK

0 commit comments

Comments
 (0)