[srvx-commits] CVS: services/src chanserv.c,1.270,1.271 hash.h,1.88,1.89 proto-p10.c,1.19,1.20
Brought to you by:
entrope
|
From: Zoot <zo...@us...> - 2002-08-14 02:51:15
|
Update of /cvsroot/srvx/services/src
In directory usw-pr-cvs1:/tmp/cvs-serv907/src
Modified Files:
chanserv.c hash.h proto-p10.c
Log Message:
Support the P10 CLEARMODE command and make OPMODE a bit more paranoid about checking arguments.
Index: chanserv.c
===================================================================
RCS file: /cvsroot/srvx/services/src/chanserv.c,v
retrieving revision 1.270
retrieving revision 1.271
diff -C2 -r1.270 -r1.271
*** chanserv.c 14 Aug 2002 01:36:11 -0000 1.270
--- chanserv.c 14 Aug 2002 02:51:11 -0000 1.271
***************
*** 389,394 ****
#define ACTION_DEL_BAN 0x0020
! /* The 24 allows for [+-ntlksimp] and lots of fudge factor. */
! #define MODELEN 24 + KEYLEN
#define PADLEN 21
#define ACCESSLEN 10
--- 389,394 ----
#define ACTION_DEL_BAN 0x0020
! /* The 40 allows for [+-ntlksimprD] and lots of fudge factor. */
! #define MODELEN 40 + KEYLEN
#define PADLEN 21
#define ACCESSLEN 10
Index: hash.h
===================================================================
RCS file: /cvsroot/srvx/services/src/hash.h,v
retrieving revision 1.88
retrieving revision 1.89
diff -C2 -r1.88 -r1.89
*** hash.h 14 Aug 2002 01:36:11 -0000 1.88
--- hash.h 14 Aug 2002 02:51:11 -0000 1.89
***************
*** 37,40 ****
--- 37,43 ----
#define MODE_LIMIT 0x0400
#define MODE_DELAYJOINS 0x0800
+ #define MODE_REGONLY 0x1000
+
+ #define CHANNEL_MODES (MODE_PRIVATE | MODE_SECRET | MODE_MODERATED | MODE_TOPICLIMIT | MODE_INVITEONLY | MODE_NOPRIVMSGS | MODE_KEY | MODE_LIMIT | MODE_DELAYJOINS | MODE_REGONLY)
#define FLAGS_OPER 0x0001 /* Operator +O */
Index: proto-p10.c
===================================================================
RCS file: /cvsroot/srvx/services/src/proto-p10.c,v
retrieving revision 1.19
retrieving revision 1.20
diff -C2 -r1.19 -r1.20
*** proto-p10.c 14 Aug 2002 01:48:11 -0000 1.19
--- proto-p10.c 14 Aug 2002 02:51:11 -0000 1.20
***************
*** 1119,1126 ****
return 0;
}
- if (!IsChannelName(argv[1])) {
- log(MAIN_LOG, LOG_ERROR, "Received OPMODE for non-channel %s.\n", argv[1]);
- return 0;
- }
if (!(cn = GetChannel(argv[1]))) {
--- 1119,1122 ----
***************
*** 1132,1135 ****
--- 1128,1135 ----
return 0;
}
+ if(!IsOper(un)) {
+ log(MAIN_LOG, LOG_ERROR, "Non-privileged user %s using OPMODE.\n", un->nick);
+ return 0;
+ }
modes = unsplit_string(argv + 2, argc - 2, NULL);
***************
*** 1137,1140 ****
--- 1137,1167 ----
}
+ int clear_chanmode(struct chanNode *channel, struct userNode *who, const char *modes);
+
+ static CMD_FUNC(cmd_clearmode)
+ {
+ struct chanNode *cn;
+ struct userNode *un;
+
+ if (argc < 3) {
+ return 0;
+ }
+
+ if (!(cn = GetChannel(argv[1]))) {
+ log(MAIN_LOG, LOG_ERROR, "Unable to find channel %s whose mode is changing\n", argv[1]);
+ return 0;
+ }
+ if (!(un = GetUserH(origin))) {
+ log(MAIN_LOG, LOG_ERROR, "Unable to find user %s requesting CLEARMODE.\n", origin);
+ return 0;
+ }
+ if(!IsOper(un)) {
+ log(MAIN_LOG, LOG_ERROR, "Non-privileged user %s using CLEARMODE.\n", un->nick);
+ return 0;
+ }
+
+ return clear_chanmode(cn, un, argv[2]);
+ }
+
static CMD_FUNC(cmd_topic)
{
***************
*** 1414,1417 ****
--- 1441,1446 ----
dict_insert(irc_func_dict, CMD_OPMODE, cmd_opmode);
dict_insert(irc_func_dict, TOK_OPMODE, cmd_opmode);
+ dict_insert(irc_func_dict, CMD_CLEARMODE, cmd_clearmode);
+ dict_insert(irc_func_dict, TOK_CLEARMODE, cmd_clearmode);
/* In P10, DESTRUCT doesn't do anything except be broadcast to servers.
***************
*** 1991,1994 ****
--- 2020,2120 ----
call_mode_change_funcs(channel, who, MODE_CHANGE_MISC, NULL);
}
+ return 1;
+ }
+
+ int
+ clear_chanmode(struct chanNode *channel, struct userNode *who, const char *modes)
+ {
+ static int flags[] = {
+ MODE_CHANOP, 'o',
+ MODE_VOICE, 'v',
+ MODE_PRIVATE, 'p',
+ MODE_SECRET, 's',
+ MODE_MODERATED, 'm',
+ MODE_TOPICLIMIT, 't',
+ MODE_INVITEONLY, 'i',
+ MODE_NOPRIVMSGS, 'n',
+ MODE_KEY, 'k',
+ MODE_BAN, 'b',
+ MODE_LIMIT, 'l',
+ MODE_DELAYJOINS, 'D',
+ MODE_REGONLY, 'r',
+ 0x0, 0x0
+ };
+ unsigned int remove = 0, pos = 0;
+ char buffer[40 + KEYLEN];
+
+ buffer[pos++] = '-';
+ while(*modes)
+ {
+ int *flag_p;
+
+ for(flag_p = flags; flag_p[0]; flag_p += 2)
+ {
+ if(*modes == flag_p[1])
+ {
+ remove |= flag_p[0];
+
+ if((flag_p[0] & CHANNEL_MODES) & channel->modes)
+ {
+ buffer[pos++] = flag_p[0];
+ }
+ break;
+ }
+ }
+ modes++;
+ }
+
+ if(!remove)
+ {
+ return 1;
+ }
+
+ /* Handle channel modes that take arguments in order
+ of their appearance in flags[]. */
+ if((remove & MODE_KEY) && channel->key)
+ {
+ pos += sprintf(buffer + pos, " %s", channel->key);
+ channel->key[0] = '\0';
+ }
+ if((remove & MODE_LIMIT) && channel->limit)
+ {
+ pos += sprintf(buffer + pos, " %d", channel->limit);
+ channel->limit = 0;
+ }
+
+ /* Remove simple modes. */
+ channel->modes &= ~remove;
+
+ /* If removing bans, kill 'em all. */
+ if(remove & MODE_BAN && channel->banlist.used)
+ {
+ unsigned int i;
+ struct banNode **ary = channel->banlist.list;
+ struct string_list *removed;
+ char *ban;
+
+ removed = alloc_string_list(channel->banlist.used);
+ for (i=0; i<channel->banlist.used; i++)
+ {
+ ban = strdup(ary[i]->ban);
+ string_list_append(removed, ban);
+ }
+ DelChannelBan(removed->used, (const char **)removed->list, channel, who, 0);
+ free_string_list(removed);
+ }
+
+ /* Remove member modes. */
+ if(remove & (MODE_CHANOP | MODE_VOICE) && channel->members.used)
+ {
+ int mask = ~(remove & (MODE_CHANOP | MODE_VOICE));
+ unsigned int i;
+
+ for(i = 0; i < channel->members.used; i++)
+ {
+ channel->members.list[i]->modes &= mask;
+ }
+ }
+
return 1;
}
|