[srvx-commits] CVS: services/src modcmd.c,1.34,1.35 modcmd.h,1.11,1.12
Brought to you by:
entrope
|
From: Entrope <en...@us...> - 2002-10-29 01:57:13
|
Update of /cvsroot/srvx/services/src
In directory usw-pr-cvs1:/tmp/cvs-serv23692/src
Modified Files:
modcmd.c modcmd.h
Log Message:
fix the (as it turns out, over-)simplified permissions checking
Index: modcmd.c
===================================================================
RCS file: /cvsroot/srvx/services/src/modcmd.c,v
retrieving revision 1.34
retrieving revision 1.35
diff -C2 -r1.34 -r1.35
*** modcmd.c 28 Oct 2002 02:01:47 -0000 1.34
--- modcmd.c 29 Oct 2002 01:57:10 -0000 1.35
***************
*** 29,32 ****
--- 29,33 ----
#define MCMSG_BAD_OPSERV_LEVEL "Invalid $O access level %s."
#define MCMSG_BAD_CHANSERV_LEVEL "Invalid $C access level %s."
+ #define MCMSG_LEVEL_TOO_HIGH "You cannot set the access requirements to %s (that is too high)."
#define MCMSG_UNKNOWN_COMMAND "Unknown command name %s (as template for %s in service %s)."
#define MCMSG_BAD_WEIGHT "Invalid command weight %s."
***************
*** 244,253 ****
static void
svccmd_copy_rules(struct svccmd *dest, struct svccmd *src) {
! dest->weight = src->weight;
! dest->flags = src->flags;
! dest->req_account_flags = src->req_account_flags;
! dest->deny_account_flags = src->deny_account_flags;
! dest->min_opserv_level = src->min_opserv_level;
! dest->min_channel_access = src->min_channel_access;
}
--- 245,260 ----
static void
svccmd_copy_rules(struct svccmd *dest, struct svccmd *src) {
! dest->flags |= src->flags;
! dest->req_account_flags |= src->req_account_flags;
! dest->deny_account_flags |= src->deny_account_flags;
! if (src->weight > dest->weight) {
! dest->weight = src->weight;
! }
! if (src->min_opserv_level > dest->min_opserv_level) {
! dest->min_opserv_level = src->min_opserv_level;
! }
! if (src->min_channel_access > dest->min_channel_access) {
! dest->min_channel_access = src->min_channel_access;
! }
}
***************
*** 311,315 ****
return 0;
}
! cmd->min_opserv_level = atoi(value);
return 1;
} else if (!irccasecmp(param, "level") || !irccasecmp(param, "access")) {
--- 318,326 ----
return 0;
}
! if (user && (!user->handle_info || (newval > user->handle_info->opserv_level))) {
! send_message(user, bot, MCMSG_LEVEL_TOO_HIGH, value);
! return 0;
! }
! cmd->min_opserv_level = newval;
return 1;
} else if (!irccasecmp(param, "level") || !irccasecmp(param, "access")) {
***************
*** 341,344 ****
--- 352,366 ----
}
+ static void
+ modcmd_set_effective_flags(struct svccmd *cmd) {
+ int flags = cmd->flags | cmd->command->flags;
+ if (cmd->min_opserv_level > 0) flags |= MODCMD_REQUIRE_OPER;
+ if (cmd->min_channel_access > ulNone) flags |= MODCMD_REQUIRE_CHANUSER;
+ if (flags & MODCMD_REQUIRE_CHANUSER) flags |= MODCMD_REQUIRE_REGCHAN;
+ if (flags & MODCMD_REQUIRE_JOINABLE) flags |= MODCMD_REQUIRE_CHANNEL;
+ if (flags & (MODCMD_REQUIRE_STAFF|MODCMD_REQUIRE_HELPING)) flags |= MODCMD_REQUIRE_AUTHED;
+ cmd->effective_flags = flags;
+ }
+
struct modcmd *
modcmd_register(struct module *module, const char *name, modcmd_func_t func, unsigned int min_argc, unsigned int flags, ...) {
***************
*** 379,382 ****
--- 401,405 ----
}
}
+ modcmd_set_effective_flags(newcmd->defaults);
va_end(args);
return newcmd;
***************
*** 391,414 ****
unsigned int uData_checked = 0;
struct userData *uData = NULL;
! int rflags = 0;
! if (cmd->flags & MODCMD_DISABLED) {
if (noisy) send_message(user, bot, MSG_COMMAND_DISABLED, cmd->name);
return 0;
}
! if ((cmd->flags & MODCMD_REQUIRE_QUALIFIED) && !server_qualified) {
if (noisy) send_message(user, bot, MCMSG_MUST_QUALIFY, bot->nick, cmd->name, bot->nick);
return 0;
}
! if ((cmd->flags & MODCMD_REQUIRE_AUTHED) && !user->handle_info) {
if (noisy) send_message(user, bot, MSG_AUTHENTICATE);
return 0;
}
if (channel || noisy) {
! if ((cmd->flags & MODCMD_REQUIRE_CHANNEL) && !channel) {
if (noisy) send_message(user, bot, MSG_INVALID_CHANNEL);
return 0;
}
! if (cmd->flags & MODCMD_REQUIRE_REGCHAN) {
if (!channel) {
/* XXX: could maybe figure out better way to handle this case */
--- 414,437 ----
unsigned int uData_checked = 0;
struct userData *uData = NULL;
! int rflags = 0, flags = cmd->effective_flags;
! if (flags & MODCMD_DISABLED) {
if (noisy) send_message(user, bot, MSG_COMMAND_DISABLED, cmd->name);
return 0;
}
! if ((flags & MODCMD_REQUIRE_QUALIFIED) && !server_qualified) {
if (noisy) send_message(user, bot, MCMSG_MUST_QUALIFY, bot->nick, cmd->name, bot->nick);
return 0;
}
! if ((flags & MODCMD_REQUIRE_AUTHED) && !user->handle_info) {
if (noisy) send_message(user, bot, MSG_AUTHENTICATE);
return 0;
}
if (channel || noisy) {
! if ((flags & MODCMD_REQUIRE_CHANNEL) && !channel) {
if (noisy) send_message(user, bot, MSG_INVALID_CHANNEL);
return 0;
}
! if (flags & MODCMD_REQUIRE_REGCHAN) {
if (!channel) {
/* XXX: could maybe figure out better way to handle this case */
***************
*** 420,424 ****
}
}
! if (cmd->flags & MODCMD_REQUIRE_CHANUSER) {
if (!uData_checked) uData = _GetChannelUser(channel->channel_info, user->handle_info, 1, 0), uData_checked = 1;
if (!uData) {
--- 443,447 ----
}
}
! if (flags & MODCMD_REQUIRE_CHANUSER) {
if (!uData_checked) uData = _GetChannelUser(channel->channel_info, user->handle_info, 1, 0), uData_checked = 1;
if (!uData) {
***************
*** 430,434 ****
}
}
! if (cmd->flags & MODCMD_REQUIRE_JOINABLE) {
if (!uData_checked) uData = _GetChannelUser(channel->channel_info, user->handle_info, 1, 0), uData_checked = 1;
if ((channel->modes & (MODE_INVITEONLY|MODE_KEY))
--- 453,457 ----
}
}
! if (flags & MODCMD_REQUIRE_JOINABLE) {
if (!uData_checked) uData = _GetChannelUser(channel->channel_info, user->handle_info, 1, 0), uData_checked = 1;
if ((channel->modes & (MODE_INVITEONLY|MODE_KEY))
***************
*** 440,444 ****
}
}
! if ((cmd->flags & MODCMD_TOY) && channel) {
char opt = channel->channel_info ? channel->channel_info->options[optToys] : 'n';
switch (opt) {
--- 463,467 ----
}
}
! if ((flags & MODCMD_TOY) && channel) {
char opt = channel->channel_info ? channel->channel_info->options[optToys] : 'n';
switch (opt) {
***************
*** 454,461 ****
}
}
! if (cmd->flags & MODCMD_REQUIRE_STAFF) {
! if (((cmd->flags & MODCMD_REQUIRE_OPER) && IsOper(user))
! || ((cmd->flags & MODCMD_REQUIRE_NETWORK_HELPER) && IsNetworkHelper(user))
! || ((cmd->flags & MODCMD_REQUIRE_SUPPORT_HELPER) && IsSupportHelper(user))) {
/* allow it */
} else {
--- 477,484 ----
}
}
! if (flags & MODCMD_REQUIRE_STAFF) {
! if (((flags & MODCMD_REQUIRE_OPER) && IsOper(user))
! || ((flags & MODCMD_REQUIRE_NETWORK_HELPER) && IsNetworkHelper(user))
! || ((flags & MODCMD_REQUIRE_SUPPORT_HELPER) && IsSupportHelper(user))) {
/* allow it */
} else {
***************
*** 464,468 ****
}
}
! if ((cmd->flags & MODCMD_REQUIRE_HELPING) && !HANDLE_FLAGGED(user->handle_info, HELPING)) {
if (noisy) send_message(user, bot, MCMSG_MUST_BE_HELPING);
return 0;
--- 487,491 ----
}
}
! if ((flags & MODCMD_REQUIRE_HELPING) && !HANDLE_FLAGGED(user->handle_info, HELPING)) {
if (noisy) send_message(user, bot, MCMSG_MUST_BE_HELPING);
return 0;
***************
*** 489,498 ****
/* If it's an override, return a special value. */
! if ((cmd->flags & MODCMD_REQUIRE_CHANUSER)
&& noisy
&& (uData->access > ulOwner)
&& (!(uData = _GetChannelUser(channel->channel_info, user->handle_info, 0, 0))
|| uData->access < cmd->min_channel_access)
! && !(cmd->flags & (MODCMD_REQUIRE_STAFF|MODCMD_REQUIRE_HELPING))) {
rflags |= ACTION_OVERRIDE;
}
--- 512,521 ----
/* If it's an override, return a special value. */
! if ((flags & MODCMD_REQUIRE_CHANUSER)
&& noisy
&& (uData->access > ulOwner)
&& (!(uData = _GetChannelUser(channel->channel_info, user->handle_info, 0, 0))
|| uData->access < cmd->min_channel_access)
! && !(flags & (MODCMD_REQUIRE_STAFF|MODCMD_REQUIRE_HELPING))) {
rflags |= ACTION_OVERRIDE;
}
***************
*** 612,616 ****
/* Figure out what actions we should do for it.. */
if (cmd_arg && (cmd->flags & MODCMD_TOY)) {
! /* Don't let user manually specify a channel. */
channel = NULL;
}
--- 635,639 ----
/* Figure out what actions we should do for it.. */
if (cmd_arg && (cmd->flags & MODCMD_TOY)) {
! /* Do not let user manually specify a channel. */
channel = NULL;
}
***************
*** 1082,1086 ****
static MODCMD_FUNC(cmd_command) {
struct svccmd *svccmd;
! unsigned int shown_flags, nn, pos;
char buf[MAXLEN];
--- 1105,1109 ----
static MODCMD_FUNC(cmd_command) {
struct svccmd *svccmd;
! unsigned int flags, shown_flags, nn, pos;
char buf[MAXLEN];
***************
*** 1096,1106 ****
reply(MCMSG_COMMAND_BINDING, svccmd->name, buf);
}
if ((svccmd->parent && svccmd->parent->privileged && !IsOper(user))
! || ((svccmd->flags & MODCMD_REQUIRE_STAFF)
&& !IsOper(user) && !IsNetworkHelper(user) && !IsSupportHelper(user))) {
reply(MCMSG_INSPECTION_REFUSED, svccmd->name);
return 0;
}
! if (svccmd->flags & MODCMD_DISABLED) {
reply(MSG_COMMAND_DISABLED, svccmd->name);
return 1;
--- 1119,1130 ----
reply(MCMSG_COMMAND_BINDING, svccmd->name, buf);
}
+ flags = svccmd->effective_flags;
if ((svccmd->parent && svccmd->parent->privileged && !IsOper(user))
! || ((flags & MODCMD_REQUIRE_STAFF)
&& !IsOper(user) && !IsNetworkHelper(user) && !IsSupportHelper(user))) {
reply(MCMSG_INSPECTION_REFUSED, svccmd->name);
return 0;
}
! if (flags & MODCMD_DISABLED) {
reply(MSG_COMMAND_DISABLED, svccmd->name);
return 1;
***************
*** 1124,1137 ****
shown_flags |= MODCMD_REQUIRE_AUTHED;
}
! if (!svccmd->flags && !shown_flags) {
reply(MCMSG_NEED_NOTHING, svccmd->name);
return 1;
}
! if (svccmd->flags & ~shown_flags & MODCMD_REQUIRE_HELPING) {
reply(MCMSG_MUST_BE_HELPING);
shown_flags |= MODCMD_REQUIRE_AUTHED | MODCMD_REQUIRE_STAFF;
}
! if (svccmd->flags & ~shown_flags & MODCMD_REQUIRE_STAFF) {
! switch (svccmd->flags & MODCMD_REQUIRE_STAFF) {
default: case MODCMD_REQUIRE_STAFF:
strcpy(buf, "network staff");
--- 1148,1161 ----
shown_flags |= MODCMD_REQUIRE_AUTHED;
}
! if (!flags && !shown_flags) {
reply(MCMSG_NEED_NOTHING, svccmd->name);
return 1;
}
! if (flags & ~shown_flags & MODCMD_REQUIRE_HELPING) {
reply(MCMSG_MUST_BE_HELPING);
shown_flags |= MODCMD_REQUIRE_AUTHED | MODCMD_REQUIRE_STAFF;
}
! if (flags & ~shown_flags & MODCMD_REQUIRE_STAFF) {
! switch (flags & MODCMD_REQUIRE_STAFF) {
default: case MODCMD_REQUIRE_STAFF:
strcpy(buf, "network staff");
***************
*** 1159,1184 ****
shown_flags |= MODCMD_REQUIRE_AUTHED;
}
! if (svccmd->flags & ~shown_flags & MODCMD_REQUIRE_JOINABLE) {
reply(MCMSG_NEED_JOINABLE);
shown_flags |= MODCMD_REQUIRE_CHANUSER;
}
! if (svccmd->flags & ~shown_flags & MODCMD_REQUIRE_CHANUSER) {
reply(MCMSG_NEED_CHANUSER);
shown_flags |= MODCMD_REQUIRE_REGCHAN | MODCMD_REQUIRE_CHANNEL | MODCMD_REQUIRE_AUTHED;
}
! if (svccmd->flags & ~shown_flags & MODCMD_REQUIRE_REGCHAN) {
reply(MCMSG_NEED_REGCHAN);
shown_flags |= MODCMD_REQUIRE_CHANNEL;
}
! if (svccmd->flags & ~shown_flags & MODCMD_REQUIRE_CHANNEL) {
reply(MCMSG_NEED_CHANNEL);
}
! if (svccmd->flags & ~shown_flags & MODCMD_REQUIRE_AUTHED) {
reply(MCMSG_NEED_AUTHED);
}
! if (svccmd->flags & ~shown_flags & MODCMD_TOY) {
reply(MCMSG_IS_TOY, svccmd->name);
}
! if (svccmd->flags & ~shown_flags & MODCMD_REQUIRE_QUALIFIED) {
const char *botnick = svccmd->parent ? svccmd->parent->bot->nick : "SomeBot";
reply(MCMSG_MUST_QUALIFY, botnick, svccmd->name, botnick);
--- 1183,1208 ----
shown_flags |= MODCMD_REQUIRE_AUTHED;
}
! if (flags & ~shown_flags & MODCMD_REQUIRE_JOINABLE) {
reply(MCMSG_NEED_JOINABLE);
shown_flags |= MODCMD_REQUIRE_CHANUSER;
}
! if (flags & ~shown_flags & MODCMD_REQUIRE_CHANUSER) {
reply(MCMSG_NEED_CHANUSER);
shown_flags |= MODCMD_REQUIRE_REGCHAN | MODCMD_REQUIRE_CHANNEL | MODCMD_REQUIRE_AUTHED;
}
! if (flags & ~shown_flags & MODCMD_REQUIRE_REGCHAN) {
reply(MCMSG_NEED_REGCHAN);
shown_flags |= MODCMD_REQUIRE_CHANNEL;
}
! if (flags & ~shown_flags & MODCMD_REQUIRE_CHANNEL) {
reply(MCMSG_NEED_CHANNEL);
}
! if (flags & ~shown_flags & MODCMD_REQUIRE_AUTHED) {
reply(MCMSG_NEED_AUTHED);
}
! if (flags & ~shown_flags & MODCMD_TOY) {
reply(MCMSG_IS_TOY, svccmd->name);
}
! if (flags & ~shown_flags & MODCMD_REQUIRE_QUALIFIED) {
const char *botnick = svccmd->parent ? svccmd->parent->bot->nick : "SomeBot";
reply(MCMSG_MUST_QUALIFY, botnick, svccmd->name, botnick);
***************
*** 1204,1208 ****
}
changed = 0;
! for (arg++; arg+1 < argc; arg += 2) {
if (svccmd_configure(svccmd, user, cmd->parent->bot, argv[arg], argv[arg+1])) {
reply(MCMSG_COMMAND_MODIFIED, argv[arg], svccmd->name);
--- 1228,1233 ----
}
changed = 0;
! log(MAIN_LOG, LOG_OTHER, "Parsing command modifiers, starting at %d of %d\n", arg, argc);
! for (; arg+1 < argc; arg += 2) {
if (svccmd_configure(svccmd, user, cmd->parent->bot, argv[arg], argv[arg+1])) {
reply(MCMSG_COMMAND_MODIFIED, argv[arg], svccmd->name);
***************
*** 1210,1213 ****
--- 1235,1239 ----
}
}
+ if (changed) modcmd_set_effective_flags(svccmd);
return changed;
}
***************
*** 1430,1434 ****
if (svccmd->min_opserv_level > 0) show_opserv_level = 1;
if (svccmd->min_channel_access > ulNone) show_channel_access = 1;
! if (svccmd->flags & (MODCMD_REQUIRE_STAFF|MODCMD_REQUIRE_HELPING) & ~ignore_flags) show_channel_access = 1;
svccmd_list_append(&commands, svccmd);
}
--- 1456,1464 ----
if (svccmd->min_opserv_level > 0) show_opserv_level = 1;
if (svccmd->min_channel_access > ulNone) show_channel_access = 1;
! if (svccmd->effective_flags
! & (MODCMD_REQUIRE_STAFF|MODCMD_REQUIRE_HELPING)
! & ~ignore_flags) {
! show_channel_access = 1;
! }
svccmd_list_append(&commands, svccmd);
}
***************
*** 1454,1460 ****
if (show_channel_access) {
const char *access;
! if (svccmd->flags & MODCMD_REQUIRE_HELPING) access = "helping";
! else if (svccmd->flags & MODCMD_REQUIRE_STAFF) {
! switch (svccmd->flags & MODCMD_REQUIRE_STAFF) {
case MODCMD_REQUIRE_OPER: access = "oper"; break;
case MODCMD_REQUIRE_OPER | MODCMD_REQUIRE_NETWORK_HELPER:
--- 1484,1491 ----
if (show_channel_access) {
const char *access;
! int flags = svccmd->effective_flags;
! if (flags & MODCMD_REQUIRE_HELPING) access = "helping";
! else if (flags & MODCMD_REQUIRE_STAFF) {
! switch (flags & MODCMD_REQUIRE_STAFF) {
case MODCMD_REQUIRE_OPER: access = "oper"; break;
case MODCMD_REQUIRE_OPER | MODCMD_REQUIRE_NETWORK_HELPER:
***************
*** 1647,1650 ****
--- 1678,1682 ----
}
}
+ modcmd_set_effective_flags(svccmd);
}
Index: modcmd.h
===================================================================
RCS file: /cvsroot/srvx/services/src/modcmd.h,v
retrieving revision 1.11
retrieving revision 1.12
diff -C2 -r1.11 -r1.12
*** modcmd.h 28 Oct 2002 02:01:47 -0000 1.11
--- modcmd.h 29 Oct 2002 01:57:10 -0000 1.12
***************
*** 113,116 ****
--- 113,117 ----
unsigned int min_opserv_level;
unsigned int min_channel_access;
+ unsigned int effective_flags;
};
|