vlc | branch: master | David Fuhrmann <[email protected]> | Thu Sep 20 21:21:49 2018 +0200| [69c190a3e2a5d2a3b6db3299a0fd6f51568a3505] | committer: David Fuhrmann
keychain: distinguish between old and new secret format Add a creator tag to distinguish keychain entries from older VLC versions and newer ones. Older entries need an appended \0, otherwise the resulting data might be parsed incorrectly. New entries already include any trailing \0 (if part of the original data). > http://git.videolan.org/gitweb.cgi/vlc.git/?a=commit;h=69c190a3e2a5d2a3b6db3299a0fd6f51568a3505 --- modules/keystore/keychain.m | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) diff --git a/modules/keystore/keychain.m b/modules/keystore/keychain.m index 63336be554..f62f9f7cec 100644 --- a/modules/keystore/keychain.m +++ b/modules/keystore/keychain.m @@ -42,6 +42,9 @@ #import <Security/Security.h> +// Marker to recognize changed format in vlc 4: secret does not have \0 cut off anymore. +int kVlc4Creator = 'vlc4'; + static int Open(vlc_object_t *); static const int sync_list[] = @@ -318,6 +321,7 @@ static int Store(vlc_keystore *p_keystore, /* just set the secret data */ [query setObject:secretData forKey:(__bridge id)kSecValueData]; + [query setObject:@(kVlc4Creator) forKey:(__bridge id)kSecAttrCreator]; status = SecItemUpdate((__bridge CFDictionaryRef)(searchQuery), (__bridge CFDictionaryRef)(query)); } else if (status == errSecItemNotFound) { @@ -333,6 +337,7 @@ static int Store(vlc_keystore *p_keystore, /* set secret data */ [query setObject:secretData forKey:(__bridge id)kSecValueData]; + [query setObject:@(kVlc4Creator) forKey:(__bridge id)kSecAttrCreator]; status = SecItemAdd((__bridge CFDictionaryRef)query, NULL); } @@ -385,6 +390,7 @@ static unsigned int Find(vlc_keystore *p_keystore, } NSDictionary *keychainItem = [listOfResults objectAtIndex:i]; + NSString *accountName = [keychainItem objectForKey:(__bridge id)kSecAttrAccount]; NSMutableDictionary *passwordFetchQuery = [baseLookupQuery mutableCopy]; [passwordFetchQuery setObject:(__bridge id)kCFBooleanTrue forKey:(__bridge id)kSecReturnData]; @@ -405,6 +411,22 @@ static unsigned int Find(vlc_keystore *p_keystore, } NSData *secretData = (__bridge_transfer NSData *)secretResult; + NSNumber *creator = [keychainItem objectForKey:(__bridge id)kSecAttrCreator]; + if (creator && [creator isEqual:@(kVlc4Creator)]) { + msg_Dbg(p_keystore, "Found keychain entry in vlc4 format"); + vlc_keystore_entry_set_secret(p_entry, secretData.bytes, secretData.length); + + } else { + msg_Dbg(p_keystore, "Found keychain entry in vlc3 format"); + + /* we need to do some padding here, as string is expected to be 0 terminated */ + NSUInteger secretDataLength = secretData.length; + uint8_t *paddedSecretData = calloc(1, secretDataLength + 1); + memcpy(paddedSecretData, secretData.bytes, secretDataLength); + vlc_keystore_entry_set_secret(p_entry, paddedSecretData, secretDataLength + 1); + free(paddedSecretData); + } + vlc_keystore_entry_set_secret(p_entry, secretData.bytes, secretData.length); } _______________________________________________ vlc-commits mailing list [email protected] https://mailman.videolan.org/listinfo/vlc-commits
