X-Git-Url: https://jfr.im/git/irc/rqf/shadowircd.git/blobdiff_plain/c83cbedc0eb7ee26b88dc910a29b3bbb8ccf3706..d1264ac89250eee9f887a2ffa77f7ef55c0bc25b:/src/s_user.c diff --git a/src/s_user.c b/src/s_user.c index f4ff4b0..58b0568 100644 --- a/src/s_user.c +++ b/src/s_user.c @@ -21,7 +21,7 @@ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 * USA * - * $Id: s_user.c 3293 2007-03-28 14:33:50Z jilles $ + * $Id: s_user.c 3586 2007-11-20 11:16:43Z nenolod $ */ #include "stdinc.h" @@ -147,6 +147,14 @@ int user_modes[256] = { int show_lusers(struct Client *source_p) { + if(dlink_list_length(&lclient_list) > (unsigned long)MaxClientCount) + MaxClientCount = dlink_list_length(&lclient_list); + + if((dlink_list_length(&lclient_list) + dlink_list_length(&serv_list)) > + (unsigned long)MaxConnectionCount) + MaxConnectionCount = dlink_list_length(&lclient_list) + + dlink_list_length(&serv_list); + sendto_one_numeric(source_p, RPL_LUSERCLIENT, form_str(RPL_LUSERCLIENT), (Count.total - Count.invisi), Count.invisi, dlink_list_length(&global_serv_list)); @@ -185,14 +193,6 @@ show_lusers(struct Client *source_p) MaxConnectionCount, MaxClientCount, Count.totalrestartcount); - if(dlink_list_length(&lclient_list) > (unsigned long)MaxClientCount) - MaxClientCount = dlink_list_length(&lclient_list); - - if((dlink_list_length(&lclient_list) + dlink_list_length(&serv_list)) > - (unsigned long)MaxConnectionCount) - MaxConnectionCount = dlink_list_length(&lclient_list) + - dlink_list_length(&serv_list); - return 0; } @@ -223,7 +223,7 @@ show_lusers(struct Client *source_p) int register_local_user(struct Client *client_p, struct Client *source_p, const char *username) { - struct ConfItem *aconf; + struct ConfItem *aconf, *xconf; struct User *user = source_p->user; char tmpstr2[IRCD_BUFSIZE]; char ipaddr[HOSTIPLEN]; @@ -250,14 +250,14 @@ register_local_user(struct Client *client_p, struct Client *source_p, const char source_p->flags |= FLAGS_PINGSENT; return -1; } - if(!(source_p->flags2 & FLAGS2_PING_COOKIE)) + if(!(source_p->flags & FLAGS_PING_COOKIE)) { return -1; } } /* hasnt finished client cap negotiation */ - if(source_p->flags2 & FLAGS2_CLICAP) + if(source_p->flags & FLAGS_CLICAP) return -1; /* still has DNSbls to validate against */ @@ -296,7 +296,7 @@ register_local_user(struct Client *client_p, struct Client *source_p, const char del_from_client_hash(source_p->name, source_p); strlcpy(source_p->name, source_p->preClient->spoofnick, NICKLEN + 1); add_to_client_hash(source_p->name, source_p); - comm_note(source_p->localClient->fd, "Nick: %s", source_p->name); + comm_note(source_p->localClient->F->fd, "Nick: %s", source_p->name); } if(!valid_hostname(source_p->host)) @@ -304,11 +304,6 @@ register_local_user(struct Client *client_p, struct Client *source_p, const char sendto_one_notice(source_p, ":*** Notice -- You have an illegal character in your hostname"); strlcpy(source_p->host, source_p->sockhost, sizeof(source_p->host)); - -#ifdef IPV6 - if(ConfigFileEntry.dot_in_ip6_addr == 1) - strlcat(source_p->host, ".", sizeof(source_p->host)); -#endif } @@ -402,10 +397,8 @@ register_local_user(struct Client *client_p, struct Client *source_p, const char * -Taner */ /* Except "F:" clients */ - if(((dlink_list_length(&lclient_list) + 1) >= - ((unsigned long)GlobalSetOptions.maxclients + MAX_BUFFER) || - (dlink_list_length(&lclient_list) + 1) >= - ((unsigned long)GlobalSetOptions.maxclients - 5)) && !(IsExemptLimits(source_p))) + if(dlink_list_length(&lclient_list) >= + (unsigned long)GlobalSetOptions.maxclients && !IsExemptLimits(source_p)) { sendto_realops_snomask(SNO_FULL, L_ALL, "Too many clients, rejecting %s[%s].", source_p->name, source_p->host); @@ -417,10 +410,10 @@ register_local_user(struct Client *client_p, struct Client *source_p, const char /* kline exemption extends to xline too */ if(!IsExemptKline(source_p) && - find_xline(source_p->info, 1) != NULL) + (xconf = find_xline(source_p->info, 1)) != NULL) { ServerStats->is_ref++; - add_reject(source_p); + add_reject(source_p, xconf->name, NULL); exit_client(client_p, source_p, &me, "Bad user info"); return CLIENT_EXITED; } @@ -452,7 +445,7 @@ register_local_user(struct Client *client_p, struct Client *source_p, const char sendto_one_notice(source_p, ":*** Your IP address %s is listed in %s", source_p->sockhost, source_p->preClient->dnsbl_listed->host); source_p->preClient->dnsbl_listed->hits++; - add_reject(source_p); + add_reject(source_p, NULL, NULL); exit_client(client_p, source_p, &me, "*** Banned (DNS blacklist)"); return CLIENT_EXITED; } @@ -466,6 +459,8 @@ register_local_user(struct Client *client_p, struct Client *source_p, const char "Invalid username: %s (%s@%s)", source_p->name, source_p->username, source_p->host); ServerStats->is_ref++; + sendto_one_notice(source_p, ":*** Your username is invalid. Please make sure that your username contains " + "only alphanumeric characters."); ircsprintf(tmpstr2, "Invalid username [%s]", source_p->username); exit_client(client_p, source_p, &me, tmpstr2); return (CLIENT_EXITED); @@ -486,9 +481,18 @@ register_local_user(struct Client *client_p, struct Client *source_p, const char SetDynSpoof(source_p); } - if(IsAnyDead(client_p)) + source_p->umodes |= ConfigFileEntry.default_umodes & ~ConfigFileEntry.oper_only_umodes & ~orphaned_umodes; + + call_hook(h_new_local_user, source_p); + + /* If they have died in send_* or were thrown out by the + * new_local_user hook don't do anything. */ + if(IsAnyDead(source_p)) return CLIENT_EXITED; + /* To avoid inconsistencies, do not abort the registration + * starting from this point -- jilles + */ inetntop_sock((struct sockaddr *)&source_p->localClient->ip, ipaddr, sizeof(ipaddr)); sendto_realops_snomask(SNO_CCONN, L_ALL, @@ -506,10 +510,6 @@ register_local_user(struct Client *client_p, struct Client *source_p, const char show_ip(NULL, source_p) ? source_p->localClient->fullcaps : " ", source_p->info); - /* If they have died in send_* don't do anything. */ - if(IsAnyDead(source_p)) - return CLIENT_EXITED; - add_to_hostname_hash(source_p->orighost, source_p); /* Allocate a UID if it was not previously allocated. @@ -521,21 +521,21 @@ register_local_user(struct Client *client_p, struct Client *source_p, const char add_to_id_hash(source_p->id, source_p); } - source_p->umodes |= ConfigFileEntry.default_umodes & ~ConfigFileEntry.oper_only_umodes & ~orphaned_umodes; - if (source_p->umodes & UMODE_INVISIBLE) Count.invisi++; s_assert(!IsClient(source_p)); + del_unknown_ip(source_p); dlinkMoveNode(&source_p->localClient->tnode, &unknown_list, &lclient_list); SetClient(source_p); - /* XXX source_p->servptr is &me, since local client */ - source_p->servptr = find_server(NULL, user->server); + source_p->servptr = &me; dlinkAdd(source_p, &source_p->lnode, &source_p->servptr->serv->users); + /* Increment our total user count here */ if(++Count.total > Count.max_tot) Count.max_tot = Count.total; + source_p->localClient->allow_read = MAX_FLOOD_BURST; Count.totalrestartcount++; @@ -554,8 +554,6 @@ register_local_user(struct Client *client_p, struct Client *source_p, const char if(find_tgchange(source_p->sockhost)) USED_TARGETS(source_p) = 6; - call_hook(h_new_local_user, source_p); - monitor_signon(source_p); user_welcome(source_p); @@ -634,7 +632,7 @@ introduce_client(struct Client *client_p, struct Client *source_p, struct User * nick, source_p->hopcount + 1, (long) source_p->tsinfo, ubuf, source_p->username, source_p->host, - user->server, source_p->info); + source_p->servptr->name, source_p->info); } else sendto_server(client_p, NULL, NOCAPS, NOCAPS, @@ -642,7 +640,7 @@ introduce_client(struct Client *client_p, struct Client *source_p, struct User * nick, source_p->hopcount + 1, (long) source_p->tsinfo, ubuf, source_p->username, source_p->host, - user->server, source_p->info); + source_p->servptr->name, source_p->info); if (IsDynSpoof(source_p)) { @@ -834,14 +832,7 @@ report_and_set_user_flags(struct Client *source_p, struct ConfItem *aconf) if(IsConfExemptLimits(aconf)) { SetExemptLimits(source_p); - sendto_one_notice(source_p, "*** You are exempt from user limits. congrats."); - } - - /* If this user is exempt from idle time outs */ - if(IsConfIdlelined(aconf)) - { - SetIdlelined(source_p); - sendto_one_notice(source_p, ":*** You are exempt from idle limits. congrats."); + sendto_one_notice(source_p, ":*** You are exempt from user limits. congrats."); } if(IsConfExemptFlood(aconf)) @@ -941,10 +932,12 @@ user_mode(struct Client *client_p, struct Client *source_p, int parc, const char *m++ = (char) i; *m = '\0'; - sendto_one(source_p, form_str(RPL_UMODEIS), me.name, source_p->name, buf); + sendto_one_numeric(source_p, RPL_UMODEIS, form_str(RPL_UMODEIS), buf); + if (source_p->snomask != 0) - sendto_one(source_p, form_str(RPL_SNOMASK), me.name, source_p->name, + sendto_one_numeric(source_p, RPL_SNOMASK, form_str(RPL_SNOMASK), construct_snobuf(source_p->snomask)); + return 0; } @@ -1084,7 +1077,7 @@ user_mode(struct Client *client_p, struct Client *source_p, int parc, const char if(MyClient(source_p) && (source_p->snomask & SNO_NCHANGE) && !IsOperN(source_p)) { - sendto_one_notice(source_p, ":*** You need oper and N flag for +s +n"); + sendto_one_notice(source_p, ":*** You need oper and nick_changes flag for +s +n"); source_p->snomask &= ~SNO_NCHANGE; /* only tcm's really need this */ } @@ -1097,7 +1090,7 @@ user_mode(struct Client *client_p, struct Client *source_p, int parc, const char if(MyConnect(source_p) && (source_p->umodes & UMODE_ADMIN) && (!IsOperAdmin(source_p) || IsOperHiddenAdmin(source_p))) { - sendto_one_notice(source_p, ":*** You need oper and A flag for +a"); + sendto_one_notice(source_p, ":*** You need oper and admin flag for +a"); source_p->umodes &= ~UMODE_ADMIN; } @@ -1117,7 +1110,7 @@ user_mode(struct Client *client_p, struct Client *source_p, int parc, const char */ send_umode_out(client_p, source_p, setflags); if (showsnomask && MyConnect(source_p)) - sendto_one(source_p, form_str(RPL_SNOMASK), me.name, source_p->name, + sendto_one_numeric(source_p, RPL_SNOMASK, form_str(RPL_SNOMASK), construct_snobuf(source_p->snomask)); return (0); @@ -1217,14 +1210,11 @@ send_umode_out(struct Client *client_p, struct Client *source_p, int old) void user_welcome(struct Client *source_p) { - sendto_one(source_p, form_str(RPL_WELCOME), me.name, source_p->name, - ServerInfo.network_name, source_p->name); - sendto_one(source_p, form_str(RPL_YOURHOST), me.name, - source_p->name, + sendto_one_numeric(source_p, RPL_WELCOME, form_str(RPL_WELCOME), ServerInfo.network_name, source_p->name); + sendto_one_numeric(source_p, RPL_YOURHOST, form_str(RPL_YOURHOST), get_listener_name(source_p->localClient->listener), ircd_version); - - sendto_one(source_p, form_str(RPL_CREATED), me.name, source_p->name, creation); - sendto_one(source_p, form_str(RPL_MYINFO), me.name, source_p->name, me.name, ircd_version, umodebuf); + sendto_one_numeric(source_p, RPL_CREATED, form_str(RPL_CREATED), creation); + sendto_one_numeric(source_p, RPL_MYINFO, form_str(RPL_MYINFO), me.name, ircd_version, umodebuf); show_isupport(source_p); @@ -1312,7 +1302,7 @@ oper_up(struct Client *source_p, struct oper_conf *oper_p) if((old & UMODE_INVISIBLE) && !IsInvisible(source_p)) --Count.invisi; send_umode_out(source_p, source_p, old); - sendto_one(source_p, form_str(RPL_SNOMASK), me.name, source_p->name, + sendto_one_numeric(source_p, RPL_SNOMASK, form_str(RPL_SNOMASK), construct_snobuf(source_p->snomask)); sendto_one(source_p, form_str(RPL_YOUREOPER), me.name, source_p->name); sendto_one_notice(source_p, ":*** Oper privs are %s", get_oper_privs(oper_p->flags));