]> git.ipfire.org Git - thirdparty/dovecot/core.git/commitdiff
lib: var-expand - Support base64url for hash format
authorAki Tuomi <aki.tuomi@open-xchange.com>
Thu, 10 Oct 2019 09:57:08 +0000 (12:57 +0300)
committerAki Tuomi <aki.tuomi@open-xchange.com>
Mon, 17 Jan 2022 11:52:09 +0000 (13:52 +0200)
src/lib/test-var-expand.c
src/lib/var-expand.c

index 558ef76b869d1ea958b5a5000e3efcf0c70912cb..77cf6589dfe3afa129d6c7c5451989202dbcb6aa 100644 (file)
@@ -289,6 +289,7 @@ static void test_var_expand_extensions(void)
                { "rounds,salt,expand: %{sha1;rounds=1000,salt=%{other-value}:value} %{other-value}", "rounds,salt,expand: 49a598ee110af615e175f2e4511cc5d7ccff96ab other-example" },
                { "format: %4.8{sha1:value}", "format: 9c272973" },
                { "base64: %{sha1;format=base64:value}", "base64: w0mcJylzCn+AfvuGdqkty2+KP48=" },
+               { "base64url: %{sha1;format=base64url:value}", "base64url: w0mcJylzCn-AfvuGdqkty2-KP48" },
        };
 
        static const struct var_expand_func_table func_table[] = {
index 7ddaec0a63f93a3f11236f3990b1648d59f52cd1..c0c0ed2d5b34a02cc6fa3932e144e7b9b1311336 100644 (file)
@@ -201,7 +201,8 @@ var_expand_hash(struct var_expand_context *ctx,
        enum {
                FORMAT_HEX,
                FORMAT_HEX_UC,
-               FORMAT_BASE64
+               FORMAT_BASE64,
+               FORMAT_BASE64_URL,
        } format = FORMAT_HEX;
 
        const char *p = strchr(key, ';');
@@ -289,6 +290,8 @@ var_expand_hash(struct var_expand_context *ctx,
                                format = FORMAT_HEX_UC;
                        } else if (strcmp(value, "base64") == 0) {
                                format = FORMAT_BASE64;
+                       } else if (strcmp(value, "base64url") == 0) {
+                               format = FORMAT_BASE64_URL;
                        } else {
                                *error_r = t_strdup_printf(
                                        "Cannot parse hash arguments:"
@@ -344,6 +347,13 @@ var_expand_hash(struct var_expand_context *ctx,
                        *result_r = str_c(dest);
                        return 1;
                }
+               case FORMAT_BASE64_URL: {
+                       string_t *dest = t_str_new(64);
+                       base64url_encode(BASE64_ENCODE_FLAG_NO_PADDING, 0,
+                                        tmp->data, tmp->used, dest);
+                       *result_r = str_c(dest);
+                       return 1;
+               }
        }
 
        i_unreached();