aboutsummaryrefslogtreecommitdiff
path: root/QSThingsPlugin/Helpers/KeychainHelper.m
diff options
context:
space:
mode:
Diffstat (limited to 'QSThingsPlugin/Helpers/KeychainHelper.m')
-rw-r--r--QSThingsPlugin/Helpers/KeychainHelper.m83
1 files changed, 83 insertions, 0 deletions
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