예제 #1
0
/* 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);
}
예제 #2
0
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;
}
예제 #3
0
/*  
 * 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;
}
예제 #4
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;
}