[srvx-commits] CVS: services/src chanserv.c,1.161.2.71,1.161.2.72
Brought to you by:
entrope
From: Paul C. <zo...@us...> - 2001-08-12 01:18:28
|
Update of /cvsroot/srvx/services/src In directory usw-pr-cvs1:/tmp/cvs-serv28817/src Modified Files: Tag: rel-1_0 chanserv.c Log Message: Prevent ChanServ from attempting to remove timed bans from suspended channels, add a new command flag to control which commands can be used on suspended channels. Index: chanserv.c =================================================================== RCS file: /cvsroot/srvx/services/src/chanserv.c,v retrieving revision 1.161.2.71 retrieving revision 1.161.2.72 diff -C2 -r1.161.2.71 -r1.161.2.72 *** chanserv.c 2001/08/11 06:18:45 1.161.2.71 --- chanserv.c 2001/08/12 01:18:25 1.161.2.72 *************** *** 158,162 **** #define CSMSG_NO_ACCESS "You lack sufficient access to use this command." #define CSMSG_UNREGISTERED "$b%s$b has not been registered with $b$C$b." - #define CSMSG_CHANNEL_SUSPENDED "$b$C$b access to $b%s$b has been temporarily suspended." #define CSMSG_STRUCTURE_LIMIT "This channel has reached the maximum %s limit of $b%d$b." #define CSMSG_ALLOCATION_ERROR "Could not allocate memory for %s." --- 158,161 ---- *************** *** 239,244 **** #define CSMSG_ALREADY_SUSPENDED "$b%s$b is already suspended." #define CSMSG_NOT_SUSPENDED "$b%s$b is not suspended." ! #define CSMSG_SUSPENDED "$b%s$b is now suspended." ! #define CSMSG_UNSUSPENDED "$b%s$b is now unsuspended." /* Access information */ --- 238,243 ---- #define CSMSG_ALREADY_SUSPENDED "$b%s$b is already suspended." #define CSMSG_NOT_SUSPENDED "$b%s$b is not suspended." ! #define CSMSG_SUSPENDED "$b$C$b access to $b%s$b has been temporarily suspended." ! #define CSMSG_UNSUSPENDED "$b$C$b access to $b%s$b has been restored." /* Access information */ *************** *** 351,354 **** --- 350,354 ---- #define CMD_IGNORE_EVENT 0x100 #define CMD_REQUIRE_GODDABLE 0x200 + #define CMD_SUSPEND_OVERRIDE 0x400 #define CMD_REQUIRE_DEFAULT (CMD_REQUIRE_ACCESS) *************** *** 792,798 **** } ! if(!IsPrivileged(user) && (cmd->flags & _CMD_REQUIRE_REGISTERED) && IsSuspended(channel->channel_info)) { ! chanserv_notice(user, CSMSG_CHANNEL_SUSPENDED, channel->name); return; } --- 792,798 ---- } ! if(!(cmd->flags & CMD_SUSPEND_OVERRIDE) && (cmd->flags & _CMD_REQUIRE_REGISTERED) && IsSuspended(channel->channel_info)) { ! chanserv_notice(user, CSMSG_SUSPENDED, channel->name); return; } *************** *** 826,834 **** } ! index += sprintf(buffer + index, "[%s:", user->nick); if(cmd->flags & CMD_REQUIRE_HANDLE) { ! index += sprintf(buffer + index, "%s]", user->handle_info->handle); } else --- 826,834 ---- } ! index += sprintf(buffer + index, "[%s", user->nick); if(cmd->flags & CMD_REQUIRE_HANDLE) { ! index += sprintf(buffer + index, ":%s]", user->handle_info->handle); } else *************** *** 1334,1337 **** --- 1334,1346 ---- bd = data; channel = bd->channel; + + if(IsSuspended(channel)) + { + bd->duration = 0; + del_channel_ban(bd); + + return; + } + bans = channel->channel->banlist; removed = alloc_string_list(2); *************** *** 1388,1410 **** if(channel->greeting) free(channel->greeting); if(channel->suspended) { struct suspended *suspended = channel->suspended; free(suspended->name); free(suspended->suspender); free(suspended); } else { ! channel->channel->channel_info = NULL; } - if (channel->prev) channel->prev->next = channel->next; - else channelList = channel->next; - - if (channel->next) channel->next->prev = channel->prev; - - free(channel); --- 1397,1424 ---- if(channel->greeting) free(channel->greeting); + if (channel->prev) channel->prev->next = channel->next; + else channelList = channel->next; + + if (channel->next) channel->next->prev = channel->prev; + if(channel->suspended) { struct suspended *suspended = channel->suspended; + struct chanNode *cNode = dict_find(channels, channel->suspended->name, NULL); free(suspended->name); free(suspended->suspender); free(suspended); + + if(cNode) + { + cNode->channel_info = NULL; + } } else { ! channel->channel->channel_info = NULL; } free(channel); *************** *** 1436,1442 **** if(!IsSuspended(channel)) ! { ! DelChannelUser(chanserv, channel->channel, reason, 0); ! } unregister_channel(channel); } --- 1450,1457 ---- if(!IsSuspended(channel)) ! { ! DelChannelUser(chanserv, channel->channel, reason, 0); ! } ! unregister_channel(channel); } *************** *** 1646,1680 **** } ! if(channel->channel_info) { ! length = strlen(channel->name); ! offset = (length > 7) ? length : 7; ! reason = alloca(strlen(user->nick) + offset + 19); ! sprintf(reason, "%s unregistered by %s.", "Channel", user->nick); ! ! name = alloca(length + 1); ! safestrncpy(name, channel->name, length + 1); ! DelChannelUser(chanserv, channel, reason, 0); ! unregister_channel(channel->channel_info); ! chanserv_notice(user, CSMSG_UNREG_SUCCESS, name); } ! else { ! struct suspended *suspended; ! suspended = dict_find(sChannels, argv[-1], NULL); ! if (suspended) { ! /* must allocate reason for log message below */ ! length = strlen(suspended->name); ! offset = (length > 7) ? length : 7; ! reason = alloca(strlen(user->nick) + offset + 19); ! name = alloca(length + 1); ! safestrncpy(name, suspended->name, length + 1); ! /* then unregister it */ ! unregister_channel(suspended->cData); ! } else { ! log(MAIN_LOG, LOG_ERROR, "Unable to find %s as either a real or suspended channel\n", argv[-1]); ! return 1; ! } } sprintf(reason, "%s unregistered by %s.", name, user->nick); --- 1661,1684 ---- } ! length = strlen(channel->name); ! offset = length > 7 ? length : 7; ! ! reason = alloca(strlen(user->nick) + offset + 19); ! sprintf(reason, "%s unregistered by %s.", "Channel", user->nick); ! ! name = alloca(length + 1); ! safestrncpy(name, channel->name, length + 1); ! ! if(IsSuspended(channel->channel_info)) { ! dict_remove(sChannels, channel->name); } ! ! if(channel) /* not suspended */ { ! DelChannelUser(chanserv, channel, reason, 0); } + unregister_channel(channel->channel_info); + chanserv_notice(user, CSMSG_UNREG_SUCCESS, name); sprintf(reason, "%s unregistered by %s.", name, user->nick); *************** *** 2016,2029 **** } static CHANSERV_FUNC(cmd_up) { struct userData *uData; struct modeNode *mn; ! (void)argv; (void)argc; /* weeeeeeeeeeeeeeeeeeeeeeee */ uData = GetChannelUser(channel->channel_info, user->handle_info); mn = GetUserMode(channel, user); ! if(!mn) { chanserv_notice(user, MSG_CHANNEL_ABSENT, channel->name); --- 2020,2035 ---- } + /* If argc is 0 in cmd_up or cmd_down, no notices will be sent + to the user. cmd_all takes advantage of this. */ static CHANSERV_FUNC(cmd_up) { struct userData *uData; struct modeNode *mn; ! (void)argv; /* weeeeeeeeeeeeeeeeeeeeeeee */ uData = GetChannelUser(channel->channel_info, user->handle_info); mn = GetUserMode(channel, user); ! if(!mn && argc) { chanserv_notice(user, MSG_CHANNEL_ABSENT, channel->name); *************** *** 2033,2037 **** if(uData->access >= ulOp) { ! if(mn->modes & MODE_CHANOP) { chanserv_notice(user, CSMSG_ALREADY_UP, "opped", channel->name); --- 2039,2043 ---- if(uData->access >= ulOp) { ! if((mn->modes & MODE_CHANOP) && argc) { chanserv_notice(user, CSMSG_ALREADY_UP, "opped", channel->name); *************** *** 2043,2047 **** else { ! if(mn->modes & MODE_VOICE) { chanserv_notice(user, CSMSG_ALREADY_UP, "voiced", channel->name); --- 2049,2053 ---- else { ! if((mn->modes & MODE_VOICE) && argc) { chanserv_notice(user, CSMSG_ALREADY_UP, "voiced", channel->name); *************** *** 2055,2080 **** } - static CHANSERV_FUNC(cmd_upall) - { - struct chanList *cList; - (void)channel; (void)argc; (void)argv; - - for(cList = user->handle_info->channels; cList; cList = cList->next) - { - struct modeNode *mn = GetUserMode(cList->channel->channel, user); - - if (!mn - || (cList->user->access >= ulOp && mn->modes & MODE_CHANOP) - || (cList->user->access < ulOp && mn->modes & MODE_VOICE)) - { - continue; - } - - cmd_up(user, cList->channel->channel, 0, NULL); - } - - return 1; - } - static CHANSERV_FUNC(cmd_down) { --- 2061,2064 ---- *************** *** 2084,2088 **** mn = GetUserMode(channel, user); ! if(!mn) { chanserv_notice(user, MSG_CHANNEL_ABSENT, channel->name); --- 2068,2072 ---- mn = GetUserMode(channel, user); ! if(!mn && argc) { chanserv_notice(user, MSG_CHANNEL_ABSENT, channel->name); *************** *** 2090,2094 **** } ! if(!(mn->modes & (MODE_CHANOP | MODE_VOICE))) { chanserv_notice(user, CSMSG_ALREADY_DOWN, channel->name); --- 2074,2078 ---- } ! if(!(mn->modes & (MODE_CHANOP | MODE_VOICE)) && argc) { chanserv_notice(user, CSMSG_ALREADY_DOWN, channel->name); *************** *** 2105,2109 **** } ! static CHANSERV_FUNC(cmd_downall) { struct chanList *cList; --- 2089,2093 ---- } ! static int cmd_all(struct userNode *user, struct chanNode *channel, unsigned int argc, unsigned char *argv[], chanserv_func_t cmd) { struct chanList *cList; *************** *** 2112,2120 **** for(cList = user->handle_info->channels; cList; cList = cList->next) { ! /* The channel may be NULL if it has been suspended. */ ! if(cList->channel->channel) { ! cmd_down(user, cList->channel->channel, 0, NULL); } } --- 2096,2105 ---- for(cList = user->handle_info->channels; cList; cList = cList->next) { ! if(IsSuspended(cList->channel)) { ! continue; } + + cmd(user, cList->channel->channel, 0, NULL); } *************** *** 2122,2125 **** --- 2107,2120 ---- } + static CHANSERV_FUNC(cmd_upall) + { + return cmd_all(CSFUNC_ARGS, cmd_down); + } + + static CHANSERV_FUNC(cmd_downall) + { + return cmd_all(CSFUNC_ARGS, cmd_down); + } + typedef int validate_func_t(struct userNode *user, struct chanNode *channel, struct userNode *victim); typedef void process_func_t(unsigned int num, userNode **newops, chanNode *channel, const char *who, int announce); *************** *** 3592,3600 **** --- 3587,3603 ---- suspended->cData = channel->channel_info; + suspended->cData->suspended = suspended; + suspended->cData->channel = NULL; reason = alloca(strlen(user->nick) + 36); sprintf(reason, "Channel registration suspended by %s.", user->nick); + /* Send the notice before we remove ChanServ from the channel, + because after ChanServ parts, it cannot be guaranteed that + channel is valid. Commands that assume channel is valid must + not be marked CMD_SUSPEND_OVERRIDE. */ + chanserv_notice(user, CSMSG_SUSPENDED, channel->name); + /* Mark the channel as suspended, then part. */ channel->channel_info->flags |= CHANNEL_SUSPENDED; *************** *** 3691,3703 **** chanserv_notice(user, CSMSG_COMMAND_INFO, cmd); chanserv_notice(user, CSMSG_COMMAND_ACCESS, chanserv_expand_command(access)); ! chanserv_notice(user, CSMSG_COMMAND_USES, command->uses); ! ! /* I really don't think users care too much about either the * weight or the flags. */ ! if(IsPrivileged(user)) ! { ! chanserv_notice(user, CSMSG_COMMAND_WEIGHT, command->weight); ! chanserv_notice(user, CSMSG_COMMAND_FLAGS, command->flags); ! } if((aliases = command_aliases("ChanServ", cmd))) --- 3694,3705 ---- chanserv_notice(user, CSMSG_COMMAND_INFO, cmd); chanserv_notice(user, CSMSG_COMMAND_ACCESS, chanserv_expand_command(access)); ! /* I really don't think users care too much about either the * weight or the flags. */ ! if(IsPrivileged(user)) ! { ! chanserv_notice(user, CSMSG_COMMAND_FLAGS, command->flags); ! chanserv_notice(user, CSMSG_COMMAND_WEIGHT, command->weight); ! } ! chanserv_notice(user, CSMSG_COMMAND_USES, command->uses); if((aliases = command_aliases("ChanServ", cmd))) *************** *** 4487,4490 **** --- 4489,4493 ---- channel->channel_info = suspended->cData; + suspended->cData->channel = channel; } *************** *** 5842,5846 **** DEFINE_COMMAND(register, CMD_REQUIRE_HANDLE | CMD_REQUIRE_CHANNEL, ulNone); ! DEFINE_COMMAND(unregister, CMD_REQUIRE_REGISTERED, ulOwner); DEFINE_COMMAND(move, CMD_REQUIRE_PRIVILEGE | CMD_REQUIRE_REGISTERED, ulOwner); DEFINE_COMMAND(opchan, CMD_REQUIRE_PRIVILEGE | CMD_REQUIRE_CHANNEL, ulOwner); --- 5845,5849 ---- DEFINE_COMMAND(register, CMD_REQUIRE_HANDLE | CMD_REQUIRE_CHANNEL, ulNone); ! DEFINE_COMMAND(unregister, CMD_REQUIRE_REGISTERED | CMD_SUSPEND_OVERRIDE, ulOwner); DEFINE_COMMAND(move, CMD_REQUIRE_PRIVILEGE | CMD_REQUIRE_REGISTERED, ulOwner); DEFINE_COMMAND(opchan, CMD_REQUIRE_PRIVILEGE | CMD_REQUIRE_CHANNEL, ulOwner); *************** *** 5891,5910 **** DEFINE_COMMAND(setinfo, CMD_REQUIRE_DEFAULT | CMD_IGNORE_EVENT, USER_LEVEL_LOWEST); ! DEFINE_COMMAND(events, CMD_REQUIRE_DEFAULT | CMD_IGNORE_EVENT, ulCoowner); DEFINE_COMMAND(addban, CMD_REQUIRE_DEFAULT, ulMaster); DEFINE_COMMAND(addtimedban, CMD_REQUIRE_DEFAULT, ulMaster); DEFINE_COMMAND(delban, CMD_REQUIRE_DEFAULT, ulMaster); ! DEFINE_COMMAND(bans, CMD_REQUIRE_DEFAULT | CMD_IGNORE_EVENT, ulPeon); DEFINE_COMMAND(peek, CMD_REQUIRE_DEFAULT | CMD_IGNORE_EVENT, ulOp); ! DEFINE_COMMAND(access, CMD_REQUIRE_REGISTERED | CMD_IGNORE_EVENT, ulNone); ! DEFINE_COMMAND(users, CMD_REQUIRE_REGISTERED | CMD_IGNORE_EVENT, ulNone); ! DEFINE_COMMAND(wlist, CMD_REQUIRE_REGISTERED | CMD_IGNORE_EVENT, ulNone); ! DEFINE_COMMAND(clist, CMD_REQUIRE_REGISTERED | CMD_IGNORE_EVENT, ulNone); ! DEFINE_COMMAND(mlist, CMD_REQUIRE_REGISTERED | CMD_IGNORE_EVENT, ulNone); ! DEFINE_COMMAND(olist, CMD_REQUIRE_REGISTERED | CMD_IGNORE_EVENT, ulNone); ! DEFINE_COMMAND(plist, CMD_REQUIRE_REGISTERED | CMD_IGNORE_EVENT, ulNone); ! DEFINE_COMMAND(info, CMD_REQUIRE_REGISTERED | CMD_IGNORE_EVENT, ulNone); ! DEFINE_COMMAND(seen, CMD_REQUIRE_REGISTERED | CMD_IGNORE_EVENT, ulNone); DEFINE_COMMAND(command, CMD_IGNORE_EVENT, ulNone); --- 5894,5913 ---- DEFINE_COMMAND(setinfo, CMD_REQUIRE_DEFAULT | CMD_IGNORE_EVENT, USER_LEVEL_LOWEST); ! DEFINE_COMMAND(events, CMD_REQUIRE_DEFAULT | CMD_IGNORE_EVENT | CMD_SUSPEND_OVERRIDE, ulCoowner); DEFINE_COMMAND(addban, CMD_REQUIRE_DEFAULT, ulMaster); DEFINE_COMMAND(addtimedban, CMD_REQUIRE_DEFAULT, ulMaster); DEFINE_COMMAND(delban, CMD_REQUIRE_DEFAULT, ulMaster); ! DEFINE_COMMAND(bans, CMD_REQUIRE_DEFAULT | CMD_IGNORE_EVENT | CMD_SUSPEND_OVERRIDE, ulPeon); DEFINE_COMMAND(peek, CMD_REQUIRE_DEFAULT | CMD_IGNORE_EVENT, ulOp); ! DEFINE_COMMAND(access, CMD_REQUIRE_REGISTERED | CMD_IGNORE_EVENT | CMD_SUSPEND_OVERRIDE, ulNone); ! DEFINE_COMMAND(users, CMD_REQUIRE_REGISTERED | CMD_IGNORE_EVENT | CMD_SUSPEND_OVERRIDE, ulNone); ! DEFINE_COMMAND(wlist, CMD_REQUIRE_REGISTERED | CMD_IGNORE_EVENT | CMD_SUSPEND_OVERRIDE, ulNone); ! DEFINE_COMMAND(clist, CMD_REQUIRE_REGISTERED | CMD_IGNORE_EVENT | CMD_SUSPEND_OVERRIDE, ulNone); ! DEFINE_COMMAND(mlist, CMD_REQUIRE_REGISTERED | CMD_IGNORE_EVENT | CMD_SUSPEND_OVERRIDE, ulNone); ! DEFINE_COMMAND(olist, CMD_REQUIRE_REGISTERED | CMD_IGNORE_EVENT | CMD_SUSPEND_OVERRIDE, ulNone); ! DEFINE_COMMAND(plist, CMD_REQUIRE_REGISTERED | CMD_IGNORE_EVENT | CMD_SUSPEND_OVERRIDE, ulNone); ! DEFINE_COMMAND(info, CMD_REQUIRE_REGISTERED | CMD_IGNORE_EVENT | CMD_SUSPEND_OVERRIDE, ulNone); ! DEFINE_COMMAND(seen, CMD_REQUIRE_REGISTERED | CMD_IGNORE_EVENT | CMD_SUSPEND_OVERRIDE, ulNone); DEFINE_COMMAND(command, CMD_IGNORE_EVENT, ulNone); |