From d93030ad27af9cd6a807de8f672ae73ec0e1dff8 Mon Sep 17 00:00:00 2001 From: Alexander Barton Date: Sat, 16 Aug 2008 17:52:02 +0200 Subject: [PATCH] Make real use of the CLIENT_SERVICE client type. This patch enables ngIRCd to handle IRC services as real services, and not as "fake users": - Set correct client type CLIENT_SERVICE for services, - Change log messages to include correct client type, - PRIVMSG: allow users to send messages to services, - Send services nick names to other servers (as users). Please note that this patch doesn't announce services as services in the network, but as regular users (as before). Only the local server knows of services as services (see LUSERS command, for example). It is up to one of the next patches to fix this and to introduce the SERVICE command in server to server communication. The propagation of services as regular users between servers doesn't limit the functionality of the IRC services and will be the fallback for servers that don't support "real" services propagation in the future. --- src/ngircd/client.c | 3 ++- src/ngircd/irc-channel.c | 6 +++--- src/ngircd/irc-login.c | 3 ++- src/ngircd/irc-mode.c | 4 +++- src/ngircd/irc.c | 7 +++++++ src/ngircd/numeric.c | 3 ++- 6 files changed, 19 insertions(+), 7 deletions(-) diff --git a/src/ngircd/client.c b/src/ngircd/client.c index a8a2ddfa..1d01f784 100644 --- a/src/ngircd/client.c +++ b/src/ngircd/client.c @@ -402,7 +402,8 @@ Client_SetAway( CLIENT *Client, char *Txt ) assert( Txt != NULL ); strlcpy( Client->away, Txt, sizeof( Client->away )); - Log( LOG_DEBUG, "User \"%s\" is away: %s", Client_Mask( Client ), Txt ); + LogDebug("%s \"%s\" is away: %s", Client_TypeText(Client), + Client_Mask(Client), Txt); } /* Client_SetAway */ diff --git a/src/ngircd/irc-channel.c b/src/ngircd/irc-channel.c index f64570ad..b557b531 100644 --- a/src/ngircd/irc-channel.c +++ b/src/ngircd/irc-channel.c @@ -396,9 +396,9 @@ IRC_TOPIC( CLIENT *Client, REQUEST *Req ) /* Set new topic */ Channel_SetTopic(chan, from, Req->argv[1]); - Log(LOG_DEBUG, "User \"%s\" set topic on \"%s\": %s", - Client_Mask(from), Channel_Name(chan), - Req->argv[1][0] ? Req->argv[1] : ""); + LogDebug("%s \"%s\" set topic on \"%s\": %s", + Client_TypeText(from), Client_Mask(from), Channel_Name(chan), + Req->argv[1][0] ? Req->argv[1] : ""); /* im Channel bekannt machen und an Server weiterleiten */ IRC_WriteStrServersPrefix( Client, from, "TOPIC %s :%s", Req->argv[0], Req->argv[1] ); diff --git a/src/ngircd/irc-login.c b/src/ngircd/irc-login.c index 95ec959c..9a04a3f7 100644 --- a/src/ngircd/irc-login.c +++ b/src/ngircd/irc-login.c @@ -672,7 +672,7 @@ Hello_User(CLIENT * Client) if (strcmp(Client_Password(Client), Conf_ServerPwd) != 0) { /* Bad password! */ Log(LOG_ERR, - "User \"%s\" rejected (connection %d): Bad password!", + "Client \"%s\" rejected (connection %d): Bad password!", Client_Mask(Client), Client_Conn(Client)); Conn_Close(Client_Conn(Client), NULL, "Bad password", true); return DISCONNECTED; @@ -742,6 +742,7 @@ Introduce_Client(CLIENT *From, CLIENT *Client) if (From) { if (Conf_IsService(Conf_GetServer(Client_Conn(From)), Client_ID(Client))) { type = "Service"; + Client_SetType(Client, CLIENT_SERVICE); } else type = "User"; LogDebug("%s \"%s\" (+%s) registered (via %s, on %s, %d hop%s).", diff --git a/src/ngircd/irc-mode.c b/src/ngircd/irc-mode.c index f4e3e0f9..76e3ab46 100644 --- a/src/ngircd/irc-mode.c +++ b/src/ngircd/irc-mode.c @@ -229,7 +229,9 @@ client_exit: ok = IRC_WriteStrClientPrefix( Client, Origin, "MODE %s :%s", Client_ID( Target ), the_modes ); IRC_WriteStrServersPrefix( Client, Origin, "MODE %s :%s", Client_ID( Target ), the_modes ); } - Log( LOG_DEBUG, "User \"%s\": Mode change, now \"%s\".", Client_Mask( Target ), Client_Modes( Target )); + LogDebug("%s \"%s\": Mode change, now \"%s\".", + Client_TypeText(Target), Client_Mask(Target), + Client_Modes(Target)); } IRC_SetPenalty( Client, 1 ); diff --git a/src/ngircd/irc.c b/src/ngircd/irc.c index ad9d32c9..0741aefa 100644 --- a/src/ngircd/irc.c +++ b/src/ngircd/irc.c @@ -419,7 +419,14 @@ Send_Message(CLIENT * Client, REQUEST * Req, int ForceType, bool SendErrors) if (cl) { /* Target is a user, enforce type */ +#ifndef STRICT_RFC + if (Client_Type(cl) != ForceType && + !(ForceType == CLIENT_USER && + (Client_Type(cl) == CLIENT_USER || + Client_Type(cl) == CLIENT_SERVICE))) { +#else if (Client_Type(cl) != ForceType) { +#endif if (!SendErrors) return CONNECTED; return IRC_WriteStrClient(from, ERR_NOSUCHNICK_MSG, diff --git a/src/ngircd/numeric.c b/src/ngircd/numeric.c index af1ac027..927989db 100644 --- a/src/ngircd/numeric.c +++ b/src/ngircd/numeric.c @@ -252,7 +252,8 @@ IRC_Num_ENDOFMOTD(CLIENT * Client, UNUSED REQUEST * Req) /* Announce all the users to the new server */ c = Client_First(); while (c) { - if (Client_Type(c) == CLIENT_USER) { + if (Client_Type(c) == CLIENT_USER || + Client_Type(c) == CLIENT_SERVICE) { if (!Announce_User(Client, c)) return DISCONNECTED; }