Merge pull request #30785 from poettering/json-allow-extensions
json: add flag for allowing extension of json objects when dispatching, without otherwise being permissive
This commit is contained in:
@@ -192,7 +192,7 @@ static int get_efi_hibernate_location(EFIHibernateLocation **ret) {
|
||||
if (!e)
|
||||
return log_oom();
|
||||
|
||||
r = json_dispatch(v, dispatch_table, JSON_LOG, e);
|
||||
r = json_dispatch(v, dispatch_table, JSON_LOG|JSON_ALLOW_EXTENSIONS, e);
|
||||
if (r < 0)
|
||||
return r;
|
||||
|
||||
|
||||
@@ -113,7 +113,7 @@ static int check_netns_match(void) {
|
||||
{},
|
||||
};
|
||||
|
||||
r = json_dispatch(reply, dispatch_table, JSON_LOG, &id);
|
||||
r = json_dispatch(reply, dispatch_table, JSON_LOG|JSON_ALLOW_EXTENSIONS, &id);
|
||||
if (r < 0)
|
||||
return r;
|
||||
|
||||
|
||||
@@ -20,7 +20,7 @@
|
||||
#include "strv.h"
|
||||
#include "varlink.h"
|
||||
|
||||
static JsonDispatchFlags json_dispatch_flags = 0;
|
||||
static JsonDispatchFlags json_dispatch_flags = JSON_ALLOW_EXTENSIONS;
|
||||
|
||||
static void setup_logging(void) {
|
||||
log_parse_environment_variables();
|
||||
|
||||
@@ -230,7 +230,7 @@ int group_record_load(
|
||||
if (r < 0)
|
||||
return r;
|
||||
|
||||
r = json_dispatch(h->json, group_dispatch_table, json_flags, h);
|
||||
r = json_dispatch(h->json, group_dispatch_table, json_flags | JSON_ALLOW_EXTENSIONS, h);
|
||||
if (r < 0)
|
||||
return r;
|
||||
|
||||
|
||||
+5
-1
@@ -4615,8 +4615,12 @@ int json_dispatch_full(
|
||||
done++;
|
||||
|
||||
} else {
|
||||
json_log(value, flags, 0, "Unexpected object field '%s'.", json_variant_string(key));
|
||||
if (flags & JSON_ALLOW_EXTENSIONS) {
|
||||
json_log(value, flags, 0, "Unrecognized object field '%s', assuming extension.", json_variant_string(key));
|
||||
continue;
|
||||
}
|
||||
|
||||
json_log(value, flags, 0, "Unexpected object field '%s'.", json_variant_string(key));
|
||||
if (flags & JSON_PERMISSIVE)
|
||||
continue;
|
||||
|
||||
|
||||
+8
-7
@@ -376,15 +376,16 @@ int json_buildv(JsonVariant **ret, va_list ap);
|
||||
* entry, as well the bitmask specified for json_log() calls */
|
||||
typedef enum JsonDispatchFlags {
|
||||
/* The following three may be set in JsonDispatch's .flags field or the json_dispatch() flags parameter */
|
||||
JSON_PERMISSIVE = 1 << 0, /* Shall parsing errors be considered fatal for this property? */
|
||||
JSON_MANDATORY = 1 << 1, /* Should existence of this property be mandatory? */
|
||||
JSON_LOG = 1 << 2, /* Should the parser log about errors? */
|
||||
JSON_SAFE = 1 << 3, /* Don't accept "unsafe" strings in json_dispatch_string() + json_dispatch_string() */
|
||||
JSON_RELAX = 1 << 4, /* Use relaxed user name checking in json_dispatch_user_group_name */
|
||||
JSON_PERMISSIVE = 1 << 0, /* Shall parsing errors be considered fatal for this field or object? */
|
||||
JSON_MANDATORY = 1 << 1, /* Should existence of this property be mandatory? */
|
||||
JSON_LOG = 1 << 2, /* Should the parser log about errors? */
|
||||
JSON_SAFE = 1 << 3, /* Don't accept "unsafe" strings in json_dispatch_string() + json_dispatch_string() */
|
||||
JSON_RELAX = 1 << 4, /* Use relaxed user name checking in json_dispatch_user_group_name */
|
||||
JSON_ALLOW_EXTENSIONS = 1 << 5, /* Subset of JSON_PERMISSIVE: allow additional fields, but no other permissive handling */
|
||||
|
||||
/* The following two may be passed into log_json() in addition to those above */
|
||||
JSON_DEBUG = 1 << 5, /* Indicates that this log message is a debug message */
|
||||
JSON_WARNING = 1 << 6, /* Indicates that this log message is a warning message */
|
||||
JSON_DEBUG = 1 << 6, /* Indicates that this log message is a debug message */
|
||||
JSON_WARNING = 1 << 7, /* Indicates that this log message is a warning message */
|
||||
} JsonDispatchFlags;
|
||||
|
||||
typedef int (*JsonDispatchCallback)(const char *name, JsonVariant *variant, JsonDispatchFlags flags, void *userdata);
|
||||
|
||||
@@ -1625,7 +1625,7 @@ int user_record_load(UserRecord *h, JsonVariant *v, UserRecordLoadFlags load_fla
|
||||
if (r < 0)
|
||||
return r;
|
||||
|
||||
r = json_dispatch(h->json, user_dispatch_table, json_flags, h);
|
||||
r = json_dispatch(h->json, user_dispatch_table, json_flags | JSON_ALLOW_EXTENSIONS, h);
|
||||
if (r < 0)
|
||||
return r;
|
||||
|
||||
|
||||
+3
-3
@@ -199,7 +199,7 @@ static int userdb_on_query_reply(
|
||||
|
||||
assert_se(!iterator->found_user);
|
||||
|
||||
r = json_dispatch(parameters, dispatch_table, 0, &user_data);
|
||||
r = json_dispatch(parameters, dispatch_table, JSON_ALLOW_EXTENSIONS, &user_data);
|
||||
if (r < 0)
|
||||
goto finish;
|
||||
|
||||
@@ -256,7 +256,7 @@ static int userdb_on_query_reply(
|
||||
|
||||
assert_se(!iterator->found_group);
|
||||
|
||||
r = json_dispatch(parameters, dispatch_table, 0, &group_data);
|
||||
r = json_dispatch(parameters, dispatch_table, JSON_ALLOW_EXTENSIONS, &group_data);
|
||||
if (r < 0)
|
||||
goto finish;
|
||||
|
||||
@@ -309,7 +309,7 @@ static int userdb_on_query_reply(
|
||||
assert(!iterator->found_user_name);
|
||||
assert(!iterator->found_group_name);
|
||||
|
||||
r = json_dispatch(parameters, dispatch_table, 0, &membership_data);
|
||||
r = json_dispatch(parameters, dispatch_table, JSON_ALLOW_EXTENSIONS, &membership_data);
|
||||
if (r < 0)
|
||||
goto finish;
|
||||
|
||||
|
||||
Reference in New Issue
Block a user