]> granicus.if.org Git - apache/commitdiff
Expression parser: Add the ability to apply a SHA1 hash to strings within
authorGraham Leggett <minfrin@apache.org>
Sun, 17 Mar 2013 13:52:58 +0000 (13:52 +0000)
committerGraham Leggett <minfrin@apache.org>
Sun, 17 Mar 2013 13:52:58 +0000 (13:52 +0000)
the parser.

git-svn-id: https://svn.apache.org/repos/asf/httpd/httpd/trunk@1457450 13f79535-47bb-0310-9956-ffa450edef68

docs/manual/expr.xml
server/util_expr_eval.c

index 51bfbf3d4b8d2eec2249db482296065c986d1756..8079fd266f880107d8f7d49f7c74b8fc574d153e 100644 (file)
@@ -477,6 +477,9 @@ listfunction ::= listfuncname "<strong>(</strong>" word "<strong>)</strong>"
     <tr><td><code>unbase64</code></td>
         <td>Decode base64 encoded string, return truncated string if 0x00 is
             found</td><td></td></tr>
+    <tr><td><code>sha1</code></td>
+        <td>Hash the string using SHA1, then encode the hash with base64
+            encoding</td><td></td></tr>
     <tr><td><code>file</code></td>
         <td>Read contents from a file</td><td>yes</td></tr>
     <tr><td><code>filesize</code></td>
index 4088fc42ae1417b7ca767104e027c123047a2140..3ee0ff5a7fb9f57d518cae019fdd30c4de381dec 100644 (file)
@@ -28,6 +28,8 @@
 
 #include "apr_lib.h"
 #include "apr_fnmatch.h"
+#include "apr_base64.h"
+#include "apr_sha1.h"
 
 #include <limits.h>     /* for INT_MAX */
 
@@ -1031,6 +1033,25 @@ static const char *unbase64_func(ap_expr_eval_ctx_t *ctx, const void *data,
     return ap_pbase64decode(ctx->p, arg);
 }
 
+static const char *sha1_func(ap_expr_eval_ctx_t *ctx, const void *data,
+                               const char *arg)
+{
+    int l;
+    apr_sha1_ctx_t context;
+    apr_byte_t digest[APR_SHA1_DIGESTSIZE];
+    char *out = apr_palloc(ctx->p, 28);
+
+    apr_sha1_init(&context);
+    apr_sha1_update(&context, arg, strlen(arg));
+    apr_sha1_final(digest, &context);
+
+    /* SHA1 hash is always 20 chars */
+    l = apr_base64_encode_binary(out, digest, sizeof(digest));
+    out[l] = '\0';
+
+    return out;
+}
+
 #define MAX_FILE_SIZE 10*1024*1024
 static const char *file_func(ap_expr_eval_ctx_t *ctx, const void *data,
                              char *arg)
@@ -1612,6 +1633,7 @@ static const struct expr_provider_single string_func_providers[] = {
     { filesize_func,        "filesize",       NULL, 1 },
     { base64_func,          "base64",         NULL, 0 },
     { unbase64_func,        "unbase64",       NULL, 0 },
+    { sha1_func,            "sha1",           NULL, 0 },
     { NULL, NULL, NULL}
 };
 /* XXX: base64 encode/decode ? */