]> granicus.if.org Git - apache/commitdiff
Merge r1457450, r1457610, r1457995, r1458003 from trunk:
authorJim Jagielski <jim@apache.org>
Mon, 15 Apr 2013 12:41:23 +0000 (12:41 +0000)
committerJim Jagielski <jim@apache.org>
Mon, 15 Apr 2013 12:41:23 +0000 (12:41 +0000)
Expression parser: Add the ability to apply a SHA1 hash to strings within
the parser.

Expression parser: use hex encoding for the sha1 hash.

sha1 now does hex encoding

simplify code by using ap_bin2hex()

Submitted by: minfrin, sf, sf
Reviewed/backported by: jim

git-svn-id: https://svn.apache.org/repos/asf/httpd/httpd/branches/2.4.x@1467979 13f79535-47bb-0310-9956-ffa450edef68

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

diff --git a/STATUS b/STATUS
index 5c1cfa064cfa68480115c8a59e1bce8af75e3630..1f7213f47ac971402f5c9a56d2465367cc7382eb 100644 (file)
--- a/STATUS
+++ b/STATUS
@@ -90,15 +90,6 @@ RELEASE SHOWSTOPPERS:
 PATCHES ACCEPTED TO BACKPORT FROM TRUNK:
   [ start all new proposals below, under PATCHES PROPOSED. ]
 
-  * ap_expr: Expression parser: Add the ability to apply a SHA1 hash to
-    strings within the parser.
-    trunk patch: http://svn.apache.org/r1457450
-                 http://svn.apache.org/r1457610
-                 http://svn.apache.org/r1457995
-                 http://svn.apache.org/r1458003
-    2.4.x patch: trunk patch applies.
-    +1: minfrin, rjung, jim
-
    * remove useless tests ==> (*x && apr_isspace(*x))
      trunk patch: http://svn.apache.org/viewvc?view=revision&revision=1452128
      2.4.x patch: trunk patch works (with some offset)
index 13b5cee89ab5d37ccf80b54caf01d5120391a5d4..12b8df1e4fb743a81d2f9ad106b88d4a8bf98f2c 100644 (file)
@@ -464,6 +464,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 hexadecimal
+            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 46bd4b6e85363d13b03556559776fcd6b559e8f9..92146a23c386baa70cd12ef3451132a43a1cc252 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,24 @@ 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)
+{
+    apr_sha1_ctx_t context;
+    apr_byte_t sha1[APR_SHA1_DIGESTSIZE];
+    char *out;
+
+    out = apr_palloc(ctx->p, APR_SHA1_DIGESTSIZE*2+1);
+
+    apr_sha1_init(&context);
+    apr_sha1_update(&context, arg, strlen(arg));
+    apr_sha1_final(sha1, &context);
+
+    ap_bin2hex(sha1, APR_SHA1_DIGESTSIZE, out);
+
+    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)
@@ -1589,6 +1609,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}
 };