From 7cf393095282077b0bbae3046826b67f4f20a8eb Mon Sep 17 00:00:00 2001 From: Ruben Beltran del Rio Date: Wed, 10 Sep 2025 16:12:55 +0200 Subject: Add auth key + complete task action --- QSThingsPlugin/Helpers/KeychainHelper.h | 20 ++++++++ QSThingsPlugin/Helpers/KeychainHelper.m | 83 +++++++++++++++++++++++++++++++++ 2 files changed, 103 insertions(+) create mode 100644 QSThingsPlugin/Helpers/KeychainHelper.h create mode 100644 QSThingsPlugin/Helpers/KeychainHelper.m (limited to 'QSThingsPlugin/Helpers') 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 +#import + +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 -- cgit