#include "class.h"
#include "ircd.h"
#include "ircd_features.h"
+#include "ircd_log.h"
#include "ircd_reply.h"
#include "list.h"
#include "msgq.h"
#include "send.h"
#include "struct.h"
-#include <assert.h>
+/* #include <assert.h> -- Now using assert in ircd_log.h */
#include <string.h>
/** Find the shortest non-zero ping time attached to a client.
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;
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);
}
}
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 }
};