quote, value_parse_rules_quoted[quote], &my_rules);
if (slen <= 0) goto error;
- } else if (!rhs[0]) {
- MEM(map->rhs = tmpl_alloc(map, TMPL_TYPE_DATA, T_BARE_WORD, "", 0));
+ } else if (!rhs[0] || !my_rules.enumv || (my_rules.enumv->type == FR_TYPE_STRING)) {
- (void) fr_value_box_strdup(map->rhs, tmpl_value(map->rhs), NULL, "", false);
+ MEM(map->rhs = tmpl_alloc(map, TMPL_TYPE_DATA, T_BARE_WORD, rhs, strlen(rhs)));
+
+ (void) fr_value_box_strdup(map->rhs, tmpl_value(map->rhs), NULL, rhs, false);
} else {
+ /*
+ * Parse it as the given data type.
+ */
slen = tmpl_afrom_substr(map, &map->rhs, &FR_SBUFF_IN(rhs, strlen(rhs)),
T_BARE_WORD, value_parse_rules_unquoted[T_BARE_WORD], &my_rules);
if (slen <= 0) goto error;
TALLOC_CTX *ctx;
fr_value_box_t *to_free = NULL;
fr_value_box_t const *box;
+ fr_pair_parse_t root, relative;
/*
* Finds both the correct ctx and nested list.
add:
vp = fr_pair_afrom_da_nested(ctx, list, da);
if (!vp) {
+ fail:
TALLOC_FREE(to_free);
return -1;
}
*/
if (!box->vb_strvalue[0]) break;
- fr_assert(0);
+ /*
+ * Parse the string as a list of pairs.
+ */
+ root = (fr_pair_parse_t) {
+ .ctx = vp,
+ .da = vp->da,
+ .list = &vp->vp_group,
+ .allow_compare = false,
+ .tainted = box->tainted,
+ };
+ relative = (fr_pair_parse_t) { };
+
+ if (fr_pair_list_afrom_substr(&root, &relative, &FR_SBUFF_IN(box->vb_strvalue, box->vb_length)) < 0) {
+ RPEDEBUG("Failed parsing string '%pV' as attribute list", box);
+ goto fail;
+ }
break;
default:
*/
if (t_rules->at_runtime) return 0;
+ ERROR("UNRESOLVED %d", __LINE__);
+
tmpl_init(vpt, TMPL_TYPE_DATA_UNRESOLVED, T_BARE_WORD,
fr_sbuff_start(&our_in), fr_sbuff_used(&our_in), t_rules);
vpt->data.unescaped = str;
FR_SBUFF_ERROR_RETURN(&our_in);
}
+ slen = fr_sbuff_used(&our_in);
+
+ data_unresolved:
+ if (t_rules->at_runtime) {
+ tmpl_init(vpt, TMPL_TYPE_DATA, quote,
+ fr_sbuff_start(&our_in), slen, t_rules);
+
+ /*
+ * @todo - we have no idea if this is tainted or not.
+ */
+ fr_value_box_strdup_shallow(tmpl_value(vpt), t_rules->enumv, str, false);
+ break;
+ }
+
tmpl_init(vpt, TMPL_TYPE_DATA_UNRESOLVED, quote,
- fr_sbuff_start(&our_in), fr_sbuff_used(&our_in), t_rules);
+ fr_sbuff_start(&our_in), slen, t_rules);
vpt->data.unescaped = str;
- *out = vpt;
-
- FR_SBUFF_SET_RETURN(in, &our_in);
+ break;
case T_SINGLE_QUOTED_STRING:
/*
slen = fr_sbuff_out_aunescape_until(vpt, &str, &our_in, SIZE_MAX,
p_rules ? p_rules->terminals : NULL,
p_rules ? p_rules->escapes : NULL);
- tmpl_init(vpt, TMPL_TYPE_DATA_UNRESOLVED, quote, fr_sbuff_start(&our_in), slen, t_rules);
- vpt->data.unescaped = str;
- break;
+ goto data_unresolved;
case T_DOUBLE_QUOTED_STRING:
{
*/
if (xlat_to_string(vpt, &str, &head)) {
TALLOC_FREE(head);
-
- tmpl_init(vpt, TMPL_TYPE_DATA_UNRESOLVED, quote,
- fr_sbuff_start(&our_in), slen, t_rules);
- vpt->data.unescaped = str; /* Store the unescaped string for parsing later */
- break;
+ goto data_unresolved;
}
}
#
Packet-Type == Access-Accept
Idle-Timeout == 3600
-Digest-Attributes == { }
-#Digest-Attributes == { Nonce == "dcd98b7102dd2f0e8b11d0f600bfb0c093", Method == "Invite", URI == "sip:bob@biloxi.com" }
+Digest-Attributes == { Nonce == "dcd98b7102dd2f0e8b11d0f600bfb0c093", Method == "Invite", URI == "sip:bob@biloxi.com" }
test_fail
}
-if (%sql("${insert_into_radreply} ('user_auth_nested', 'Digest-Attributes', ':=', '')") != "1") {
+if (%sql("${insert_into_radreply} ('user_auth_nested', 'Digest-Attributes', ':=', 'Nonce = \"dcd98b7102dd2f0e8b11d0f600bfb0c093\", Method = \"Invite\", URI = \"sip:bob@biloxi.com\"')") != "1") {
test_fail
}