diff options
| author | Ruben Beltran del Rio <git@r.bdr.sh> | 2025-09-10 16:12:55 +0200 |
|---|---|---|
| committer | Ruben Beltran del Rio <git@r.bdr.sh> | 2025-09-10 16:12:55 +0200 |
| commit | 7cf393095282077b0bbae3046826b67f4f20a8eb (patch) | |
| tree | 9aaf5704cbb8612bf78378aefa40ae40e79a7850 /QSThingsPlugin/Helpers | |
| parent | c4705a0a678ac523b243c7b68ce27fbf5e44b61a (diff) | |
Add auth key + complete task action
Diffstat (limited to 'QSThingsPlugin/Helpers')
| -rw-r--r-- | QSThingsPlugin/Helpers/KeychainHelper.h | 20 | ||||
| -rw-r--r-- | QSThingsPlugin/Helpers/KeychainHelper.m | 83 |
2 files changed, 103 insertions, 0 deletions
diff --git a/QSThingsPlugin/Helpers/KeychainHelper.h b/QSThingsPlugin/Helpers/KeychainHelper.h new file mode 100644 index 0000000..d935bec --- /dev/null +++ b/QSThingsPlugin/Helpers/KeychainHelper.h @@ -0,0 +1,20 @@ +// +// KeychainHelper.h +// Things Plugin +// +// Created by Ruben Beltran del Rio on 2025-09-10. +// + +#import "Constants.h" +#import <Foundation/Foundation.h> +#import <Security/Security.h> + +NS_ASSUME_NONNULL_BEGIN + +@interface KeychainHelper : NSObject ++ (NSString *)authenticationKey; ++ (OSStatus)setAuthenticationKey:(NSString *)authenticationKey; ++ (OSStatus)deleteAuthenticationKey; +@end + +NS_ASSUME_NONNULL_END diff --git a/QSThingsPlugin/Helpers/KeychainHelper.m b/QSThingsPlugin/Helpers/KeychainHelper.m new file mode 100644 index 0000000..9ce90f7 --- /dev/null +++ b/QSThingsPlugin/Helpers/KeychainHelper.m @@ -0,0 +1,83 @@ +// +// KeychainHelper.m +// Things Plugin +// +// Created by Ruben Beltran del Rio on 2025-09-10. +// + +#import "KeychainHelper.h" + +NS_ASSUME_NONNULL_BEGIN + +@implementation KeychainHelper + ++ (NSString *)authenticationKey { + const char *service = [kKeychainService UTF8String]; + const char *account = [kAuthenticationKeyKeychainKey UTF8String]; + + UInt32 authenticationKeyLength = 0; + void *authenticationKeyData = NULL; + + OSStatus status = SecKeychainFindGenericPassword( + NULL, (UInt32)strlen(service), service, (UInt32)strlen(account), account, + &authenticationKeyLength, &authenticationKeyData, NULL); + + if (status == errSecSuccess && authenticationKeyData != NULL) { + NSString *authenticationKey = [[NSString alloc] initWithBytes:authenticationKeyData + length:authenticationKeyLength + encoding:NSUTF8StringEncoding]; + SecKeychainItemFreeContent(NULL, authenticationKeyData); + return authenticationKey; + } + + return nil; +} + ++ (OSStatus)setAuthenticationKey:(NSString *)authenticationKey { + const char *service = [kKeychainService UTF8String]; + const char *account = [kAuthenticationKeyKeychainKey UTF8String]; + const char *authenticationKeyCString = [authenticationKey UTF8String]; + + // First try to find existing item + SecKeychainItemRef item = NULL; + OSStatus findStatus = SecKeychainFindGenericPassword( + NULL, (UInt32)strlen(service), service, (UInt32)strlen(account), account, + NULL, NULL, &item); + + OSStatus status; + if (findStatus == errSecSuccess) { + // Update existing item + status = SecKeychainItemModifyAttributesAndData( + item, NULL, (UInt32)strlen(authenticationKeyCString), authenticationKeyCString); + CFRelease(item); + } else { + // Create new item + status = SecKeychainAddGenericPassword( + NULL, (UInt32)strlen(service), service, (UInt32)strlen(account), + account, (UInt32)strlen(authenticationKeyCString), authenticationKeyCString, NULL); + } + + return status; +} + ++ (OSStatus) deleteAuthenticationKey { + const char *service = [kKeychainService UTF8String]; + const char *account = [kAuthenticationKeyKeychainKey UTF8String]; + + SecKeychainItemRef item = NULL; + OSStatus findStatus = SecKeychainFindGenericPassword( + NULL, (UInt32)strlen(service), service, (UInt32)strlen(account), account, + NULL, NULL, &item); + + if (findStatus == errSecSuccess) { + OSStatus deleteStatus = SecKeychainItemDelete(item); + CFRelease(item); + return deleteStatus; + } + + return findStatus; +} + +@end + +NS_ASSUME_NONNULL_END |