X-Git-Url: http://git.pk910.de/?a=blobdiff_plain;f=ircd%2Fclient.c;h=e3961b43ffac28d51545d7267d57f072532e8727;hb=refs%2Fheads%2Fupstream-ssl;hp=6860d0cb759ff0ac76db84748f9a8476b90721b6;hpb=fc21303989a07d6091ef684150db29c49f682614;p=ircu2.10.12-pk.git diff --git a/ircd/client.c b/ircd/client.c index 6860d0c..e3961b4 100644 --- a/ircd/client.c +++ b/ircd/client.c @@ -140,9 +140,25 @@ client_set_privs(struct Client *client, struct ConfItem *oper) struct Privs *source, *defaults; enum Priv priv; + if (!MyConnect(client)) + return; + + /* Clear out client's privileges. */ + memset(cli_privs(client), 0, sizeof(struct Privs)); + + if (!IsAnOper(client) || !oper) + return; + if (!privs_defaults_set) { memset(&privs_global, -1, sizeof(privs_global)); + FlagClr(&privs_global, PRIV_WALK_LCHAN); + FlagClr(&privs_global, PRIV_UNLIMIT_QUERY); + FlagClr(&privs_global, PRIV_SET); + FlagClr(&privs_global, PRIV_BADCHAN); + FlagClr(&privs_global, PRIV_LOCAL_BADCHAN); + FlagClr(&privs_global, PRIV_APASS_OPMODE); + memset(&privs_local, 0, sizeof(privs_local)); FlagSet(&privs_local, PRIV_CHAN_LIMIT); FlagSet(&privs_local, PRIV_MODE_LCHAN); @@ -156,23 +172,9 @@ client_set_privs(struct Client *client, struct ConfItem *oper) FlagSet(&privs_local, PRIV_WHOX); FlagSet(&privs_local, PRIV_DISPLAY); FlagSet(&privs_local, PRIV_FORCE_LOCAL_OPMODE); - privs_defaults_set = 1; - } - memset(&(cli_privs(client)), 0, sizeof(struct Privs)); - if (!IsAnOper(client)) - return; - else if (!MyConnect(client)) - { - memset(&(cli_privs(client)), 255, sizeof(struct Privs)); - FlagClr(&(cli_privs(client)), PRIV_SET); - return; + privs_defaults_set = 1; } - else if (oper == NULL) - return; - - /* Clear out client's privileges. */ - memset(&cli_privs(client), 0, sizeof(struct Privs)); /* Decide whether to use global or local oper defaults. */ if (FlagHas(&oper->privs_dirty, PRIV_PROPAGATE)) @@ -199,23 +201,23 @@ client_set_privs(struct Client *client, struct ConfItem *oper) /* Set it if necessary (privileges were already cleared). */ if (FlagHas(source, priv)) - FlagSet(&cli_privs(client), priv); + SetPriv(client, priv); } /* This should be handled in the config, but lets be sure... */ - if (FlagHas(&cli_privs(client), PRIV_PROPAGATE)) + if (HasPriv(client, PRIV_PROPAGATE)) { /* force propagating opers to display */ - FlagSet(&cli_privs(client), PRIV_DISPLAY); + SetPriv(client, PRIV_DISPLAY); } else { /* if they don't propagate oper status, prevent desyncs */ - FlagClr(&cli_privs(client), PRIV_KILL); - FlagClr(&cli_privs(client), PRIV_GLINE); - FlagClr(&cli_privs(client), PRIV_JUPE); - FlagClr(&cli_privs(client), PRIV_OPMODE); - FlagClr(&cli_privs(client), PRIV_BADCHAN); + ClrPriv(client, PRIV_KILL); + ClrPriv(client, PRIV_GLINE); + ClrPriv(client, PRIV_JUPE); + ClrPriv(client, PRIV_OPMODE); + ClrPriv(client, PRIV_BADCHAN); } } @@ -232,8 +234,8 @@ static struct { P(GLINE), P(LOCAL_GLINE), P(JUPE), P(LOCAL_JUPE), P(OPMODE), P(LOCAL_OPMODE), P(SET), P(WHOX), P(BADCHAN), P(LOCAL_BADCHAN), P(SEE_CHAN), P(PROPAGATE), - P(DISPLAY), P(SEE_OPERS), P(FORCE_OPMODE), P(FORCE_LOCAL_OPMODE), - P(WIDE_GLINE), + P(DISPLAY), P(SEE_OPERS), P(WIDE_GLINE), P(LIST_CHAN), + P(FORCE_OPMODE), P(FORCE_LOCAL_OPMODE), P(APASS_OPMODE), #undef P { 0, 0 } };