diff --git a/MASFoundation/Classes/_private_/services/access/MASAccessService.h b/MASFoundation/Classes/_private_/services/access/MASAccessService.h index a498a5e2..dfb9c3f0 100644 --- a/MASFoundation/Classes/_private_/services/access/MASAccessService.h +++ b/MASFoundation/Classes/_private_/services/access/MASAccessService.h @@ -341,6 +341,16 @@ extern NSString * const MASKeychainStorageKeyDeviceVendorId; +/** + Deletes keychain storage item based on storage key + + @param storageKey NSString of storage key. + @param error NSError object reference. + */ +- (void)deleteForStorageKey:(NSString *)storageKey error:(NSError **)error; + + + ///-------------------------------------- /// @name Public ///-------------------------------------- diff --git a/MASFoundation/Classes/_private_/services/access/MASAccessService.m b/MASFoundation/Classes/_private_/services/access/MASAccessService.m index 503b067b..cedf6246 100644 --- a/MASFoundation/Classes/_private_/services/access/MASAccessService.m +++ b/MASFoundation/Classes/_private_/services/access/MASAccessService.m @@ -671,6 +671,23 @@ - (SecKeyRef)getAccessValueCryptoKeyWithStorageKey:(NSString *)storageKey } +- (void)deleteForStorageKey:(NSString *)storageKey error:(NSError **)error +{ + NSString *storageType = [self getStorageTypeWithKey:storageKey]; + NSString *accessValueAsString = [self convertKeyString:storageKey]; + MASIKeyChainStore *destinationStorage = _storages[storageType]; + + NSError *operationError = nil; + + [destinationStorage removeItemForKey:accessValueAsString error:&operationError]; + + if (operationError && error) + { + *error = operationError; + } +} + + #pragma mark - Private + (NSString *)padding:(NSString *)encodedString{ diff --git a/MASFoundation/Classes/models/MASSharedStorage.h b/MASFoundation/Classes/models/MASSharedStorage.h index 69867a73..7b68d72c 100644 --- a/MASFoundation/Classes/models/MASSharedStorage.h +++ b/MASFoundation/Classes/models/MASSharedStorage.h @@ -74,4 +74,14 @@ */ + (BOOL)saveData:(NSData *_Nonnull)data key:(NSString *_Nonnull)key error:(NSError * __nullable __autoreleasing * __nullable)error; + + +/** + Deletes any data type with the specified key from shared keychain storage. + + @param key NSString of the key used to store the data + @param error NSError object reference that would notify if there was any error while deleting the data + */ ++ (void)deleteForKey:(NSString *_Nonnull)key error:(NSError * __nullable __autoreleasing * __nullable)error; + @end diff --git a/MASFoundation/Classes/models/MASSharedStorage.m b/MASFoundation/Classes/models/MASSharedStorage.m index c7d0916d..84a652e8 100644 --- a/MASFoundation/Classes/models/MASSharedStorage.m +++ b/MASFoundation/Classes/models/MASSharedStorage.m @@ -215,4 +215,50 @@ + (BOOL)saveData:(NSData *)data key:(NSString *)key error:(NSError **)error return result; } + ++ (void)deleteForKey:(NSString *_Nonnull)key error:(NSError * __nullable __autoreleasing * __nullable)error +{ + // + // Check if SDK was initialized + // + if ([MAS MASState] != MASStateDidStart) + { + if (error) + { + *error = [NSError errorMASIsNotStarted]; + } + + return; + } + + // + // Check for data key + // + if (key == nil || [key length] <= 0) + { + if (error) + { + *error = [NSError errorForFoundationCode:MASFoundationErrorCodeSharedStorageNotNilKey errorDomain:MASFoundationErrorDomainLocal]; + } + + return; + } + + NSError *operationError = nil; + [[MASAccessService sharedService] deleteForStorageKey:[NSString stringWithFormat:@"%@.%@", MASSharedStorageCustomPrefix, key] error:&operationError]; + + // + // If an error occurred while keychain operation, convert it into MASFoundationErrorDomainLocal error object + // + if (operationError) + { + NSError *thisError = [NSError errorWithDomain:MASFoundationErrorDomainLocal code:operationError.code userInfo:@{NSLocalizedDescriptionKey : operationError.localizedDescription}]; + + if (error) + { + *error = thisError; + } + } +} + @end