]> git.ipfire.org Git - thirdparty/dovecot/core.git/commitdiff
lib-oauth2: Move identifier escaping to own function
authorAki Tuomi <aki.tuomi@open-xchange.com>
Sat, 10 Apr 2021 14:54:45 +0000 (17:54 +0300)
committerAki Tuomi <aki.tuomi@open-xchange.com>
Fri, 16 Apr 2021 07:21:25 +0000 (10:21 +0300)
src/lib-oauth2/oauth2-jwt.c

index 83b241c558ec47440cc7752bd43965df4bf3c5d0..94810766f13faaeeb9f080df8e8e68014e62fa96 100644 (file)
@@ -45,6 +45,38 @@ get_time_field(const struct json_tree *tree, const char *key, long *value_r)
        return 1;
 }
 
+/* Escapes '.', '/' and '%' in identifier to %hex */
+static const char *escape_identifier(const char *identifier)
+{
+       size_t pos = strcspn(identifier, "./%");
+       if (pos < strlen(identifier)) {
+               /* sanitize identifier, cannot allow dots or / in it, so we
+                 encode them */
+               string_t *new_id = t_str_new(strlen(identifier));
+               /* put initial data */
+               str_append_data(new_id, identifier, pos);
+
+               for (const char *c = identifier+pos; *c != '\0'; c++) {
+                       switch (*c) {
+                       case '.':
+                               str_append(new_id, "%2e");
+                               break;
+                       case '/':
+                               str_append(new_id, "%2f");
+                               break;
+                       case '%':
+                               str_append(new_id, "%25");
+                               break;
+                       default:
+                               str_append_c(new_id, *c);
+                               break;
+                       }
+               }
+               return str_c(new_id);
+       }
+       return identifier;
+}
+
 static int
 oauth2_lookup_hmac_key(const struct oauth2_settings *set, const char *azp,
                       const char *alg, const char *key_id,
@@ -429,32 +461,8 @@ int oauth2_try_parse_jwt(const struct oauth2_settings *set,
        else if (*kid == '\0') {
                *error_r = "'kid' field is empty";
                return -1;
-       }
-
-       size_t pos = strcspn(kid, "./%");
-       if (pos < strlen(kid)) {
-               /* sanitize kid, cannot allow dots or / in it, so we encode them
-                */
-               string_t *new_kid = t_str_new(strlen(kid));
-               /* put initial data */
-               str_append_data(new_kid, kid, pos);
-               for (const char *c = kid+pos; *c != '\0'; c++) {
-                       switch (*c) {
-                       case '.':
-                               str_append(new_kid, "%2e");
-                               break;
-                       case '/':
-                               str_append(new_kid, "%2f");
-                               break;
-                       case '%':
-                               str_append(new_kid, "%25");
-                               break;
-                       default:
-                               str_append_c(new_kid, *c);
-                               break;
-                       }
-               }
-               kid = str_c(new_kid);
+       } else {
+               kid = escape_identifier(kid);
        }
 
        /* parse body */