From 83b9d5c682b21d88133f24da0f94dd56bd79e687 Mon Sep 17 00:00:00 2001
From: 单军华
Date: Thu, 19 Jul 2018 13:38:55 +0800
Subject: [PATCH] change
---
screendisplay/Pods/UICKeyChainStore/Lib/UICKeyChainStore/UICKeyChainStore.m | 1392 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
1 files changed, 1,392 insertions(+), 0 deletions(-)
diff --git a/screendisplay/Pods/UICKeyChainStore/Lib/UICKeyChainStore/UICKeyChainStore.m b/screendisplay/Pods/UICKeyChainStore/Lib/UICKeyChainStore/UICKeyChainStore.m
new file mode 100755
index 0000000..ace499b
--- /dev/null
+++ b/screendisplay/Pods/UICKeyChainStore/Lib/UICKeyChainStore/UICKeyChainStore.m
@@ -0,0 +1,1392 @@
+//
+// UICKeyChainStore.m
+// UICKeyChainStore
+//
+// Created by Kishikawa Katsumi on 11/11/20.
+// Copyright (c) 2011 Kishikawa Katsumi. All rights reserved.
+//
+
+#import "UICKeyChainStore.h"
+
+NSString * const UICKeyChainStoreErrorDomain = @"com.kishikawakatsumi.uickeychainstore";
+static NSString *_defaultService;
+
+@interface UICKeyChainStore ()
+
+@end
+
+@implementation UICKeyChainStore
+
++ (NSString *)defaultService
+{
+ if (!_defaultService) {
+ _defaultService = [[NSBundle mainBundle] bundleIdentifier] ?: @"";
+ }
+
+ return _defaultService;
+}
+
++ (void)setDefaultService:(NSString *)defaultService
+{
+ _defaultService = defaultService;
+}
+
+#pragma mark -
+
++ (UICKeyChainStore *)keyChainStore
+{
+ return [[self alloc] initWithService:nil accessGroup:nil];
+}
+
++ (UICKeyChainStore *)keyChainStoreWithService:(NSString *)service
+{
+ return [[self alloc] initWithService:service accessGroup:nil];
+}
+
++ (UICKeyChainStore *)keyChainStoreWithService:(NSString *)service accessGroup:(NSString *)accessGroup
+{
+ return [[self alloc] initWithService:service accessGroup:accessGroup];
+}
+
+#pragma mark -
+
++ (UICKeyChainStore *)keyChainStoreWithServer:(NSURL *)server protocolType:(UICKeyChainStoreProtocolType)protocolType
+{
+ return [[self alloc] initWithServer:server protocolType:protocolType authenticationType:UICKeyChainStoreAuthenticationTypeDefault];
+}
+
++ (UICKeyChainStore *)keyChainStoreWithServer:(NSURL *)server protocolType:(UICKeyChainStoreProtocolType)protocolType authenticationType:(UICKeyChainStoreAuthenticationType)authenticationType
+{
+ return [[self alloc] initWithServer:server protocolType:protocolType authenticationType:authenticationType];
+}
+
+#pragma mark -
+
+- (instancetype)init
+{
+ return [self initWithService:[self.class defaultService] accessGroup:nil];
+}
+
+- (instancetype)initWithService:(NSString *)service
+{
+ return [self initWithService:service accessGroup:nil];
+}
+
+- (instancetype)initWithService:(NSString *)service accessGroup:(NSString *)accessGroup
+{
+ self = [super init];
+ if (self) {
+ _itemClass = UICKeyChainStoreItemClassGenericPassword;
+
+ if (!service) {
+ service = [self.class defaultService];
+ }
+ _service = service.copy;
+ _accessGroup = accessGroup.copy;
+ [self commonInit];
+ }
+
+ return self;
+}
+
+#pragma mark -
+
+- (instancetype)initWithServer:(NSURL *)server protocolType:(UICKeyChainStoreProtocolType)protocolType
+{
+ return [self initWithServer:server protocolType:protocolType authenticationType:UICKeyChainStoreAuthenticationTypeDefault];
+}
+
+- (instancetype)initWithServer:(NSURL *)server protocolType:(UICKeyChainStoreProtocolType)protocolType authenticationType:(UICKeyChainStoreAuthenticationType)authenticationType
+{
+ self = [super init];
+ if (self) {
+ _itemClass = UICKeyChainStoreItemClassInternetPassword;
+
+ _server = server.copy;
+ _protocolType = protocolType;
+ _authenticationType = authenticationType;
+
+ [self commonInit];
+ }
+
+ return self;
+}
+
+#pragma mark -
+
+- (void)commonInit
+{
+ _accessibility = UICKeyChainStoreAccessibilityAfterFirstUnlock;
+}
+
+#pragma mark -
+
++ (NSString *)stringForKey:(NSString *)key
+{
+ return [self stringForKey:key service:nil accessGroup:nil error:nil];
+}
+
++ (NSString *)stringForKey:(NSString *)key error:(NSError *__autoreleasing *)error
+{
+ return [self stringForKey:key service:nil accessGroup:nil error:error];
+}
+
++ (NSString *)stringForKey:(NSString *)key service:(NSString *)service
+{
+ return [self stringForKey:key service:service accessGroup:nil error:nil];
+}
+
++ (NSString *)stringForKey:(NSString *)key service:(NSString *)service error:(NSError *__autoreleasing *)error
+{
+ return [self stringForKey:key service:service accessGroup:nil error:error];
+}
+
++ (NSString *)stringForKey:(NSString *)key service:(NSString *)service accessGroup:(NSString *)accessGroup
+{
+ return [self stringForKey:key service:service accessGroup:accessGroup error:nil];
+}
+
++ (NSString *)stringForKey:(NSString *)key service:(NSString *)service accessGroup:(NSString *)accessGroup error:(NSError *__autoreleasing *)error
+{
+ if (!key) {
+ NSError *e = [self argumentError:NSLocalizedString(@"the key must not to be nil", nil)];
+ if (error) {
+ *error = e;
+ }
+ return nil;
+ }
+ if (!service) {
+ service = [self defaultService];
+ }
+
+ UICKeyChainStore *keychain = [UICKeyChainStore keyChainStoreWithService:service accessGroup:accessGroup];
+ return [keychain stringForKey:key error:error];
+}
+
+#pragma mark -
+
++ (BOOL)setString:(NSString *)value forKey:(NSString *)key
+{
+ return [self setString:value forKey:key service:nil accessGroup:nil genericAttribute:nil error:nil];
+}
+
++ (BOOL)setString:(NSString *)value forKey:(NSString *)key error:(NSError *__autoreleasing *)error
+{
+ return [self setString:value forKey:key service:nil accessGroup:nil genericAttribute:nil error:error];
+}
+
++ (BOOL)setString:(NSString *)value forKey:(NSString *)key genericAttribute:(id)genericAttribute
+{
+ return [self setString:value forKey:key service:nil accessGroup:nil genericAttribute:genericAttribute error:nil];
+}
+
++ (BOOL)setString:(NSString *)value forKey:(NSString *)key genericAttribute:(id)genericAttribute error:(NSError * __autoreleasing *)error
+{
+ return [self setString:value forKey:key service:nil accessGroup:nil genericAttribute:genericAttribute error:error];
+}
+
++ (BOOL)setString:(NSString *)value forKey:(NSString *)key service:(NSString *)service
+{
+ return [self setString:value forKey:key service:service accessGroup:nil genericAttribute:nil error:nil];
+}
+
++ (BOOL)setString:(NSString *)value forKey:(NSString *)key service:(NSString *)service error:(NSError *__autoreleasing *)error
+{
+ return [self setString:value forKey:key service:service accessGroup:nil genericAttribute:nil error:error];
+}
+
++ (BOOL)setString:(NSString *)value forKey:(NSString *)key service:(NSString *)service genericAttribute:(id)genericAttribute
+{
+ return [self setString:value forKey:key service:service accessGroup:nil genericAttribute:genericAttribute error:nil];
+}
+
++ (BOOL)setString:(NSString *)value forKey:(NSString *)key service:(NSString *)service genericAttribute:(id)genericAttribute error:(NSError * __autoreleasing *)error
+{
+ return [self setString:value forKey:key service:service accessGroup:nil genericAttribute:genericAttribute error:error];
+}
+
++ (BOOL)setString:(NSString *)value forKey:(NSString *)key service:(NSString *)service accessGroup:(NSString *)accessGroup
+{
+ return [self setString:value forKey:key service:service accessGroup:accessGroup genericAttribute:nil error:nil];
+}
+
++ (BOOL)setString:(NSString *)value forKey:(NSString *)key service:(NSString *)service accessGroup:(NSString *)accessGroup error:(NSError *__autoreleasing *)error
+{
+ return [self setString:value forKey:key service:service accessGroup:accessGroup genericAttribute:nil error:error];
+}
+
++ (BOOL)setString:(NSString *)value forKey:(NSString *)key service:(NSString *)service accessGroup:(NSString *)accessGroup genericAttribute:(id)genericAttribute
+{
+ return [self setString:value forKey:key service:service accessGroup:accessGroup genericAttribute:genericAttribute error:nil];
+}
+
++ (BOOL)setString:(NSString *)value forKey:(NSString *)key service:(NSString *)service accessGroup:(NSString *)accessGroup genericAttribute:(id)genericAttribute error:(NSError * __autoreleasing *)error
+{
+ if (!value) {
+ return [self removeItemForKey:key service:service accessGroup:accessGroup error:error];
+ }
+ NSData *data = [value dataUsingEncoding:NSUTF8StringEncoding];
+ if (data) {
+ return [self setData:data forKey:key service:service accessGroup:accessGroup genericAttribute:genericAttribute error:error];
+ }
+ NSError *e = [self conversionError:NSLocalizedString(@"failed to convert string to data", nil)];
+ if (error) {
+ *error = e;
+ }
+ return NO;
+}
+
+#pragma mark -
+
++ (NSData *)dataForKey:(NSString *)key
+{
+ return [self dataForKey:key service:nil accessGroup:nil error:nil];
+}
+
++ (NSData *)dataForKey:(NSString *)key error:(NSError *__autoreleasing *)error
+{
+ return [self dataForKey:key service:nil accessGroup:nil error:error];
+}
+
++ (NSData *)dataForKey:(NSString *)key service:(NSString *)service
+{
+ return [self dataForKey:key service:service accessGroup:nil error:nil];
+}
+
++ (NSData *)dataForKey:(NSString *)key service:(NSString *)service error:(NSError *__autoreleasing *)error
+{
+ return [self dataForKey:key service:service accessGroup:nil error:error];
+}
+
++ (NSData *)dataForKey:(NSString *)key service:(NSString *)service accessGroup:(NSString *)accessGroup
+{
+ return [self dataForKey:key service:service accessGroup:accessGroup error:nil];
+}
+
++ (NSData *)dataForKey:(NSString *)key service:(NSString *)service accessGroup:(NSString *)accessGroup error:(NSError *__autoreleasing *)error
+{
+ if (!key) {
+ NSError *e = [self argumentError:NSLocalizedString(@"the key must not to be nil", nil)];
+ if (error) {
+ *error = e;
+ }
+ return nil;
+ }
+ if (!service) {
+ service = [self defaultService];
+ }
+
+ UICKeyChainStore *keychain = [UICKeyChainStore keyChainStoreWithService:service accessGroup:accessGroup];
+ return [keychain dataForKey:key error:error];
+}
+
+#pragma mark -
+
++ (BOOL)setData:(NSData *)data forKey:(NSString *)key
+{
+ return [self setData:data forKey:key service:nil accessGroup:nil genericAttribute:nil error:nil];
+}
+
++ (BOOL)setData:(NSData *)data forKey:(NSString *)key error:(NSError *__autoreleasing *)error
+{
+ return [self setData:data forKey:key service:nil accessGroup:nil genericAttribute:nil error:error];
+}
+
++ (BOOL)setData:(NSData *)data forKey:(NSString *)key genericAttribute:(id)genericAttribute
+{
+ return [self setData:data forKey:key service:nil accessGroup:nil genericAttribute:genericAttribute error:nil];
+}
+
++ (BOOL)setData:(NSData *)data forKey:(NSString *)key genericAttribute:(id)genericAttribute error:(NSError * __autoreleasing *)error
+{
+ return [self setData:data forKey:key service:nil accessGroup:nil genericAttribute:genericAttribute error:error];
+}
+
++ (BOOL)setData:(NSData *)data forKey:(NSString *)key service:(NSString *)service
+{
+ return [self setData:data forKey:key service:service accessGroup:nil genericAttribute:nil error:nil];
+}
+
++ (BOOL)setData:(NSData *)data forKey:(NSString *)key service:(NSString *)service error:(NSError *__autoreleasing *)error
+{
+ return [self setData:data forKey:key service:service accessGroup:nil genericAttribute:nil error:error];
+}
+
++ (BOOL)setData:(NSData *)data forKey:(NSString *)key service:(NSString *)service genericAttribute:(id)genericAttribute
+{
+ return [self setData:data forKey:key service:service accessGroup:nil genericAttribute:genericAttribute error:nil];
+}
+
++ (BOOL)setData:(NSData *)data forKey:(NSString *)key service:(NSString *)service genericAttribute:(id)genericAttribute error:(NSError * __autoreleasing *)error
+{
+ return [self setData:data forKey:key service:service accessGroup:nil genericAttribute:genericAttribute error:error];
+}
+
++ (BOOL)setData:(NSData *)data forKey:(NSString *)key service:(NSString *)service accessGroup:(NSString *)accessGroup
+{
+ return [self setData:data forKey:key service:service accessGroup:accessGroup genericAttribute:nil error:nil];
+}
+
++ (BOOL)setData:(NSData *)data forKey:(NSString *)key service:(NSString *)service accessGroup:(NSString *)accessGroup error:(NSError *__autoreleasing *)error
+{
+ return [self setData:data forKey:key service:service accessGroup:accessGroup genericAttribute:nil error:error];
+}
+
++ (BOOL)setData:(NSData *)data forKey:(NSString *)key service:(NSString *)service accessGroup:(NSString *)accessGroup genericAttribute:(id)genericAttribute
+{
+ return [self setData:data forKey:key service:service accessGroup:accessGroup genericAttribute:genericAttribute error:nil];
+}
+
++ (BOOL)setData:(NSData *)data forKey:(NSString *)key service:(NSString *)service accessGroup:(NSString *)accessGroup genericAttribute:(id)genericAttribute error:(NSError * __autoreleasing *)error
+{
+ if (!key) {
+ NSError *e = [self argumentError:NSLocalizedString(@"the key must not to be nil", nil)];
+ if (error) {
+ *error = e;
+ }
+ return NO;
+ }
+ if (!service) {
+ service = [self defaultService];
+ }
+
+ UICKeyChainStore *keychain = [UICKeyChainStore keyChainStoreWithService:service accessGroup:accessGroup];
+ return [keychain setData:data forKey:key genericAttribute:genericAttribute];
+}
+
+#pragma mark -
+
+- (BOOL)contains:(NSString *)key
+{
+ NSMutableDictionary *query = [self query];
+ query[(__bridge __strong id)kSecAttrAccount] = key;
+
+ OSStatus status = SecItemCopyMatching((__bridge CFDictionaryRef)query, NULL);
+ return status == errSecSuccess;
+}
+
+#pragma mark -
+
+- (NSString *)stringForKey:(id)key
+{
+ return [self stringForKey:key error:nil];
+}
+
+- (NSString *)stringForKey:(id)key error:(NSError *__autoreleasing *)error
+{
+ NSData *data = [self dataForKey:key error:error];
+ if (data) {
+ NSString *string = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
+ if (string) {
+ return string;
+ }
+ NSError *e = [self.class conversionError:NSLocalizedString(@"failed to convert data to string", nil)];
+ if (error) {
+ *error = e;
+ }
+ return nil;
+ }
+
+ return nil;
+}
+
+#pragma mark -
+
+- (BOOL)setString:(NSString *)string forKey:(NSString *)key
+{
+ return [self setString:string forKey:key genericAttribute:nil label:nil comment:nil error:nil];
+}
+
+- (BOOL)setString:(NSString *)string forKey:(NSString *)key error:(NSError *__autoreleasing *)error
+{
+ return [self setString:string forKey:key genericAttribute:nil label:nil comment:nil error:error];
+}
+
+- (BOOL)setString:(NSString *)string forKey:(NSString *)key genericAttribute:(id)genericAttribute
+{
+ return [self setString:string forKey:key genericAttribute:genericAttribute label:nil comment:nil error:nil];
+}
+
+- (BOOL)setString:(NSString *)string forKey:(NSString *)key genericAttribute:(id)genericAttribute error:(NSError * __autoreleasing *)error
+{
+ return [self setString:string forKey:key genericAttribute:genericAttribute label:nil comment:nil error:error];
+}
+
+- (BOOL)setString:(NSString *)string forKey:(NSString *)key label:(NSString *)label comment:(NSString *)comment
+{
+ return [self setString:string forKey:key genericAttribute:nil label:label comment:comment error:nil];
+}
+
+- (BOOL)setString:(NSString *)string forKey:(NSString *)key label:(NSString *)label comment:(NSString *)comment error:(NSError *__autoreleasing *)error
+{
+ return [self setString:string forKey:key genericAttribute:nil label:label comment:comment error:error];
+}
+
+- (BOOL)setString:(NSString *)string forKey:(NSString *)key genericAttribute:(id)genericAttribute label:(NSString *)label comment:(NSString *)comment error:(NSError *__autoreleasing *)error
+{
+ if (!string) {
+ return [self removeItemForKey:key error:error];
+ }
+ NSData *data = [string dataUsingEncoding:NSUTF8StringEncoding];
+ if (data) {
+ return [self setData:data forKey:key genericAttribute:genericAttribute label:label comment:comment error:error];
+ }
+ NSError *e = [self.class conversionError:NSLocalizedString(@"failed to convert string to data", nil)];
+ if (error) {
+ *error = e;
+ }
+ return NO;
+}
+
+#pragma mark -
+
+- (NSData *)dataForKey:(NSString *)key
+{
+ return [self dataForKey:key error:nil];
+}
+
+- (NSData *)dataForKey:(NSString *)key error:(NSError *__autoreleasing *)error
+{
+ NSMutableDictionary *query = [self query];
+ query[(__bridge __strong id)kSecMatchLimit] = (__bridge id)kSecMatchLimitOne;
+ query[(__bridge __strong id)kSecReturnData] = (__bridge id)kCFBooleanTrue;
+
+ query[(__bridge __strong id)kSecAttrAccount] = key;
+
+ CFTypeRef data = nil;
+ OSStatus status = SecItemCopyMatching((__bridge CFDictionaryRef)query, &data);
+
+ if (status == errSecSuccess) {
+ NSData *ret = [NSData dataWithData:(__bridge NSData *)data];
+ if (data) {
+ CFRelease(data);
+ return ret;
+ } else {
+ NSError *e = [self.class unexpectedError:NSLocalizedString(@"Unexpected error has occurred.", nil)];
+ if (error) {
+ *error = e;
+ }
+ return nil;
+ }
+ } else if (status == errSecItemNotFound) {
+ return nil;
+ }
+
+ NSError *e = [self.class securityError:status];
+ if (error) {
+ *error = e;
+ }
+ return nil;
+}
+
+#pragma mark -
+
+- (BOOL)setData:(NSData *)data forKey:(NSString *)key
+{
+ return [self setData:data forKey:key genericAttribute:nil label:nil comment:nil error:nil];
+}
+
+- (BOOL)setData:(NSData *)data forKey:(NSString *)key error:(NSError *__autoreleasing *)error
+{
+ return [self setData:data forKey:key genericAttribute:nil label:nil comment:nil error:error];
+}
+
+- (BOOL)setData:(NSData *)data forKey:(NSString *)key genericAttribute:(id)genericAttribute
+{
+ return [self setData:data forKey:key genericAttribute:genericAttribute label:nil comment:nil error:nil];
+}
+
+- (BOOL)setData:(NSData *)data forKey:(NSString *)key genericAttribute:(id)genericAttribute error:(NSError * __autoreleasing *)error
+{
+ return [self setData:data forKey:key genericAttribute:genericAttribute label:nil comment:nil error:error];
+}
+
+- (BOOL)setData:(NSData *)data forKey:(NSString *)key label:(NSString *)label comment:(NSString *)comment
+{
+ return [self setData:data forKey:key genericAttribute:nil label:label comment:comment error:nil];
+}
+
+- (BOOL)setData:(NSData *)data forKey:(NSString *)key label:(NSString *)label comment:(NSString *)comment error:(NSError *__autoreleasing *)error
+{
+ return [self setData:data forKey:key genericAttribute:nil label:label comment:comment error:error];
+}
+
+- (BOOL)setData:(NSData *)data forKey:(NSString *)key genericAttribute:(id)genericAttribute label:(NSString *)label comment:(NSString *)comment error:(NSError *__autoreleasing *)error
+{
+ if (!key) {
+ NSError *e = [self.class argumentError:NSLocalizedString(@"the key must not to be nil", nil)];
+ if (error) {
+ *error = e;
+ }
+ return NO;
+ }
+ if (!data) {
+ return [self removeItemForKey:key error:error];
+ }
+
+ NSMutableDictionary *query = [self query];
+ query[(__bridge __strong id)kSecAttrAccount] = key;
+#if TARGET_OS_IOS
+ if (floor(NSFoundationVersionNumber) > floor(1144.17)) { // iOS 9+
+ query[(__bridge __strong id)kSecUseAuthenticationUI] = (__bridge id)kSecUseAuthenticationUIFail;
+#if __IPHONE_OS_VERSION_MIN_REQUIRED < __IPHONE_9_0
+ } else if (floor(NSFoundationVersionNumber) > floor(1047.25)) { // iOS 8+
+ query[(__bridge __strong id)kSecUseNoAuthenticationUI] = (__bridge id)kCFBooleanTrue;
+#endif
+ }
+#elif TARGET_OS_WATCH || TARGET_OS_TV
+ query[(__bridge __strong id)kSecUseAuthenticationUI] = (__bridge id)kSecUseAuthenticationUIFail;
+#endif
+
+ OSStatus status = SecItemCopyMatching((__bridge CFDictionaryRef)query, NULL);
+ if (status == errSecSuccess || status == errSecInteractionNotAllowed) {
+ query = [self query];
+ query[(__bridge __strong id)kSecAttrAccount] = key;
+
+ NSError *unexpectedError = nil;
+ NSMutableDictionary *attributes = [self attributesWithKey:nil value:data error:&unexpectedError];
+
+ if (genericAttribute) {
+ attributes[(__bridge __strong id)kSecAttrGeneric] = genericAttribute;
+ }
+ if (label) {
+ attributes[(__bridge __strong id)kSecAttrLabel] = label;
+ }
+ if (comment) {
+ attributes[(__bridge __strong id)kSecAttrComment] = comment;
+ }
+
+ if (unexpectedError) {
+ NSLog(@"error: [%@] %@", @(unexpectedError.code), NSLocalizedString(@"Unexpected error has occurred.", nil));
+ if (error) {
+ *error = unexpectedError;
+ }
+ return NO;
+ } else {
+
+ if (status == errSecInteractionNotAllowed && floor(NSFoundationVersionNumber) <= floor(1140.11)) { // iOS 8.0.x
+ if ([self removeItemForKey:key error:error]) {
+ return [self setData:data forKey:key label:label comment:comment error:error];
+ }
+ } else {
+ status = SecItemUpdate((__bridge CFDictionaryRef)query, (__bridge CFDictionaryRef)attributes);
+ }
+ if (status != errSecSuccess) {
+ NSError *e = [self.class securityError:status];
+ if (error) {
+ *error = e;
+ }
+ return NO;
+ }
+ }
+ } else if (status == errSecItemNotFound) {
+ NSError *unexpectedError = nil;
+ NSMutableDictionary *attributes = [self attributesWithKey:key value:data error:&unexpectedError];
+
+ if (genericAttribute) {
+ attributes[(__bridge __strong id)kSecAttrGeneric] = genericAttribute;
+ }
+ if (label) {
+ attributes[(__bridge __strong id)kSecAttrLabel] = label;
+ }
+ if (comment) {
+ attributes[(__bridge __strong id)kSecAttrComment] = comment;
+ }
+
+ if (unexpectedError) {
+ NSLog(@"error: [%@] %@", @(unexpectedError.code), NSLocalizedString(@"Unexpected error has occurred.", nil));
+ if (error) {
+ *error = unexpectedError;
+ }
+ return NO;
+ } else {
+ status = SecItemAdd((__bridge CFDictionaryRef)attributes, NULL);
+ if (status != errSecSuccess) {
+ NSError *e = [self.class securityError:status];
+ if (error) {
+ *error = e;
+ }
+ return NO;
+ }
+ }
+ } else {
+ NSError *e = [self.class securityError:status];
+ if (error) {
+ *error = e;
+ }
+ return NO;
+ }
+
+ return YES;
+}
+
+#pragma mark -
+
++ (BOOL)removeItemForKey:(NSString *)key
+{
+ return [self removeItemForKey:key service:nil accessGroup:nil error:nil];
+}
+
++ (BOOL)removeItemForKey:(NSString *)key error:(NSError *__autoreleasing *)error
+{
+ return [self removeItemForKey:key service:nil accessGroup:nil error:error];
+}
+
++ (BOOL)removeItemForKey:(NSString *)key service:(NSString *)service
+{
+ return [self removeItemForKey:key service:service accessGroup:nil error:nil];
+}
+
++ (BOOL)removeItemForKey:(NSString *)key service:(NSString *)service error:(NSError *__autoreleasing *)error
+{
+ return [self removeItemForKey:key service:service accessGroup:nil error:error];
+}
+
++ (BOOL)removeItemForKey:(NSString *)key service:(NSString *)service accessGroup:(NSString *)accessGroup
+{
+ return [self removeItemForKey:key service:service accessGroup:accessGroup error:nil];
+}
+
++ (BOOL)removeItemForKey:(NSString *)key service:(NSString *)service accessGroup:(NSString *)accessGroup error:(NSError *__autoreleasing *)error
+{
+ if (!key) {
+ NSError *e = [self.class argumentError:NSLocalizedString(@"the key must not to be nil", nil)];
+ if (error) {
+ *error = e;
+ }
+ return NO;
+ }
+ if (!service) {
+ service = [self defaultService];
+ }
+
+ UICKeyChainStore *keychain = [UICKeyChainStore keyChainStoreWithService:service accessGroup:accessGroup];
+ return [keychain removeItemForKey:key error:error];
+}
+
+#pragma mark -
+
++ (BOOL)removeAllItems
+{
+ return [self removeAllItemsForService:nil accessGroup:nil error:nil];
+}
+
++ (BOOL)removeAllItemsWithError:(NSError *__autoreleasing *)error
+{
+ return [self removeAllItemsForService:nil accessGroup:nil error:error];
+}
+
++ (BOOL)removeAllItemsForService:(NSString *)service
+{
+ return [self removeAllItemsForService:service accessGroup:nil error:nil];
+}
+
++ (BOOL)removeAllItemsForService:(NSString *)service error:(NSError *__autoreleasing *)error
+{
+ return [self removeAllItemsForService:service accessGroup:nil error:error];
+}
+
++ (BOOL)removeAllItemsForService:(NSString *)service accessGroup:(NSString *)accessGroup
+{
+ return [self removeAllItemsForService:service accessGroup:accessGroup error:nil];
+}
+
++ (BOOL)removeAllItemsForService:(NSString *)service accessGroup:(NSString *)accessGroup error:(NSError *__autoreleasing *)error
+{
+ UICKeyChainStore *keychain = [UICKeyChainStore keyChainStoreWithService:service accessGroup:accessGroup];
+ return [keychain removeAllItemsWithError:error];
+}
+
+#pragma mark -
+
+- (BOOL)removeItemForKey:(NSString *)key
+{
+ return [self removeItemForKey:key error:nil];
+}
+
+- (BOOL)removeItemForKey:(NSString *)key error:(NSError *__autoreleasing *)error
+{
+ NSMutableDictionary *query = [self query];
+ query[(__bridge __strong id)kSecAttrAccount] = key;
+
+ OSStatus status = SecItemDelete((__bridge CFDictionaryRef)query);
+ if (status != errSecSuccess && status != errSecItemNotFound) {
+ NSError *e = [self.class securityError:status];
+ if (error) {
+ *error = e;
+ }
+ return NO;
+ }
+
+ return YES;
+}
+
+#pragma mark -
+
+- (BOOL)removeAllItems
+{
+ return [self removeAllItemsWithError:nil];
+}
+
+- (BOOL)removeAllItemsWithError:(NSError *__autoreleasing *)error
+{
+ NSMutableDictionary *query = [self query];
+#if !TARGET_OS_IPHONE
+ query[(__bridge id)kSecMatchLimit] = (__bridge id)kSecMatchLimitAll;
+#endif
+
+ OSStatus status = SecItemDelete((__bridge CFDictionaryRef)query);
+ if (status != errSecSuccess && status != errSecItemNotFound) {
+ NSError *e = [self.class securityError:status];
+ if (error) {
+ *error = e;
+ }
+ return NO;
+ }
+
+ return YES;
+}
+
+#pragma mark -
+
+- (NSString *)objectForKeyedSubscript:(NSString <NSCopying> *)key
+{
+ return [self stringForKey:key];
+}
+
+- (void)setObject:(NSString *)obj forKeyedSubscript:(NSString <NSCopying> *)key
+{
+ if (!obj) {
+ [self removeItemForKey:key];
+ } else {
+ [self setString:obj forKey:key];
+ }
+}
+
+#pragma mark -
+
+- (NSArray UIC_KEY_TYPE *)allKeys
+{
+ NSArray *items = [self.class prettify:[self itemClassObject] items:[self items]];
+ NSMutableArray *keys = [[NSMutableArray alloc] init];
+ for (NSDictionary *item in items) {
+ NSString *key = item[@"key"];
+ if (key) {
+ [keys addObject:key];
+ }
+ }
+ return keys.copy;
+}
+
++ (NSArray UIC_KEY_TYPE *)allKeysWithItemClass:(UICKeyChainStoreItemClass)itemClass
+{
+ CFTypeRef itemClassObject = kSecClassGenericPassword;
+ if (itemClass == UICKeyChainStoreItemClassGenericPassword) {
+ itemClassObject = kSecClassGenericPassword;
+ } else if (itemClass == UICKeyChainStoreItemClassInternetPassword) {
+ itemClassObject = kSecClassInternetPassword;
+ }
+
+ NSMutableDictionary *query = [[NSMutableDictionary alloc] init];
+ query[(__bridge __strong id)kSecClass] = (__bridge id)itemClassObject;
+ query[(__bridge __strong id)kSecMatchLimit] = (__bridge id)kSecMatchLimitAll;
+ query[(__bridge __strong id)kSecReturnAttributes] = (__bridge id)kCFBooleanTrue;
+
+ CFArrayRef result = nil;
+ CFDictionaryRef cfquery = (CFDictionaryRef)CFBridgingRetain(query);
+ OSStatus status = SecItemCopyMatching(cfquery, (CFTypeRef *)&result);
+ CFRelease(cfquery);
+
+ if (status == errSecSuccess) {
+ NSArray *items = [self prettify:itemClassObject items:(__bridge NSArray *)result];
+ NSMutableArray *keys = [[NSMutableArray alloc] init];
+ for (NSDictionary *item in items) {
+ if (itemClassObject == kSecClassGenericPassword) {
+ [keys addObject:@{@"service": item[@"service"] ?: @"", @"key": item[@"key"] ?: @""}];
+ } else if (itemClassObject == kSecClassInternetPassword) {
+ [keys addObject:@{@"server": item[@"service"] ?: @"", @"key": item[@"key"] ?: @""}];
+ }
+ }
+ return keys.copy;
+ } else if (status == errSecItemNotFound) {
+ return @[];
+ }
+
+ return nil;
+}
+
++ (NSArray *)allItemsWithItemClass:(UICKeyChainStoreItemClass)itemClass
+{
+ CFTypeRef itemClassObject = kSecClassGenericPassword;
+ if (itemClass == UICKeyChainStoreItemClassGenericPassword) {
+ itemClassObject = kSecClassGenericPassword;
+ } else if (itemClass == UICKeyChainStoreItemClassInternetPassword) {
+ itemClassObject = kSecClassInternetPassword;
+ }
+
+ NSMutableDictionary *query = [[NSMutableDictionary alloc] init];
+ query[(__bridge __strong id)kSecClass] = (__bridge id)itemClassObject;
+ query[(__bridge __strong id)kSecMatchLimit] = (__bridge id)kSecMatchLimitAll;
+ query[(__bridge __strong id)kSecReturnAttributes] = (__bridge id)kCFBooleanTrue;
+#if TARGET_OS_IPHONE
+ query[(__bridge __strong id)kSecReturnData] = (__bridge id)kCFBooleanTrue;
+#endif
+
+ CFArrayRef result = nil;
+ CFDictionaryRef cfquery = (CFDictionaryRef)CFBridgingRetain(query);
+ OSStatus status = SecItemCopyMatching(cfquery, (CFTypeRef *)&result);
+ CFRelease(cfquery);
+
+ if (status == errSecSuccess) {
+ return [self prettify:itemClassObject items:(__bridge NSArray *)result];
+ } else if (status == errSecItemNotFound) {
+ return @[];
+ }
+
+ return nil;
+}
+
+- (NSArray *)allItems
+{
+ return [self.class prettify:[self itemClassObject] items:[self items]];
+}
+
+- (NSArray *)items
+{
+ NSMutableDictionary *query = [self query];
+ query[(__bridge __strong id)kSecMatchLimit] = (__bridge id)kSecMatchLimitAll;
+ query[(__bridge __strong id)kSecReturnAttributes] = (__bridge id)kCFBooleanTrue;
+#if TARGET_OS_IPHONE
+ query[(__bridge __strong id)kSecReturnData] = (__bridge id)kCFBooleanTrue;
+#endif
+
+ CFArrayRef result = nil;
+ OSStatus status = SecItemCopyMatching((__bridge CFDictionaryRef)query,(CFTypeRef *)&result);
+
+ if (status == errSecSuccess) {
+ return CFBridgingRelease(result);
+ } else if (status == errSecItemNotFound) {
+ return @[];
+ }
+
+ return nil;
+}
+
++ (NSArray *)prettify:(CFTypeRef)itemClass items:(NSArray *)items
+{
+ NSMutableArray *prettified = [[NSMutableArray alloc] init];
+
+ for (NSDictionary *attributes in items) {
+ NSMutableDictionary *item = [[NSMutableDictionary alloc] init];
+ if (itemClass == kSecClassGenericPassword) {
+ item[@"class"] = @"GenericPassword";
+ id service = attributes[(__bridge id)kSecAttrService];
+ if (service) {
+ item[@"service"] = service;
+ }
+ id accessGroup = attributes[(__bridge id)kSecAttrAccessGroup];
+ if (accessGroup) {
+ item[@"accessGroup"] = accessGroup;
+ }
+ } else if (itemClass == kSecClassInternetPassword) {
+ item[@"class"] = @"InternetPassword";
+ id server = attributes[(__bridge id)kSecAttrServer];
+ if (server) {
+ item[@"server"] = server;
+ }
+ id protocolType = attributes[(__bridge id)kSecAttrProtocol];
+ if (protocolType) {
+ item[@"protocol"] = protocolType;
+ }
+ id authenticationType = attributes[(__bridge id)kSecAttrAuthenticationType];
+ if (authenticationType) {
+ item[@"authenticationType"] = authenticationType;
+ }
+ }
+ id key = attributes[(__bridge id)kSecAttrAccount];
+ if (key) {
+ item[@"key"] = key;
+ }
+ NSData *data = attributes[(__bridge id)kSecValueData];
+ NSString *string = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
+ if (string) {
+ item[@"value"] = string;
+ } else {
+ item[@"value"] = data;
+ }
+
+ id accessible = attributes[(__bridge id)kSecAttrAccessible];
+ if (accessible) {
+ item[@"accessibility"] = accessible;
+ }
+
+ if (floor(NSFoundationVersionNumber) > floor(993.00)) { // iOS 7+
+ id synchronizable = attributes[(__bridge id)kSecAttrSynchronizable];
+ if (synchronizable) {
+ item[@"synchronizable"] = synchronizable;
+ }
+ }
+
+ [prettified addObject:item];
+ }
+
+ return prettified.copy;
+}
+
+#pragma mark -
+
+- (void)setSynchronizable:(BOOL)synchronizable
+{
+ _synchronizable = synchronizable;
+ if (_authenticationPolicy) {
+ NSLog(@"%@", @"Cannot specify both an authenticationPolicy and a synchronizable");
+ }
+}
+
+- (void)setAccessibility:(UICKeyChainStoreAccessibility)accessibility authenticationPolicy:(UICKeyChainStoreAuthenticationPolicy)authenticationPolicy
+{
+ _accessibility = accessibility;
+ _authenticationPolicy = authenticationPolicy;
+ if (_synchronizable) {
+ NSLog(@"%@", @"Cannot specify both an authenticationPolicy and a synchronizable");
+ }
+}
+
+#pragma mark -
+
+#if TARGET_OS_IOS
+- (void)sharedPasswordWithCompletion:(void (^)(NSString *account, NSString *password, NSError *error))completion
+{
+ NSString *domain = self.server.host;
+ if (domain.length > 0) {
+ [self.class requestSharedWebCredentialForDomain:domain account:nil completion:^(NSArray *credentials, NSError *error) {
+ NSDictionary *credential = credentials.firstObject;
+ if (credential) {
+ NSString *account = credential[@"account"];
+ NSString *password = credential[@"password"];
+ if (completion) {
+ completion(account, password, error);
+ }
+ } else {
+ if (completion) {
+ completion(nil, nil, error);
+ }
+ }
+ }];
+ } else {
+ NSError *error = [self.class argumentError:NSLocalizedString(@"the server property must not to be nil, should use 'keyChainStoreWithServer:protocolType:' initializer to instantiate keychain store", nil)];
+ if (completion) {
+ completion(nil, nil, error);
+ }
+ }
+}
+
+- (void)sharedPasswordForAccount:(NSString *)account completion:(void (^)(NSString *password, NSError *error))completion
+{
+ NSString *domain = self.server.host;
+ if (domain.length > 0) {
+ [self.class requestSharedWebCredentialForDomain:domain account:account completion:^(NSArray *credentials, NSError *error) {
+ NSDictionary *credential = credentials.firstObject;
+ if (credential) {
+ NSString *password = credential[@"password"];
+ if (completion) {
+ completion(password, error);
+ }
+ } else {
+ if (completion) {
+ completion(nil, error);
+ }
+ }
+ }];
+ } else {
+ NSError *error = [self.class argumentError:NSLocalizedString(@"the server property must not to be nil, should use 'keyChainStoreWithServer:protocolType:' initializer to instantiate keychain store", nil)];
+ if (completion) {
+ completion(nil, error);
+ }
+ }
+}
+
+- (void)setSharedPassword:(NSString *)password forAccount:(NSString *)account completion:(void (^)(NSError *error))completion
+{
+ NSString *domain = self.server.host;
+ if (domain.length > 0) {
+ SecAddSharedWebCredential((__bridge CFStringRef)domain, (__bridge CFStringRef)account, (__bridge CFStringRef)password, ^(CFErrorRef error) {
+ if (completion) {
+ completion((__bridge NSError *)error);
+ }
+ });
+ } else {
+ NSError *error = [self.class argumentError:NSLocalizedString(@"the server property must not to be nil, should use 'keyChainStoreWithServer:protocolType:' initializer to instantiate keychain store", nil)];
+ if (completion) {
+ completion(error);
+ }
+ }
+}
+
+- (void)removeSharedPasswordForAccount:(NSString *)account completion:(void (^)(NSError *error))completion
+{
+ [self setSharedPassword:nil forAccount:account completion:completion];
+}
+
++ (void)requestSharedWebCredentialWithCompletion:(void (^)(NSArray UIC_CREDENTIAL_TYPE *credentials, NSError *error))completion
+{
+ [self requestSharedWebCredentialForDomain:nil account:nil completion:completion];
+}
+
++ (void)requestSharedWebCredentialForDomain:(NSString *)domain account:(NSString *)account completion:(void (^)(NSArray UIC_CREDENTIAL_TYPE *credentials, NSError *error))completion
+{
+ SecRequestSharedWebCredential((__bridge CFStringRef)domain, (__bridge CFStringRef)account, ^(CFArrayRef credentials, CFErrorRef error) {
+ if (error) {
+ NSError *e = (__bridge NSError *)error;
+ if (e.code != errSecItemNotFound) {
+ NSLog(@"error: [%@] %@", @(e.code), e.localizedDescription);
+ }
+ }
+
+ NSMutableArray *sharedCredentials = [[NSMutableArray alloc] init];
+ for (NSDictionary *credential in (__bridge NSArray *)credentials) {
+ NSMutableDictionary *sharedCredential = [[NSMutableDictionary alloc] init];
+ NSString *server = credential[(__bridge __strong id)kSecAttrServer];
+ if (server) {
+ sharedCredential[@"server"] = server;
+ }
+ NSString *account = credential[(__bridge __strong id)kSecAttrAccount];
+ if (account) {
+ sharedCredential[@"account"] = account;
+ }
+ NSString *password = credential[(__bridge __strong id)kSecSharedPassword];
+ if (password) {
+ sharedCredential[@"password"] = password;
+ }
+ [sharedCredentials addObject:sharedCredential];
+ }
+
+ if (completion) {
+ completion(sharedCredentials.copy, (__bridge NSError *)error);
+ }
+ });
+}
+
++ (NSString *)generatePassword
+{
+ return (NSString *)CFBridgingRelease(SecCreateSharedWebCredentialPassword());
+}
+
+#endif
+
+#pragma mark -
+
+- (NSString *)description
+{
+ NSArray *items = [self allItems];
+ if (items.count == 0) {
+ return @"()";
+ }
+ NSMutableString *description = [[NSMutableString alloc] initWithString:@"(\n"];
+ for (NSDictionary *item in items) {
+ [description appendFormat:@" %@", item];
+ }
+ [description appendString:@")"];
+ return description.copy;
+}
+
+- (NSString *)debugDescription
+{
+ return [NSString stringWithFormat:@"%@", [self items]];
+}
+
+#pragma mark -
+
+- (NSMutableDictionary *)query
+{
+ NSMutableDictionary *query = [[NSMutableDictionary alloc] init];
+
+ CFTypeRef itemClass = [self itemClassObject];
+ query[(__bridge __strong id)kSecClass] =(__bridge id)itemClass;
+ if (floor(NSFoundationVersionNumber) > floor(993.00)) { // iOS 7+ (NSFoundationVersionNumber_iOS_6_1)
+ query[(__bridge __strong id)kSecAttrSynchronizable] = (__bridge id)kSecAttrSynchronizableAny;
+ }
+
+ if (itemClass == kSecClassGenericPassword) {
+ query[(__bridge __strong id)(kSecAttrService)] = _service;
+#if !TARGET_OS_SIMULATOR
+ if (_accessGroup) {
+ query[(__bridge __strong id)kSecAttrAccessGroup] = _accessGroup;
+ }
+#endif
+ } else {
+ if (_server.host) {
+ query[(__bridge __strong id)kSecAttrServer] = _server.host;
+ }
+ if (_server.port) {
+ query[(__bridge __strong id)kSecAttrPort] = _server.port;
+ }
+ CFTypeRef protocolTypeObject = [self protocolTypeObject];
+ if (protocolTypeObject) {
+ query[(__bridge __strong id)kSecAttrProtocol] = (__bridge id)protocolTypeObject;
+ }
+ CFTypeRef authenticationTypeObject = [self authenticationTypeObject];
+ if (authenticationTypeObject) {
+ query[(__bridge __strong id)kSecAttrAuthenticationType] = (__bridge id)authenticationTypeObject;
+ }
+ }
+
+#if TARGET_OS_IOS
+ if (_authenticationPrompt) {
+ if (floor(NSFoundationVersionNumber) > floor(1047.25)) { // iOS 8+ (NSFoundationVersionNumber_iOS_7_1)
+ query[(__bridge __strong id)kSecUseOperationPrompt] = _authenticationPrompt;
+ } else {
+ NSLog(@"%@", @"Unavailable 'authenticationPrompt' attribute on iOS versions prior to 8.0.");
+ }
+ }
+#endif
+
+ return query;
+}
+
+- (NSMutableDictionary *)attributesWithKey:(NSString *)key value:(NSData *)value error:(NSError *__autoreleasing *)error
+{
+ NSMutableDictionary *attributes;
+
+ if (key) {
+ attributes = [self query];
+ attributes[(__bridge __strong id)kSecAttrAccount] = key;
+ } else {
+ attributes = [[NSMutableDictionary alloc] init];
+ }
+
+ attributes[(__bridge __strong id)kSecValueData] = value;
+
+#if TARGET_OS_IOS
+ double iOS_7_1_or_10_9_2 = 1047.25; // NSFoundationVersionNumber_iOS_7_1
+#else
+ double iOS_7_1_or_10_9_2 = 1056.13; // NSFoundationVersionNumber10_9_2
+#endif
+ CFTypeRef accessibilityObject = [self accessibilityObject];
+ if (_authenticationPolicy && accessibilityObject) {
+ if (floor(NSFoundationVersionNumber) > floor(iOS_7_1_or_10_9_2)) { // iOS 8+ or OS X 10.10+
+ CFErrorRef securityError = NULL;
+ SecAccessControlRef accessControl = SecAccessControlCreateWithFlags(kCFAllocatorDefault, accessibilityObject, (SecAccessControlCreateFlags)_authenticationPolicy, &securityError);
+ if (securityError) {
+ NSError *e = (__bridge NSError *)securityError;
+ NSLog(@"error: [%@] %@", @(e.code), e.localizedDescription);
+ if (error) {
+ *error = e;
+ CFRelease(accessControl);
+ return nil;
+ }
+ }
+ if (!accessControl) {
+ NSString *message = NSLocalizedString(@"Unexpected error has occurred.", nil);
+ NSError *e = [self.class unexpectedError:message];
+ if (error) {
+ *error = e;
+ }
+ return nil;
+ }
+ attributes[(__bridge __strong id)kSecAttrAccessControl] = (__bridge_transfer id)accessControl;
+ } else {
+#if TARGET_OS_IOS
+ NSLog(@"%@", @"Unavailable 'Touch ID integration' on iOS versions prior to 8.0.");
+#else
+ NSLog(@"%@", @"Unavailable 'Touch ID integration' on OS X versions prior to 10.10.");
+#endif
+ }
+ } else {
+ if (floor(NSFoundationVersionNumber) <= floor(iOS_7_1_or_10_9_2) && _accessibility == UICKeyChainStoreAccessibilityWhenPasscodeSetThisDeviceOnly) {
+#if TARGET_OS_IOS
+ NSLog(@"%@", @"Unavailable 'UICKeyChainStoreAccessibilityWhenPasscodeSetThisDeviceOnly' attribute on iOS versions prior to 8.0.");
+#else
+ NSLog(@"%@", @"Unavailable 'UICKeyChainStoreAccessibilityWhenPasscodeSetThisDeviceOnly' attribute on OS X versions prior to 10.10.");
+#endif
+ } else {
+ if (accessibilityObject) {
+ attributes[(__bridge __strong id)kSecAttrAccessible] = (__bridge id)accessibilityObject;
+ }
+ }
+ }
+
+ if (floor(NSFoundationVersionNumber) > floor(993.00)) { // iOS 7+
+ attributes[(__bridge __strong id)kSecAttrSynchronizable] = @(_synchronizable);
+ }
+
+ return attributes;
+}
+
+#pragma mark -
+
+- (CFTypeRef)itemClassObject
+{
+ switch (_itemClass) {
+ case UICKeyChainStoreItemClassGenericPassword:
+ return kSecClassGenericPassword;
+ case UICKeyChainStoreItemClassInternetPassword:
+ return kSecClassInternetPassword;
+ default:
+ return nil;
+ }
+}
+
+- (CFTypeRef)protocolTypeObject
+{
+ switch (_protocolType) {
+ case UICKeyChainStoreProtocolTypeFTP:
+ return kSecAttrProtocolFTP;
+ case UICKeyChainStoreProtocolTypeFTPAccount:
+ return kSecAttrProtocolFTPAccount;
+ case UICKeyChainStoreProtocolTypeHTTP:
+ return kSecAttrProtocolHTTP;
+ case UICKeyChainStoreProtocolTypeIRC:
+ return kSecAttrProtocolIRC;
+ case UICKeyChainStoreProtocolTypeNNTP:
+ return kSecAttrProtocolNNTP;
+ case UICKeyChainStoreProtocolTypePOP3:
+ return kSecAttrProtocolPOP3;
+ case UICKeyChainStoreProtocolTypeSMTP:
+ return kSecAttrProtocolSMTP;
+ case UICKeyChainStoreProtocolTypeSOCKS:
+ return kSecAttrProtocolSOCKS;
+ case UICKeyChainStoreProtocolTypeIMAP:
+ return kSecAttrProtocolIMAP;
+ case UICKeyChainStoreProtocolTypeLDAP:
+ return kSecAttrProtocolLDAP;
+ case UICKeyChainStoreProtocolTypeAppleTalk:
+ return kSecAttrProtocolAppleTalk;
+ case UICKeyChainStoreProtocolTypeAFP:
+ return kSecAttrProtocolAFP;
+ case UICKeyChainStoreProtocolTypeTelnet:
+ return kSecAttrProtocolTelnet;
+ case UICKeyChainStoreProtocolTypeSSH:
+ return kSecAttrProtocolSSH;
+ case UICKeyChainStoreProtocolTypeFTPS:
+ return kSecAttrProtocolFTPS;
+ case UICKeyChainStoreProtocolTypeHTTPS:
+ return kSecAttrProtocolHTTPS;
+ case UICKeyChainStoreProtocolTypeHTTPProxy:
+ return kSecAttrProtocolHTTPProxy;
+ case UICKeyChainStoreProtocolTypeHTTPSProxy:
+ return kSecAttrProtocolHTTPSProxy;
+ case UICKeyChainStoreProtocolTypeFTPProxy:
+ return kSecAttrProtocolFTPProxy;
+ case UICKeyChainStoreProtocolTypeSMB:
+ return kSecAttrProtocolSMB;
+ case UICKeyChainStoreProtocolTypeRTSP:
+ return kSecAttrProtocolRTSP;
+ case UICKeyChainStoreProtocolTypeRTSPProxy:
+ return kSecAttrProtocolRTSPProxy;
+ case UICKeyChainStoreProtocolTypeDAAP:
+ return kSecAttrProtocolDAAP;
+ case UICKeyChainStoreProtocolTypeEPPC:
+ return kSecAttrProtocolEPPC;
+ case UICKeyChainStoreProtocolTypeNNTPS:
+ return kSecAttrProtocolNNTPS;
+ case UICKeyChainStoreProtocolTypeLDAPS:
+ return kSecAttrProtocolLDAPS;
+ case UICKeyChainStoreProtocolTypeTelnetS:
+ return kSecAttrProtocolTelnetS;
+ case UICKeyChainStoreProtocolTypeIRCS:
+ return kSecAttrProtocolIRCS;
+ case UICKeyChainStoreProtocolTypePOP3S:
+ return kSecAttrProtocolPOP3S;
+ default:
+ return nil;
+ }
+}
+
+- (CFTypeRef)authenticationTypeObject
+{
+ switch (_authenticationType) {
+ case UICKeyChainStoreAuthenticationTypeNTLM:
+ return kSecAttrAuthenticationTypeNTLM;
+ case UICKeyChainStoreAuthenticationTypeMSN:
+ return kSecAttrAuthenticationTypeMSN;
+ case UICKeyChainStoreAuthenticationTypeDPA:
+ return kSecAttrAuthenticationTypeDPA;
+ case UICKeyChainStoreAuthenticationTypeRPA:
+ return kSecAttrAuthenticationTypeRPA;
+ case UICKeyChainStoreAuthenticationTypeHTTPBasic:
+ return kSecAttrAuthenticationTypeHTTPBasic;
+ case UICKeyChainStoreAuthenticationTypeHTTPDigest:
+ return kSecAttrAuthenticationTypeHTTPDigest;
+ case UICKeyChainStoreAuthenticationTypeHTMLForm:
+ return kSecAttrAuthenticationTypeHTMLForm;
+ case UICKeyChainStoreAuthenticationTypeDefault:
+ return kSecAttrAuthenticationTypeDefault;
+ default:
+ return nil;
+ }
+}
+
+- (CFTypeRef)accessibilityObject
+{
+ switch (_accessibility) {
+ case UICKeyChainStoreAccessibilityWhenUnlocked:
+ return kSecAttrAccessibleWhenUnlocked;
+ case UICKeyChainStoreAccessibilityAfterFirstUnlock:
+ return kSecAttrAccessibleAfterFirstUnlock;
+ case UICKeyChainStoreAccessibilityAlways:
+ return kSecAttrAccessibleAlways;
+ case UICKeyChainStoreAccessibilityWhenPasscodeSetThisDeviceOnly:
+ return kSecAttrAccessibleWhenPasscodeSetThisDeviceOnly;
+ case UICKeyChainStoreAccessibilityWhenUnlockedThisDeviceOnly:
+ return kSecAttrAccessibleWhenUnlockedThisDeviceOnly;
+ case UICKeyChainStoreAccessibilityAfterFirstUnlockThisDeviceOnly:
+ return kSecAttrAccessibleAfterFirstUnlockThisDeviceOnly;
+ case UICKeyChainStoreAccessibilityAlwaysThisDeviceOnly:
+ return kSecAttrAccessibleAlwaysThisDeviceOnly;
+ default:
+ return nil;
+ }
+}
+
++ (NSError *)argumentError:(NSString *)message
+{
+ NSError *error = [NSError errorWithDomain:UICKeyChainStoreErrorDomain code:UICKeyChainStoreErrorInvalidArguments userInfo:@{NSLocalizedDescriptionKey: message}];
+ NSLog(@"error: [%@] %@", @(error.code), error.localizedDescription);
+ return error;
+}
+
++ (NSError *)conversionError:(NSString *)message
+{
+ NSError *error = [NSError errorWithDomain:UICKeyChainStoreErrorDomain code:-67594 userInfo:@{NSLocalizedDescriptionKey: message}];
+ NSLog(@"error: [%@] %@", @(error.code), error.localizedDescription);
+ return error;
+}
+
++ (NSError *)securityError:(OSStatus)status
+{
+ NSString *message = @"Security error has occurred.";
+#if TARGET_OS_MAC && !TARGET_OS_IPHONE
+ CFStringRef description = SecCopyErrorMessageString(status, NULL);
+ if (description) {
+ message = (__bridge_transfer NSString *)description;
+ }
+#endif
+ NSError *error = [NSError errorWithDomain:UICKeyChainStoreErrorDomain code:status userInfo:@{NSLocalizedDescriptionKey: message}];
+ NSLog(@"OSStatus error: [%@] %@", @(error.code), error.localizedDescription);
+ return error;
+}
+
++ (NSError *)unexpectedError:(NSString *)message
+{
+ NSError *error = [NSError errorWithDomain:UICKeyChainStoreErrorDomain code:-99999 userInfo:@{NSLocalizedDescriptionKey: message}];
+ NSLog(@"error: [%@] %@", @(error.code), error.localizedDescription);
+ return error;
+}
+
+@end
+
+@implementation UICKeyChainStore (Deprecation)
+
+- (void)synchronize
+{
+ // Deprecated, calling this method is no longer required
+}
+
+- (BOOL)synchronizeWithError:(NSError *__autoreleasing *)error
+{
+ // Deprecated, calling this method is no longer required
+ return true;
+}
+
+@end
--
Gitblit v1.8.0