/* bogus_host() * * inputs - hostname * output - 1 if a bogus hostname input, 0 if its valid * side effects - none */ static int bogus_host(char *host) { unsigned int length = 0; unsigned int dots = 0; char *s = host; for (; *s; s++) { if (!IsServChar(*s)) return(1); ++length; if ('.' == *s) ++dots; } return(!dots || length > HOSTLEN); }
bool valid_servername(const char *servername) { const char *s; int dots = 0; for(s = servername; *s != '\0'; s++) { if(!IsServChar(*s)) { return false; } if(*s == '.') dots++; } if(dots == 0) { return false; } return true; }
/* * bogus_host * * inputs - hostname * output - 1 if a bogus hostname input, 0 if its valid * side effects - none */ int bogus_host(char *host) { int bogus_server = 0; char *s; int dots = 0; for( s = host; *s; s++ ) { if (!IsServChar(*s)) { bogus_server = 1; break; } if ('.' == *s) ++dots; } if (!dots || bogus_server || strlen(host) > HOSTLEN) return 1; return 0; }
/* * m_links - LINKS message handler * parv[0] = sender prefix * parv[1] = servername mask * or * parv[0] = sender prefix * parv[1] = server to query * parv[2] = servername mask */ int m_links(struct Client *cptr, struct Client *sptr, int parc, char *parv[]) { const char* mask = ""; struct Client* acptr; struct ConfItem* aconf; char clean_mask[2 * HOSTLEN + 4]; char* p; int bogus_server = 0; static time_t last_used = 0L; if (parc > 2) { if (!IsServer(sptr) && !HasUmode(sptr,UMODE_REMOTEINFO)) { if (SeesOperMessages(sptr)) sendto_one(sptr,":%s NOTICE %s :You have no S umode", me.name, parv[0]); else sendto_one(sptr, form_str(ERR_NOPRIVILEGES), me.name, parv[0]); return 0; } if (hunt_server(cptr, sptr, ":%s LINKS %s :%s", 1, parc, parv) != HUNTED_ISME) return 0; mask = parv[2]; } else if (parc == 2) mask = parv[1]; assert(0 != mask); if(!NoFloodProtection(sptr)) { /* reject non local requests */ if(!MyClient(sptr)) return 0; if(IsHoneypot(sptr) || (last_used + PACE_WAIT) > CurrentTime) { /* safe enough to give this on a local connect only */ sendto_one(sptr,form_str(RPL_LOAD2HI),me.name,parv[0],"LINKS"); return 0; } else { last_used = CurrentTime; } } /* * *sigh* Before the kiddies find this new and exciting way of * annoying opers, lets clean up what is sent to all opers * -Dianora */ { const char* s = mask; while (*s) { if (!IsServChar(*s)) { bogus_server = 1; break; } s++; } } if (bogus_server) { sendto_ops_flag(UMODE_SPY, "BOGUS LINKS '%s' requested by %s (%s@%s) [%s]", clean_string(clean_mask, (const unsigned char *) mask, 2 * HOSTLEN), sptr->name, sptr->username, sptr->host, sptr->user->server); return 0; } if (*mask) /* only necessary if there is a mask */ mask = collapse(clean_string(clean_mask, (const unsigned char *) mask, 2 * HOSTLEN)); /* Here's a cute spacing hack for you -- asuffield */ if (MyConnect(sptr)) sendto_ops_flag(UMODE_SPY, "LINKS %s%srequested by %s (%s@%s) [%s]", mask, mask ? " " : "" , sptr->name, sptr->username, sptr->host, sptr->user->server); for (aconf = ConfigItemList; aconf; aconf = aconf->next) { if (aconf->status != CONF_NOCONNECT_SERVER) continue; if ((aconf->flags & CONF_FLAGS_HIDDEN_SERVER) && !HasUmode(sptr, UMODE_AUSPEX)) continue; acptr = find_server(aconf->name); if (!acptr) continue; if (!IsServer(acptr) && !IsMe(acptr)) continue; if (*mask && !match(mask, acptr->name)) continue; if (HasUmode(sptr,UMODE_AUSPEX)) sendto_one(sptr, form_str(RPL_LINKS), me.name, parv[0], acptr->name, acptr->serv->up, HasUmode(sptr, UMODE_SEEROUTING) ? acptr->hopcount : 0, acptr->info[0] ? acptr->info : "(Unknown Location)"); else { if(acptr->info[0]) { /* kludge, you didn't see this nor am I going to admit * that I coded this. */ p = strchr(acptr->info,']'); if(p) p += 2; /* skip the nasty [IP] part */ else p = acptr->info; } else { static char unknown[] = "(Unknown Location)"; p = unknown; } #ifdef SERVERHIDE if (strlen(acptr->name) < 6 || strcmp(".quiet", (acptr->name)+(strlen(acptr->name)-6)) || strcmp(".local", (acptr->name)+(strlen(acptr->name)-6)) || HasUmode(sptr,UMODE_SEEROUTING)) sendto_one(sptr, form_str(RPL_LINKS), me.name, parv[0], acptr->name, HasUmode(sptr,UMODE_SEEROUTING) ? acptr->serv->up : NETWORK_NAME, 0, p); #else sendto_one(sptr, form_str(RPL_LINKS), me.name, parv[0], acptr->name, acptr->serv->up, acptr->hopcount, p); #endif } } sendto_one(sptr, form_str(RPL_ENDOFLINKS), me.name, parv[0], EmptyString(mask) ? "*" : mask); return 0; }