From c4d3c6b3f119aee4d6d1ddf137d048de50a4a5f6 Mon Sep 17 00:00:00 2001 From: adam Date: Tue, 8 Jun 2004 09:24:49 +0000 Subject: [PATCH] fixed MODE_REGISTERED bug; introduced MCP_REGISTERED * fixed MODE_REGISTERED bug: srvx was sending a blank mode change on channel unregistrations; we now have a srvx.conf setting that dictates whether or not to use MODE_REGISTERED (which has no corresponding letter on P10 networks!) - also, we now set MODE_REGISTERED in newly registered channels (which we werent before) * introduced MCP_REGISTERED: we now don't let channels that are registered play with the registered mode (usually +r on bahamut networks) via chanserv user-level commands (ie: !mode -r) git-archimport-id: srvx@srvx.net--2004-srvx/srvx--devo--1.3--patch-68 --- ChangeLog | 19 +++++++++++++++++++ src/chanserv.c | 21 +++++++++++++++------ src/proto-bahamut.c | 8 ++++++++ src/proto.h | 1 + srvx.conf.example | 3 +++ 5 files changed, 46 insertions(+), 6 deletions(-) diff --git a/ChangeLog b/ChangeLog index 34364d6..b3bda78 100644 --- a/ChangeLog +++ b/ChangeLog @@ -2,6 +2,25 @@ # arch-tag: automatic-ChangeLog--srvx@srvx.net--2004-srvx/srvx--devo--1.3 # +2004-06-08 09:24:49 GMT adam patch-68 + + Summary: + fixed MODE_REGISTERED bug; introduced MCP_REGISTERED + Revision: + srvx--devo--1.3--patch-68 + + * fixed MODE_REGISTERED bug: srvx was sending a blank mode change on channel unregistrations; we now have a srvx.conf setting that dictates whether or not to use MODE_REGISTERED (which has no corresponding letter on P10 networks!) - also, we now set MODE_REGISTERED in newly registered channels (which we werent before) + + * introduced MCP_REGISTERED: we now don't let channels that are registered play with the registered mode (usually +r on bahamut networks) via chanserv user-level commands (ie: !mode -r) + + + + + modified files: + ChangeLog src/chanserv.c src/proto-bahamut.c src/proto.h + srvx.conf.example + + 2004-05-22 04:24:57 GMT Michael Poole patch-67 Summary: diff --git a/src/chanserv.c b/src/chanserv.c index 60f8991..7c629f6 100644 --- a/src/chanserv.c +++ b/src/chanserv.c @@ -500,6 +500,8 @@ static struct unsigned int max_chan_bans; unsigned int max_userinfo_length; + unsigned int use_registered_mode; + struct string_list *set_shows; struct string_list *eightball; struct string_list *old_ban_names; @@ -1287,9 +1289,11 @@ unregister_channel(struct chanData *channel, const char *reason) timeq_del(0, NULL, channel, TIMEQ_IGNORE_FUNC | TIMEQ_IGNORE_WHEN); - mod_chanmode_init(&change); - change.modes_clear |= MODE_REGISTERED; - mod_chanmode_announce(chanserv, channel->channel, &change); + if (chanserv_conf.use_registered_mode) { + mod_chanmode_init(&change); + change.modes_clear |= MODE_REGISTERED; + mod_chanmode_announce(chanserv, channel->channel, &change); + } while(channel->users) del_channel_user(channel->users, 0); @@ -1745,6 +1749,8 @@ static CHANSERV_FUNC(cmd_register) cData = register_channel(channel, user->handle_info->handle); scan_user_presence(add_channel_user(cData, handle, UL_OWNER, 0, NULL), NULL); cData->modes = chanserv_conf.default_modes; + if (chanserv_conf.use_registered_mode) + cData->modes.modes_set |= MODE_REGISTERED; change = mod_chanmode_dup(&cData->modes, 1); change->args[change->argc].mode = MODE_CHANOP; change->args[change->argc].member = AddChannelUser(chanserv, channel); @@ -3733,7 +3739,7 @@ static CHANSERV_FUNC(cmd_mode) return 1; } - change = mod_chanmode_parse(channel, argv+1, argc-1, MCP_KEY_FREE); + change = mod_chanmode_parse(channel, argv+1, argc-1, MCP_KEY_FREE|MCP_REGISTERED); if(!change) { reply("MSG_INVALID_MODES", unsplit_string(argv+1, argc-1, NULL)); @@ -4853,7 +4859,7 @@ static MODCMD_FUNC(chan_opt_modes) { memset(&channel->channel_info->modes, 0, sizeof(channel->channel_info->modes)); } - else if(!(new_modes = mod_chanmode_parse(channel, argv+1, argc-1, MCP_KEY_FREE))) + else if(!(new_modes = mod_chanmode_parse(channel, argv+1, argc-1, MCP_KEY_FREE|MCP_REGISTERED))) { reply("CSMSG_INVALID_MODE_LOCK", unsplit_string(argv+1, argc-1, NULL)); return 0; @@ -6436,6 +6442,8 @@ chanserv_conf_read(void) * parse issue. */ str = database_get_data(conf_node, "off_channel", RECDB_QSTRING); off_channel = (str && enabled_string(str)) ? 1 : 0; + str = database_get_data(conf_node, "use_registered_mode", RECDB_QSTRING); + chanserv_conf.use_registered_mode = (str && enabled_string(str)) ? 1 : 0; } static void @@ -6740,7 +6748,8 @@ chanserv_channel_read(const char *key, struct record_data *hir) && (argc = split_line(str, 0, ArrayLength(argv), argv)) && (modes = mod_chanmode_parse(cNode, argv, argc, MCP_KEY_FREE))) { cData->modes = *modes; - cData->modes.modes_set |= MODE_REGISTERED; + if (chanserv_conf.use_registered_mode) + cData->modes.modes_set |= MODE_REGISTERED; if(cData->modes.argc > 1) cData->modes.argc = 1; mod_chanmode_announce(chanserv, cNode, &cData->modes); diff --git a/src/proto-bahamut.c b/src/proto-bahamut.c index 84531b0..ee649b1 100644 --- a/src/proto-bahamut.c +++ b/src/proto-bahamut.c @@ -1255,6 +1255,14 @@ mod_chanmode_parse(struct chanNode *channel, char **modes, unsigned int argc, un case 'p': do_chan_mode(MODE_PRIVATE); break; case 's': do_chan_mode(MODE_SECRET); break; case 't': do_chan_mode(MODE_TOPICLIMIT); break; + case 'r': + if (!(flags & MCP_REGISTERED)) { + do_chan_mode(MODE_REGISTERED); + } else { + mod_chanmode_free(change); + return NULL; + } + break; #undef do_chan_mode case 'l': if (add) { diff --git a/src/proto.h b/src/proto.h index d95144f..3b60c72 100644 --- a/src/proto.h +++ b/src/proto.h @@ -205,6 +205,7 @@ struct mod_chanmode { #define MCP_ALLOW_OVB 0x0001 /* allow op, voice, ban manipulation */ #define MCP_FROM_SERVER 0x0002 /* parse as from a server */ #define MCP_KEY_FREE 0x0004 /* -k without a key argument */ +#define MCP_REGISTERED 0x0008 /* chan is already registered; do not allow changes to MODE_REGISTERED */ #define MC_ANNOUNCE 0x0100 /* send a mod_chanmode() change out */ #define MC_NOTIFY 0x0200 /* make local callbacks to announce */ #ifdef NDEBUG diff --git a/srvx.conf.example b/srvx.conf.example index b016ea0..3bd2d60 100644 --- a/srvx.conf.example +++ b/srvx.conf.example @@ -181,6 +181,9 @@ // Does your ircd have off-channel services support? // Bahamut does; ircu2.10.11 does not. "off_channel" "no"; + // Does your ircd have a mode for registered channels? + // Bahamut does; ircu2.10.11 does not. + "use_registered_mode" "no"; // how long should a person be unseen before resending infoline? "info_delay" "120"; // maximum greeting length -- 2.20.1