hank
2019-01-22 ab662912a378edb0878538b40a531434dbbe6792
commit | author | age
655e66 1 /*
H 2  * Copyright (C) 2017 Twitter, Inc.
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *      http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  *
16  */
17
a0a843 18 #import <Foundation/Foundation.h>
H 19
20 NS_ASSUME_NONNULL_BEGIN
21
22 extern NSString *const TWTRGenericKeychainItemErrorDomain;
23
24 /**
25  * The TWTRGenericKeychainQuery provides an simple model object
26  * that can be used in conjuction with TWTRGenericKeychainItem to
27  * retrieve items in the keychain.
28  */
29 @interface TWTRGenericKeychainQuery : NSObject
30
31 /**
32  * The name of the service corresponding with kSecAttrService.
33  * If this value is specified the genericValue and accessGroup values are ignored.
34  */
35 @property (nonatomic, copy, readonly, nullable) NSString *service;
36
37 /**
38  * The name of the account corresponding with kSecAttrAccount.
39  * If this value is specified the genericValue and accessGroup values are ignored.
40  */
41 @property (nonatomic, copy, readonly, nullable) NSString *account;
42
43 /**
44  * A generic value corresponding with kSecAttrGeneric.
45  */
46 @property (nonatomic, copy, readonly, nullable) NSString *genericValue;
47
48 /**
49  * The access group corresponding with kSecAttrAccessGroup.
50  * This value is not used in equality checks.
51  * Note: This value is ignored in the simulator.
52  */
53 @property (nonatomic, copy, readonly, nullable) NSString *accessGroup;
54
55 /**
56  * A query that will return all the items in the keychain.
57  */
58 + (instancetype)queryForAllItems;
59
60 /**
61  * A query that will return all items with the given service.
62  */
63 + (instancetype)queryForService:(NSString *)service;
64
65 /**
66  * A query that will return all items with the given account.
67  */
68 + (instancetype)queryForAccount:(NSString *)account;
69
70 /**
71  * A query that will match all items that contain both the service and account.
72  */
73 + (instancetype)queryForService:(NSString *)service account:(NSString *)account;
74
75 /**
76  * A query that will return all items with the given generic value.
77  */
78 + (instancetype)queryForGenericValue:(NSString *)genericValue;
79
80 /**
81  * A query that will return all items with the given access group.
82  */
83 + (instancetype)queryForAccessGroup:(NSString *)accessGroup;
84
85 @end
86
87 /**
88  * The TWTRGenericKeychainItem provides a convenience wrapper
89  * around the security framework's keychain access.  All of
90  * the items stored using this class will be stored as
91  * kSecClassGenericPassword objects.
92  */
93 @interface TWTRGenericKeychainItem : NSObject
94
95 /**
96  * A value which specifies the item's service attribute. This
97  * value represents the service associated with this item.
98  */
99 @property (nonatomic, copy, readonly) NSString *service;
100
101 /**
102  * A value which represents the items account name.
103  */
104 @property (nonatomic, copy, readonly) NSString *account;
105
106 /**
107  * The item that is intended to be kept secret. This may be
108  * something like a password for an account or an oauth token.
109  *
110  * @warning If this data is too large it will fail to save. The size
111  * should be smaller than ~2mb but can change from device to device.
112  */
113 @property (nonatomic, copy, readonly) NSData *secret;
114
115 /**
116  * An optional value that can be set on the item.
117  */
118 @property (nonatomic, copy, readonly, nullable) NSString *genericValue;
119
120 /**
121  * Returns the date that the item was last saved to the store. This value
122  * is nil until the item is actually saved.
123  */
124 @property (nonatomic, copy, readonly, nullable) NSDate *lastSavedDate;
125
126 /**
127  * An optional value that can be used to specify the items accesss group.
128  * If this value is not set the default access group which is only
129  * accessible from the calling application will be used.
130  *
131  * Refer to 'Keychain Services Programming Guide' for more information
132  * regarding access groups. Most of the time you will
133  * want to leave this value empty.
134  *
135  * This value may not be empty upon fetch even if it is empty when it is saved. This
136  * is because the security framework will fill it with the default value which
137  * is not specified.
138  */
139 @property (nonatomic, copy, readonly, nullable) NSString *accessGroup;
140
141 /**
142  * Fetches all of the stored items for the given query.
143  * If the returned array is nil it indicates that an error
144  * has occurred and the error parameter will be set. If no
145  * items are found an empty array will be returned.
146  *
147  * The query results will depend on the specificity of the query
148  * object as described in its documetation.
149  */
150 + (NSArray *)storedItemsMatchingQuery:(TWTRGenericKeychainQuery *)query error:(NSError **)error;
151
152 /**
153  * Removes all the items matching the given query.
154  */
155 + (BOOL)removeAllItemsForQuery:(TWTRGenericKeychainQuery *)query error:(NSError **)error;
156
157 /**
158  * Initializes a TWTRGenericKeychainItem object with the given values.
159  * This does not automatically save the object, you must call -[TWTRGenericKeychainItem storeInKeychain:]
160  to actually save the object.
161  *
162  * A keychain item is uniquely constrained by the service/account combination. Any action performed
163  * with the keychain item will override any existing keychain items with the given service/account
164  * combination.
165  *
166  * @param service the service for this item.
167  * @param account the account associated with this item.
168  * @param secret the secret value to store.
169  * @param genericValue an additional value to associate with this item.
170  * @param accessGroup the access group for this item. If empty uses the default access group. *
171  */
172 - (instancetype)initWithService:(NSString *)service account:(NSString *)account secret:(NSData *)secret;
173 - (instancetype)initWithService:(NSString *)service account:(NSString *)account secret:(NSData *)secret genericValue:(nullable NSString *)genericValue;
174 - (instancetype)initWithService:(NSString *)service account:(NSString *)account secret:(NSData *)secret genericValue:(nullable NSString *)genericValue accessGroup:(nullable NSString *)accessGroup;
175
176 /**
177  * Call this method to store the keychain item in the store.
178  *
179  * A TWTRGenericKeychainItem is only unique based on the account
180  * and the service specified. If the item exists and the replaceExisting parameter
181  * is YES the value will be replaced. If this parameter is NO the operation will
182  * fail.
183  *
184  * @param replacesExisting whether an existing value should be replaced, Default = YES
185  * @param error an optional error that will be set if the operation fails.
186  * @return a value representing if the operation was successful
187  */
188 - (BOOL)storeInKeychain:(NSError **)error;
189 - (BOOL)storeInKeychainReplacingExisting:(BOOL)replaceExisting error:(NSError **)error;
190
191 /**
192  * Attempts to remove the wrapper from the keychain.
193  *
194  * The keychain item is only unique based on the service/account
195  * pair. So a value that is created with the same service/account
196  * but different secret will remove the existing value.
197  *
198  * @return a value representing if the operation was successful
199  */
200 - (BOOL)removeFromKeychain:(NSError **)error;
201
202 @end
203
204 NS_ASSUME_NONNULL_END