]> jfr.im git - solanum.git/blobdiff - src/s_user.c
Minor cleanup to command throttling code:
[solanum.git] / src / s_user.c
index 7405256056137ce3395e41e0ada61ce0bc85eea5..ccae53f44f7efe0df2d8f4b5433a3aefb1a1461f 100644 (file)
@@ -260,8 +260,6 @@ register_local_user(struct Client *client_p, struct Client *source_p, const char
                return -1;
 
        client_p->localClient->last = rb_current_time();
-       /* Straight up the maximum rate of flooding... */
-       source_p->localClient->allow_read = MAX_FLOOD_BURST;
 
        /* XXX - fixme. we shouldnt have to build a users buffer twice.. */
        if(!IsGotId(source_p) && (strchr(username, '[') != NULL))
@@ -336,7 +334,7 @@ register_local_user(struct Client *client_p, struct Client *source_p, const char
                }
 
                /* dont replace username if its supposed to be spoofed --fl */
-               if(!IsConfDoSpoofIp(aconf) || !strchr(aconf->name, '@'))
+               if(!IsConfDoSpoofIp(aconf) || !strchr(aconf->info.name, '@'))
                {
                        p = username;
 
@@ -420,7 +418,7 @@ register_local_user(struct Client *client_p, struct Client *source_p, const char
           (xconf = find_xline(source_p->info, 1)) != NULL)
        {
                ServerStats.is_ref++;
-               add_reject(source_p, xconf->name, NULL);
+               add_reject(source_p, xconf->host, NULL);
                exit_client(client_p, source_p, &me, "Bad user info");
                return CLIENT_EXITED;
        }
@@ -545,8 +543,6 @@ register_local_user(struct Client *client_p, struct Client *source_p, const char
        if(++Count.total > Count.max_tot)
                Count.max_tot = Count.total;
 
-       source_p->localClient->allow_read = MAX_FLOOD_BURST;
-
        Count.totalrestartcount++;
 
        s_assert(source_p->localClient != NULL);
@@ -561,7 +557,9 @@ register_local_user(struct Client *client_p, struct Client *source_p, const char
 
        /* they get a reduced limit */
        if(find_tgchange(source_p->sockhost))
-               USED_TARGETS(source_p) = 6;
+               source_p->localClient->targets_free = TGCHANGE_INITIAL_LOW;
+       else
+               source_p->localClient->targets_free = TGCHANGE_INITIAL;
 
        monitor_signon(source_p);
        user_welcome(source_p);
@@ -633,6 +631,11 @@ introduce_client(struct Client *client_p, struct Client *source_p, struct User *
                      IsIPSpoof(source_p) ? "0" : sockhost,
                      source_p->id, source_p->info);
 
+       if(!EmptyString(source_p->certfp))
+               sendto_server(client_p, NULL, CAP_TS6, NOCAPS,
+                               ":%s ENCAP * CERTFP :%s",
+                               use_id(source_p), source_p->certfp);
+
        if (IsDynSpoof(source_p))
        {
                sendto_server(client_p, NULL, CAP_TS6, use_euid ? CAP_EUID : NOCAPS, ":%s ENCAP * REALHOST %s",
@@ -647,8 +650,8 @@ introduce_client(struct Client *client_p, struct Client *source_p, struct User *
 
        if(MyConnect(source_p) && source_p->localClient->passwd)
        {
-               if (ConfigFileEntry.identifyservice[0] != '\0' &&
-                               ConfigFileEntry.identifycommand[0] != '\0')
+               if (!EmptyString(ConfigFileEntry.identifyservice) &&
+                               !EmptyString(ConfigFileEntry.identifycommand))
                {
                        /* use user@server */
                        p = strchr(ConfigFileEntry.identifyservice, '@');
@@ -712,7 +715,7 @@ introduce_client(struct Client *client_p, struct Client *source_p, struct User *
 int
 valid_hostname(const char *hostname)
 {
-       const char *p = hostname;
+       const char *p = hostname, *last_slash = 0;
        int found_sep = 0;
 
        s_assert(NULL != p);
@@ -720,7 +723,7 @@ valid_hostname(const char *hostname)
        if(hostname == NULL)
                return NO;
 
-       if('.' == *p || ':' == *p)
+       if('.' == *p || ':' == *p || '/' == *p)
                return NO;
 
        while (*p)
@@ -729,13 +732,21 @@ valid_hostname(const char *hostname)
                        return NO;
                 if(*p == '.' || *p == ':')
                        found_sep++;
+               else if(*p == '/')
+               {
+                       found_sep++;
+                       last_slash = p;
+               }
                p++;
        }
 
        if(found_sep == 0)
-               return(NO);
+               return NO;
 
-       return (YES);
+       if(last_slash && IsDigit(last_slash[1]))
+               return NO;
+
+       return YES;
 }
 
 /* 
@@ -802,63 +813,86 @@ report_and_set_user_flags(struct Client *source_p, struct ConfItem *aconf)
        /* If this user is being spoofed, tell them so */
        if(IsConfDoSpoofIp(aconf))
        {
-               sendto_one_notice(source_p, ":*** Spoofing your IP. congrats.");
+               sendto_one_notice(source_p, ":*** Spoofing your IP");
        }
 
        /* If this user is in the exception class, Set it "E lined" */
        if(IsConfExemptKline(aconf))
        {
                SetExemptKline(source_p);
-               sendto_one_notice(source_p, ":*** You are exempt from K/X lines. congrats.");
+               sendto_one_notice(source_p, ":*** You are exempt from K/X lines");
        }
 
        if(IsConfExemptDNSBL(aconf))
                /* kline exempt implies this, don't send both */
                if(!IsConfExemptKline(aconf))
-                       sendto_one_notice(source_p, ":*** You are exempt from DNS blacklists.");
+                       sendto_one_notice(source_p, ":*** You are exempt from DNS blacklists");
 
        /* If this user is exempt from user limits set it F lined" */
        if(IsConfExemptLimits(aconf))
        {
-               sendto_one_notice(source_p, ":*** You are exempt from user limits. congrats.");
+               sendto_one_notice(source_p, ":*** You are exempt from user limits");
        }
 
        if(IsConfExemptFlood(aconf))
        {
                SetExemptFlood(source_p);
-               sendto_one_notice(source_p, ":*** You are exempt from flood limits.");
+               sendto_one_notice(source_p, ":*** You are exempt from flood limits");
        }
 
        if(IsConfExemptSpambot(aconf))
        {
                SetExemptSpambot(source_p);
-               sendto_one_notice(source_p, ":*** You are exempt from spambot checks.");
+               sendto_one_notice(source_p, ":*** You are exempt from spambot checks");
        }
 
        if(IsConfExemptJupe(aconf))
        {
                SetExemptJupe(source_p);
-               sendto_one_notice(source_p, ":*** You are exempt from juped channel warnings.");
+               sendto_one_notice(source_p, ":*** You are exempt from juped channel warnings");
        }
 
        if(IsConfExemptResv(aconf))
        {
                SetExemptResv(source_p);
-               sendto_one_notice(source_p, ":*** You are exempt from resvs.");
+               sendto_one_notice(source_p, ":*** You are exempt from resvs");
        }
 
        if(IsConfExemptShide(aconf))
        {
                SetExemptShide(source_p);
-               sendto_one_notice(source_p, ":*** You are exempt from serverhiding.");
+               sendto_one_notice(source_p, ":*** You are exempt from serverhiding");
        }
 }
 
+static void
+show_other_user_mode(struct Client *source_p, struct Client *target_p)
+{
+       int i;
+       char buf[BUFSIZE];
+       char *m;
+
+       m = buf;
+       *m++ = '+';
+
+       for (i = 0; i < 128; i++) /* >= 127 is extended ascii */
+               if (target_p->umodes & user_modes[i])
+                       *m++ = (char) i;
+       *m = '\0';
+
+       if (MyConnect(target_p) && target_p->snomask != 0)
+               sendto_one_notice(source_p, ":Modes for %s are %s %s",
+                               target_p->name, buf,
+                               construct_snobuf(target_p->snomask));
+       else
+               sendto_one_notice(source_p, ":Modes for %s are %s",
+                               target_p->name, buf);
+}
+
 /*
  * user_mode - set get current users mode
  *
  * m_umode() added 15/10/91 By Darren Reed.
- * parv[0] - sender
  * parv[1] - username to change mode for
  * parv[2] - modes to change
  */
@@ -904,9 +938,12 @@ user_mode(struct Client *client_p, struct Client *source_p, int parc, const char
                return 0;
        }
 
-       if(source_p != target_p || target_p->from != source_p->from)
+       if(source_p != target_p)
        {
-               sendto_one(source_p, form_str(ERR_USERSDONTMATCH), me.name, source_p->name);
+               if (MyOper(source_p) && parc < 3)
+                       show_other_user_mode(source_p, target_p);
+               else
+                       sendto_one(source_p, form_str(ERR_USERSDONTMATCH), me.name, source_p->name);
                return 0;
        }
 
@@ -1032,7 +1069,8 @@ user_mode(struct Client *client_p, struct Client *source_p, int parc, const char
                        }
                        /* FALLTHROUGH */
                default:
-                       if (MyConnect(source_p) && *pm == 'Q' && !ConfigChannel.use_forward) {
+                       if (MyConnect(source_p) && *pm == 'Q' && !ConfigChannel.use_forward)
+                       {
                                badflag = YES;
                                break;
                        }
@@ -1287,7 +1325,7 @@ oper_up(struct Client *source_p, struct oper_conf *oper_p)
        call_hook(h_umode_changed, &hdata);
 
        sendto_realops_snomask(SNO_GENERAL, L_ALL,
-                            "%s (%s@%s) is now an operator", source_p->name,
+                            "%s (%s!%s@%s) is now an operator", oper_p->name, source_p->name,
                             source_p->username, source_p->host);
        if(!(old & UMODE_INVISIBLE) && IsInvisible(source_p))
                ++Count.invisi;
@@ -1388,7 +1426,7 @@ change_nick_user_host(struct Client *target_p,    const char *nick, const char *use
                vsnprintf(reason, 255, format, ap);
                va_end(ap);
 
-               sendto_common_channels_local_butone(target_p, ":%s!%s@%s QUIT :%s",
+               sendto_common_channels_local_butone(target_p, NOCAPS, ":%s!%s@%s QUIT :%s",
                                target_p->name, target_p->username, target_p->host,
                                reason);
 
@@ -1430,7 +1468,7 @@ change_nick_user_host(struct Client *target_p,    const char *nick, const char *use
        }
        else if(changed_case)
        {
-               sendto_common_channels_local(target_p, ":%s!%s@%s NICK :%s",
+               sendto_common_channels_local(target_p, NOCAPS, ":%s!%s@%s NICK :%s",
                                target_p->name, target_p->username,
                                target_p->host, nick);
        }