aboutsummaryrefslogtreecommitdiff
path: root/QSThingsPlugin/Helpers
diff options
context:
space:
mode:
authorRuben Beltran del Rio <git@r.bdr.sh>2025-09-10 16:12:55 +0200
committerRuben Beltran del Rio <git@r.bdr.sh>2025-09-10 16:12:55 +0200
commit7cf393095282077b0bbae3046826b67f4f20a8eb (patch)
tree9aaf5704cbb8612bf78378aefa40ae40e79a7850 /QSThingsPlugin/Helpers
parentc4705a0a678ac523b243c7b68ce27fbf5e44b61a (diff)
Add auth key + complete task action
Diffstat (limited to 'QSThingsPlugin/Helpers')
-rw-r--r--QSThingsPlugin/Helpers/KeychainHelper.h20
-rw-r--r--QSThingsPlugin/Helpers/KeychainHelper.m83
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