Skip to content

Commit

Permalink
Use the map functions to parse VALUE_PAIR string tuples
Browse files Browse the repository at this point in the history
  • Loading branch information
arr2036 committed Nov 26, 2013
1 parent 66c2598 commit e938e21
Show file tree
Hide file tree
Showing 4 changed files with 31 additions and 45 deletions.
2 changes: 1 addition & 1 deletion src/include/libradius.h
Expand Up @@ -277,7 +277,7 @@ typedef struct vp_cursor {
* Used to represent pairs in the legacy 'users' file format.
*/
typedef struct value_pair_raw {
char l_opand[64]; //!< Left hand side of the pair.
char l_opand[256]; //!< Left hand side of the pair.
char r_opand[1024]; //!< Right hand side of the pair.

FR_TOKEN quote; //!< Type of quoting around the r_opand.
Expand Down
4 changes: 3 additions & 1 deletion src/include/radiusd.h
Expand Up @@ -738,7 +738,9 @@ int radius_map2vp(VALUE_PAIR **out, REQUEST *request, value_pair_map_t const *ma
int radius_map2request(REQUEST *request, value_pair_map_t const *map,
char const *src, radius_tmpl_getvalue_t func, void *ctx);

int radius_str2vp(REQUEST *request, char const *str, request_refs_t request_def, pair_lists_t list_def);
int radius_str2vp(REQUEST *request, char const *raw,
request_refs_t dst_request_def, pair_lists_t dst_list_def,
request_refs_t src_request_def, pair_lists_t src_list_def);
VALUE_PAIR *radius_vpt_get_vp(REQUEST *request, value_pair_tmpl_t const *vpt);
int radius_get_vp(VALUE_PAIR **vp_p, REQUEST *request, char const *name);

Expand Down
64 changes: 23 additions & 41 deletions src/main/valuepair.c
Expand Up @@ -1325,57 +1325,39 @@ int radius_map2vp(VALUE_PAIR **out, REQUEST *request, value_pair_map_t const *ma
*
* @param request Current request.
* @param raw string to parse.
* @param request_def to use if attribute isn't qualified.
* @param list_def to use if attribute isn't qualified.
* @return 0 on success, -1 on error.
* @param dst_request_def to use if attribute isn't qualified.
* @param dst_list_def to use if attribute isn't qualified.
* @param src_request_def to use if attribute isn't qualified.
* @param src_list_def to use if attribute isn't qualified.
* @return 0 on success, < 0 on error.
*/
int radius_str2vp(REQUEST *request, char const *raw, request_refs_t request_def, pair_lists_t list_def)
int radius_str2vp(REQUEST *request, char const *raw,
request_refs_t dst_request_def, pair_lists_t dst_list_def,
request_refs_t src_request_def, pair_lists_t src_list_def)
{
char const *p;
size_t len;
request_refs_t req;
pair_lists_t list;

VALUE_PAIR *vp = NULL;
VALUE_PAIR **vps;

p = raw;

req = radius_request_name(&p, request_def);
len = p - raw;
if (req == REQUEST_UNKNOWN) {
REDEBUG("Invalid request qualifier \"%.*s\"", (int) len, raw);

return -1;
}
raw += len;

list = radius_list_name(&p, list_def);
if (list == PAIR_LIST_UNKNOWN) {
len = p - raw;

REDEBUG("Invalid list qualifier \"%.*s\"", (int) len, raw);
char const *p = raw;
FR_TOKEN ret;
int rcode;

return -1;
}
raw += len;
VALUE_PAIR_RAW tokens;
value_pair_map_t *map;

if (radius_request(&request, req) < 0) {
ret = pairread(&p, &tokens);
if (ret != T_EOL) {
REDEBUG("Failed tokenising attribute string: %s", fr_strerror());
return -1;
}

vps = radius_list(request, list);
if (!vps) {
map = radius_str2map(request, tokens.l_opand, T_BARE_WORD, tokens.op, tokens.r_opand, tokens.quote,
dst_request_def, dst_list_def, src_request_def, src_list_def);
if (!map) {
REDEBUG("Failed parsing attribute string: %s", fr_strerror());
return -1;
}

if (userparse(request, raw, &vp) == T_OP_INVALID) {
return -1;
}

pairmove(request, vps, &vp);

return 0;
rcode = radius_map2request(request, map, NULL, radius_map2vp, NULL);
talloc_free(map);
return rcode;
}


Expand Down
6 changes: 4 additions & 2 deletions src/modules/rlm_ldap/attrmap.c
Expand Up @@ -262,7 +262,6 @@ void rlm_ldap_map_do(UNUSED const ldap_instance_t *inst, REQUEST *request, LDAP
rlm_ldap_result_t result;
char const *name;


for (map = expanded->maps; map != NULL; map = map->next) {
name = expanded->attrs[total++];

Expand Down Expand Up @@ -305,7 +304,10 @@ void rlm_ldap_map_do(UNUSED const ldap_instance_t *inst, REQUEST *request, LDAP
count = ldap_count_values(values);

for (i = 0; i < count; i++) {
if (radius_str2vp(request, values[i], REQUEST_CURRENT, PAIR_LIST_REPLY) < 0) {
RDEBUG3("Parsing attribute string '%s'", values[i]);
if (radius_str2vp(request, values[i],
REQUEST_CURRENT, PAIR_LIST_REPLY,
REQUEST_CURRENT, PAIR_LIST_REQUEST) < 0) {
RWDEBUG("Failed parsing '%s' value \"%s\" as valuepair, skipping...",
inst->valuepair_attr, values[i]);
}
Expand Down

0 comments on commit e938e21

Please sign in to comment.