]> git.ipfire.org Git - thirdparty/freeradius-server.git/commitdiff
rlm_redis argument splitting
authorBrian Candler <b.candler@pobox.com>
Sat, 9 Feb 2013 10:20:10 +0000 (10:20 +0000)
committerBrian Candler <b.candler@pobox.com>
Fri, 15 Feb 2013 09:13:47 +0000 (09:13 +0000)
rlm_redis_query now splits the query into separate arguments and expands
each one individually.

This allows for both string literals and expansions to contain spaces, e.g.

    %{redis:LPUSH 'my key' %{User-Name}}

src/modules/rlm_redis/rlm_redis.c
src/modules/rlm_redis/rlm_redis.h
src/modules/rlm_rediswho/rlm_rediswho.c

index bddb5eab3a81f9571ed66208356777cc1339ae29..a2e376efb86ca563667d8662eb4cda8a849ab3d7 100644 (file)
@@ -229,15 +229,6 @@ static int redis_xlat(void *instance, REQUEST *request,
        size_t ret = 0;
        char *buffer_ptr;
        char buffer[21];
-       char querystr[MAX_QUERY_LEN];
-
-       if (!radius_xlat(querystr, sizeof(querystr), fmt, request,
-                   redis_escape_func)) {
-               radlog(L_ERR, "rlm_redis (%s): xlat failed.",
-                      inst->xlat_name);
-
-               return 0;
-       }
 
        if ((dissocket = redis_get_socket(inst)) == NULL) {
                radlog(L_ERR, "rlm_redis (%s): redis_get_socket() failed",
@@ -247,7 +238,7 @@ static int redis_xlat(void *instance, REQUEST *request,
        }
 
        /* Query failed for some reason, release socket and return */
-       if (rlm_redis_query(dissocket, inst, querystr) < 0) {
+       if (rlm_redis_query(dissocket, inst, fmt, request) < 0) {
                rlm_redis_finish_query(dissocket);
                redis_release_socket(inst,dissocket);
         
@@ -371,16 +362,26 @@ static int redis_init_socketpool(REDIS_INST *inst)
 }
 
 /*
- *     Free the redis database
+ *     Peform a redis query. Split into args and pass each one through xlat.
  */
-int rlm_redis_query(REDISSOCK *dissocket, REDIS_INST *inst, char *query)
+int rlm_redis_query(REDISSOCK *dissocket, REDIS_INST *inst, const char *query,
+                   REQUEST *request)
 {
+       int argc;
+       const char *argv[MAX_REDIS_ARGS];
+       char argv_buf[MAX_QUERY_LEN];
+
        if (!query || !*query) {
                return -1;
        }
 
-       DEBUG2("executing query %s", query);
-       dissocket->reply = redisCommand(dissocket->conn, query);
+       argc = rad_expand_xlat(request, query, MAX_REDIS_ARGS, argv, 0,
+                               sizeof(argv_buf), argv_buf);
+       if (argc <= 0)
+               return -1;
+
+       DEBUG2("executing %s ...", argv[0]);
+       dissocket->reply = redisCommandArgv(dissocket->conn, argc, argv, NULL);
 
        if (dissocket->reply == NULL) {
                radlog(L_ERR, "rlm_redis: (%s) REDIS error: %s",
index c50158627ddb0b7c42a4087db8b6e6e68b1bddaf..732559f32eb8b058ab9aa6884c8bafd6b4ee2033 100644 (file)
@@ -71,15 +71,18 @@ typedef struct rlm_redis_t {
 
        REDISSOCK *(*redis_get_socket)(REDIS_INST * inst);
        int (*redis_release_socket)(REDIS_INST * inst, REDISSOCK *dissocket);
-        int (*redis_query)(REDISSOCK *dissocket, REDIS_INST *inst, char *query);
+        int (*redis_query)(REDISSOCK *dissocket, REDIS_INST *inst,
+                           const char *query, REQUEST *request);
         int (*redis_finish_query)(REDISSOCK *dissocket);
         size_t (*redis_escape_func)(char *out, size_t outlen, const char *in);
 
 } rlm_redis_t;
 
 #define MAX_QUERY_LEN                  4096
+#define MAX_REDIS_ARGS                 16
 
-int rlm_redis_query(REDISSOCK *dissocket, REDIS_INST *inst, char *query);
+int rlm_redis_query(REDISSOCK *dissocket, REDIS_INST *inst, const char *query,
+                    REQUEST *request);
 int rlm_redis_finish_query(REDISSOCK *dissocket);
 
 REDISSOCK * redis_get_socket(REDIS_INST * inst);
index aca9df402720109eff9088f7812851e0afaa0e85..9aea3121d4aba4125bfc693dc923bef496bcb078 100644 (file)
@@ -100,26 +100,12 @@ static CONF_PARSER module_config[] = {
 static int rediswho_command(const char *fmt, REDISSOCK *dissocket,
                            rlm_rediswho_t *data, REQUEST *request)
 {
-       char query[MAX_STRING_LEN * 4];
        int result = 0;
 
-       /*
-        *      Do an xlat on the provided string
-        */
-       if (request) {
-               if (!radius_xlat(query, sizeof (query), fmt, request,
-                                data->redis_inst->redis_escape_func)) {
-                       radlog(L_ERR, "rediswho_command: xlat failed on: '%s'", query);
-                       return -1;
-               }
-
-       } else {
-               strcpy(query, fmt);
-       }
-
-       if (data->redis_inst->redis_query(dissocket, data->redis_inst, query) < 0) {
+       if (data->redis_inst->redis_query(dissocket, data->redis_inst,
+                                         fmt, request) < 0) {
 
-               radlog(L_ERR, "rediswho_command: database query error in: '%s'", query);
+               radlog(L_ERR, "rediswho_command: database query error in: '%s'", fmt);
                return -1;
        }