X-Git-Url: http://git.pk910.de/?a=blobdiff_plain;f=ircd%2Fclient.c;h=b4d3afe8b3da73f304f7517c5e28dfe4a53286da;hb=e22c93b27e9f501b7869b310dff7df384e06f7e6;hp=183545cb234e991af88c27bfbb7ae607761025f0;hpb=8e0f02c37aa9898f8870a037ec1913e3179a4cca;p=ircu2.10.12-pk.git diff --git a/ircd/client.c b/ircd/client.c index 183545c..b4d3afe 100644 --- a/ircd/client.c +++ b/ircd/client.c @@ -26,6 +26,7 @@ #include "class.h" #include "ircd.h" #include "ircd_features.h" +#include "ircd_log.h" #include "ircd_reply.h" #include "list.h" #include "msgq.h" @@ -35,7 +36,7 @@ #include "send.h" #include "struct.h" -#include +/* #include -- Now using assert in ircd_log.h */ #include /** Find the shortest non-zero ping time attached to a client. @@ -139,45 +140,47 @@ 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)); - PrivSet(&privs_local, PRIV_CHAN_LIMIT); - PrivSet(&privs_local, PRIV_MODE_LCHAN); - PrivSet(&privs_local, PRIV_SHOW_INVIS); - PrivSet(&privs_local, PRIV_SHOW_ALL_INVIS); - PrivSet(&privs_local, PRIV_LOCAL_KILL); - PrivSet(&privs_local, PRIV_REHASH); - PrivSet(&privs_local, PRIV_LOCAL_GLINE); - PrivSet(&privs_local, PRIV_LOCAL_JUPE); - PrivSet(&privs_local, PRIV_LOCAL_OPMODE); - PrivSet(&privs_local, PRIV_WHOX); - PrivSet(&privs_local, PRIV_DISPLAY); - PrivSet(&privs_local, PRIV_FORCE_LOCAL_OPMODE); - privs_defaults_set = 1; - } - memset(&(cli_privs(client)), 0, sizeof(struct Privs)); + FlagSet(&privs_local, PRIV_CHAN_LIMIT); + FlagSet(&privs_local, PRIV_MODE_LCHAN); + FlagSet(&privs_local, PRIV_SHOW_INVIS); + FlagSet(&privs_local, PRIV_SHOW_ALL_INVIS); + FlagSet(&privs_local, PRIV_LOCAL_KILL); + FlagSet(&privs_local, PRIV_REHASH); + FlagSet(&privs_local, PRIV_LOCAL_GLINE); + FlagSet(&privs_local, PRIV_LOCAL_JUPE); + FlagSet(&privs_local, PRIV_LOCAL_OPMODE); + FlagSet(&privs_local, PRIV_WHOX); + FlagSet(&privs_local, PRIV_DISPLAY); + FlagSet(&privs_local, PRIV_FORCE_LOCAL_OPMODE); - if (!IsAnOper(client)) - return; - else if (!MyConnect(client)) - { - memset(&(cli_privs(client)), 255, sizeof(struct Privs)); - PrivClr(&(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 (PrivHas(&oper->privs_dirty, PRIV_PROPAGATE)) - defaults = PrivHas(&oper->privs, PRIV_PROPAGATE) ? &privs_global : &privs_local; - else if (PrivHas(&oper->conn_class->privs_dirty, PRIV_PROPAGATE)) - defaults = PrivHas(&oper->conn_class->privs, PRIV_PROPAGATE) ? &privs_global : &privs_local; + if (FlagHas(&oper->privs_dirty, PRIV_PROPAGATE)) + defaults = FlagHas(&oper->privs, PRIV_PROPAGATE) ? &privs_global : &privs_local; + else if (FlagHas(&oper->conn_class->privs_dirty, PRIV_PROPAGATE)) + defaults = FlagHas(&oper->conn_class->privs, PRIV_PROPAGATE) ? &privs_global : &privs_local; else { assert(0 && "Oper has no propagation and neither does connection class"); return; @@ -189,32 +192,32 @@ client_set_privs(struct Client *client, struct ConfItem *oper) for (priv = 0; priv < PRIV_LAST_PRIV; ++priv) { /* Figure out most applicable definition for the privilege. */ - if (PrivHas(&oper->privs_dirty, priv)) + if (FlagHas(&oper->privs_dirty, priv)) source = &oper->privs; - else if (PrivHas(&oper->conn_class->privs_dirty, priv)) + else if (FlagHas(&oper->conn_class->privs_dirty, priv)) source = &oper->conn_class->privs; else source = defaults; /* Set it if necessary (privileges were already cleared). */ - if (PrivHas(source, priv)) - PrivSet(&cli_privs(client), priv); + if (FlagHas(source, priv)) + SetPriv(client, priv); } /* This should be handled in the config, but lets be sure... */ - if (PrivHas(&cli_privs(client), PRIV_PROPAGATE)) + if (HasPriv(client, PRIV_PROPAGATE)) { /* force propagating opers to display */ - PrivSet(&cli_privs(client), PRIV_DISPLAY); + SetPriv(client, PRIV_DISPLAY); } else { /* if they don't propagate oper status, prevent desyncs */ - PrivClr(&cli_privs(client), PRIV_KILL); - PrivClr(&cli_privs(client), PRIV_GLINE); - PrivClr(&cli_privs(client), PRIV_JUPE); - PrivClr(&cli_privs(client), PRIV_OPMODE); - PrivClr(&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); } } @@ -231,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 } }; @@ -261,3 +264,19 @@ client_report_privs(struct Client *to, struct Client *client) return 0; } + +int client_get_privs(struct Client* client) { + int privs = cli_privs(client); + + // add privs from class + struct SLink *list; + + for (list = cli_confs(cptr); list != NULL; list = list->next) { + struct ConfItem *aconf; + aconf = list->value.aconf; + if (aconf->status & CONF_CLIENT) + privs |= aconf->privs; + } + return privs; +} +