struct Message nick_msgtab = {
"NICK", 0, 0, 0, MFLG_SLOW,
- {{mr_nick, 0}, {m_nick, 0}, {mc_nick, 3}, {ms_nick, 8}, mg_ignore, {m_nick, 0}}
+ {{mr_nick, 0}, {m_nick, 0}, {mc_nick, 3}, {ms_nick, 0}, mg_ignore, {m_nick, 0}}
};
struct Message uid_msgtab = {
"UID", 0, 0, 0, MFLG_SLOW,
return 0;
}
-/* ms_nick()
+/* mc_nick()
*
* server -> server nick change
* parv[0] = sender prefix
* parv[1] = nickname
* parv[2] = TS when nick change
- *
- * server introducing new nick
- * parv[0] = sender prefix
- * parv[1] = nickname
- * parv[2] = hop count
- * parv[3] = TS
- * parv[4] = umode
- * parv[5] = username
- * parv[6] = hostname
- * parv[7] = server
- * parv[8] = ircname
*/
static int
mc_nick(struct Client *client_p, struct Client *source_p, int parc, const char *parv[])
static int
ms_nick(struct Client *client_p, struct Client *source_p, int parc, const char *parv[])
{
- struct Client *target_p;
- time_t newts = 0;
- char squitreason[100];
-
- if(parc != 9)
- {
- sendto_realops_snomask(SNO_GENERAL, L_ALL,
- "Dropping server %s due to (invalid) command 'NICK' "
- "with %d arguments (expecting 9)", client_p->name, parc);
- ilog(L_SERVER, "Excess parameters (%d) for command 'NICK' from %s.",
- parc, client_p->name);
- rb_snprintf(squitreason, sizeof squitreason,
- "Excess parameters (%d) to %s command, expecting %d",
- parc, "NICK", 9);
- exit_client(client_p, client_p, client_p, squitreason);
- return 0;
- }
-
- /* if nicks empty, erroneous, or too long, kill */
- if(!clean_nick(parv[1], 0))
- {
- bad_nickname(client_p, parv[1]);
- return 0;
- }
+ const char *nick, *server;
- /* invalid username or host? */
- if(!clean_username(parv[5]) || !clean_host(parv[6]))
- {
- ServerStats.is_kill++;
- sendto_realops_snomask(SNO_DEBUG, L_ALL,
- "Bad user@host: %s@%s From: %s(via %s)",
- parv[5], parv[6], parv[7], client_p->name);
- sendto_one(client_p, ":%s KILL %s :%s (Bad user@host)", me.name, parv[1], me.name);
- return 0;
- }
+ nick = parc > 1 ? parv[1] : "?";
+ server = parc > 7 ? parv[7] : "?";
- /* check the length of the clients gecos */
- if(strlen(parv[8]) > REALLEN)
- {
- char *s = LOCAL_COPY(parv[8]);
- /* why exactly do we care? --fl */
- sendto_realops_snomask(SNO_GENERAL, L_ALL,
- "Long realname from server %s for %s", parv[7], parv[1]);
-
- s[REALLEN] = '\0';
- parv[8] = s;
- }
-
- newts = atol(parv[3]);
-
- target_p = find_named_client(parv[1]);
+ sendto_wallops_flags(UMODE_WALLOP, &me,
+ "Link %s cancelled, TS5 nickname %s on %s introduced (old server?)",
+ client_p->name, nick, server);
+ sendto_server(NULL, NULL, CAP_TS6, NOCAPS,
+ ":%s WALLOPS :Link %s cancelled, TS5 nickname %s on %s introduced (old server?)",
+ me.id, client_p->name, nick, server);
+ ilog(L_SERVER, "Link %s cancelled, TS5 nickname %s on %s introduced (old server?)",
+ client_p->name, nick, server);
- /* if the nick doesnt exist, allow it and process like normal */
- if(target_p == NULL)
- {
- register_client(client_p, NULL, parv[1], newts, parc, parv);
- }
- else if(IsUnknown(target_p))
- {
- exit_client(NULL, target_p, &me, "Overridden");
- register_client(client_p, NULL, parv[1], newts, parc, parv);
- }
- else if(target_p == source_p)
- {
- /* client changing case of nick */
- if(strcmp(target_p->name, parv[1]))
- register_client(client_p, NULL, parv[1], newts, parc, parv);
- }
- /* we've got a collision! */
- else
- perform_nick_collides(source_p, client_p, target_p, parc, parv,
- newts, parv[1], NULL);
+ exit_client(client_p, client_p, &me, "TS5 nickname introduced");
return 0;
}