Skip to content

Commit

Permalink
- add keychain apis for ios
Browse files Browse the repository at this point in the history
  • Loading branch information
polymonster committed Jan 21, 2024
1 parent 81ae027 commit 527d71b
Show file tree
Hide file tree
Showing 2 changed files with 95 additions and 0 deletions.
2 changes: 2 additions & 0 deletions core/pen/include/os.h
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
93 changes: 93 additions & 0 deletions core/pen/source/ios/os.mm
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,7 @@
#import <MediaPlayer/MPNowPlayingInfoCenter.h>
#import <MediaPlayer/MPRemoteCommandCenter.h>
#import <MediaPlayer/MPRemoteCommand.h>
#import <Security/Security.h>

// the last 2 global externs \o/
pen::user_info pen_user_info;
Expand Down Expand Up @@ -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];
Expand Down

0 comments on commit 527d71b

Please sign in to comment.