* @param[in] vp VALUE_PAIR to convert.
* @param[in] always_string create all values as strings
* @param[in] enum_as_int output enum attribute values as integers not strings
+ * @param[in] dates_as_int output date values as seconds since the epoch
* @return Newly allocated JSON object, or NULL on error
*/
-json_object *json_object_from_attr_value(TALLOC_CTX *ctx, VALUE_PAIR const *vp, bool always_string, bool enum_as_int)
+json_object *json_object_from_attr_value(TALLOC_CTX *ctx, VALUE_PAIR const *vp, bool always_string, bool enum_as_int, bool dates_as_int)
{
char buf[2048];
ssize_t len;
}
}
+ /*
+ * We handle dates as epoch seconds here and dates as strings later.
+ */
+ if (vp->da->type == PW_TYPE_DATE && dates_as_int)
+ return json_object_new_int(vp->vp_date);
/*
* If always_string is set then we print everything to a string and
fr_assert(vp);
fr_assert(inst);
- MEM(obj = json_object_from_attr_value(ctx, vp, inst->always_string, inst->enum_as_int));
+ MEM(obj = json_object_from_attr_value(ctx, vp, inst->always_string, inst->enum_as_int, inst->dates_as_int));
*out = obj;
return is_enum;
if (verbose) WARN("'enum_as_int' not valid in output_mode 'array_of_names' and will be ignored");
ret = false;
}
+ if (inst->dates_as_int) {
+ if (verbose) WARN("'dates_as_int' not valid in output_mode 'array_of_names' and will be ignored");
+ ret = false;
+ }
if (inst->always_string) {
if (verbose) WARN("'always_string' not valid in output_mode 'array_of_names' and will be ignored");
ret = false;
}
-if (&control:Tmp-String-1 != '{"User-Name":{"type":"string","value":"john"},"Filter-Id":{"type":"string","value":["f1","f2"]},"NAS-Port":{"type":"integer","value":999},"Service-Type":{"type":"integer","value":"Login-User"}}') {
+if (&control:Tmp-String-1 != '{"User-Name":{"type":"string","value":"john"},"Filter-Id":{"type":"string","value":["f1","f2"]},"NAS-Port":{"type":"integer","value":999},"Service-Type":{"type":"integer","value":"Login-User"},"Event-Timestamp":{"type":"date","value":"Jan 1 1970 00:20:34 UTC"}}') {
test_fail
}
test_fail
}
-if (&control:Tmp-String-5 != '{"User-Name":{"type":"string","value":"john"},"NAS-Port":{"type":"integer","value":999},"Service-Type":{"type":"integer","value":"Login-User"}}') {
+if (&control:Tmp-String-5 != '{"User-Name":{"type":"string","value":"john"},"NAS-Port":{"type":"integer","value":999},"Service-Type":{"type":"integer","value":"Login-User"},"Event-Timestamp":{"type":"date","value":"Jan 1 1970 00:20:34 UTC"}}') {
test_fail
}
&Tmp-String-2 := "%{json_object_ex_encode:&request:[*]}"
}
-if (&control:Tmp-String-1 != '{"User-Name":{"type":"string","value":"john"},"Filter-Id":{"type":"string","value":["f1","f2"]},"NAS-Port":{"type":"integer","value":999},"Service-Type":{"type":"integer","value":"Login-User"}}') {
+if (&control:Tmp-String-1 != '{"User-Name":{"type":"string","value":"john"},"Filter-Id":{"type":"string","value":["f1","f2"]},"NAS-Port":{"type":"integer","value":999},"Service-Type":{"type":"integer","value":"Login-User"},"Event-Timestamp":{"type":"date","value":"Jan 1 1970 00:20:34 UTC"}}') {
test_fail
}
-if (&control:Tmp-String-2 != '{"pf:User-Name":{"type":"string","value":["john"]},"pf:Filter-Id":{"type":"string","value":["f1","f2"]},"pf:NAS-Port":{"type":"integer","value":["999"]},"pf:Service-Type":{"type":"integer","value":["1"]}}') {
+if (&control:Tmp-String-2 != '{"pf:User-Name":{"type":"string","value":["john"]},"pf:Filter-Id":{"type":"string","value":["f1","f2"]},"pf:NAS-Port":{"type":"integer","value":["999"]},"pf:Service-Type":{"type":"integer","value":["1"]},"pf:Event-Timestamp":{"type":"date","value":[1234]}}') {
test_fail
}
&Tmp-String-2 := "%{json_object_simple_ex_encode:&request:[*]}"
}
-if (&control:Tmp-String-1 != '{"User-Name":"john","Filter-Id":["f1","f2"],"NAS-Port":999,"Service-Type":"Login-User"}') {
+if (&control:Tmp-String-1 != '{"User-Name":"john","Filter-Id":["f1","f2"],"NAS-Port":999,"Service-Type":"Login-User","Event-Timestamp":"Jan 1 1970 00:20:34 UTC"}') {
test_fail
}
-if (&control:Tmp-String-2 != '{"pf:User-Name":["john"],"pf:Filter-Id":["f1","f2"],"pf:NAS-Port":["999"],"pf:Service-Type":["1"]}') {
+if (&control:Tmp-String-2 != '{"pf:User-Name":["john"],"pf:Filter-Id":["f1","f2"],"pf:NAS-Port":["999"],"pf:Service-Type":["1"],"pf:Event-Timestamp":[1234]}') {
test_fail
}
&Tmp-String-2 := "%{json_array_ex_encode:&request:[*]}"
}
-if (&control:Tmp-String-1 != '[{"name":"User-Name","type":"string","value":"john"},{"name":"Filter-Id","type":"string","value":"f1"},{"name":"Filter-Id","type":"string","value":"f2"},{"name":"NAS-Port","type":"integer","value":999},{"name":"Service-Type","type":"integer","value":"Login-User"}]') {
+if (&control:Tmp-String-1 != '[{"name":"User-Name","type":"string","value":"john"},{"name":"Filter-Id","type":"string","value":"f1"},{"name":"Filter-Id","type":"string","value":"f2"},{"name":"NAS-Port","type":"integer","value":999},{"name":"Service-Type","type":"integer","value":"Login-User"},{"name":"Event-Timestamp","type":"date","value":"Jan 1 1970 00:20:34 UTC"}]') {
test_fail
}
-if (&control:Tmp-String-2 != '[{"name":"pf:User-Name","type":"string","value":["john"]},{"name":"pf:Filter-Id","type":"string","value":["f1","f2"]},{"name":"pf:NAS-Port","type":"integer","value":["999"]},{"name":"pf:Service-Type","type":"integer","value":["1"]}]') {
+if (&control:Tmp-String-2 != '[{"name":"pf:User-Name","type":"string","value":["john"]},{"name":"pf:Filter-Id","type":"string","value":["f1","f2"]},{"name":"pf:NAS-Port","type":"integer","value":["999"]},{"name":"pf:Service-Type","type":"integer","value":["1"]},{"name":"pf:Event-Timestamp","type":"date","value":[1234]}]') {
test_fail
}
&Tmp-String-2 := "%{json_array_names_ex_encode:&request:[*]}"
}
-if (&control:Tmp-String-1 != '["User-Name","Filter-Id","Filter-Id","NAS-Port","Service-Type"]') {
+if (&control:Tmp-String-1 != '["User-Name","Filter-Id","Filter-Id","NAS-Port","Service-Type","Event-Timestamp"]') {
test_fail
}
-if (&control:Tmp-String-2 != '["pf:User-Name","pf:Filter-Id","pf:Filter-Id","pf:NAS-Port","pf:Service-Type"]') {
+if (&control:Tmp-String-2 != '["pf:User-Name","pf:Filter-Id","pf:Filter-Id","pf:NAS-Port","pf:Service-Type","pf:Event-Timestamp"]') {
test_fail
}
&Tmp-String-2 := "%{json_array_values_ex_encode:&request:[*]}"
}
-if (&control:Tmp-String-1 != '["john","f1","f2",999,"Login-User"]') {
+if (&control:Tmp-String-1 != '["john","f1","f2",999,"Login-User","Jan 1 1970 00:20:34 UTC"]') {
test_fail
}
-if (&control:Tmp-String-2 != '["john","f1","f2","999","1"]') {
+if (&control:Tmp-String-2 != '["john","f1","f2","999","1",1234]') {
test_fail
}