From 527d71b665ba50122d08ea8f67268e07e3dfacd5 Mon Sep 17 00:00:00 2001 From: polymonster Date: Sun, 21 Jan 2024 13:12:00 +0000 Subject: [PATCH] - add keychain apis for ios --- core/pen/include/os.h | 2 + core/pen/source/ios/os.mm | 93 +++++++++++++++++++++++++++++++++++++++ 2 files changed, 95 insertions(+) diff --git a/core/pen/include/os.h b/core/pen/include/os.h index 925345a5..fff37b8c 100644 --- a/core/pen/include/os.h +++ b/core/pen/include/os.h @@ -52,6 +52,8 @@ namespace pen void os_haptic_selection_feedback(); void os_init_on_screen_keyboard(); void os_show_on_screen_keyboard(bool show); + bool os_set_keychain_item(const Str& identifier, const Str& key, const Str& value); + Str os_get_keychain_item(const Str& identifier, const Str& key); // music struct music_item diff --git a/core/pen/source/ios/os.mm b/core/pen/source/ios/os.mm index f8147aed..ad1e9b6d 100644 --- a/core/pen/source/ios/os.mm +++ b/core/pen/source/ios/os.mm @@ -32,6 +32,7 @@ #import #import #import +#import // the last 2 global externs \o/ pen::user_info pen_user_info; @@ -574,6 +575,98 @@ void os_show_on_screen_keyboard(bool show) s_context.show_on_screen_keyboard = show; } + bool os_set_keychain_item(const Str& identifier, const Str& key, const Str& value) + { + @autoreleasepool { + Str concatid = identifier; + concatid.appendf(".%s", key.c_str()); + + NSString* nsid = [NSString stringWithUTF8String:concatid.c_str()]; + NSString* nsvalue = [NSString stringWithUTF8String:value.c_str()]; + NSData* tag = [nsid dataUsingEncoding:NSUTF8StringEncoding]; + NSData* data = [nsvalue dataUsingEncoding:NSUTF8StringEncoding]; + + NSDictionary* addquery = @{ + (NSString*)kSecClass: (NSString*)kSecClassGenericPassword, + (NSString*)kSecAttrAccount: tag, + (NSString*)kSecValueData: data, + }; + + OSStatus status = SecItemAdd((__bridge CFDictionaryRef)addquery, nullptr); + if (status == errSecDuplicateItem) + { + NSDictionary* searchquery = @{ + (NSString*)kSecClass: (NSString*)kSecClassGenericPassword, + (__bridge id)kSecAttrAccount : tag, + (__bridge id)kSecMatchLimit : (__bridge id)kSecMatchLimitOne, + (__bridge id)kSecReturnAttributes : (__bridge id)kCFBooleanTrue, + (__bridge id)kSecReturnData : (__bridge id)kCFBooleanTrue + }; + + CFTypeRef item = nullptr; + if (SecItemCopyMatching((__bridge CFDictionaryRef)searchquery, &item) == errSecSuccess) + { + NSMutableDictionary* update_dict = (__bridge NSMutableDictionary *)item; + [update_dict addEntriesFromDictionary:addquery]; + [update_dict removeObjectForKey:(__bridge id)kSecClass]; + + NSDictionary* updatequery = @{ + (NSString*)kSecClass: (NSString*)kSecClassGenericPassword, + (NSString*)kSecAttrAccount: tag, + }; + + status = SecItemUpdate((__bridge CFDictionaryRef)updatequery, + (__bridge CFDictionaryRef)update_dict); + + if(status < errSecSuccess) + { + return false; + } + } + } + else if(status != errSecSuccess) + { + return false; + } + } + + return true; + } + + + Str os_get_keychain_item(const Str& identifier, const Str& key) + { + @autoreleasepool { + Str concatid = identifier; + concatid.appendf(".%s", key.c_str()); + + NSString* nsid = [NSString stringWithUTF8String:concatid.c_str()]; + NSData* tag = [nsid dataUsingEncoding:NSUTF8StringEncoding]; + + NSDictionary* getquery = @{ + (NSString*)kSecClass: (NSString*)kSecClassGenericPassword, + (NSString*)kSecAttrAccount: tag, + (NSString*)kSecReturnData: @YES, + }; + + CFTypeRef item = nullptr; + OSStatus status = SecItemCopyMatching((__bridge CFDictionaryRef)getquery, &item); + + if(status == errSecSuccess) + { + CFDataRef nsitem = (CFDataRef)item; + NSData* ddd = (__bridge NSData*)nsitem; + + NSString* result_str = [[NSString alloc] initWithData:ddd encoding:NSUTF8StringEncoding]; + const c8* cstr = [result_str UTF8String]; + + return Str(cstr); + } + } + + return ""; + } + void music_enable_remote_control() { [[UIApplication sharedApplication] beginReceivingRemoteControlEvents];