From 837d8db8da9b2b42a74de752b1c10a2e5d3213dd Mon Sep 17 00:00:00 2001 From: Jim Jagielski Date: Mon, 15 Apr 2013 12:41:23 +0000 Subject: [PATCH] Merge r1457450, r1457610, r1457995, r1458003 from trunk: 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 | 9 --------- docs/manual/expr.xml | 3 +++ server/util_expr_eval.c | 21 +++++++++++++++++++++ 3 files changed, 24 insertions(+), 9 deletions(-) diff --git a/STATUS b/STATUS index 5c1cfa064c..1f7213f47a 100644 --- 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) diff --git a/docs/manual/expr.xml b/docs/manual/expr.xml index 13b5cee89a..12b8df1e4f 100644 --- a/docs/manual/expr.xml +++ b/docs/manual/expr.xml @@ -464,6 +464,9 @@ listfunction ::= listfuncname "(" word ")" unbase64 Decode base64 encoded string, return truncated string if 0x00 is found + sha1 + Hash the string using SHA1, then encode the hash with hexadecimal + encoding file Read contents from a fileyes filesize diff --git a/server/util_expr_eval.c b/server/util_expr_eval.c index 46bd4b6e85..92146a23c3 100644 --- a/server/util_expr_eval.c +++ b/server/util_expr_eval.c @@ -28,6 +28,8 @@ #include "apr_lib.h" #include "apr_fnmatch.h" +#include "apr_base64.h" +#include "apr_sha1.h" #include /* 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} }; -- 2.40.0