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:
@@ -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
@@ -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;
|
||||
|
||||
Reference in New Issue
Block a user