struct ConfItem *find_dline(struct sockaddr *, int);
-#define find_kline(x) (find_conf_by_address((x)->host, (x)->sockhost, \
- (x)->orighost, \
+#define find_kline(x) ((IsConfDoSpoofIp((x)->localClient->att_conf) && IsConfKlineSpoof((x)->localClient->att_conf)) ? \
+ find_conf_by_address((x)->orighost, NULL, NULL, NULL, CONF_KILL, AF_INET, (x)->username, NULL) : \
+ find_conf_by_address((x)->host, (x)->sockhost, (x)->orighost, \
(struct sockaddr *)&(x)->localClient->ip, CONF_KILL,\
GET_SS_FAMILY(&(x)->localClient->ip), (x)->username, NULL))
#define CONF_FLAGS_EXEMPTDNSBL 0x04000000
#define CONF_FLAGS_EXEMPTPROXY 0x08000000
#define CONF_FLAGS_ALLOW_SCTP 0x10000000
+#define CONF_FLAGS_KLINE_SPOOF 0x20000000
/* Macros for struct ConfItem */
#define IsConfExtendChans(x) ((x)->flags & CONF_FLAGS_EXTEND_CHANS)
#define IsConfSSLNeeded(x) ((x)->flags & CONF_FLAGS_NEED_SSL)
#define IsConfAllowSCTP(x) ((x)->flags & CONF_FLAGS_ALLOW_SCTP)
+#define IsConfKlineSpoof(x) ((x)->flags & CONF_FLAGS_KLINE_SPOOF)
/* flag definitions for opers now in client.h */
if(IsConfExemptKline(iconf))
return iconf;
- /* Find the best K-line... -A1kmm */
- kconf = find_conf_by_address(host, sockhost, NULL, ip, CONF_KILL, aftype, user, NULL);
-
- /* If they are K-lined, return the K-line */
- if(kconf)
- return kconf;
-
/* if theres a spoof, check it against klines.. */
if(IsConfDoSpoofIp(iconf))
{
char *p = strchr(iconf->info.name, '@');
/* note, we dont need to pass sockhost here, as its
- * guaranteed to not match by whats above.. --anfl
+ * guaranteed to not match by whats below.. --anfl
*/
if(p)
{
*p = '\0';
- kconf = find_conf_by_address(p+1, NULL, NULL, ip, CONF_KILL, aftype, iconf->info.name, NULL);
+ kconf = find_conf_by_address(p+1, NULL, NULL, NULL, CONF_KILL, aftype, iconf->info.name, NULL);
*p = '@';
}
else
- kconf = find_conf_by_address(iconf->info.name, NULL, NULL, ip, CONF_KILL, aftype, vuser, NULL);
+ kconf = find_conf_by_address(iconf->info.name, NULL, NULL, NULL, CONF_KILL, aftype, vuser, NULL);
if(kconf)
return kconf;
+
+ /* everything else checks real hosts, if they're kline_spoof_ip we're done */
+ if(IsConfKlineSpoof(iconf))
+ return iconf;
}
+ /* Find the best K-line... -A1kmm */
+ kconf = find_conf_by_address(host, sockhost, NULL, ip, CONF_KILL, aftype, user, NULL);
+
+ /* If they are K-lined, return the K-line */
+ if(kconf)
+ return kconf;
+
/* if no_tilde, check the username without tilde against klines too
* -- jilles */
if(user != vuser)