+2004-07-27 Michael Poole <mdpoole@troilus.org>
+
+ * ircd/m_burst.c: Add new netride_modes() function to check
+ which modes could be used in a net.ride. Use this instead
+ of the old check for just +i or +k.
+ (Based on patches by beware and pomac.)
+
+2004-07-25 Michael Poole <mdpoole@troilus.org>
+
+ * ircd/ircd_parser.y: Remove redundant semicolon; it causes
+ errors on some versions of yacc.
+
2004-07-21 Michael Poole <mdpoole@troilus.org>
* include/client.h, ircd/ircd_auth.c, ircd/ircd_crypt_smd5.c,
#include <string.h>
#include <ctype.h>
+static int
+netride_modes(int parc, char **parv, const char *curr_key)
+{
+ char *modes = parv[0];
+ int result = 0;
+
+ assert(modes && modes[0] == '+');
+ while (*modes) {
+ switch (*modes++) {
+ case 'i':
+ result |= MODE_INVITEONLY;
+ break;
+ case 'k':
+ if (strcmp(curr_key, *++parv))
+ result |= MODE_KEY;
+ break;
+ case 'l':
+ ++parv;
+ break;
+ case 'r':
+ result |= MODE_REGONLY;
+ break;
+ }
+ }
+ return result;
+}
+
/*
* ms_burst - server message handler
*
*/
for (param = 3; param < parc; param++)
{
+ int check_modes;
if (parv[param][0] != '+')
continue;
- if (strchr(parv[param], 'i') || strchr(parv[param], 'k'))
+ check_modes = netride_modes(parc - param, parv + param, chptr->mode.key);
+ if (check_modes)
{
/* Clear any outstanding rogue invites */
mode_invite_clear(chptr);
nmember = member->next_member;
if (!MyUser(member->user) || IsZombie(member))
continue;
+ /* Kick as netrider if key mismatch *or* remote channel is +i
+ * *or* remote channel is +r and user has no account.
+ */
+ if ((check_modes == MODE_REGONLY) && IsAccount(member->user))
+ continue;
sendcmdto_serv_butone(&me, CMD_KICK, NULL, "%H %C :Net Rider", chptr, member->user);
sendcmdto_channel_butserv_butone(&me, CMD_KICK, chptr, NULL, 0, "%H %C :Net Rider", chptr, member->user);
make_zombie(member, member->user, &me, &me, chptr);