diff options
author | Dennis Kaarsemaker <dennis@kaarsemaker.net> | 2016-02-22 22:26:15 +0100 |
---|---|---|
committer | Dennis Kaarsemaker <dennis@kaarsemaker.net> | 2016-03-23 07:44:13 +0100 |
commit | e41ba05c0a9002b30e9e2475f56fd207e856a9f8 (patch) | |
tree | 29392d95d252822f506d61ea9dfcf4c19f9f74f5 | |
parent | 3ac6d9fe93279d74d36a6bf2b6e2ba182ed3bf34 (diff) |
Allow individual settings to be locked down
This allows a site admin who pregenerates configs to mark certain
settings as untouchable, ensuring that users cannot mess up their
settings too badly.
-rw-r--r-- | root_commands.c | 4 | ||||
-rw-r--r-- | set.h | 1 | ||||
-rw-r--r-- | storage_xml.c | 11 |
3 files changed, 16 insertions, 0 deletions
diff --git a/root_commands.c b/root_commands.c index f9c6e8e9..80873c79 100644 --- a/root_commands.c +++ b/root_commands.c @@ -339,6 +339,10 @@ static int cmd_set_real(irc_t *irc, char **cmd, set_t **head, cmd_set_checkflags set_t *s = set_find(head, set_name); int st; + if (s && s->flags & SET_LOCKED) { + irc_rootmsg(irc, "This setting can not be changed"); + return 0; + } if (s && checkflags && checkflags(irc, s) == 0) { return 0; } @@ -48,6 +48,7 @@ typedef enum { SET_HIDDEN = 0x0200, /* Don't show up in setting lists. Mostly for internal storage. */ SET_PASSWORD = 0x0400, /* Value shows up in settings list as "********". */ SET_HIDDEN_DEFAULT = 0x0800, /* Hide unless changed from default. */ + SET_LOCKED = 0x1000 /* Setting is locked, don't allow changing it */ } set_flags_t; typedef struct set { diff --git a/storage_xml.c b/storage_xml.c index 107983cf..dbdd151d 100644 --- a/storage_xml.c +++ b/storage_xml.c @@ -64,9 +64,11 @@ static void xml_init(void) static void handle_settings(struct xt_node *node, set_t **head) { struct xt_node *c; + struct set *s; for (c = node->children; (c = xt_find_node(c, "setting")); c = c->next) { char *name = xt_find_attr(c, "name"); + char *locked = xt_find_attr(c, "locked"); if (!name) { continue; @@ -79,6 +81,12 @@ static void handle_settings(struct xt_node *node, set_t **head) } } set_setstr(head, name, c->text); + if (locked && !g_strcasecmp(locked, "true")) { + s = set_find(head, name); + if (s) { + s->flags |= SET_LOCKED; + } + } } } @@ -370,6 +378,9 @@ static void xml_generate_settings(struct xt_node *cur, set_t **head) struct xt_node *xset; xt_add_child(cur, xset = xt_new_node("setting", set->value, NULL)); xt_add_attr(xset, "name", set->key); + if (set->flags & SET_LOCKED) { + xt_add_attr(xset, "locked", "true"); + } } } } |