[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);
|