From d57fda84dfa2559ab7fe90fc18049c038413fafa Mon Sep 17 00:00:00 2001 From: Bram Matthys Date: Thu, 3 Aug 2006 12:11:15 +0000 Subject: [PATCH] - Fixed SVSMODE -b [user] not always removing all bans (specificly, bans on the cloaked host when you have a vhost), a code cleanup was also done. Based on patch from tabrisnet. Reported by Rob (#0002981). --- Changes | 3 + src/modules/m_svsmode.c | 244 ++++++++++++++++++++-------------------- 2 files changed, 123 insertions(+), 124 deletions(-) diff --git a/Changes b/Changes index 4bd72a45e..6f94120f3 100644 --- a/Changes +++ b/Changes @@ -1275,3 +1275,6 @@ - Added bugs.* url to /info, was still showing some email address. - Fixed forgotten operoverride logmessage (kick if chan +Q), reported in #2889. - Fixed operoverride message if oper is +h and -h's himself, reported by Bock (#2889). +- Fixed SVSMODE -b [user] not always removing all bans (specificly, bans on the cloaked + host when you have a vhost), a code cleanup was also done. Based on patch from tabrisnet. + Reported by Rob (#0002981). diff --git a/src/modules/m_svsmode.c b/src/modules/m_svsmode.c index 94a521b4a..6c97efb8a 100644 --- a/src/modules/m_svsmode.c +++ b/src/modules/m_svsmode.c @@ -87,6 +87,120 @@ DLLFUNC int MOD_UNLOAD(m_svsmode)(int module_unload) return MOD_SUCCESS; } +void unban_user(aClient *sptr, aChannel *chptr, aClient *acptr, char chmode) +{ + Extban *extban; + Ban *ban, *bnext; + Ban **banlist; + char uhost[NICKLEN+USERLEN+HOSTLEN+6], vhost[NICKLEN+USERLEN+HOSTLEN+6]; + char ihost[NICKLEN+USERLEN+HOSTLEN+6], chost[NICKLEN+USERLEN+HOSTLEN+6]; + + /* BUILD HOSTS */ + + *uhost = *vhost = *ihost = *chost = '\0'; + + strlcpy(uhost, make_nick_user_host(acptr->name, + acptr->user->username, acptr->user->realhost), + sizeof uhost); + + if (GetIP(acptr)) /* only if we actually have an IP */ + strlcpy(ihost, make_nick_user_host(acptr->name, + acptr->user->username, GetIP(acptr)), + sizeof ihost); + + /* The next could have been an IsSetHost(), but I'm playing it safe with regards to backward compat. */ + if (IsHidden(acptr) && + !(*acptr->user->cloakedhost && !strcasecmp(acptr->user->virthost, acptr->user->cloakedhost))) + { + strlcpy(vhost, make_nick_user_host(acptr->name, + acptr->user->username, acptr->user->virthost), + sizeof vhost); + } + + if (*acptr->user->cloakedhost) /* only if we know the cloaked host */ + strlcpy(chost, make_nick_user_host(acptr->name, + acptr->user->username, acptr->user->cloakedhost), + sizeof chost); + + /* SELECT BANLIST */ + + switch (chmode) + { + case 'b': + banlist = &chptr->banlist; + break; + case 'e': + banlist = &chptr->exlist; + break; + case 'I': + banlist = &chptr->invexlist; + break; + default: + abort(); + } + + /* DO THE ACTUAL WORK */ + + for (ban = *banlist; ban; ban = bnext) + { + bnext = ban->next; + if (!match(ban->banstr, uhost) || + (*vhost && !match(ban->banstr, vhost)) || + (*ihost && !match(ban->banstr, ihost)) || + (*chost && !match(ban->banstr, chost))) + { + add_send_mode_param(chptr, sptr, '-', chmode, + ban->banstr); + del_listmode(banlist, chptr, ban->banstr); + } + else if (chmode != 'I' && *ban->banstr == '~' && (extban = findmod_by_bantype(ban->banstr[1]))) + { + if (extban->options & EXTBOPT_CHSVSMODE) + { + if (extban->is_banned(acptr, chptr, ban->banstr, BANCHK_JOIN)) + { + add_send_mode_param(chptr, acptr, '-', chmode, ban->banstr); + del_listmode(banlist, chptr, ban->banstr); + } + } + } + } +} + +void clear_bans(aClient *sptr, aChannel *chptr, char chmode) +{ + Extban *extban; + Ban *ban, *bnext; + Ban **banlist; + + switch (chmode) + { + case 'b': + banlist = &chptr->banlist; + break; + case 'e': + banlist = &chptr->exlist; + break; + case 'I': + banlist = &chptr->invexlist; + break; + default: + abort(); + } + + for (ban = *banlist; ban; ban = bnext) + { + bnext = ban->next; + if (chmode != 'I' && (*ban->banstr == '~') && (extban = findmod_by_bantype(ban->banstr[1]))) + { + if (!(extban->options & EXTBOPT_CHSVSMODE)) + continue; + } + add_send_mode_param(chptr, sptr, '-', chmode, ban->banstr); + del_listmode(banlist, chptr, ban->banstr); + } +} + int channel_svsmode(aClient *cptr, aClient *sptr, int parc, char *parv[]) { aChannel *chptr; @@ -197,8 +311,6 @@ int channel_svsmode(aClient *cptr, aClient *sptr, int parc, char *parv[]) Extban *extban; Ban *ban, *bnext; if (parc >= i) { - char uhost[NICKLEN+USERLEN+HOSTLEN+6], vhost[NICKLEN+USERLEN+HOSTLEN+6]; - char ihost[NICKLEN+USERLEN+HOSTLEN+6]; if (!(acptr = find_person(parv[i-1], NULL))) { i++; break; @@ -209,53 +321,10 @@ int channel_svsmode(aClient *cptr, aClient *sptr, int parc, char *parv[]) } i++; - strlcpy(uhost, make_nick_user_host(acptr->name, - acptr->user->username, acptr->user->realhost), - sizeof uhost); - strlcpy(vhost, make_nick_user_host(acptr->name, - acptr->user->username, GetHost(acptr)), - sizeof vhost); - strlcpy(ihost, make_nick_user_host(acptr->name, - acptr->user->username, GetIP(acptr)), - sizeof ihost); - ban = chptr->banlist; - while (ban) { - bnext = ban->next; - if (*ban->banstr == '~' && (extban = findmod_by_bantype(ban->banstr[1]))) - { - if (extban->options & EXTBOPT_CHSVSMODE) - { - if (extban->is_banned(acptr, chptr, ban->banstr, BANCHK_JOIN)) - { - add_send_mode_param(chptr, acptr, '-', 'b', ban->banstr); - del_listmode(&chptr->banlist, chptr, ban->banstr); - } - } - } - else if (!match(ban->banstr, uhost) || !match(ban->banstr, vhost) || !match(ban->banstr, ihost)) { - add_send_mode_param(chptr, sptr, '-', 'b', - ban->banstr); - del_listmode(&chptr->banlist, chptr, ban->banstr); - } - ban = bnext; - } + unban_user(sptr, chptr, acptr, 'b'); } else { - ban = chptr->banlist; - while (ban) { - bnext = ban->next; - if (*ban->banstr == '~' && (extban = findmod_by_bantype(ban->banstr[1]))) - { - if (!(extban->options & EXTBOPT_CHSVSMODE)) - { - ban = bnext; - continue; - } - } - add_send_mode_param(chptr, sptr, '-', 'b', ban->banstr); - del_listmode(&chptr->banlist, chptr, ban->banstr); - ban = bnext; - } + clear_bans(sptr, chptr, 'b'); } } break; @@ -263,8 +332,6 @@ int channel_svsmode(aClient *cptr, aClient *sptr, int parc, char *parv[]) Extban *extban; Ban *ban, *bnext; if (parc >= i) { - char uhost[NICKLEN+USERLEN+HOSTLEN+6], vhost[NICKLEN+USERLEN+HOSTLEN+6]; - char ihost[NICKLEN+USERLEN+HOSTLEN+6]; if (!(acptr = find_person(parv[i-1], NULL))) { i++; break; @@ -275,62 +342,16 @@ int channel_svsmode(aClient *cptr, aClient *sptr, int parc, char *parv[]) } i++; - strlcpy(uhost, make_nick_user_host(acptr->name, - acptr->user->username, acptr->user->realhost), - sizeof uhost); - strlcpy(vhost, make_nick_user_host(acptr->name, - acptr->user->username, GetHost(acptr)), - sizeof vhost); - strlcpy(ihost, make_nick_user_host(acptr->name, - acptr->user->username, GetIP(acptr)), - sizeof ihost); - - ban = chptr->exlist; - while (ban) { - bnext = ban->next; - if (*ban->banstr == '~' && (extban = findmod_by_bantype(ban->banstr[1]))) - { - if (extban->options & EXTBOPT_CHSVSMODE) - { - if (extban->is_banned(acptr, chptr, ban->banstr, BANCHK_JOIN)) - { - add_send_mode_param(chptr, acptr, '-', 'b', ban->banstr); - del_listmode(&chptr->exlist, chptr, ban->banstr); - } - } - } - else if (!match(ban->banstr, uhost) || !match(ban->banstr, vhost) || !match(ban->banstr, ihost)) { - add_send_mode_param(chptr, sptr, '-', 'e', - ban->banstr); - del_listmode(&chptr->exlist, chptr, ban->banstr); - } - ban = bnext; - } + unban_user(sptr, chptr, acptr, 'e'); } else { - ban = chptr->exlist; - while (ban) { - bnext = ban->next; - if (*ban->banstr == '~' && (extban = findmod_by_bantype(ban->banstr[1]))) - { - if (!(extban->options & EXTBOPT_CHSVSMODE)) - { - ban = bnext; - continue; - } - } - add_send_mode_param(chptr, sptr, '-', 'e', ban->banstr); - del_listmode(&chptr->exlist, chptr, ban->banstr); - ban = bnext; - } + clear_bans(sptr, chptr, 'e'); } } break; case 'I': { Ban *ban, *bnext; if (parc >= i) { - char uhost[NICKLEN+USERLEN+HOSTLEN+6], vhost[NICKLEN+USERLEN+HOSTLEN+6]; - char ihost[NICKLEN+USERLEN+HOSTLEN+6]; if (!(acptr = find_person(parv[i-1], NULL))) { i++; break; @@ -341,35 +362,10 @@ int channel_svsmode(aClient *cptr, aClient *sptr, int parc, char *parv[]) } i++; - strlcpy(uhost, make_nick_user_host(acptr->name, - acptr->user->username, acptr->user->realhost), - sizeof uhost); - strlcpy(vhost, make_nick_user_host(acptr->name, - acptr->user->username, GetHost(acptr)), - sizeof vhost); - strlcpy(ihost, make_nick_user_host(acptr->name, - acptr->user->username, GetIP(acptr)), - sizeof ihost); - - ban = chptr->invexlist; - while (ban) { - bnext = ban->next; - if (!match(ban->banstr, uhost) || !match(ban->banstr, vhost) || !match(ban->banstr, ihost)) { - add_send_mode_param(chptr, sptr, '-', 'I', - ban->banstr); - del_listmode(&chptr->invexlist, chptr, ban->banstr); - } - ban = bnext; - } + unban_user(sptr, chptr, acptr, 'I'); } else { - ban = chptr->invexlist; - while (ban) { - bnext = ban->next; - add_send_mode_param(chptr, sptr, '-', 'I', ban->banstr); - del_listmode(&chptr->invexlist, chptr, ban->banstr); - ban = bnext; - } + clear_bans(sptr, chptr, 'I'); } } break;