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);
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))
/* 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);
}
}
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 }
};