/*
* ngIRCd -- The Next Generation IRC Daemon
- * Copyright (c)2001-2012 Alexander Barton (alex@barton.de) and Contributors.
+ * Copyright (c)2001-2013 Alexander Barton (alex@barton.de) and Contributors.
*
* 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
* Login and logout
*/
-#include "imp.h"
#include <assert.h>
#include <ctype.h>
#include <stdlib.h>
#include <string.h>
#include <strings.h>
+#include <time.h>
#include "conn-func.h"
-#include "class.h"
#include "conf.h"
#include "channel.h"
#include "log.h"
#include "messages.h"
#include "parse.h"
#include "irc.h"
-#include "irc-info.h"
#include "irc-macros.h"
#include "irc-write.h"
-#include "exp.h"
-#include "irc-login.h"
-
-static void Kill_Nick PARAMS((char *Nick, char *Reason));
static void Change_Nick PARAMS((CLIENT * Origin, CLIENT * Target, char *NewNick,
bool InformClient));
#ifndef STRICT_RFC
if (Conf_AuthPing) {
+#ifdef HAVE_ARC4RANDOM
+ Conn_SetAuthPing(Client_Conn(Client), arc4random());
+#else
Conn_SetAuthPing(Client_Conn(Client), rand());
+#endif
IRC_WriteStrClient(Client, "PING :%ld",
Conn_GetAuthPing(Client_Conn(Client)));
LogDebug("Connection %d: sent AUTH PING %ld ...",
* the new nick is already present on this server:
* the new and the old one have to be disconnected now.
*/
- Log( LOG_ERR, "Server %s introduces already registered nick \"%s\"!", Client_ID( Client ), Req->argv[0] );
- Kill_Nick( Req->argv[0], "Nick collision" );
- return CONNECTED;
+ Log(LOG_ERR,
+ "Server %s introduces already registered nick \"%s\"!",
+ Client_ID(Client), Req->argv[0]);
+ return IRC_KillClient(Client, NULL, Req->argv[0],
+ "Nick collision");
}
/* Find the Server this client is connected to */
intr_c = Client_GetFromToken(Client, token);
if (!intr_c) {
- Log( LOG_ERR, "Server %s introduces nick \"%s\" on unknown server!?", Client_ID( Client ), Req->argv[0] );
- Kill_Nick( Req->argv[0], "Unknown server" );
- return CONNECTED;
+ Log(LOG_ERR,
+ "Server %s introduces nick \"%s\" on unknown server!?",
+ Client_ID(Client), Req->argv[0]);
+ return IRC_KillClient(Client, NULL, Req->argv[0],
+ "Unknown server");
}
c = Client_NewRemoteUser(intr_c, nick, hops, user, hostname,
Log(LOG_ALERT,
"Can't create client structure! (on connection %d)",
Client_Conn(Client));
- Kill_Nick(Req->argv[0], "Server error");
- return CONNECTED;
+ return IRC_KillClient(Client, NULL, Req->argv[0],
+ "Server error");
}
/* RFC 2813: client is now fully registered, inform all the
assert(Client != NULL);
assert(Req != NULL);
- _IRC_ARGC_EQ_OR_RETURN_(Client, Req, 2)
-
/* Search the originator */
from = Client_Search(Req->prefix);
if (!from)
/* Search the target */
target = Client_Search(Req->argv[0]);
- if (!target || Client_Type(target) != CLIENT_USER) {
+ if (!target || Client_Type(target) != CLIENT_USER)
return IRC_WriteErrClient(Client, ERR_NOSUCHNICK_MSG,
Client_ID(Client), Req->argv[0]);
- }
if (Client_Conn(target) <= NONE) {
/* We have to forward the message to the server handling
return IRC_WriteErrClient(Client, ERR_ALREADYREGISTRED_MSG,
Client_ID(Client));
- _IRC_ARGC_EQ_OR_RETURN_(Client, Req, 6)
-
if (Client_Type(Client) != CLIENT_SERVER)
return IRC_WriteErrClient(Client, ERR_ERRONEUSNICKNAME_MSG,
Client_ID(Client), Req->argv[0]);
c = Client_Search(nick);
if(c) {
/* Nickname collision: disconnect (KILL) both clients! */
- Log(LOG_ERR, "Server %s introduces already registered service \"%s\"!",
+ Log(LOG_ERR,
+ "Server %s introduces already registered service \"%s\"!",
Client_ID(Client), nick);
- Kill_Nick(nick, "Nick collision");
- return CONNECTED;
+ return IRC_KillClient(Client, NULL, nick, "Nick collision");
}
/* Get the server to which the service is connected */
intr_c = Client_GetFromToken(Client, token);
if (! intr_c) {
- Log(LOG_ERR, "Server %s introduces service \"%s\" on unknown server!?",
+ Log(LOG_ERR,
+ "Server %s introduces service \"%s\" on unknown server!?",
Client_ID(Client), nick);
- Kill_Nick(nick, "Unknown server");
- return CONNECTED;
+ return IRC_KillClient(Client, NULL, nick, "Unknown server");
}
/* Get user and host name */
if (! c) {
/* Couldn't create client structure, so KILL the service to
* keep network status consistent ... */
- Log(LOG_ALERT, "Can't create client structure! (on connection %d)",
+ Log(LOG_ALERT,
+ "Can't create client structure! (on connection %d)",
Client_Conn(Client));
- Kill_Nick(nick, "Server error");
- return CONNECTED;
+ return IRC_KillClient(Client, NULL, nick, "Server error");
}
Client_Introduce(Client, c, CLIENT_SERVICE);
GLOBAL bool
IRC_WEBIRC(CLIENT *Client, REQUEST *Req)
{
- _IRC_ARGC_EQ_OR_RETURN_(Client, Req, 4)
-
if (!Conf_WebircPwd[0] || strcmp(Req->argv[0], Conf_WebircPwd) != 0)
return IRC_WriteErrClient(Client, ERR_PASSWDMISMATCH_MSG,
Client_ID(Client));
Client_SetUser(Client, Req->argv[1], true);
Client_SetOrigUser(Client, Req->argv[1]);
- Client_SetHostname(Client, Req->argv[2]);
+ if (Conf_DNS)
+ Client_SetHostname(Client, Req->argv[2]);
+ else
+ Client_SetHostname(Client, Req->argv[3]);
Client_SetIPAText(Client, Req->argv[3]);
return CONNECTED;
IRC_QUIT( CLIENT *Client, REQUEST *Req )
{
CLIENT *target;
- char quitmsg[LINE_LEN];
+ char quitmsg[COMMAND_LEN];
assert(Client != NULL);
assert(Req != NULL);
- _IRC_ARGC_LE_OR_RETURN_(Client, Req, 1)
-
if (Req->argc == 1)
strlcpy(quitmsg, Req->argv[0], sizeof quitmsg);
return CONNECTED;
} /* IRC_PONG */
-/**
- * Kill all users with a specific nickname in the network.
- *
- * @param Nick Nickname.
- * @param Reason Reason for the KILL.
- */
-static void
-Kill_Nick(char *Nick, char *Reason)
-{
- REQUEST r;
-
- assert (Nick != NULL);
- assert (Reason != NULL);
-
- r.prefix = NULL;
- r.argv[0] = Nick;
- r.argv[1] = Reason;
- r.argc = 2;
-
- Log(LOG_ERR, "User(s) with nick \"%s\" will be disconnected: %s!",
- Nick, Reason);
-
- IRC_KILL(Client_ThisServer(), &r);
-} /* Kill_Nick */
-
/**
* Change the nickname of a client.
*