2020-03-29 09:16:53 +00:00
|
|
|
/*
|
|
|
|
* IRC - Internet Relay Chat, src/modules/user.c
|
|
|
|
* (C) 2005 The UnrealIRCd Team
|
|
|
|
*
|
|
|
|
* See file AUTHORS in IRC package for additional names of
|
|
|
|
* the programmers.
|
|
|
|
*
|
|
|
|
* This program is free software; you can redistribute it and/or modify
|
|
|
|
* it under the terms of the GNU General Public License as published by
|
|
|
|
* the Free Software Foundation; either version 1, or (at your option)
|
|
|
|
* any later version.
|
|
|
|
*
|
|
|
|
* This program is distributed in the hope that it will be useful,
|
|
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
|
|
* GNU General Public License for more details.
|
|
|
|
*
|
|
|
|
* You should have received a copy of the GNU General Public License
|
|
|
|
* along with this program; if not, write to the Free Software
|
|
|
|
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
|
|
|
*/
|
|
|
|
|
|
|
|
#include "unrealircd.h"
|
|
|
|
|
|
|
|
CMD_FUNC(cmd_user);
|
|
|
|
|
|
|
|
#define MSG_USER "USER"
|
|
|
|
|
|
|
|
ModuleHeader MOD_HEADER
|
|
|
|
= {
|
|
|
|
"user",
|
|
|
|
"5.0",
|
|
|
|
"command /user",
|
|
|
|
"UnrealIRCd Team",
|
2022-01-15 05:16:34 +00:00
|
|
|
"unrealircd-6",
|
2020-03-29 09:16:53 +00:00
|
|
|
};
|
|
|
|
|
|
|
|
MOD_INIT()
|
|
|
|
{
|
|
|
|
CommandAdd(modinfo->handle, MSG_USER, cmd_user, 4, CMD_UNREGISTERED);
|
|
|
|
MARK_AS_OFFICIAL_MODULE(modinfo);
|
|
|
|
return MOD_SUCCESS;
|
|
|
|
}
|
|
|
|
|
|
|
|
MOD_LOAD()
|
|
|
|
{
|
|
|
|
return MOD_SUCCESS;
|
|
|
|
}
|
|
|
|
|
|
|
|
MOD_UNLOAD()
|
|
|
|
{
|
|
|
|
return MOD_SUCCESS;
|
|
|
|
}
|
|
|
|
|
|
|
|
/** The USER command, together with NICK this will register a user.
|
|
|
|
* As per UnrealIRCd 5 this command is only available to local clients.
|
|
|
|
* Intraserver traffic is handled through the UID command.
|
|
|
|
* parv[1] = username
|
|
|
|
* parv[2] = client host name (ignored)
|
|
|
|
* parv[3] = server host name (ignored)
|
|
|
|
* parv[4] = real name / gecos
|
|
|
|
*
|
|
|
|
* NOTE: Be advised that multiple USER messages are possible,
|
|
|
|
* hence, always check if a certain struct is already allocated... -- Syzop
|
|
|
|
*/
|
|
|
|
CMD_FUNC(cmd_user)
|
|
|
|
{
|
2022-01-15 05:16:34 +00:00
|
|
|
const char *username;
|
|
|
|
const char *realname;
|
|
|
|
char *p;
|
2020-03-29 09:16:53 +00:00
|
|
|
|
|
|
|
if (!MyConnect(client) || IsServer(client))
|
|
|
|
return;
|
|
|
|
|
|
|
|
if (MyConnect(client) && (client->local->listener->options & LISTENER_SERVERSONLY))
|
|
|
|
{
|
|
|
|
exit_client(client, NULL, "This port is for servers only");
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
if ((parc < 5) || BadPtr(parv[4]))
|
|
|
|
{
|
|
|
|
sendnumeric(client, ERR_NEEDMOREPARAMS, "USER");
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
username = parv[1];
|
|
|
|
realname = parv[4];
|
|
|
|
|
|
|
|
make_user(client);
|
|
|
|
|
|
|
|
/* set::modes-on-connect */
|
|
|
|
client->umodes |= CONN_MODES;
|
|
|
|
client->user->server = me_hash;
|
|
|
|
strlcpy(client->info, realname, sizeof(client->info));
|
2022-01-15 05:16:34 +00:00
|
|
|
strlcpy(client->user->username, username, sizeof(client->user->username));
|
|
|
|
|
|
|
|
/* This cuts the username off at @, uh okay.. */
|
|
|
|
if ((p = strchr(client->user->username, '@')))
|
|
|
|
*p = '\0';
|
2020-03-29 09:16:53 +00:00
|
|
|
|
|
|
|
if (*client->name && is_handshake_finished(client))
|
|
|
|
{
|
|
|
|
/* NICK and no-spoof already received, now we have USER... */
|
|
|
|
if (USE_BAN_VERSION && MyConnect(client))
|
|
|
|
{
|
|
|
|
sendto_one(client, NULL, ":IRC!IRC@%s PRIVMSG %s :\1VERSION\1",
|
|
|
|
me.name, client->name);
|
|
|
|
}
|
2022-01-15 05:16:34 +00:00
|
|
|
register_user(client);
|
2020-03-29 09:16:53 +00:00
|
|
|
return;
|
|
|
|
}
|
|
|
|
}
|