From: Phil Mayers Date: Fri, 21 Sep 2012 17:04:03 +0000 (+0100) Subject: rlm_sqlcounter: remove SQL escaping, let the SQL module handle it X-Git-Tag: release_3_0_0_beta1~1662^2~1^2~2 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=c38eb9198d497e9a961509903184066f5e122b52;p=thirdparty%2Ffreeradius-server.git rlm_sqlcounter: remove SQL escaping, let the SQL module handle it --- diff --git a/src/modules/rlm_sqlcounter/rlm_sqlcounter.c b/src/modules/rlm_sqlcounter/rlm_sqlcounter.c index 52fe2be00ac..9cb6c1d46a1 100644 --- a/src/modules/rlm_sqlcounter/rlm_sqlcounter.c +++ b/src/modules/rlm_sqlcounter/rlm_sqlcounter.c @@ -69,7 +69,6 @@ typedef struct rlm_sqlcounter_t { char *sqlmod_inst; /* instance of SQL module to use, usually just 'sql' */ char *query; /* SQL query to retrieve current session time */ char *reset; /* daily, weekly, monthly, never or user defined */ - char *allowed_chars; /* safe characters list for SQL queries */ time_t reset_time; time_t last_reset; DICT_ATTR *key_attr; /* attribute number for key field */ @@ -94,61 +93,9 @@ static const CONF_PARSER module_config[] = { { "sqlmod-inst", PW_TYPE_STRING_PTR, offsetof(rlm_sqlcounter_t,sqlmod_inst), NULL, NULL }, { "query", PW_TYPE_STRING_PTR, offsetof(rlm_sqlcounter_t,query), NULL, NULL }, { "reset", PW_TYPE_STRING_PTR, offsetof(rlm_sqlcounter_t,reset), NULL, NULL }, - { "safe-characters", PW_TYPE_STRING_PTR, offsetof(rlm_sqlcounter_t,allowed_chars), NULL, "@abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789.-_: /"}, { NULL, -1, 0, NULL, NULL } }; -static char *allowed_chars = NULL; - -/* - * Translate the SQL queries. - */ -static size_t sql_escape_func(UNUSED REQUEST *request, char *out, size_t outlen, const char *in, UNUSED void *arg) -{ - int len = 0; - - while (in[0]) { - /* - * Non-printable characters get replaced with their - * mime-encoded equivalents. - */ - if ((in[0] < 32) || - strchr(allowed_chars, *in) == NULL) { - /* - * Only 3 or less bytes available. - */ - if (outlen <= 3) { - break; - } - - snprintf(out, outlen, "=%02X", (unsigned char) in[0]); - in++; - out += 3; - outlen -= 3; - len += 3; - continue; - } - - /* - * Only one byte left. - */ - if (outlen <= 1) { - break; - } - - /* - * Allowed character. - */ - *out = *in; - out++; - in++; - outlen--; - len++; - } - *out = '\0'; - return len; -} - static int find_next_reset(rlm_sqlcounter_t *data, time_t timeval) { int ret = 0; @@ -353,11 +300,6 @@ static int sqlcounter_expand(char *out, int outlen, const char *fmt, void *insta strlcpy(q, data->key_name, freespace); q += strlen(q); break; - case 'S': /* SQL module instance */ - DEBUG2("WARNING: Please replace '%%S' with '${sqlmod-inst}'"); - strlcpy(q, data->sqlmod_inst, freespace); - q += strlen(q); - break; default: *q++ = '%'; *q++ = *p; @@ -382,7 +324,7 @@ static int sqlcounter_cmp(void *instance, REQUEST *req, rlm_sqlcounter_t *data = (rlm_sqlcounter_t *) instance; int counter; char querystr[MAX_QUERY_LEN]; - char responsestr[MAX_QUERY_LEN]; + char sqlxlat[MAX_QUERY_LEN]; check_pairs = check_pairs; /* shut the compiler up */ reply_pairs = reply_pairs; @@ -390,15 +332,11 @@ static int sqlcounter_cmp(void *instance, REQUEST *req, /* first, expand %k, %b and %e in query */ sqlcounter_expand(querystr, MAX_QUERY_LEN, data->query, instance); - /* second, xlat any request attribs in query */ - radius_xlat(responsestr, MAX_QUERY_LEN, querystr, req, sql_escape_func, NULL); - /* third, wrap query with sql module call & expand */ - snprintf(querystr, sizeof(querystr), "%%{%%S:%s}", responsestr); - sqlcounter_expand(responsestr, MAX_QUERY_LEN, querystr, instance); + snprintf(sqlxlat, sizeof(sqlxlat), "%%{%s:%s}", data->sqlmod_inst, querystr); /* Finally, xlat resulting SQL query */ - radius_xlat(querystr, MAX_QUERY_LEN, responsestr, req, sql_escape_func, NULL); + radius_xlat(querystr, MAX_QUERY_LEN, sqlxlat, req, NULL, NULL); counter = atoi(querystr); @@ -422,7 +360,6 @@ static int sqlcounter_instantiate(CONF_SECTION *conf, void **instance) DICT_ATTR *dattr; ATTR_FLAGS flags; time_t now; - char buffer[MAX_STRING_LEN]; /* * Set up a storage area for instance data @@ -453,12 +390,6 @@ static int sqlcounter_instantiate(CONF_SECTION *conf, void **instance) return -1; } - /* - * Safe characters list for sql queries. Everything else is - * replaced with their mime-encoded equivalents. - */ - allowed_chars = data->allowed_chars; - /* * Discover the attribute number of the key. */ @@ -467,12 +398,6 @@ static int sqlcounter_instantiate(CONF_SECTION *conf, void **instance) sqlcounter_detach(data); return -1; } - sql_escape_func(NULL, buffer, sizeof(buffer), data->key_name, NULL); - if (strcmp(buffer, data->key_name) != 0) { - radlog(L_ERR, "rlm_sqlcounter: The value for option 'key' is too long or contains unsafe characters."); - sqlcounter_detach(data); - return -1; - } dattr = dict_attrbyname(data->key_name); if (dattr == NULL) { radlog(L_ERR, "rlm_sqlcounter: No such attribute %s", @@ -501,12 +426,6 @@ static int sqlcounter_instantiate(CONF_SECTION *conf, void **instance) sqlcounter_detach(data); return -1; } - sql_escape_func(NULL, buffer, sizeof(buffer), data->sqlmod_inst, NULL); - if (strcmp(buffer, data->sqlmod_inst) != 0) { - radlog(L_ERR, "rlm_sqlcounter: The value for option 'sqlmod-inst' is too long or contains unsafe characters."); - sqlcounter_detach(data); - return -1; - } /* * Create a new attribute for the counter. @@ -606,7 +525,7 @@ static int sqlcounter_authorize(void *instance, REQUEST *request) VALUE_PAIR *reply_item; char msg[128]; char querystr[MAX_QUERY_LEN]; - char responsestr[MAX_QUERY_LEN]; + char sqlxlat[MAX_QUERY_LEN]; /* quiet the compiler */ instance = instance; @@ -652,15 +571,11 @@ static int sqlcounter_authorize(void *instance, REQUEST *request) /* first, expand %k, %b and %e in query */ sqlcounter_expand(querystr, MAX_QUERY_LEN, data->query, instance); - /* second, xlat any request attribs in query */ - radius_xlat(responsestr, MAX_QUERY_LEN, querystr, request, sql_escape_func, NULL); - - /* third, wrap query with sql module & expand */ - snprintf(querystr, sizeof(querystr), "%%{%%S:%s}", responsestr); - sqlcounter_expand(responsestr, MAX_QUERY_LEN, querystr, instance); + /* next, wrap query with sql module & expand */ + snprintf(sqlxlat, sizeof(sqlxlat), "%%{%s:%s}", data->sqlmod_inst, querystr); /* Finally, xlat resulting SQL query */ - radius_xlat(querystr, MAX_QUERY_LEN, responsestr, request, sql_escape_func, NULL); + radius_xlat(querystr, MAX_QUERY_LEN, sqlxlat, request, NULL, NULL); if (sscanf(querystr, "%u", &counter) != 1) { DEBUG2("rlm_sqlcounter: No integer found in string \"%s\"", @@ -751,7 +666,6 @@ static int sqlcounter_detach(void *instance) char **p; rlm_sqlcounter_t *inst = (rlm_sqlcounter_t *)instance; - allowed_chars = NULL; paircompare_unregister(inst->dict_attr->attr, sqlcounter_cmp); /*