Fix -Wshadow warnings caused by json enum member.
This commit is contained in:
@@ -39,7 +39,7 @@
|
|||||||
* Closure used to store state when iterating over all aliases.
|
* Closure used to store state when iterating over all aliases.
|
||||||
*/
|
*/
|
||||||
struct json_alias_closure {
|
struct json_alias_closure {
|
||||||
struct json_container *json;
|
struct json_container *jsonc;
|
||||||
const char *title;
|
const char *title;
|
||||||
unsigned int count;
|
unsigned int count;
|
||||||
int alias_type;
|
int alias_type;
|
||||||
@@ -60,7 +60,7 @@ enum word_type {
|
|||||||
* Print sudo command member in JSON format, with correct indentation.
|
* Print sudo command member in JSON format, with correct indentation.
|
||||||
*/
|
*/
|
||||||
static void
|
static void
|
||||||
print_command_json(struct json_container *json, const char *name, bool negated)
|
print_command_json(struct json_container *jsonc, const char *name, bool negated)
|
||||||
{
|
{
|
||||||
struct sudo_command *c = (struct sudo_command *)name;
|
struct sudo_command *c = (struct sudo_command *)name;
|
||||||
struct command_digest *digest;
|
struct command_digest *digest;
|
||||||
@@ -81,28 +81,28 @@ print_command_json(struct json_container *json, const char *name, bool negated)
|
|||||||
|
|
||||||
if (!negated && TAILQ_EMPTY(&c->digests)) {
|
if (!negated && TAILQ_EMPTY(&c->digests)) {
|
||||||
/* Print as { "command": "command and args" } */
|
/* Print as { "command": "command and args" } */
|
||||||
sudo_json_add_value_as_object(json, "command", &value);
|
sudo_json_add_value_as_object(jsonc, "command", &value);
|
||||||
} else {
|
} else {
|
||||||
/* Print as multi-line object. */
|
/* Print as multi-line object. */
|
||||||
sudo_json_open_object(json, NULL);
|
sudo_json_open_object(jsonc, NULL);
|
||||||
sudo_json_add_value(json, "command", &value);
|
sudo_json_add_value(jsonc, "command", &value);
|
||||||
|
|
||||||
/* Optional digest list. */
|
/* Optional digest list. */
|
||||||
TAILQ_FOREACH(digest, &c->digests, entries) {
|
TAILQ_FOREACH(digest, &c->digests, entries) {
|
||||||
digest_name = digest_type_to_name(digest->digest_type);
|
digest_name = digest_type_to_name(digest->digest_type);
|
||||||
value.type = JSON_STRING;
|
value.type = JSON_STRING;
|
||||||
value.u.string = digest->digest_str;
|
value.u.string = digest->digest_str;
|
||||||
sudo_json_add_value(json, digest_name, &value);
|
sudo_json_add_value(jsonc, digest_name, &value);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Command may be negated. */
|
/* Command may be negated. */
|
||||||
if (negated) {
|
if (negated) {
|
||||||
value.type = JSON_BOOL;
|
value.type = JSON_BOOL;
|
||||||
value.u.boolean = true;
|
value.u.boolean = true;
|
||||||
sudo_json_add_value(json, "negated", &value);
|
sudo_json_add_value(jsonc, "negated", &value);
|
||||||
}
|
}
|
||||||
|
|
||||||
sudo_json_close_object(json);
|
sudo_json_close_object(jsonc);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (cmnd != c->cmnd)
|
if (cmnd != c->cmnd)
|
||||||
@@ -155,7 +155,7 @@ defaults_to_word_type(int defaults_type)
|
|||||||
* Print struct member in JSON format, with correct indentation.
|
* Print struct member in JSON format, with correct indentation.
|
||||||
*/
|
*/
|
||||||
static void
|
static void
|
||||||
print_member_json_int(struct json_container *json,
|
print_member_json_int(struct json_container *jsonc,
|
||||||
struct sudoers_parse_tree *parse_tree, char *name, int type, bool negated,
|
struct sudoers_parse_tree *parse_tree, char *name, int type, bool negated,
|
||||||
enum word_type word_type, bool expand_aliases)
|
enum word_type word_type, bool expand_aliases)
|
||||||
{
|
{
|
||||||
@@ -226,7 +226,7 @@ print_member_json_int(struct json_container *json,
|
|||||||
typestr = "networkaddr";
|
typestr = "networkaddr";
|
||||||
break;
|
break;
|
||||||
case COMMAND:
|
case COMMAND:
|
||||||
print_command_json(json, name, negated);
|
print_command_json(jsonc, name, negated);
|
||||||
debug_return;
|
debug_return;
|
||||||
case ALL:
|
case ALL:
|
||||||
case MYSELF:
|
case MYSELF:
|
||||||
@@ -306,7 +306,7 @@ print_member_json_int(struct json_container *json,
|
|||||||
/* Print each member of the alias. */
|
/* Print each member of the alias. */
|
||||||
if ((a = alias_get(parse_tree, value.u.string, alias_type)) != NULL) {
|
if ((a = alias_get(parse_tree, value.u.string, alias_type)) != NULL) {
|
||||||
TAILQ_FOREACH(m, &a->members, entries) {
|
TAILQ_FOREACH(m, &a->members, entries) {
|
||||||
print_member_json_int(json, parse_tree, m->name, m->type,
|
print_member_json_int(jsonc, parse_tree, m->name, m->type,
|
||||||
negated ? !m->negated : m->negated,
|
negated ? !m->negated : m->negated,
|
||||||
alias_to_word_type(alias_type), true);
|
alias_to_word_type(alias_type), true);
|
||||||
}
|
}
|
||||||
@@ -314,14 +314,14 @@ print_member_json_int(struct json_container *json,
|
|||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
if (negated) {
|
if (negated) {
|
||||||
sudo_json_open_object(json, NULL);
|
sudo_json_open_object(jsonc, NULL);
|
||||||
sudo_json_add_value(json, typestr, &value);
|
sudo_json_add_value(jsonc, typestr, &value);
|
||||||
value.type = JSON_BOOL;
|
value.type = JSON_BOOL;
|
||||||
value.u.boolean = true;
|
value.u.boolean = true;
|
||||||
sudo_json_add_value(json, "negated", &value);
|
sudo_json_add_value(jsonc, "negated", &value);
|
||||||
sudo_json_close_object(json);
|
sudo_json_close_object(jsonc);
|
||||||
} else {
|
} else {
|
||||||
sudo_json_add_value_as_object(json, typestr, &value);
|
sudo_json_add_value_as_object(jsonc, typestr, &value);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -329,11 +329,11 @@ print_member_json_int(struct json_container *json,
|
|||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
print_member_json(struct json_container *json,
|
print_member_json(struct json_container *jsonc,
|
||||||
struct sudoers_parse_tree *parse_tree, struct member *m,
|
struct sudoers_parse_tree *parse_tree, struct member *m,
|
||||||
enum word_type word_type, bool expand_aliases)
|
enum word_type word_type, bool expand_aliases)
|
||||||
{
|
{
|
||||||
print_member_json_int(json, parse_tree, m->name, m->type, m->negated,
|
print_member_json_int(jsonc, parse_tree, m->name, m->type, m->negated,
|
||||||
word_type, expand_aliases);
|
word_type, expand_aliases);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -353,14 +353,14 @@ print_alias_json(struct sudoers_parse_tree *parse_tree, struct alias *a, void *v
|
|||||||
|
|
||||||
/* Open the aliases object or close the last entry, then open new one. */
|
/* Open the aliases object or close the last entry, then open new one. */
|
||||||
if (closure->count++ == 0) {
|
if (closure->count++ == 0) {
|
||||||
sudo_json_open_object(closure->json, closure->title);
|
sudo_json_open_object(closure->jsonc, closure->title);
|
||||||
} else {
|
} else {
|
||||||
sudo_json_close_array(closure->json);
|
sudo_json_close_array(closure->jsonc);
|
||||||
}
|
}
|
||||||
sudo_json_open_array(closure->json, a->name);
|
sudo_json_open_array(closure->jsonc, a->name);
|
||||||
|
|
||||||
TAILQ_FOREACH(m, &a->members, entries) {
|
TAILQ_FOREACH(m, &a->members, entries) {
|
||||||
print_member_json(closure->json, parse_tree, m,
|
print_member_json(closure->jsonc, parse_tree, m,
|
||||||
alias_to_word_type(closure->alias_type), false);
|
alias_to_word_type(closure->alias_type), false);
|
||||||
}
|
}
|
||||||
debug_return_int(0);
|
debug_return_int(0);
|
||||||
@@ -370,7 +370,7 @@ print_alias_json(struct sudoers_parse_tree *parse_tree, struct alias *a, void *v
|
|||||||
* Print the binding for a Defaults entry of the specified type.
|
* Print the binding for a Defaults entry of the specified type.
|
||||||
*/
|
*/
|
||||||
static void
|
static void
|
||||||
print_binding_json(struct json_container *json,
|
print_binding_json(struct json_container *jsonc,
|
||||||
struct sudoers_parse_tree *parse_tree, struct member_list *binding,
|
struct sudoers_parse_tree *parse_tree, struct member_list *binding,
|
||||||
int type, bool expand_aliases)
|
int type, bool expand_aliases)
|
||||||
{
|
{
|
||||||
@@ -381,12 +381,12 @@ print_binding_json(struct json_container *json,
|
|||||||
debug_return;
|
debug_return;
|
||||||
|
|
||||||
/* Print each member object in binding. */
|
/* Print each member object in binding. */
|
||||||
sudo_json_open_array(json, "Binding");
|
sudo_json_open_array(jsonc, "Binding");
|
||||||
TAILQ_FOREACH(m, binding, entries) {
|
TAILQ_FOREACH(m, binding, entries) {
|
||||||
print_member_json(json, parse_tree, m, defaults_to_word_type(type),
|
print_member_json(jsonc, parse_tree, m, defaults_to_word_type(type),
|
||||||
expand_aliases);
|
expand_aliases);
|
||||||
}
|
}
|
||||||
sudo_json_close_array(json);
|
sudo_json_close_array(jsonc);
|
||||||
|
|
||||||
debug_return;
|
debug_return;
|
||||||
}
|
}
|
||||||
@@ -395,13 +395,13 @@ print_binding_json(struct json_container *json,
|
|||||||
* Print a Defaults list JSON format.
|
* Print a Defaults list JSON format.
|
||||||
*/
|
*/
|
||||||
static void
|
static void
|
||||||
print_defaults_list_json(struct json_container *json, struct defaults *def)
|
print_defaults_list_json(struct json_container *jsonc, struct defaults *def)
|
||||||
{
|
{
|
||||||
char savech, *start, *end = def->val;
|
char savech, *start, *end = def->val;
|
||||||
struct json_value value;
|
struct json_value value;
|
||||||
debug_decl(print_defaults_list_json, SUDOERS_DEBUG_UTIL);
|
debug_decl(print_defaults_list_json, SUDOERS_DEBUG_UTIL);
|
||||||
|
|
||||||
sudo_json_open_object(json, NULL);
|
sudo_json_open_object(jsonc, NULL);
|
||||||
value.type = JSON_STRING;
|
value.type = JSON_STRING;
|
||||||
switch (def->op) {
|
switch (def->op) {
|
||||||
case '+':
|
case '+':
|
||||||
@@ -418,8 +418,8 @@ print_defaults_list_json(struct json_container *json, struct defaults *def)
|
|||||||
value.u.string = "unsupported";
|
value.u.string = "unsupported";
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
sudo_json_add_value(json, "operation", &value);
|
sudo_json_add_value(jsonc, "operation", &value);
|
||||||
sudo_json_open_array(json, def->var);
|
sudo_json_open_array(jsonc, def->var);
|
||||||
/* Split value into multiple space-separated words. */
|
/* Split value into multiple space-separated words. */
|
||||||
do {
|
do {
|
||||||
/* Remove leading blanks, must have a non-empty string. */
|
/* Remove leading blanks, must have a non-empty string. */
|
||||||
@@ -435,11 +435,11 @@ print_defaults_list_json(struct json_container *json, struct defaults *def)
|
|||||||
*end = '\0';
|
*end = '\0';
|
||||||
value.type = JSON_STRING;
|
value.type = JSON_STRING;
|
||||||
value.u.string = start;
|
value.u.string = start;
|
||||||
sudo_json_add_value(json, NULL, &value);
|
sudo_json_add_value(jsonc, NULL, &value);
|
||||||
*end = savech;
|
*end = savech;
|
||||||
} while (*end++ != '\0');
|
} while (*end++ != '\0');
|
||||||
sudo_json_close_array(json);
|
sudo_json_close_array(jsonc);
|
||||||
sudo_json_close_object(json);
|
sudo_json_close_object(jsonc);
|
||||||
|
|
||||||
debug_return;
|
debug_return;
|
||||||
}
|
}
|
||||||
@@ -461,7 +461,7 @@ get_defaults_type(struct defaults *def)
|
|||||||
* Export all Defaults in JSON format.
|
* Export all Defaults in JSON format.
|
||||||
*/
|
*/
|
||||||
static void
|
static void
|
||||||
print_defaults_json(struct json_container *json,
|
print_defaults_json(struct json_container *jsonc,
|
||||||
struct sudoers_parse_tree *parse_tree, bool expand_aliases)
|
struct sudoers_parse_tree *parse_tree, bool expand_aliases)
|
||||||
{
|
{
|
||||||
struct json_value value;
|
struct json_value value;
|
||||||
@@ -472,7 +472,7 @@ print_defaults_json(struct json_container *json,
|
|||||||
if (TAILQ_EMPTY(&parse_tree->defaults))
|
if (TAILQ_EMPTY(&parse_tree->defaults))
|
||||||
debug_return;
|
debug_return;
|
||||||
|
|
||||||
sudo_json_open_array(json, "Defaults");
|
sudo_json_open_array(jsonc, "Defaults");
|
||||||
|
|
||||||
TAILQ_FOREACH_SAFE(def, &parse_tree->defaults, entries, next) {
|
TAILQ_FOREACH_SAFE(def, &parse_tree->defaults, entries, next) {
|
||||||
type = get_defaults_type(def);
|
type = get_defaults_type(def);
|
||||||
@@ -483,28 +483,28 @@ print_defaults_json(struct json_container *json,
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* Found it, print object container and binding (if any). */
|
/* Found it, print object container and binding (if any). */
|
||||||
sudo_json_open_object(json, NULL);
|
sudo_json_open_object(jsonc, NULL);
|
||||||
print_binding_json(json, parse_tree, def->binding, def->type,
|
print_binding_json(jsonc, parse_tree, def->binding, def->type,
|
||||||
expand_aliases);
|
expand_aliases);
|
||||||
|
|
||||||
/* Validation checks. */
|
/* Validation checks. */
|
||||||
/* XXX - validate values in addition to names? */
|
/* XXX - validate values in addition to names? */
|
||||||
|
|
||||||
/* Print options, merging ones with the same binding. */
|
/* Print options, merging ones with the same binding. */
|
||||||
sudo_json_open_array(json, "Options");
|
sudo_json_open_array(jsonc, "Options");
|
||||||
for (;;) {
|
for (;;) {
|
||||||
next = TAILQ_NEXT(def, entries);
|
next = TAILQ_NEXT(def, entries);
|
||||||
/* XXX - need to update cur too */
|
/* XXX - need to update cur too */
|
||||||
if ((type & T_MASK) == T_FLAG || def->val == NULL) {
|
if ((type & T_MASK) == T_FLAG || def->val == NULL) {
|
||||||
value.type = JSON_BOOL;
|
value.type = JSON_BOOL;
|
||||||
value.u.boolean = def->op;
|
value.u.boolean = def->op;
|
||||||
sudo_json_add_value_as_object(json, def->var, &value);
|
sudo_json_add_value_as_object(jsonc, def->var, &value);
|
||||||
} else if ((type & T_MASK) == T_LIST) {
|
} else if ((type & T_MASK) == T_LIST) {
|
||||||
print_defaults_list_json(json, def);
|
print_defaults_list_json(jsonc, def);
|
||||||
} else {
|
} else {
|
||||||
value.type = JSON_STRING;
|
value.type = JSON_STRING;
|
||||||
value.u.string = def->val;
|
value.u.string = def->val;
|
||||||
sudo_json_add_value_as_object(json, def->var, &value);
|
sudo_json_add_value_as_object(jsonc, def->var, &value);
|
||||||
}
|
}
|
||||||
if (next == NULL || def->binding != next->binding)
|
if (next == NULL || def->binding != next->binding)
|
||||||
break;
|
break;
|
||||||
@@ -516,12 +516,12 @@ print_defaults_json(struct json_container *json,
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
sudo_json_close_array(json);
|
sudo_json_close_array(jsonc);
|
||||||
sudo_json_close_object(json);
|
sudo_json_close_object(jsonc);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Close Defaults array; comma (if any) & newline will be printer later. */
|
/* Close Defaults array; comma (if any) & newline will be printer later. */
|
||||||
sudo_json_close_array(json);
|
sudo_json_close_array(jsonc);
|
||||||
|
|
||||||
debug_return;
|
debug_return;
|
||||||
}
|
}
|
||||||
@@ -531,20 +531,20 @@ print_defaults_json(struct json_container *json,
|
|||||||
* Iterates through the entire aliases tree.
|
* Iterates through the entire aliases tree.
|
||||||
*/
|
*/
|
||||||
static void
|
static void
|
||||||
print_aliases_by_type_json(struct json_container *json,
|
print_aliases_by_type_json(struct json_container *jsonc,
|
||||||
struct sudoers_parse_tree *parse_tree, int alias_type, const char *title)
|
struct sudoers_parse_tree *parse_tree, int alias_type, const char *title)
|
||||||
{
|
{
|
||||||
struct json_alias_closure closure;
|
struct json_alias_closure closure;
|
||||||
debug_decl(print_aliases_by_type_json, SUDOERS_DEBUG_UTIL);
|
debug_decl(print_aliases_by_type_json, SUDOERS_DEBUG_UTIL);
|
||||||
|
|
||||||
closure.json = json;
|
closure.jsonc = jsonc;
|
||||||
closure.count = 0;
|
closure.count = 0;
|
||||||
closure.alias_type = alias_type;
|
closure.alias_type = alias_type;
|
||||||
closure.title = title;
|
closure.title = title;
|
||||||
alias_apply(parse_tree, print_alias_json, &closure);
|
alias_apply(parse_tree, print_alias_json, &closure);
|
||||||
if (closure.count != 0) {
|
if (closure.count != 0) {
|
||||||
sudo_json_close_array(json);
|
sudo_json_close_array(jsonc);
|
||||||
sudo_json_close_object(json);
|
sudo_json_close_object(jsonc);
|
||||||
}
|
}
|
||||||
|
|
||||||
debug_return;
|
debug_return;
|
||||||
@@ -554,15 +554,15 @@ print_aliases_by_type_json(struct json_container *json,
|
|||||||
* Export all aliases in JSON format.
|
* Export all aliases in JSON format.
|
||||||
*/
|
*/
|
||||||
static void
|
static void
|
||||||
print_aliases_json(struct json_container *json,
|
print_aliases_json(struct json_container *jsonc,
|
||||||
struct sudoers_parse_tree *parse_tree)
|
struct sudoers_parse_tree *parse_tree)
|
||||||
{
|
{
|
||||||
debug_decl(print_aliases_json, SUDOERS_DEBUG_UTIL);
|
debug_decl(print_aliases_json, SUDOERS_DEBUG_UTIL);
|
||||||
|
|
||||||
print_aliases_by_type_json(json, parse_tree, USERALIAS, "User_Aliases");
|
print_aliases_by_type_json(jsonc, parse_tree, USERALIAS, "User_Aliases");
|
||||||
print_aliases_by_type_json(json, parse_tree, RUNASALIAS, "Runas_Aliases");
|
print_aliases_by_type_json(jsonc, parse_tree, RUNASALIAS, "Runas_Aliases");
|
||||||
print_aliases_by_type_json(json, parse_tree, HOSTALIAS, "Host_Aliases");
|
print_aliases_by_type_json(jsonc, parse_tree, HOSTALIAS, "Host_Aliases");
|
||||||
print_aliases_by_type_json(json, parse_tree, CMNDALIAS, "Command_Aliases");
|
print_aliases_by_type_json(jsonc, parse_tree, CMNDALIAS, "Command_Aliases");
|
||||||
|
|
||||||
debug_return;
|
debug_return;
|
||||||
}
|
}
|
||||||
@@ -589,7 +589,7 @@ cmndspec_continues(struct cmndspec *cs, struct cmndspec *next)
|
|||||||
* merge adjacent entries that are identical in all but the command.
|
* merge adjacent entries that are identical in all but the command.
|
||||||
*/
|
*/
|
||||||
static void
|
static void
|
||||||
print_cmndspec_json(struct json_container *json,
|
print_cmndspec_json(struct json_container *jsonc,
|
||||||
struct sudoers_parse_tree *parse_tree, struct cmndspec *cs,
|
struct sudoers_parse_tree *parse_tree, struct cmndspec *cs,
|
||||||
struct cmndspec **nextp, struct defaults_list *options, bool expand_aliases)
|
struct cmndspec **nextp, struct defaults_list *options, bool expand_aliases)
|
||||||
{
|
{
|
||||||
@@ -602,26 +602,26 @@ print_cmndspec_json(struct json_container *json,
|
|||||||
debug_decl(print_cmndspec_json, SUDOERS_DEBUG_UTIL);
|
debug_decl(print_cmndspec_json, SUDOERS_DEBUG_UTIL);
|
||||||
|
|
||||||
/* Open Cmnd_Spec object. */
|
/* Open Cmnd_Spec object. */
|
||||||
sudo_json_open_object(json, NULL);
|
sudo_json_open_object(jsonc, NULL);
|
||||||
|
|
||||||
/* Print runasuserlist */
|
/* Print runasuserlist */
|
||||||
if (cs->runasuserlist != NULL) {
|
if (cs->runasuserlist != NULL) {
|
||||||
sudo_json_open_array(json, "runasusers");
|
sudo_json_open_array(jsonc, "runasusers");
|
||||||
TAILQ_FOREACH(m, cs->runasuserlist, entries) {
|
TAILQ_FOREACH(m, cs->runasuserlist, entries) {
|
||||||
print_member_json(json, parse_tree, m, TYPE_RUNASUSER,
|
print_member_json(jsonc, parse_tree, m, TYPE_RUNASUSER,
|
||||||
expand_aliases);
|
expand_aliases);
|
||||||
}
|
}
|
||||||
sudo_json_close_array(json);
|
sudo_json_close_array(jsonc);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Print runasgrouplist */
|
/* Print runasgrouplist */
|
||||||
if (cs->runasgrouplist != NULL) {
|
if (cs->runasgrouplist != NULL) {
|
||||||
sudo_json_open_array(json, "runasgroups");
|
sudo_json_open_array(jsonc, "runasgroups");
|
||||||
TAILQ_FOREACH(m, cs->runasgrouplist, entries) {
|
TAILQ_FOREACH(m, cs->runasgrouplist, entries) {
|
||||||
print_member_json(json, parse_tree, m, TYPE_RUNASGROUP,
|
print_member_json(jsonc, parse_tree, m, TYPE_RUNASGROUP,
|
||||||
expand_aliases);
|
expand_aliases);
|
||||||
}
|
}
|
||||||
sudo_json_close_array(json);
|
sudo_json_close_array(jsonc);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Print options and tags */
|
/* Print options and tags */
|
||||||
@@ -630,21 +630,21 @@ print_cmndspec_json(struct json_container *json,
|
|||||||
!TAILQ_EMPTY(options)) {
|
!TAILQ_EMPTY(options)) {
|
||||||
struct cmndtag tag = cs->tags;
|
struct cmndtag tag = cs->tags;
|
||||||
|
|
||||||
sudo_json_open_array(json, "Options");
|
sudo_json_open_array(jsonc, "Options");
|
||||||
if (cs->runchroot != NULL) {
|
if (cs->runchroot != NULL) {
|
||||||
value.type = JSON_STRING;
|
value.type = JSON_STRING;
|
||||||
value.u.string = cs->runchroot;
|
value.u.string = cs->runchroot;
|
||||||
sudo_json_add_value(json, "runchroot", &value);
|
sudo_json_add_value(jsonc, "runchroot", &value);
|
||||||
}
|
}
|
||||||
if (cs->runcwd != NULL) {
|
if (cs->runcwd != NULL) {
|
||||||
value.type = JSON_STRING;
|
value.type = JSON_STRING;
|
||||||
value.u.string = cs->runcwd;
|
value.u.string = cs->runcwd;
|
||||||
sudo_json_add_value(json, "runcwd", &value);
|
sudo_json_add_value(jsonc, "runcwd", &value);
|
||||||
}
|
}
|
||||||
if (cs->timeout > 0) {
|
if (cs->timeout > 0) {
|
||||||
value.type = JSON_NUMBER;
|
value.type = JSON_NUMBER;
|
||||||
value.u.number = cs->timeout;
|
value.u.number = cs->timeout;
|
||||||
sudo_json_add_value_as_object(json, "command_timeout", &value);
|
sudo_json_add_value_as_object(jsonc, "command_timeout", &value);
|
||||||
}
|
}
|
||||||
if (cs->notbefore != UNSPEC) {
|
if (cs->notbefore != UNSPEC) {
|
||||||
if ((tp = gmtime(&cs->notbefore)) == NULL) {
|
if ((tp = gmtime(&cs->notbefore)) == NULL) {
|
||||||
@@ -655,7 +655,7 @@ print_cmndspec_json(struct json_container *json,
|
|||||||
} else {
|
} else {
|
||||||
value.type = JSON_STRING;
|
value.type = JSON_STRING;
|
||||||
value.u.string = timebuf;
|
value.u.string = timebuf;
|
||||||
sudo_json_add_value_as_object(json, "notbefore", &value);
|
sudo_json_add_value_as_object(jsonc, "notbefore", &value);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -668,44 +668,44 @@ print_cmndspec_json(struct json_container *json,
|
|||||||
} else {
|
} else {
|
||||||
value.type = JSON_STRING;
|
value.type = JSON_STRING;
|
||||||
value.u.string = timebuf;
|
value.u.string = timebuf;
|
||||||
sudo_json_add_value_as_object(json, "notafter", &value);
|
sudo_json_add_value_as_object(jsonc, "notafter", &value);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (tag.nopasswd != UNSPEC) {
|
if (tag.nopasswd != UNSPEC) {
|
||||||
value.type = JSON_BOOL;
|
value.type = JSON_BOOL;
|
||||||
value.u.boolean = !tag.nopasswd;
|
value.u.boolean = !tag.nopasswd;
|
||||||
sudo_json_add_value_as_object(json, "authenticate", &value);
|
sudo_json_add_value_as_object(jsonc, "authenticate", &value);
|
||||||
}
|
}
|
||||||
if (tag.noexec != UNSPEC) {
|
if (tag.noexec != UNSPEC) {
|
||||||
value.type = JSON_BOOL;
|
value.type = JSON_BOOL;
|
||||||
value.u.boolean = tag.noexec;
|
value.u.boolean = tag.noexec;
|
||||||
sudo_json_add_value_as_object(json, "noexec", &value);
|
sudo_json_add_value_as_object(jsonc, "noexec", &value);
|
||||||
}
|
}
|
||||||
if (tag.send_mail != UNSPEC) {
|
if (tag.send_mail != UNSPEC) {
|
||||||
value.type = JSON_BOOL;
|
value.type = JSON_BOOL;
|
||||||
value.u.boolean = tag.send_mail;
|
value.u.boolean = tag.send_mail;
|
||||||
sudo_json_add_value_as_object(json, "send_mail", &value);
|
sudo_json_add_value_as_object(jsonc, "send_mail", &value);
|
||||||
}
|
}
|
||||||
if (tag.setenv != UNSPEC) {
|
if (tag.setenv != UNSPEC) {
|
||||||
value.type = JSON_BOOL;
|
value.type = JSON_BOOL;
|
||||||
value.u.boolean = tag.setenv;
|
value.u.boolean = tag.setenv;
|
||||||
sudo_json_add_value_as_object(json, "setenv", &value);
|
sudo_json_add_value_as_object(jsonc, "setenv", &value);
|
||||||
}
|
}
|
||||||
if (tag.follow != UNSPEC) {
|
if (tag.follow != UNSPEC) {
|
||||||
value.type = JSON_BOOL;
|
value.type = JSON_BOOL;
|
||||||
value.u.boolean = tag.follow;
|
value.u.boolean = tag.follow;
|
||||||
sudo_json_add_value_as_object(json, "sudoedit_follow", &value);
|
sudo_json_add_value_as_object(jsonc, "sudoedit_follow", &value);
|
||||||
}
|
}
|
||||||
if (tag.log_input != UNSPEC) {
|
if (tag.log_input != UNSPEC) {
|
||||||
value.type = JSON_BOOL;
|
value.type = JSON_BOOL;
|
||||||
value.u.boolean = tag.log_input;
|
value.u.boolean = tag.log_input;
|
||||||
sudo_json_add_value_as_object(json, "log_input", &value);
|
sudo_json_add_value_as_object(jsonc, "log_input", &value);
|
||||||
}
|
}
|
||||||
if (tag.log_output != UNSPEC) {
|
if (tag.log_output != UNSPEC) {
|
||||||
value.type = JSON_BOOL;
|
value.type = JSON_BOOL;
|
||||||
value.u.boolean = tag.log_output;
|
value.u.boolean = tag.log_output;
|
||||||
sudo_json_add_value_as_object(json, "log_output", &value);
|
sudo_json_add_value_as_object(jsonc, "log_output", &value);
|
||||||
}
|
}
|
||||||
TAILQ_FOREACH(def, options, entries) {
|
TAILQ_FOREACH(def, options, entries) {
|
||||||
int type = get_defaults_type(def);
|
int type = get_defaults_type(def);
|
||||||
@@ -717,45 +717,45 @@ print_cmndspec_json(struct json_container *json,
|
|||||||
if ((type & T_MASK) == T_FLAG || def->val == NULL) {
|
if ((type & T_MASK) == T_FLAG || def->val == NULL) {
|
||||||
value.type = JSON_BOOL;
|
value.type = JSON_BOOL;
|
||||||
value.u.boolean = def->op;
|
value.u.boolean = def->op;
|
||||||
sudo_json_add_value_as_object(json, def->var, &value);
|
sudo_json_add_value_as_object(jsonc, def->var, &value);
|
||||||
} else if ((type & T_MASK) == T_LIST) {
|
} else if ((type & T_MASK) == T_LIST) {
|
||||||
print_defaults_list_json(json, def);
|
print_defaults_list_json(jsonc, def);
|
||||||
} else {
|
} else {
|
||||||
value.type = JSON_STRING;
|
value.type = JSON_STRING;
|
||||||
value.u.string = def->val;
|
value.u.string = def->val;
|
||||||
sudo_json_add_value_as_object(json, def->var, &value);
|
sudo_json_add_value_as_object(jsonc, def->var, &value);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
sudo_json_close_array(json);
|
sudo_json_close_array(jsonc);
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef HAVE_SELINUX
|
#ifdef HAVE_SELINUX
|
||||||
/* Print SELinux role/type */
|
/* Print SELinux role/type */
|
||||||
if (cs->role != NULL && cs->type != NULL) {
|
if (cs->role != NULL && cs->type != NULL) {
|
||||||
sudo_json_open_array(json, "SELinux_Spec");
|
sudo_json_open_array(jsonc, "SELinux_Spec");
|
||||||
value.type = JSON_STRING;
|
value.type = JSON_STRING;
|
||||||
value.u.string = cs->role;
|
value.u.string = cs->role;
|
||||||
sudo_json_add_value(json, "role", &value);
|
sudo_json_add_value(jsonc, "role", &value);
|
||||||
value.u.string = cs->type;
|
value.u.string = cs->type;
|
||||||
sudo_json_add_value(json, "type", &value);
|
sudo_json_add_value(jsonc, "type", &value);
|
||||||
sudo_json_close_array(json);
|
sudo_json_close_array(jsonc);
|
||||||
}
|
}
|
||||||
#endif /* HAVE_SELINUX */
|
#endif /* HAVE_SELINUX */
|
||||||
|
|
||||||
#ifdef HAVE_PRIV_SET
|
#ifdef HAVE_PRIV_SET
|
||||||
/* Print Solaris privs/limitprivs */
|
/* Print Solaris privs/limitprivs */
|
||||||
if (cs->privs != NULL || cs->limitprivs != NULL) {
|
if (cs->privs != NULL || cs->limitprivs != NULL) {
|
||||||
sudo_json_open_array(json, "Solaris_Priv_Spec");
|
sudo_json_open_array(jsonc, "Solaris_Priv_Spec");
|
||||||
value.type = JSON_STRING;
|
value.type = JSON_STRING;
|
||||||
if (cs->privs != NULL) {
|
if (cs->privs != NULL) {
|
||||||
value.u.string = cs->privs;
|
value.u.string = cs->privs;
|
||||||
sudo_json_add_value(json, "privs", &value);
|
sudo_json_add_value(jsonc, "privs", &value);
|
||||||
}
|
}
|
||||||
if (cs->limitprivs != NULL) {
|
if (cs->limitprivs != NULL) {
|
||||||
value.u.string = cs->limitprivs;
|
value.u.string = cs->limitprivs;
|
||||||
sudo_json_add_value(json, "limitprivs", &value);
|
sudo_json_add_value(jsonc, "limitprivs", &value);
|
||||||
}
|
}
|
||||||
sudo_json_close_array(json);
|
sudo_json_close_array(jsonc);
|
||||||
}
|
}
|
||||||
#endif /* HAVE_PRIV_SET */
|
#endif /* HAVE_PRIV_SET */
|
||||||
|
|
||||||
@@ -763,9 +763,9 @@ print_cmndspec_json(struct json_container *json,
|
|||||||
* Merge adjacent commands with matching tags, runas, SELinux
|
* Merge adjacent commands with matching tags, runas, SELinux
|
||||||
* role/type and Solaris priv settings.
|
* role/type and Solaris priv settings.
|
||||||
*/
|
*/
|
||||||
sudo_json_open_array(json, "Commands");
|
sudo_json_open_array(jsonc, "Commands");
|
||||||
for (;;) {
|
for (;;) {
|
||||||
print_member_json(json, parse_tree, cs->cmnd, TYPE_COMMAND,
|
print_member_json(jsonc, parse_tree, cs->cmnd, TYPE_COMMAND,
|
||||||
expand_aliases);
|
expand_aliases);
|
||||||
/* Does the next entry differ only in the command itself? */
|
/* Does the next entry differ only in the command itself? */
|
||||||
if (!cmndspec_continues(cs, next))
|
if (!cmndspec_continues(cs, next))
|
||||||
@@ -773,10 +773,10 @@ print_cmndspec_json(struct json_container *json,
|
|||||||
cs = next;
|
cs = next;
|
||||||
next = TAILQ_NEXT(cs, entries);
|
next = TAILQ_NEXT(cs, entries);
|
||||||
}
|
}
|
||||||
sudo_json_close_array(json);
|
sudo_json_close_array(jsonc);
|
||||||
|
|
||||||
/* Close Cmnd_Spec object. */
|
/* Close Cmnd_Spec object. */
|
||||||
sudo_json_close_object(json);
|
sudo_json_close_object(jsonc);
|
||||||
|
|
||||||
*nextp = next;
|
*nextp = next;
|
||||||
|
|
||||||
@@ -787,7 +787,7 @@ print_cmndspec_json(struct json_container *json,
|
|||||||
* Print a User_Spec in JSON format at the correct indent level.
|
* Print a User_Spec in JSON format at the correct indent level.
|
||||||
*/
|
*/
|
||||||
static void
|
static void
|
||||||
print_userspec_json(struct json_container *json,
|
print_userspec_json(struct json_container *jsonc,
|
||||||
struct sudoers_parse_tree *parse_tree, struct userspec *us,
|
struct sudoers_parse_tree *parse_tree, struct userspec *us,
|
||||||
bool expand_aliases)
|
bool expand_aliases)
|
||||||
{
|
{
|
||||||
@@ -803,41 +803,41 @@ print_userspec_json(struct json_container *json,
|
|||||||
*/
|
*/
|
||||||
TAILQ_FOREACH(priv, &us->privileges, entries) {
|
TAILQ_FOREACH(priv, &us->privileges, entries) {
|
||||||
/* Open User_Spec object. */
|
/* Open User_Spec object. */
|
||||||
sudo_json_open_object(json, NULL);
|
sudo_json_open_object(jsonc, NULL);
|
||||||
|
|
||||||
/* Print users list. */
|
/* Print users list. */
|
||||||
sudo_json_open_array(json, "User_List");
|
sudo_json_open_array(jsonc, "User_List");
|
||||||
TAILQ_FOREACH(m, &us->users, entries) {
|
TAILQ_FOREACH(m, &us->users, entries) {
|
||||||
print_member_json(json, parse_tree, m, TYPE_USERNAME,
|
print_member_json(jsonc, parse_tree, m, TYPE_USERNAME,
|
||||||
expand_aliases);
|
expand_aliases);
|
||||||
}
|
}
|
||||||
sudo_json_close_array(json);
|
sudo_json_close_array(jsonc);
|
||||||
|
|
||||||
/* Print hosts list. */
|
/* Print hosts list. */
|
||||||
sudo_json_open_array(json, "Host_List");
|
sudo_json_open_array(jsonc, "Host_List");
|
||||||
TAILQ_FOREACH(m, &priv->hostlist, entries) {
|
TAILQ_FOREACH(m, &priv->hostlist, entries) {
|
||||||
print_member_json(json, parse_tree, m, TYPE_HOSTNAME,
|
print_member_json(jsonc, parse_tree, m, TYPE_HOSTNAME,
|
||||||
expand_aliases);
|
expand_aliases);
|
||||||
}
|
}
|
||||||
sudo_json_close_array(json);
|
sudo_json_close_array(jsonc);
|
||||||
|
|
||||||
/* Print commands. */
|
/* Print commands. */
|
||||||
sudo_json_open_array(json, "Cmnd_Specs");
|
sudo_json_open_array(jsonc, "Cmnd_Specs");
|
||||||
TAILQ_FOREACH_SAFE(cs, &priv->cmndlist, entries, next) {
|
TAILQ_FOREACH_SAFE(cs, &priv->cmndlist, entries, next) {
|
||||||
print_cmndspec_json(json, parse_tree, cs, &next, &priv->defaults,
|
print_cmndspec_json(jsonc, parse_tree, cs, &next, &priv->defaults,
|
||||||
expand_aliases);
|
expand_aliases);
|
||||||
}
|
}
|
||||||
sudo_json_close_array(json);
|
sudo_json_close_array(jsonc);
|
||||||
|
|
||||||
/* Close User_Spec object. */
|
/* Close User_Spec object. */
|
||||||
sudo_json_close_object(json);
|
sudo_json_close_object(jsonc);
|
||||||
}
|
}
|
||||||
|
|
||||||
debug_return;
|
debug_return;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
print_userspecs_json(struct json_container *json,
|
print_userspecs_json(struct json_container *jsonc,
|
||||||
struct sudoers_parse_tree *parse_tree, bool expand_aliases)
|
struct sudoers_parse_tree *parse_tree, bool expand_aliases)
|
||||||
{
|
{
|
||||||
struct userspec *us;
|
struct userspec *us;
|
||||||
@@ -846,11 +846,11 @@ print_userspecs_json(struct json_container *json,
|
|||||||
if (TAILQ_EMPTY(&parse_tree->userspecs))
|
if (TAILQ_EMPTY(&parse_tree->userspecs))
|
||||||
debug_return;
|
debug_return;
|
||||||
|
|
||||||
sudo_json_open_array(json, "User_Specs");
|
sudo_json_open_array(jsonc, "User_Specs");
|
||||||
TAILQ_FOREACH(us, &parse_tree->userspecs, entries) {
|
TAILQ_FOREACH(us, &parse_tree->userspecs, entries) {
|
||||||
print_userspec_json(json, parse_tree, us, expand_aliases);
|
print_userspec_json(jsonc, parse_tree, us, expand_aliases);
|
||||||
}
|
}
|
||||||
sudo_json_close_array(json);
|
sudo_json_close_array(jsonc);
|
||||||
|
|
||||||
debug_return;
|
debug_return;
|
||||||
}
|
}
|
||||||
@@ -862,7 +862,7 @@ bool
|
|||||||
convert_sudoers_json(struct sudoers_parse_tree *parse_tree,
|
convert_sudoers_json(struct sudoers_parse_tree *parse_tree,
|
||||||
const char *output_file, struct cvtsudoers_config *conf)
|
const char *output_file, struct cvtsudoers_config *conf)
|
||||||
{
|
{
|
||||||
struct json_container json;
|
struct json_container jsonc;
|
||||||
bool ret = true;
|
bool ret = true;
|
||||||
FILE *output_fp = stdout;
|
FILE *output_fp = stdout;
|
||||||
debug_decl(convert_sudoers_json, SUDOERS_DEBUG_UTIL);
|
debug_decl(convert_sudoers_json, SUDOERS_DEBUG_UTIL);
|
||||||
@@ -873,33 +873,33 @@ convert_sudoers_json(struct sudoers_parse_tree *parse_tree,
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* 4 space indent, non-compact, exit on memory allocation failure. */
|
/* 4 space indent, non-compact, exit on memory allocation failure. */
|
||||||
sudo_json_init(&json, 4, false, true);
|
sudo_json_init(&jsonc, 4, false, true);
|
||||||
|
|
||||||
/* Dump Defaults in JSON format. */
|
/* Dump Defaults in JSON format. */
|
||||||
if (!ISSET(conf->suppress, SUPPRESS_DEFAULTS)) {
|
if (!ISSET(conf->suppress, SUPPRESS_DEFAULTS)) {
|
||||||
print_defaults_json(&json, parse_tree, conf->expand_aliases);
|
print_defaults_json(&jsonc, parse_tree, conf->expand_aliases);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Dump Aliases in JSON format. */
|
/* Dump Aliases in JSON format. */
|
||||||
if (!conf->expand_aliases && !ISSET(conf->suppress, SUPPRESS_ALIASES)) {
|
if (!conf->expand_aliases && !ISSET(conf->suppress, SUPPRESS_ALIASES)) {
|
||||||
print_aliases_json(&json, parse_tree);
|
print_aliases_json(&jsonc, parse_tree);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Dump User_Specs in JSON format. */
|
/* Dump User_Specs in JSON format. */
|
||||||
if (!ISSET(conf->suppress, SUPPRESS_PRIVS)) {
|
if (!ISSET(conf->suppress, SUPPRESS_PRIVS)) {
|
||||||
print_userspecs_json(&json, parse_tree, conf->expand_aliases);
|
print_userspecs_json(&jsonc, parse_tree, conf->expand_aliases);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Write JSON output. */
|
/* Write JSON output. */
|
||||||
if (sudo_json_get_len(&json) != 0) {
|
if (sudo_json_get_len(&jsonc) != 0) {
|
||||||
putc('{', output_fp);
|
putc('{', output_fp);
|
||||||
fputs(sudo_json_get_buf(&json), output_fp);
|
fputs(sudo_json_get_buf(&jsonc), output_fp);
|
||||||
fputs("\n}\n", output_fp);
|
fputs("\n}\n", output_fp);
|
||||||
(void)fflush(output_fp);
|
(void)fflush(output_fp);
|
||||||
if (ferror(output_fp))
|
if (ferror(output_fp))
|
||||||
ret = false;
|
ret = false;
|
||||||
}
|
}
|
||||||
sudo_json_free(&json);
|
sudo_json_free(&jsonc);
|
||||||
if (output_fp != stdout)
|
if (output_fp != stdout)
|
||||||
fclose(output_fp);
|
fclose(output_fp);
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user