X-Git-Url: https://jfr.im/git/solanum.git/blobdiff_plain/463947ad9073387c16e15d0fe33296bb667b4275..b2c208be091670e3c5259eba77187bae6ac6eece:/modules/core/m_nick.c diff --git a/modules/core/m_nick.c b/modules/core/m_nick.c index 81d5c6b9..6d26fbf5 100644 --- a/modules/core/m_nick.c +++ b/modules/core/m_nick.c @@ -94,7 +94,7 @@ static int change_remote_nick(struct Client *, struct Client *, time_t, static int clean_nick(const char *, int loc_client); static int clean_username(const char *); static int clean_host(const char *); -static int clean_uid(const char *uid); +static int clean_uid(const char *uid, const char *sid); static void set_initial_nick(struct Client *client_p, struct Client *source_p, char *nick); static void change_local_nick(struct Client *client_p, struct Client *source_p, char *nick, int); @@ -108,7 +108,6 @@ static int perform_nickchange_collides(struct Client *, struct Client *, struct Client *, int, const char **, time_t, const char *); /* mr_nick() - * parv[0] = sender prefix * parv[1] = nickname */ static int @@ -116,7 +115,6 @@ mr_nick(struct Client *client_p, struct Client *source_p, int parc, const char * { struct Client *target_p; char nick[NICKLEN]; - char *s; if (strlen(client_p->id) == 3) { @@ -124,28 +122,21 @@ mr_nick(struct Client *client_p, struct Client *source_p, int parc, const char * return 0; } - if(parc < 2 || EmptyString(parv[1]) || (parv[1][0] == '~')) + if(parc < 2 || EmptyString(parv[1])) { sendto_one(source_p, form_str(ERR_NONICKNAMEGIVEN), me.name, EmptyString(source_p->name) ? "*" : source_p->name); return 0; } - /* due to the scandinavian origins, (~ being uppercase of ^) and ~ - * being disallowed as a nick char, we need to chop the first ~ - * instead of just erroring. - */ - if((s = strchr(parv[1], '~'))) - *s = '\0'; - /* copy the nick and terminate it */ - rb_strlcpy(nick, parv[1], sizeof(nick)); + rb_strlcpy(nick, parv[1], ConfigFileEntry.nicklen); /* check the nickname is ok */ if(!clean_nick(nick, 1)) { sendto_one(source_p, form_str(ERR_ERRONEUSNICKNAME), - me.name, EmptyString(parv[0]) ? "*" : parv[0], parv[1]); + me.name, EmptyString(source_p->name) ? "*" : source_p->name, parv[1]); return 0; } @@ -175,7 +166,6 @@ mr_nick(struct Client *client_p, struct Client *source_p, int parc, const char * } /* m_nick() - * parv[0] = sender prefix * parv[1] = nickname */ static int @@ -183,32 +173,24 @@ m_nick(struct Client *client_p, struct Client *source_p, int parc, const char *p { struct Client *target_p; char nick[NICKLEN]; - char *s; - if(parc < 2 || EmptyString(parv[1]) || (parv[1][0] == '~')) + if(parc < 2 || EmptyString(parv[1])) { sendto_one(source_p, form_str(ERR_NONICKNAMEGIVEN), me.name, source_p->name); return 0; } - /* due to the scandinavian origins, (~ being uppercase of ^) and ~ - * being disallowed as a nick char, we need to chop the first ~ - * instead of just erroring. - */ - if((s = strchr(parv[1], '~'))) - *s = '\0'; - /* mark end of grace period, to prevent nickflooding */ if(!IsFloodDone(source_p)) flood_endgrace(source_p); /* terminate nick to NICKLEN, we dont want clean_nick() to error! */ - rb_strlcpy(nick, parv[1], sizeof(nick)); + rb_strlcpy(nick, parv[1], ConfigFileEntry.nicklen); /* check the nickname is ok */ if(!clean_nick(nick, 1)) { - sendto_one(source_p, form_str(ERR_ERRONEUSNICKNAME), me.name, parv[0], nick); + sendto_one(source_p, form_str(ERR_ERRONEUSNICKNAME), me.name, source_p->name, nick); return 0; } @@ -245,7 +227,7 @@ m_nick(struct Client *client_p, struct Client *source_p, int parc, const char *p change_local_nick(client_p, source_p, nick, 1); } else - sendto_one(source_p, form_str(ERR_NICKNAMEINUSE), me.name, parv[0], nick); + sendto_one(source_p, form_str(ERR_NICKNAMEINUSE), me.name, source_p->name, nick); return 0; } @@ -258,7 +240,6 @@ m_nick(struct Client *client_p, struct Client *source_p, int parc, const char *p /* mc_nick() * * server -> server nick change - * parv[0] = sender prefix * parv[1] = nickname * parv[2] = TS when nick change */ @@ -365,11 +346,11 @@ ms_uid(struct Client *client_p, struct Client *source_p, int parc, const char *p return 0; } - if(!clean_uid(parv[8])) + if(!clean_uid(parv[8], source_p->id)) { rb_snprintf(squitreason, sizeof squitreason, - "Invalid UID %s for nick %s on %s", - parv[8], parv[1], source_p->name); + "Invalid UID %s for nick %s on %s/%s", + parv[8], parv[1], source_p->name, source_p->id); exit_client(client_p, client_p, client_p, squitreason); return 0; } @@ -389,7 +370,7 @@ ms_uid(struct Client *client_p, struct Client *source_p, int parc, const char *p { char *s = LOCAL_COPY(parv[9]); sendto_realops_snomask(SNO_GENERAL, L_ALL, "Long realname from server %s for %s", - parv[0], parv[1]); + source_p->name, parv[1]); s[REALLEN] = '\0'; parv[9] = s; } @@ -456,11 +437,11 @@ ms_euid(struct Client *client_p, struct Client *source_p, int parc, const char * return 0; } - if(!clean_uid(parv[8])) + if(!clean_uid(parv[8], source_p->id)) { rb_snprintf(squitreason, sizeof squitreason, - "Invalid UID %s for nick %s on %s", - parv[8], parv[1], source_p->name); + "Invalid UID %s for nick %s on %s/%s", + parv[8], parv[1], source_p->name, source_p->id); exit_client(client_p, client_p, client_p, squitreason); return 0; } @@ -490,7 +471,7 @@ ms_euid(struct Client *client_p, struct Client *source_p, int parc, const char * { char *s = LOCAL_COPY(parv[11]); sendto_realops_snomask(SNO_GENERAL, L_ALL, "Long realname from server %s for %s", - parv[0], parv[1]); + source_p->name, parv[1]); s[REALLEN] = '\0'; parv[11] = s; } @@ -569,7 +550,7 @@ clean_nick(const char *nick, int loc_client) } /* nicklen is +1 */ - if(len >= NICKLEN) + if(len >= NICKLEN && len >= ConfigFileEntry.nicklen) return 0; return 1; @@ -626,10 +607,13 @@ clean_host(const char *host) } static int -clean_uid(const char *uid) +clean_uid(const char *uid, const char *sid) { int len = 1; + if(strncmp(uid, sid, strlen(sid))) + return 0; + if(!IsDigit(*uid++)) return 0; @@ -731,7 +715,7 @@ change_local_nick(struct Client *client_p, struct Client *source_p, source_p->name, nick, source_p->username, source_p->host); /* send the nick change to the users channels */ - sendto_common_channels_local(source_p, ":%s!%s@%s NICK :%s", + sendto_common_channels_local(source_p, NOCAPS, ":%s!%s@%s NICK :%s", source_p->name, source_p->username, source_p->host, nick); /* send the nick change to servers.. */ @@ -792,7 +776,7 @@ change_remote_nick(struct Client *client_p, struct Client *source_p, monitor_signoff(source_p); } - sendto_common_channels_local(source_p, ":%s!%s@%s NICK :%s", + sendto_common_channels_local(source_p, NOCAPS, ":%s!%s@%s NICK :%s", source_p->name, source_p->username, source_p->host, nick); if(source_p->user) @@ -1025,8 +1009,8 @@ perform_nickchange_collides(struct Client *source_p, struct Client *client_p, { ServerStats.is_kill++; - sendto_one_numeric(target_p, ERR_NICKCOLLISION, - form_str(ERR_NICKCOLLISION), target_p->name); + sendto_one_numeric(source_p, ERR_NICKCOLLISION, + form_str(ERR_NICKCOLLISION), source_p->name); /* kill the client issuing the nickchange */ kill_client_serv_butone(client_p, source_p,