[vlc-commits] keychain: fix protocols not recognized

Thomas Guillem git at videolan.org
Thu Nov 14 15:24:02 CET 2019


vlc | branch: master | Thomas Guillem <thomas at gllm.fr> | Thu Oct 31 10:27:39 2019 +0100| [f3ec50edbbadbd43c67d423bc829a2ce463e056e] | committer: Thomas Guillem

keychain: fix protocols not recognized

It is mandatory for smb:// for example.

Needed for the test_modules_keystore success.

> http://git.videolan.org/gitweb.cgi/vlc.git/?a=commit;h=f3ec50edbbadbd43c67d423bc829a2ce463e056e
---

 modules/keystore/keychain.m | 44 +++++++++++++++++++++++++++++++++++++++-----
 1 file changed, 39 insertions(+), 5 deletions(-)

diff --git a/modules/keystore/keychain.m b/modules/keystore/keychain.m
index 70b6ee9def..9119e8543f 100644
--- a/modules/keystore/keychain.m
+++ b/modules/keystore/keychain.m
@@ -205,7 +205,20 @@ static void SetAccessibilityForQuery(vlc_keystore *p_keystore,
     }
 }
 
-static void SetAttributesForQuery(const char *const ppsz_values[KEY_MAX], NSMutableDictionary *query, const char *psz_label)
+struct vlc2secattr
+{
+    const char *vlc;
+    const CFStringRef secattr;
+};
+
+static int vlc2secattr_cmp(const void *key_, const void *entry_)
+{
+    const struct vlc2secattr *entry = entry_;
+    const char *key = key_;
+    return strcasecmp(key, entry->vlc);
+}
+
+static int SetAttributesForQuery(const char *const ppsz_values[KEY_MAX], NSMutableDictionary *query, const char *psz_label)
 {
     const char *psz_protocol = ppsz_values[KEY_PROTOCOL];
     const char *psz_user = ppsz_values[KEY_USER];
@@ -217,7 +230,23 @@ static void SetAttributesForQuery(const char *const ppsz_values[KEY_MAX], NSMuta
         [query setObject:[NSString stringWithUTF8String:psz_label] forKey:(__bridge id)kSecAttrLabel];
     }
     if (psz_protocol) {
-        [query setObject:[NSString stringWithUTF8String:psz_protocol] forKey:(__bridge id)kSecAttrProtocol];
+        const struct vlc2secattr tab[] =
+        { /* /!\ Alphabetical order /!\ */
+            { "ftp", kSecAttrProtocolFTP },
+            { "ftps", kSecAttrProtocolFTPS },
+            { "http", kSecAttrProtocolHTTP },
+            { "https", kSecAttrProtocolHTTPS },
+            { "rtsp", kSecAttrProtocolRTSP },
+            { "sftp", kSecAttrProtocolSSH },
+            { "smb", kSecAttrProtocolSMB },
+        };
+
+        const struct vlc2secattr *entry =
+            bsearch(psz_protocol, tab, ARRAY_SIZE(tab), sizeof(tab[0]), vlc2secattr_cmp);
+        if (!entry)
+            return VLC_EGENERIC;
+
+        [query setObject:(__bridge id)entry->secattr forKey:(__bridge id)kSecAttrProtocol];
     }
     if (psz_user) {
         [query setObject:[NSString stringWithUTF8String:psz_user] forKey:(__bridge id)kSecAttrAccount];
@@ -231,6 +260,8 @@ static void SetAttributesForQuery(const char *const ppsz_values[KEY_MAX], NSMuta
     if (psz_port) {
         [query setObject:[NSNumber numberWithInt:atoi(psz_port)] forKey:(__bridge id)kSecAttrPort];
     }
+
+    return VLC_SUCCESS;
 }
 
 static int Store(vlc_keystore *p_keystore,
@@ -251,7 +282,8 @@ static int Store(vlc_keystore *p_keystore,
     NSMutableDictionary *searchQuery = CreateQuery(p_keystore);
 
     /* set attributes */
-    SetAttributesForQuery(ppsz_values, searchQuery, psz_label);
+    if (SetAttributesForQuery(ppsz_values, searchQuery, psz_label))
+        return VLC_EGENERIC;
 
     // One return type must be added for SecItemCopyMatching, even if not used.
     // Older macOS versions (10.7) are very picky here...
@@ -309,7 +341,8 @@ static unsigned int Find(vlc_keystore *p_keystore,
     msg_Dbg(p_keystore, "Lookup keychain entry for server %s", ppsz_values[KEY_SERVER]);
 
     /* set attributes */
-    SetAttributesForQuery(ppsz_values, baseLookupQuery, NULL);
+    if (SetAttributesForQuery(ppsz_values, baseLookupQuery, NULL))
+        return 0;
 
     /* search */
     NSMutableDictionary *searchQuery = [baseLookupQuery mutableCopy];
@@ -392,7 +425,8 @@ static unsigned int Remove(vlc_keystore *p_keystore,
     NSMutableDictionary *query = CreateQuery(p_keystore);
     OSStatus status;
 
-    SetAttributesForQuery(ppsz_values, query, NULL);
+    if (SetAttributesForQuery(ppsz_values, query, NULL))
+        return 0;
 
     [query setObject:@(YES) forKey:(__bridge id)kSecReturnAttributes];
     [query setObject:(__bridge id)kSecMatchLimitAll forKey:(__bridge id)kSecMatchLimit];



More information about the vlc-commits mailing list