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.
This commit is contained in:
Alexander Barton 2008-08-16 17:52:02 +02:00
parent 4e125fb67c
commit d93030ad27
6 changed files with 19 additions and 7 deletions

View File

@ -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 */

View File

@ -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] : "<none>");
LogDebug("%s \"%s\" set topic on \"%s\": %s",
Client_TypeText(from), Client_Mask(from), Channel_Name(chan),
Req->argv[1][0] ? Req->argv[1] : "<none>");
/* im Channel bekannt machen und an Server weiterleiten */
IRC_WriteStrServersPrefix( Client, from, "TOPIC %s :%s", Req->argv[0], Req->argv[1] );

View File

@ -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).",

View File

@ -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 );

View File

@ -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,

View File

@ -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;
}