/* * ms_mark - server message handler */ int ms_mark(struct Client* cptr, struct Client* sptr, int parc, char* parv[]) { struct Client* acptr; if (!IsServer(sptr)) return protocol_violation(sptr, "MARK from non-server %s", cli_name(sptr)); if (!strcmp(parv[2], MARK_WEBIRC)) { if(parc < 4) return protocol_violation(sptr, "MARK webirc received too few parameters (%u)", parc); if ((acptr = FindUser(parv[1]))) { ircd_strncpy(cli_webirc(acptr), parv[3], BUFSIZE); sendcmdto_serv_butone(sptr, CMD_MARK, cptr, "%s %s :%s", cli_name(acptr), MARK_WEBIRC, parv[3]); } } else if (!strcmp(parv[2], MARK_GEOIP)) { if(parc < 5) return protocol_violation(sptr, "MARK geoip received too few parameters (%u)", parc); if ((acptr = FindUser(parv[1]))) { geoip_apply_mark(acptr, parv[3], parv[4], (parc > 5 ? parv[5] : NULL)); if (parc > 5) sendcmdto_serv_butone(sptr, CMD_MARK, cptr, "%s %s %s %s :%s", cli_name(acptr), MARK_GEOIP, parv[3], parv[4], parv[5]); else sendcmdto_serv_butone(sptr, CMD_MARK, cptr, "%s %s %s %s", cli_name(acptr), MARK_GEOIP, parv[3], parv[4]); } } else if (!strcmp(parv[2], MARK_CVERSION)) { if(parc < 4) return protocol_violation(sptr, "MARK client version received too few parameters (%u)", parc); if ((acptr = FindUser(parv[1]))) { ircd_strncpy(cli_version(acptr), parv[3], VERSIONLEN); sendcmdto_serv_butone(sptr, CMD_MARK, cptr, "%s %s :%s", cli_name(acptr), MARK_CVERSION, parv[3]); } } else if (!strcmp(parv[2], MARK_SSLCLIFP)) { if(parc < 4) return protocol_violation(sptr, "MARK SSL client certificate fingerprint received too few parameters (%u)", parc); if ((acptr = FindUser(parv[1]))) { ircd_strncpy(cli_sslclifp(acptr), parv[3], BUFSIZE); sendcmdto_serv_butone(sptr, CMD_MARK, cptr, "%s %s :%s", cli_name(acptr), MARK_SSLCLIFP, parv[3]); } } else if (!strcmp(parv[2], MARK_KILL)) { if(parc < 4) return protocol_violation(sptr, "MARK kill received too few parameters (%u)", parc); if ((acptr = FindUser(parv[1]))) { ircd_strncpy(cli_killmark(acptr), parv[3], BUFSIZE); sendcmdto_serv_butone(sptr, CMD_MARK, cptr, "%s %s :%s", cli_name(acptr), MARK_KILL, parv[3]); } } else if (!strcmp(parv[2], MARK_MARK) || !strcmp(parv[2], MARK_DNSBL_DATA)) { if(parc < 4) return protocol_violation(sptr, "MARK MARK (tag) received too few parameters (%u)", parc); if ((acptr = FindUser(parv[1]))) { add_mark(acptr, parv[3]); SetMarked(acptr); sendcmdto_serv_butone(sptr, CMD_MARK, cptr, "%s %s :%s", cli_name(acptr), MARK_MARK, parv[3]); } } return 0; }
/** Searches for a K/G-line for a client. If one is found, notify the * user and disconnect them. * @param cptr Client to search for. * @return 0 if client is accepted; -1 if client was locally denied * (K-line); -2 if client was globally denied (G-line); -3 if client * was globally IP denied (Z-line). */ int find_kill(struct Client *cptr) { const char* host; const char* name; const char* realname; const char* country; const char* continent; const char* version; struct DenyConf* deny; struct Gline* agline = NULL; struct Zline* azline = NULL; assert(0 != cptr); if (!cli_user(cptr)) return 0; host = cli_sockhost(cptr); name = cli_user(cptr)->username; realname = cli_info(cptr); country = cli_countrycode(cptr); continent = cli_continentcode(cptr); version = cli_version(cptr); assert(strlen(host) <= HOSTLEN); assert((name ? strlen(name) : 0) <= HOSTLEN); assert((realname ? strlen(realname) : 0) <= REALLEN); assert((country ? strlen(country) : 0) <= 3); assert((continent ? strlen(continent) : 0) <= 3); assert((version ? strlen(version) : 0) <= VERSIONLEN); /* 2000-07-14: Rewrote this loop for massive speed increases. * -- Isomer */ if (!find_except_conf(cptr, EFLAG_KLINE)) { for (deny = denyConfList; deny; deny = deny->next) { if (deny->usermask && match(deny->usermask, name)) continue; if (deny->realmask && match(deny->realmask, realname)) continue; if (deny->countrymask && country && match(deny->countrymask, country)) continue; if (deny->continentmask && continent && match(deny->continentmask, continent)) continue; if (feature_bool(FEAT_CTCP_VERSIONING) && feature_bool(FEAT_CTCP_VERSIONING_KILL)) { if (deny->version && version && match(deny->version, version)) continue; } if (deny->bits > 0) { if (!ipmask_check(&cli_ip(cptr), &deny->address, deny->bits)) continue; } else if (deny->hostmask && match(deny->hostmask, host)) continue; if ((deny->flags & DENY_FLAGS_AUTHEX) && IsAccount(cptr)) { if (!EmptyString(deny->mark) && EmptyString(cli_killmark(cptr))) ircd_strncpy(cli_killmark(cptr), deny->mark, BUFSIZE); continue; } if (EmptyString(deny->message)) send_reply(cptr, SND_EXPLICIT | ERR_YOUREBANNEDCREEP, ":Connection from your host is refused on this server."); else { if (deny->flags & DENY_FLAGS_FILE) killcomment(cptr, deny->message); else send_reply(cptr, SND_EXPLICIT | ERR_YOUREBANNEDCREEP, ":%s.", deny->message); } return -1; } } /* Check Zlines here just in case a spoofed IP matches */ if (!feature_bool(FEAT_DISABLE_ZLINES) && (azline = zline_lookup(cptr, 0))) { /* * find active zlines * added a check against the user's IP address to find_zline() */ send_reply(cptr, SND_EXPLICIT | ERR_YOUREBANNEDCREEP, ":%s.", ZlineReason(azline)); return -3; } /* Don't need to do an except lookup here as it's done in gline_lookup() */ if (!feature_bool(FEAT_DISABLE_GLINES) && (agline = gline_lookup(cptr, 0))) { /* * find active glines * added a check against the user's IP address to find_gline() -Kev */ send_reply(cptr, SND_EXPLICIT | ERR_YOUREBANNEDCREEP, ":%s.", GlineReason(agline)); return -2; } return 0; }