1
0
mirror of https://github.com/unrealircd/unrealircd.git synced 2026-07-09 15:43:12 +02:00
Files
unrealircd/src/modules/pass.c
T
Bram Matthys 3126a3fae4 BIG changes internally that will break all modules and required many
code changes in UnrealIRCd itself:
1) Clients are no longer freed directly by exit_client. Most fields
   are freed, but 'sptr' itself is not, so you can use IsDead() on it.
2) exit_client now returns void rather than int
3) ALL command functions return void rather than int.
   Of course this also affects do_cmd, command overrides, etc.

This is a direct consequence of the removal of 'cptr' earlier, as that
was used to signal certain things that are now no longer possible
(and it raises the question if things were always correctly signaled
in the first place, so may fix some bugs).
It also makes the code more resillient against cases where you forgot
to check if the client was freed. Still, you are encouraged to do an
IsDead(sptr) if you are calling functions that may kill clients,
such as command functions or things that may use spamfilter.

More changes will follow, such as the removal of FLUSH_BUFFER.
2019-10-04 10:28:41 +02:00

138 lines
3.2 KiB
C

/*
* IRC - Internet Relay Chat, src/modules/pass.c
* (C) 2004 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_pass);
#define MSG_PASS "PASS"
ModuleHeader MOD_HEADER
= {
"pass",
"5.0",
"command /pass",
"UnrealIRCd Team",
"unrealircd-5",
};
/* Forward declarations */
int _check_banned(Client *cptr, int exitflags);
MOD_TEST()
{
MARK_AS_OFFICIAL_MODULE(modinfo);
EfunctionAdd(modinfo->handle, EFUNC_CHECK_BANNED, _check_banned);
return MOD_SUCCESS;
}
MOD_INIT()
{
CommandAdd(modinfo->handle, MSG_PASS, cmd_pass, 1, CMD_UNREGISTERED|CMD_USER|CMD_SERVER);
MARK_AS_OFFICIAL_MODULE(modinfo);
return MOD_SUCCESS;
}
MOD_LOAD()
{
return MOD_SUCCESS;
}
MOD_UNLOAD()
{
return MOD_SUCCESS;
}
/** Handles zlines/gzlines/throttling/unknown connections */
int _check_banned(Client *cptr, int exitflags)
{
TKL *tk;
if ((tk = find_tkline_match_zap(cptr)))
{
banned_client(cptr, "Z-Lined", tk->ptr.serverban->reason, (tk->type & TKL_GLOBAL)?1:0, exitflags);
return FLUSH_BUFFER;
}
else
{
int val;
char zlinebuf[512];
if (!(val = throttle_can_connect(cptr)))
{
if (exitflags & NO_EXIT_CLIENT)
{
ircsnprintf(zlinebuf, sizeof(zlinebuf),
"ERROR :Closing Link: [%s] (Throttled: Reconnecting too fast) - "
"Email %s for more information.\r\n",
cptr->ip, KLINE_ADDRESS);
(void)send(cptr->local->fd, zlinebuf, strlen(zlinebuf), 0);
return FLUSH_BUFFER;
} else {
ircsnprintf(zlinebuf, sizeof(zlinebuf),
"Throttled: Reconnecting too fast - "
"Email %s for more information.",
KLINE_ADDRESS);
exit_client(cptr, NULL, zlinebuf);
return FLUSH_BUFFER;
}
}
else if (val == 1)
add_throttling_bucket(cptr);
}
return 0;
}
/***************************************************************************
* cmd_pass() - Added Sat, 4 March 1989
***************************************************************************/
/*
** cmd_pass
** parv[1] = password
*/
CMD_FUNC(cmd_pass)
{
char *password = parc > 1 ? parv[1] : NULL;
if (!MyConnect(sptr) || (!IsUnknown(sptr) && !IsHandshake(sptr)))
{
sendnumeric(sptr, ERR_ALREADYREGISTRED);
return;
}
if (BadPtr(password))
{
sendnumeric(sptr, ERR_NEEDMOREPARAMS, "PASS");
return;
}
/* Store the password */
safe_strldup(sptr->local->passwd, password, PASSWDLEN+1);
/* note: the original non-truncated password is supplied as 2nd parameter. */
RunHookReturn2(HOOKTYPE_LOCAL_PASS, sptr, password, !=0);
}