Changeset 3ac6d9f


Ignore:
Timestamp:
2016-03-23T06:44:13Z (4 years ago)
Author:
Dennis Kaarsemaker <dennis@…>
Branches:
master
Children:
e41ba05
Parents:
d701547
git-author:
Dennis Kaarsemaker <dennis@…> (22-02-16 20:04:10)
git-committer:
Dennis Kaarsemaker <dennis@…> (23-03-16 06:44:13)
Message:

Support for locked-down accounts

In certain situations, e.g. when working with pregenerated
configurations, it is useful to be able lock down accounts so they
cannot be deleted and authentication information (user, password,
server) cannot be changed.

We mark such sensitive settings with ACC_SET_LOCKABLE and will refuse to
change them if the account is locked by setting the ACC_FLAG_LOCKED
flag.

This flag is stored in the xml files as account attribute locked="true".

Files:
4 edited

Legend:

Unmodified
Added
Removed
  • protocols/account.c

    rd701547 r3ac6d9f  
    6767
    6868        s = set_add(&a->set, "password", NULL, set_eval_account, a);
    69         s->flags |= SET_NOSAVE | SET_NULL_OK | SET_PASSWORD;
     69        s->flags |= SET_NOSAVE | SET_NULL_OK | SET_PASSWORD | ACC_SET_LOCKABLE;
    7070
    7171        s = set_add(&a->set, "tag", NULL, set_eval_account, a);
     
    7373
    7474        s = set_add(&a->set, "username", NULL, set_eval_account, a);
    75         s->flags |= SET_NOSAVE | ACC_SET_OFFLINE_ONLY;
     75        s->flags |= SET_NOSAVE | ACC_SET_OFFLINE_ONLY | ACC_SET_LOCKABLE;
    7676        set_setstr(&a->set, "username", user);
    7777
  • protocols/account.h

    rd701547 r3ac6d9f  
    6363        ACC_SET_OFFLINE_ONLY = 0x02,    /* Allow changes only if the acct is offline. */
    6464        ACC_SET_ONLINE_ONLY = 0x04,     /* Allow changes only if the acct is online. */
     65        ACC_SET_LOCKABLE = 0x08         /* Setting cannot be changed if the account is locked down */
    6566} account_set_flag_t;
    6667
     
    7071        ACC_FLAG_HANDLE_DOMAINS = 0x04, /* Contact handles need a domain portion. */
    7172        ACC_FLAG_LOCAL = 0x08,          /* Contact list is local. */
     73        ACC_FLAG_LOCKED = 0x10,         /* Account is locked (cannot be deleted, certain settings can't changed) */
    7274} account_flag_t;
    7375
  • root_commands.c

    rd701547 r3ac6d9f  
    388388                irc_rootmsg(irc, "This setting can only be changed when the account is %s-line", "on");
    389389                return 0;
     390        } else if (a->flags & ACC_FLAG_LOCKED && s && s->flags & ACC_SET_LOCKABLE) {
     391                irc_rootmsg(irc, "This setting can not be changed for locked accounts");
     392                return 0;
    390393        }
    391394
     
    547550
    548551        if (len >= 1 && g_strncasecmp(cmd[2], "del", len) == 0) {
    549                 if (a->ic) {
     552                if (a->flags & ACC_FLAG_LOCKED) {
     553                        irc_rootmsg(irc, "Account is locked, can't delete");
     554                }
     555                else if (a->ic) {
    550556                        irc_rootmsg(irc, "Account is still logged in, can't delete");
    551557                } else {
  • storage_xml.c

    rd701547 r3ac6d9f  
    8686{
    8787        struct xml_parsedata *xd = data;
    88         char *protocol, *handle, *server, *password = NULL, *autoconnect, *tag;
     88        char *protocol, *handle, *server, *password = NULL, *autoconnect, *tag, *locked;
    8989        char *pass_b64 = NULL;
    9090        unsigned char *pass_cr = NULL;
     
    9999        autoconnect = xt_find_attr(node, "autoconnect");
    100100        tag = xt_find_attr(node, "tag");
     101        locked = xt_find_attr(node, "locked");
    101102
    102103        protocol = xt_find_attr(node, "protocol");
     
    126127                if (local) {
    127128                        acc->flags |= ACC_FLAG_LOCAL;
     129                }
     130                if (locked && !g_strcasecmp(locked, "true")) {
     131                        acc->flags |= ACC_FLAG_LOCKED;
    128132                }
    129133        } else {
     
    320324                        xt_add_attr(cur, "server", acc->server);
    321325                }
     326                if (acc->flags & ACC_FLAG_LOCKED) {
     327                        xt_add_attr(cur, "locked", "true");
     328                }
    322329
    323330                g_free(pass_b64);
Note: See TracChangeset for help on using the changeset viewer.