X-Git-Url: https://jfr.im/git/solanum.git/blobdiff_plain/0982871a9992e58c9a9e0bd1aedbff3e0e0d8877..3321eef45a3a76f9c026bae5ae3f5dfbf4edf7fd:/ircd/s_user.c diff --git a/ircd/s_user.c b/ircd/s_user.c index b18df182..cb4cf9db 100644 --- a/ircd/s_user.c +++ b/ircd/s_user.c @@ -81,7 +81,7 @@ int user_modes[256] = { 0, /* O */ 0, /* P */ UMODE_NOFORWARD, /* Q */ - UMODE_REGONLYMSG, /* R */ + 0, /* R */ UMODE_SERVICE, /* S */ 0, /* T */ 0, /* U */ @@ -213,25 +213,25 @@ authd_check(struct Client *client_p, struct Client *source_p) switch(source_p->preClient->auth.cause) { - case 'B': /* Blacklists */ + case 'B': /* DNSBL */ { - struct BlacklistStats *stats; - char *blacklist = source_p->preClient->auth.data; + struct DNSBLEntryStats *stats; + char *dnsbl_name = source_p->preClient->auth.data; - if(bl_stats != NULL) - if((stats = rb_dictionary_retrieve(bl_stats, blacklist)) != NULL) + if(dnsbl_stats != NULL) + if((stats = rb_dictionary_retrieve(dnsbl_stats, dnsbl_name)) != NULL) stats->hits++; if(IsExemptKline(source_p) || IsConfExemptDNSBL(aconf)) { sendto_one_notice(source_p, ":*** Your IP address %s is listed in %s, but you are exempt", - source_p->sockhost, blacklist); + source_p->sockhost, dnsbl_name); break; } sendto_realops_snomask(SNO_REJ, L_NETWIDE, "Listed on DNSBL %s: %s (%s@%s) [%s] [%s]", - blacklist, source_p->name, source_p->username, source_p->host, + dnsbl_name, source_p->name, source_p->username, source_p->host, IsIPSpoof(source_p) ? "255.255.255.255" : source_p->sockhost, source_p->info); @@ -239,9 +239,9 @@ authd_check(struct Client *client_p, struct Client *source_p) me.name, source_p->name, reason); sendto_one_notice(source_p, ":*** Your IP address %s is listed in %s", - source_p->sockhost, blacklist); - add_reject(source_p, NULL, NULL); - exit_client(client_p, source_p, &me, "Banned (DNS blacklist)"); + source_p->sockhost, dnsbl_name); + add_reject(source_p, NULL, NULL, NULL, "Banned (listed in a DNSBL)"); + exit_client(client_p, source_p, &me, "Banned (listed in a DNSBL)"); reject = true; } break; @@ -283,7 +283,7 @@ authd_check(struct Client *client_p, struct Client *source_p) sendto_one_notice(source_p, ":*** Your IP address %s has been detected as an open proxy (type %s, port %s)", source_p->sockhost, proxy, port); - add_reject(source_p, NULL, NULL); + add_reject(source_p, NULL, NULL, NULL, "Banned (Open proxy)"); exit_client(client_p, source_p, &me, "Banned (Open proxy)"); reject = true; } @@ -307,7 +307,7 @@ authd_check(struct Client *client_p, struct Client *source_p) sendto_one_notice(source_p, ":*** Rejected by authentication system: %s", reason); - add_reject(source_p, NULL, NULL); + add_reject(source_p, NULL, NULL, NULL, "Banned (authentication system)"); exit_client(client_p, source_p, &me, "Banned (authentication system)"); reject = true; break; @@ -348,7 +348,6 @@ int register_local_user(struct Client *client_p, struct Client *source_p) { struct ConfItem *aconf, *xconf; - struct User *user = source_p->user; char tmpstr2[BUFSIZE]; char ipaddr[HOSTIPLEN]; char myusername[USERLEN+1]; @@ -387,7 +386,9 @@ register_local_user(struct Client *client_p, struct Client *source_p) if(source_p->preClient->auth.cid) return -1; - client_p->localClient->last = rb_current_time(); + /* Set firsttime here so that post_registration_delay works from registration, + * rather than initial connection. */ + source_p->localClient->firsttime = client_p->localClient->last = rb_current_time(); /* XXX - fixme. we shouldnt have to build a users buffer twice.. */ if(!IsGotId(source_p) && (strchr(source_p->username, '[') != NULL)) @@ -415,13 +416,13 @@ register_local_user(struct Client *client_p, struct Client *source_p) /* Apply nick override */ if(*source_p->preClient->spoofnick) { - char note[NICKLEN + 10]; + char note[NAMELEN + 10]; del_from_client_hash(source_p->name, source_p); rb_strlcpy(source_p->name, source_p->preClient->spoofnick, NICKLEN + 1); add_to_client_hash(source_p->name, source_p); - snprintf(note, NICKLEN + 10, "Nick: %s", source_p->name); + snprintf(note, sizeof(note), "Nick: %s", source_p->name); rb_note(source_p->localClient->F, note); } @@ -448,6 +449,14 @@ register_local_user(struct Client *client_p, struct Client *source_p) return (CLIENT_EXITED); } + if(IsSCTP(source_p) && !IsConfAllowSCTP(aconf)) + { + ServerStats.is_ref++; + sendto_one_notice(source_p, ":*** Notice -- You are not allowed to use SCTP on this server"); + exit_client(client_p, source_p, &me, "SCTP not allowed"); + return (CLIENT_EXITED); + } + if(!IsGotId(source_p)) { const char *p; @@ -480,7 +489,7 @@ register_local_user(struct Client *client_p, struct Client *source_p) } } - if(IsNeedSasl(aconf) && !*user->suser) + if(IsNeedSasl(aconf) && !*source_p->user->suser) { ServerStats.is_ref++; sendto_one_notice(source_p, ":*** Notice -- You need to identify via SASL to use this server"); @@ -546,7 +555,7 @@ register_local_user(struct Client *client_p, struct Client *source_p) (xconf = find_xline(source_p->info, 1)) != NULL) { ServerStats.is_ref++; - add_reject(source_p, xconf->host, NULL); + add_reject(source_p, xconf->host, NULL, NULL, NULL); exit_client(client_p, source_p, &me, "Bad user info"); return CLIENT_EXITED; } @@ -625,7 +634,7 @@ register_local_user(struct Client *client_p, struct Client *source_p) add_to_id_hash(source_p->id, source_p); } - if (IsSSL(source_p)) + if (IsSSL(source_p) && !IsInsecure(source_p)) source_p->umodes |= UMODE_SSLCLIENT; if (source_p->umodes & UMODE_INVISIBLE) @@ -665,7 +674,7 @@ register_local_user(struct Client *client_p, struct Client *source_p) free_pre_client(source_p); - introduce_client(client_p, source_p, user, source_p->name, 1); + introduce_client(client_p, source_p, source_p->user, source_p->name, 1); return 0; } @@ -918,7 +927,7 @@ report_and_set_user_flags(struct Client *source_p, struct ConfItem *aconf) 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 DNSBL listings"); /* If this user is exempt from user limits set it F lined" */ if(IsConfExemptLimits(aconf)) @@ -1114,12 +1123,19 @@ user_mode(struct Client *client_p, struct Client *source_p, int parc, const char } source_p->flags &= ~OPER_FLAGS; - rb_free(source_p->localClient->opername); - source_p->localClient->opername = NULL; - rb_dlinkFindDestroy(source_p, &local_oper_list); - privilegeset_unref(source_p->localClient->privset); - source_p->localClient->privset = NULL; + } + + if(source_p->user->opername != NULL) + { + rb_free(source_p->user->opername); + source_p->user->opername = NULL; + } + + if(source_p->user->privset != NULL) + { + privilegeset_unref(source_p->user->privset); + source_p->user->privset = NULL; } rb_dlinkFindDestroy(source_p, &oper_list); @@ -1406,8 +1422,8 @@ oper_up(struct Client *source_p, struct oper_conf *oper_p) SetExemptKline(source_p); source_p->flags |= oper_p->flags; - source_p->localClient->opername = rb_strdup(oper_p->name); - source_p->localClient->privset = privilegeset_ref(oper_p->privset); + source_p->user->opername = rb_strdup(oper_p->name); + source_p->user->privset = privilegeset_ref(oper_p->privset); rb_dlinkAddAlloc(source_p, &local_oper_list); rb_dlinkAddAlloc(source_p, &oper_list); @@ -1426,6 +1442,8 @@ oper_up(struct Client *source_p, struct oper_conf *oper_p) sendto_realops_snomask(SNO_GENERAL, L_ALL, "%s (%s!%s@%s) is now an operator", oper_p->name, source_p->name, source_p->username, source_p->host); + sendto_server(NULL, NULL, CAP_TS6, NOCAPS, ":%s OPER %s %s", + use_id(source_p), oper_p->name, oper_p->privset->name); if(!(old & UMODE_INVISIBLE) && IsInvisible(source_p)) ++Count.invisi; if((old & UMODE_INVISIBLE) && !IsInvisible(source_p))