Thread: [srvx-commits] CVS: services/src chanserv.c,1.313,1.314
Brought to you by:
entrope
|
From: Zoot <zo...@us...> - 2002-12-12 03:26:36
|
Update of /cvsroot/srvx/services/src
In directory sc8-pr-cvs1:/tmp/cvs-serv15759/src
Modified Files:
chanserv.c
Log Message:
Remove an outdated reference to the togop command.
Index: chanserv.c
===================================================================
RCS file: /cvsroot/srvx/services/src/chanserv.c,v
retrieving revision 1.313
retrieving revision 1.314
diff -C2 -r1.313 -r1.314
*** chanserv.c 28 Nov 2002 22:00:19 -0000 1.313
--- chanserv.c 12 Dec 2002 03:26:33 -0000 1.314
***************
*** 255,258 ****
--- 255,260 ----
/* Channel banlist */
+ #define CSMSG_BAN_LIST_MATCH "$b%s$b permanent and timed bans matching %s:"
+ #define CSMSG_BAN_LIST "$b%s$b permanent and timed bans:"
#define CSMSG_BAN_HEADER "$b%-*s%-*s%-*s%-*s%s$b"
#define CSMSG_BAN_DATA "$b%-*s$b%-*s%-*s%-*s%s"
***************
*** 642,646 ****
struct userData *uData;
! if(!channel->channel_info || IsSuspended(channel->channel_info)) return;
uData = GetTrueChannelAccess(channel->channel_info, handle);
--- 644,648 ----
struct userData *uData;
! if(!channel->channel_info || !IsJoined(channel->channel_info)) return;
uData = GetTrueChannelAccess(channel->channel_info, handle);
***************
*** 674,678 ****
(void)bot;
/* Bail early if channel is inactive or doesn't restrict CTCPs, or sender is a service */
! if(!channel->channel_info || IsSuspended(channel->channel_info)) return;
if(channel->channel_info->options[optCTCPUsers] == 'a') return;
if(IsService(user)) return;
--- 676,680 ----
(void)bot;
/* Bail early if channel is inactive or doesn't restrict CTCPs, or sender is a service */
! if(!channel->channel_info || !IsJoined(channel->channel_info)) return;
if(channel->channel_info->options[optCTCPUsers] == 'a') return;
if(IsService(user)) return;
***************
*** 1154,1157 ****
--- 1156,1206 ----
}
+ static struct chanNode *
+ chanserv_join(struct chanData *cData, struct chanNode *channel, const char *name)
+ {
+ struct modeNode *mode;
+ int announce = 1;
+
+ assert(!(name && channel) && (name || channel));
+ if(name)
+ {
+ channel = GetChannel(name);
+ if(!channel)
+ {
+ channel = AddChannel(name, now, NULL, NULL);
+ announce = 0;
+ }
+ }
+
+ mode = GetUserMode(channel, chanserv);
+ if(!mode)
+ {
+ AddChannelUser(chanserv, channel);
+ }
+ if(!mode || !(mode->modes & MODE_CHANOP))
+ {
+ AddChannelOp(1, &chanserv, channel, chanserv, announce);
+ }
+
+ if(cData)
+ {
+ channel->channel_info = cData;
+
+ cData->channel = channel;
+ cData->flags |= CHANNEL_JOINED;
+ }
+
+ return channel;
+ }
+
+ static void
+ chanserv_part(struct chanData *cData, const char *reason)
+ {
+ assert(cData->flags & CHANNEL_JOINED);
+
+ DelChannelUser(chanserv, cData->channel, reason, 0);
+ cData->flags &= ~CHANNEL_JOINED;
+ }
+
static struct userData*
add_channel_user(struct chanData *channel, struct handle_info *handle, enum userLevel access, time_t seen, const char *info)
***************
*** 1325,1328 ****
--- 1374,1378 ----
channel = bd->channel;
+ /* XXX: !IsJoined might be appropriate here. */
if(IsSuspended(channel))
{
***************
*** 1430,1434 ****
{
struct chanData *channel, *next;
- struct chanNode *save;
struct userData *user;
char delay[INTERVALLEN], reason[INTERVALLEN + 64];
--- 1480,1483 ----
***************
*** 1457,1463 ****
suspended = IsSuspended(channel);
log(CS_LOG, LOG_INFO, "(%s) Channel registration expired.\n", (suspended ? channel->suspended->name : channel->channel->name));
! save = channel->channel;
unregister_channel(channel);
- if(!suspended) DelChannelUser(chanserv, save, reason, 0);
}
--- 1506,1514 ----
suspended = IsSuspended(channel);
log(CS_LOG, LOG_INFO, "(%s) Channel registration expired.\n", (suspended ? channel->suspended->name : channel->channel->name));
! if(IsJoined(channel))
! {
! chanserv_part(channel, reason);
! }
unregister_channel(channel);
}
***************
*** 1835,1850 ****
}
! if(new_channel)
! {
! channel = AddChannel(argv[1], now, NULL, NULL);
! AddChannelUser(chanserv, channel);
! }
!
! cData = register_channel(channel, user->handle_info->handle, NULL, 0);
add_channel_user(cData, handle, USER_LEVEL_HIGHEST, 0, NULL);
scan_handle_presence(channel, handle, NULL);
! if(!new_channel) AddChannelUser(chanserv, channel);
! AddChannelOp(1, &chanserv, channel, chanserv, !new_channel);
parse_mode_lock(&CHANSERV_DEFAULT_MODES, 1, cData);
--- 1886,1894 ----
}
! cData = register_channel(NULL, user->handle_info->handle, NULL, 0);
add_channel_user(cData, handle, USER_LEVEL_HIGHEST, 0, NULL);
scan_handle_presence(channel, handle, NULL);
! channel = chanserv_join(cData, NULL, chan_name);
parse_mode_lock(&CHANSERV_DEFAULT_MODES, 1, cData);
***************
*** 1899,1905 ****
else
{
! sprintf(reason, "Channel unregistered by %s.", user->handle_info->handle);
unregister_channel(cData);
- DelChannelUser(chanserv, channel, reason, 0);
}
chanserv_notice(user, CSMSG_UNREG_SUCCESS, name);
--- 1943,1952 ----
else
{
! if(IsJoined(cData))
! {
! sprintf(reason, "Channel unregistered by %s.", user->handle_info->handle);
! chanserv_part(cData, reason);
! }
unregister_channel(cData);
}
chanserv_notice(user, CSMSG_UNREG_SUCCESS, name);
***************
*** 1913,1925 ****
{
struct chanNode *target;
! struct modeNode *mn;
struct userData *uData;
! int new_channel = 0, force = 0;
! char reason[MAXLEN];
struct do_not_register *dnr;
REQUIRE_PARAMS(2);
! if(IsProtected(channel->channel_info))
{
chanserv_notice(user, CSMSG_MOVE_NODELETE, channel->name);
--- 1960,1974 ----
{
struct chanNode *target;
! struct chanData *cData;
struct userData *uData;
! int force = 0;
! char *target_name, reason[MAXLEN];
struct do_not_register *dnr;
REQUIRE_PARAMS(2);
! /* Prevent nodelete channels from being moved. */
! cData = channel->channel_info;
! if(IsProtected(cData))
{
chanserv_notice(user, CSMSG_MOVE_NODELETE, channel->name);
***************
*** 1927,1936 ****
}
force = (argc > 2) && !irccasecmp(argv[2], "force") && IsPrivileged(user);
! if((target = GetChannel(argv[1])))
{
!
! if(!force && (dnr = chanserv_is_dnr(target->name, NULL)))
{
if(IsPrivileged(user))
{
--- 1976,1998 ----
}
+ /* Don't allow channels with owners whose accounts
+ have been DNR'd to move their channels unless it
+ is forced. */
force = (argc > 2) && !irccasecmp(argv[2], "force") && IsPrivileged(user);
! if(!force)
{
! for(uData = cData->users; uData; uData = uData->next)
{
+ if(uData->access != ulOwner)
+ {
+ continue;
+ }
+
+ dnr = chanserv_is_dnr(NULL, uData->handle);
+ if(!dnr)
+ {
+ continue;
+ }
+
if(IsPrivileged(user))
{
***************
*** 1944,2044 ****
}
}
else
{
! if(!IsCSChannelName(argv[1]))
{
chanserv_notice(user, MSG_NOT_CHANNEL_NAME);
return 0;
}
!
! if(opserv_bad_channel(argv[1]))
{
! chanserv_notice(user, CSMSG_ILLEGAL_CHANNEL, argv[1]);
return 0;
}
!
! if (!force)
{
! for(uData = channel->channel_info->users; uData; uData = uData->next)
! {
! if((uData->access == ulOwner) && (dnr = chanserv_is_dnr(NULL, uData->handle)))
! {
! if(IsPrivileged(user))
! {
! chanserv_notice(user, CSMSG_DNR_INFO, dnr->chan_name, dnr->setter, dnr->reason);
! }
! else
! {
! chanserv_notice(user, CSMSG_DNR_CHANNEL_MOVE, argv[1]);
! }
! return 0;
! }
! }
!
! if((dnr = chanserv_is_dnr(argv[1], NULL)))
! {
! if(IsPrivileged(user))
! {
! chanserv_notice(user, CSMSG_DNR_INFO, dnr->chan_name, dnr->setter, dnr->reason);
! }
! else
! {
! chanserv_notice(user, CSMSG_DNR_CHANNEL_MOVE, argv[1]);
! }
! return 0;
! }
}
-
- target = AddChannel(argv[1], now, NULL, NULL);
- AddChannelUser(chanserv, target);
- new_channel = 1;
}
! if(target->channel_info)
{
! chanserv_notice(user, CSMSG_ALREADY_REGGED, target->name);
! return 0;
}
! if(!new_channel && (!(mn = GetUserMode(target, user)) || !(mn->modes && MODE_CHANOP)) && !IsPrivileged(user))
{
! chanserv_notice(user, CSMSG_MUST_BE_OPPED, target->name);
! return 0;
}
-
- /* Move the channel_info to the target channel; it
- shouldn't be necessary to clear timeq callbacks
- for the old channel. */
- target->channel_info = channel->channel_info;
- target->channel_info->channel = target;
channel->channel_info = NULL;
! if(IsSuspended(target->channel_info))
{
/* Transfer the suspension information. */
! struct suspended *suspended = target->channel_info->suspended;
free(suspended->name);
! suspended->name = strdup(target->name);
}
else
{
! if(!new_channel) AddChannelUser(chanserv, target);
! AddChannelOp(1, &chanserv, target, chanserv, 1);
! }
!
! chanserv_notice(user, CSMSG_MOVE_SUCCESS, target->name);
!
! sprintf(reason, "%s moved to %s by %s.", channel->name, target->name, user->handle_info->handle);
! if(!IsSuspended(target->channel_info))
! {
! char reason2[MAXLEN];
! sprintf(reason2, "Channel moved to %s by %s.", target->name, user->handle_info->handle);
! DelChannelUser(chanserv, channel, reason2, 0);
}
! global_message(MESSAGE_RECIPIENT_OPERS | MESSAGE_RECIPIENT_HELPERS, reason);
! return 1;
}
--- 2006,2091 ----
}
}
+
+ /* Locate target information for the channel. */
+ if((target = GetChannel(argv[1])))
+ {
+ struct modeNode *mn;
+
+ target_name = target->name;
+ if(target->channel_info)
+ {
+ chanserv_notice(user, CSMSG_ALREADY_REGGED, target_name);
+ return 0;
+ }
+ if((!(mn = GetUserMode(target, user)) || !(mn->modes && MODE_CHANOP)) && !IsPrivileged(user))
+ {
+ chanserv_notice(user, CSMSG_MUST_BE_OPPED, target_name);
+ return 0;
+ }
+ }
else
{
! target_name = argv[1];
! if(!IsCSChannelName(target_name))
{
chanserv_notice(user, MSG_NOT_CHANNEL_NAME);
return 0;
}
! if(opserv_bad_channel(target_name))
{
! chanserv_notice(user, CSMSG_ILLEGAL_CHANNEL, target_name);
return 0;
}
! if(dict_find(sChannels, target_name, NULL))
{
! chanserv_notice(user, CSMSG_ALREADY_REGGED, target_name);
! return 0;
}
}
! /* Don't allow the move if the target channel is DNR'd. */
! if(!force && (dnr = chanserv_is_dnr(target_name, NULL)))
{
! if(IsPrivileged(user))
! {
! chanserv_notice(user, CSMSG_DNR_INFO, dnr->chan_name, dnr->setter, dnr->reason);
! }
! else
! {
! chanserv_notice(user, CSMSG_DNR_CHANNEL_MOVE, target_name);
! }
! return 0;
}
! /* If ChanServ is joined to the previous channel, part
! and null the channel_info pointer. */
! if(IsJoined(cData))
{
! char reason2[MAXLEN];
! sprintf(reason2, "Channel moved to %s by %s.", target_name, user->handle_info->handle);
! chanserv_part(cData, reason2);
}
channel->channel_info = NULL;
! if(IsSuspended(cData))
{
/* Transfer the suspension information. */
! struct suspended *suspended = cData->suspended;
+ dict_remove2(sChannels, suspended->name, 1);
free(suspended->name);
! suspended->name = strdup(target_name);
! dict_insert(sChannels, suspended->name, suspended);
}
else
{
! /* Join ChanServ to the new channel. */
! chanserv_join(cData, NULL, target_name);
}
! chanserv_notice(user, CSMSG_MOVE_SUCCESS, target_name);
! sprintf(reason, "%s moved to %s by %s.", channel->name, target_name, user->handle_info->handle);
! global_message(MESSAGE_RECIPIENT_OPERS | MESSAGE_RECIPIENT_HELPERS, reason); return 1;
}
***************
*** 2299,2304 ****
merge_channel(channel->channel_info, target->channel_info);
sprintf(reason, "Channel merged into %s by %s.", target->name, user->handle_info->handle);
unregister_channel(channel->channel_info);
! DelChannelUser(chanserv, channel, reason, 0);
chanserv_notice(user, CSMSG_MERGE_SUCCESS, target->name);
return 1;
--- 2346,2353 ----
merge_channel(channel->channel_info, target->channel_info);
sprintf(reason, "Channel merged into %s by %s.", target->name, user->handle_info->handle);
+
+ chanserv_part(channel->channel_info, reason);
unregister_channel(channel->channel_info);
!
chanserv_notice(user, CSMSG_MERGE_SUCCESS, target->name);
return 1;
***************
*** 2736,2740 ****
{
if(!cList->channel->channel
! || IsSuspended(cList->channel)
|| !GetUserMode(cList->channel->channel, user)
|| IsUserSuspended(cList->user))
--- 2785,2789 ----
{
if(!cList->channel->channel
! || !IsJoined(cList->channel)
|| !GetUserMode(cList->channel->channel, user)
|| IsUserSuspended(cList->user))
***************
*** 3789,3792 ****
--- 3838,3850 ----
durationLength = timed ? INTERVALLEN : 0;
+ if(search)
+ {
+ chanserv_notice(user, CSMSG_BAN_LIST_MATCH, channel->name, search);
+ }
+ else
+ {
+ chanserv_notice(user, CSMSG_BAN_LIST, channel->name);
+ }
+
chanserv_notice(user, CSMSG_BAN_HEADER, banLength, "Mask:", ownerLength, "Set By:", INTERVALLEN, "Triggered:", durationLength, timed ? "Expires:" : "", "Reason:");
for(i = 0; i < matches; i++)
***************
*** 4735,4748 ****
{
struct suspended *suspended = data;
- struct chanNode *channel;
if(!suspended->expires || (now < suspended->expires)) suspended->revoked = now;
! dict_remove(sChannels, suspended->name);
! channel = AddChannel(suspended->name, now, NULL, NULL);
! AddChannelUser(chanserv, channel);
! AddChannelOp(1, &chanserv, channel, chanserv, 1);
! channel->channel_info = suspended->cData;
! suspended->cData->channel = channel;
suspended->cData->flags &= ~CHANNEL_SUSPENDED;
}
--- 4793,4805 ----
{
struct suspended *suspended = data;
if(!suspended->expires || (now < suspended->expires)) suspended->revoked = now;
!
! /* Unsuspend the channel. */
suspended->cData->flags &= ~CHANNEL_SUSPENDED;
+ dict_remove(sChannels, suspended->name);
+
+ /* Join ChanServ to the channel. */
+ chanserv_join(suspended->cData, NULL, suspended->name);
}
***************
*** 4798,4809 ****
suspended->previous = suspended->cData->suspended;
suspended->cData->suspended = suspended;
- suspended->cData->channel = NULL;
! /* Mark the channel as suspended, then part. */
! channel->channel_info->flags |= CHANNEL_SUSPENDED;
dict_insert(sChannels, suspended->name, suspended);
- DelChannelUser(chanserv, channel, suspended->reason, 0);
- chanserv_notice(user, CSMSG_SUSPENDED, suspended->name);
sprintf(reason, "%s suspended by %s.", suspended->name, suspended->suspender);
global_message(MESSAGE_RECIPIENT_OPERS | MESSAGE_RECIPIENT_HELPERS, reason);
--- 4855,4866 ----
suspended->previous = suspended->cData->suspended;
suspended->cData->suspended = suspended;
! /* Part the channel and mark the channel as suspended. */
! chanserv_part(suspended->cData, suspended->reason);
! suspended->cData->channel = NULL;
! suspended->cData->flags |= CHANNEL_SUSPENDED;
dict_insert(sChannels, suspended->name, suspended);
+ chanserv_notice(user, CSMSG_SUSPENDED, suspended->name);
sprintf(reason, "%s suspended by %s.", suspended->name, suspended->suspender);
global_message(MESSAGE_RECIPIENT_OPERS | MESSAGE_RECIPIENT_HELPERS, reason);
***************
*** 6018,6021 ****
--- 6075,6080 ----
SetChannelTopic(channel, chanserv, channel->channel_info->topic, 1);
}
+
+ return;
}
***************
*** 6475,6480 ****
{
chanserv_conf.debug_channel = AddChannel(str, now, "+tinms", NULL);
! AddChannelUser(chanserv, chanserv_conf.debug_channel);
! AddChannelOp(1, &chanserv, chanserv_conf.debug_channel, chanserv, 0);
}
else
--- 6534,6538 ----
{
chanserv_conf.debug_channel = AddChannel(str, now, "+tinms", NULL);
! chanserv_join(NULL, chanserv_conf.debug_channel, NULL);
}
else
***************
*** 6486,6491 ****
{
chanserv_conf.support_channel = AddChannel(str, now, "+nt", NULL);
! AddChannelUser(chanserv, chanserv_conf.support_channel);
! AddChannelOp(1, &chanserv, chanserv_conf.support_channel, chanserv, 0);
}
else
--- 6544,6548 ----
{
chanserv_conf.support_channel = AddChannel(str, now, "+nt", NULL);
! chanserv_join(NULL, chanserv_conf.support_channel, NULL);
}
else
***************
*** 6774,6777 ****
--- 6831,6840 ----
channel = hir->d.object;
+ if(!*key)
+ {
+ log(CS_LOG, LOG_ERROR, "Read channel with empty name; skipping.\n");
+ return 0;
+ }
+
if((str = database_get_data(channel, KEY_FLAGS, RECDB_QSTRING)))
{
***************
*** 6827,6831 ****
else
{
! cNode = AddChannel(key, now, NULL, NULL);
if(!cNode)
{
--- 6890,6896 ----
else
{
! /* We create the channel and join ChanServ to it here, but
! defer linking it to a registration record (the "two-step"). */
! cNode = chanserv_join(NULL, NULL, key);
if(!cNode)
{
***************
*** 6833,6838 ****
return 0;
}
- AddChannelUser(chanserv, cNode);
- AddChannelOp(1, &chanserv, cNode, chanserv, 0);
}
--- 6898,6901 ----
***************
*** 6845,6848 ****
--- 6908,6919 ----
}
+ if(!suspended)
+ {
+ /* Part two of the two-step registration join shuffle.
+ Quickly, fix this and put this ugly code out of its
+ misery. */
+ chanserv_join(cData, cNode, NULL);
+ }
+
if((cData->suspended = suspended)) suspended->cData = cData;
str = database_get_data(channel, KEY_REGISTERED, RECDB_QSTRING);
***************
*** 6884,6892 ****
{
log(CS_LOG, LOG_ERROR, "Channel %s had no users in database, unregistering it.\n", key);
unregister_channel(cData);
- if(cNode)
- {
- DelChannelUser(chanserv, cNode, "Channel has empty user list.", 0);
- }
return 0;
}
--- 6955,6963 ----
{
log(CS_LOG, LOG_ERROR, "Channel %s had no users in database, unregistering it.\n", key);
+ if(IsJoined(cData))
+ {
+ chanserv_part(cData, "Channel has empty user list.");
+ }
unregister_channel(cData);
return 0;
}
|