1
0
mirror of https://github.com/unrealircd/unrealircd.git synced 2026-07-05 04:13:14 +02:00

- 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).
This commit is contained in:
Bram Matthys
2006-08-03 12:11:15 +00:00
parent 9ea2326637
commit d57fda84df
2 changed files with 123 additions and 124 deletions
+3
View File
@@ -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).
+120 -124
View File
@@ -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;