diff --git a/SSKeychain/SSKeychain.h b/SSKeychain/SSKeychain.h index 94fa0d0..739111b 100644 --- a/SSKeychain/SSKeychain.h +++ b/SSKeychain/SSKeychain.h @@ -132,7 +132,7 @@ extern NSString *const kSSKeychainWhereKey; #pragma mark - Configuration -#if __IPHONE_4_0 && TARGET_OS_IPHONE +#ifdef SSKEYCHAIN_ACCESSIBLE_AVAILABLE /** Returns the accessibility type for all future passwords saved to the Keychain. diff --git a/SSKeychain/SSKeychain.m b/SSKeychain/SSKeychain.m index 36337ba..d38f551 100644 --- a/SSKeychain/SSKeychain.m +++ b/SSKeychain/SSKeychain.m @@ -17,7 +17,7 @@ NSString *const kSSKeychainLastModifiedKey = @"mdat"; NSString *const kSSKeychainWhereKey = @"svce"; -#if __IPHONE_4_0 && TARGET_OS_IPHONE +#ifdef SSKEYCHAIN_ACCESSIBLE_AVAILABLE static CFTypeRef SSKeychainAccessibilityType = NULL; #endif @@ -76,7 +76,7 @@ + (NSArray *)accountsForService:(NSString *)serviceName { } -#if __IPHONE_4_0 && TARGET_OS_IPHONE +#ifdef SSKEYCHAIN_ACCESSIBLE_AVAILABLE + (CFTypeRef)accessibilityType { return SSKeychainAccessibilityType; } diff --git a/SSKeychain/SSKeychainQuery.h b/SSKeychain/SSKeychainQuery.h index 7035db3..9784072 100644 --- a/SSKeychain/SSKeychainQuery.h +++ b/SSKeychain/SSKeychainQuery.h @@ -22,6 +22,15 @@ typedef NS_ENUM(NSUInteger, SSKeychainQuerySynchronizationMode) { }; #endif +#if __IPHONE_4_0 || __MAC_10_9 + #define SSKEYCHAIN_ACCESSIBLE_AVAILABLE 1 +#endif + +#if __IPHONE_3_0 || __MAC_10_9 + #define SSKEYCHAIN_ACCESSGROUP_AVAILABLE 1 +#endif + + /** Simple interface for querying or modifying keychain items. */ @@ -36,8 +45,19 @@ typedef NS_ENUM(NSUInteger, SSKeychainQuerySynchronizationMode) { /** kSecAttrLabel */ @property (nonatomic, copy) NSString *label; -#if __IPHONE_3_0 && TARGET_OS_IPHONE -/** kSecAttrAccessGroup (only used on iOS) */ +/** kSecAttrComment **/ +@property (nonatomic, copy) NSString *comment; + +#ifdef SSKEYCHAIN_ACCESSIBLE_AVAILABLE +/** + kSecAttrAccessible + Sets the accessibility type for an individual item. If set, this overrides +[SSKeychain accessibilityType]. + */ +@property (nonatomic, copy) __attribute__((NSObject)) CFTypeRef accessibilityType; +#endif + +#if SSKEYCHAIN_ACCESSGROUP_AVAILABLE +/** kSecAttrAccessGroup */ @property (nonatomic, copy) NSString *accessGroup; #endif diff --git a/SSKeychain/SSKeychainQuery.m b/SSKeychain/SSKeychainQuery.m index b93c620..d8796a3 100644 --- a/SSKeychain/SSKeychainQuery.m +++ b/SSKeychain/SSKeychainQuery.m @@ -16,7 +16,7 @@ @implementation SSKeychainQuery @synthesize label = _label; @synthesize passwordData = _passwordData; -#if __IPHONE_3_0 && TARGET_OS_IPHONE +#if SSKEYCHAIN_ACCESSGROUP_AVAILABLE @synthesize accessGroup = _accessGroup; #endif @@ -42,8 +42,13 @@ - (BOOL)save:(NSError *__autoreleasing *)error { if (self.label) { [query setObject:self.label forKey:(__bridge id)kSecAttrLabel]; } -#if __IPHONE_4_0 && TARGET_OS_IPHONE - CFTypeRef accessibilityType = [SSKeychain accessibilityType]; + + if (self.comment) { + [query setObject:self.comment forKey:(__bridge id)kSecAttrComment]; + } + +#ifdef SSKEYCHAIN_ACCESSIBLE_AVAILABLE + CFTypeRef accessibilityType = self.accessibilityType ?: [SSKeychain accessibilityType]; if (accessibilityType) { [query setObject:(__bridge id)accessibilityType forKey:(__bridge id)kSecAttrAccessible]; } @@ -187,7 +192,7 @@ - (NSMutableDictionary *)query { [dictionary setObject:self.account forKey:(__bridge id)kSecAttrAccount]; } -#if __IPHONE_3_0 && TARGET_OS_IPHONE && !TARGET_IPHONE_SIMULATOR +#if SSKEYCHAIN_ACCESSGROUP_AVAILABLE && !TARGET_IPHONE_SIMULATOR if (self.accessGroup) { [dictionary setObject:self.accessGroup forKey:(__bridge id)kSecAttrAccessGroup]; } diff --git a/Tests/SSKeychainTests.m b/Tests/SSKeychainTests.m index e3d18c8..278eb6b 100644 --- a/Tests/SSKeychainTests.m +++ b/Tests/SSKeychainTests.m @@ -171,7 +171,7 @@ - (void)testSSKeychain { XCTAssertTrue([SSKeychain setPassword:kSSKeychainPassword forService:kSSKeychainServiceName account:kSSKeychainAccountName], @"Unable to save item"); XCTAssertTrue([SSKeychain deletePasswordForService:kSSKeychainServiceName account:kSSKeychainAccountName], @"Unable to delete password"); -#if __IPHONE_4_0 && TARGET_OS_IPHONE +#ifdef SSKEYCHAIN_ACCESSIBLE_AVAILABLE [SSKeychain setAccessibilityType:kSecAttrAccessibleWhenUnlockedThisDeviceOnly]; XCTAssertTrue([SSKeychain accessibilityType] == kSecAttrAccessibleWhenUnlockedThisDeviceOnly, @"Unable to verify accessibilityType"); #endif