commit 1dc93286a0d5b80259604b4f25021fcc5a730b5b from: Alexander Barton date: Mon Aug 26 20:54:00 2013 UTC Save client IP address text for "WebIRC" users This patch introduces a new field in the CLIENT structure, "ipa_text", which points to an optional textual representation of the client IP address (or NULL) which can be used to store the "real" IP address information of a client using the "WEBIRC" protocol. Without this patch, ngIRCd ignored the paramater ... In addition, the functions Client_SetIPAText() and Client_IPAText() have been introduced to set and get the textual representation of the client IP address. Client_IPAText() can be used even when no "IP address text" has been set before, it then returns the real IP address of the connection. Closes bug #159. commit - 3b65f4e38d1ab019513f16b70581ae10574006e8 commit + 1dc93286a0d5b80259604b4f25021fcc5a730b5b blob - 72774ca9f4c749449d40a9344393aa3f6eef54b0 blob + 26d4929d732b04ecaaef3c24527465fafbe94160 --- src/ngircd/client.c +++ src/ngircd/client.c @@ -128,6 +128,8 @@ Client_Exit( void ) free(c->account_name); if (c->cloaked) free(c->cloaked); + if (c->ipa_text) + free(c->ipa_text); free( c ); c = next; } @@ -326,6 +328,8 @@ Client_Destroy( CLIENT *Client, const char *LogMsg, co free(c->account_name); if (c->cloaked) free(c->cloaked); + if (c->ipa_text) + free(c->ipa_text); free( c ); break; } @@ -366,6 +370,27 @@ Client_SetHostname( CLIENT *Client, const char *Hostna strlcpy(Client->host, Hostname, sizeof(Client->host)); } } /* Client_SetHostname */ + + +/** + * Set IP address to display for a client. + * + * @param Client The client. + * @param IPAText Textual representation of the IP address or NULL to unset. + */ +GLOBAL void +Client_SetIPAText(CLIENT *Client, const char *IPAText) +{ + assert(Client != NULL); + + if (Client->ipa_text) + free(Client->ipa_text); + + if (*IPAText) + Client->ipa_text = strndup(IPAText, CLIENT_HOST_LEN - 1); + else + Client->ipa_text = NULL; +} GLOBAL void @@ -789,6 +814,21 @@ Client_HostnameDisplayed(CLIENT *Client) return Client->cloaked; } +GLOBAL const char * +Client_IPAText(CLIENT *Client) +{ + assert(Client != NULL); + + /* Not a local client? */ + if (Client_Conn(Client) <= NONE) + return "0.0.0.0"; + + if (!Client->ipa_text) + return Conn_GetIPAInfo(Client_Conn(Client)); + else + return Client->ipa_text; +} + /** * Update (and generate, if necessary) the cloaked hostname of a client. * blob - 702f114cf0f484d773f6d237d81a2152cbbb03f5 blob + 71d413b2f01be419f8c72c997cb33ca620e01a7e --- src/ngircd/client.h +++ src/ngircd/client.h @@ -1,6 +1,6 @@ /* * ngIRCd -- The Next Generation IRC Daemon - * Copyright (c)2001-2012 Alexander Barton (alex@barton.de) + * 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 @@ -49,6 +49,7 @@ typedef struct _CLIENT struct _CLIENT *topserver; /* toplevel servers (only valid if client is a server) */ char host[CLIENT_HOST_LEN]; /* hostname of the client */ char *cloaked; /* cloaked hostname of the client */ + char *ipa_text; /* textual representaton of IP address */ char user[CLIENT_USER_LEN]; /* user name ("login") */ #if defined(PAM) && defined(IDENTAUTH) char orig_user[CLIENT_USER_LEN];/* user name supplied by USER command */ @@ -114,6 +115,7 @@ GLOBAL char *Client_OrigUser PARAMS(( CLIENT *Client ) GLOBAL char *Client_Hostname PARAMS(( CLIENT *Client )); GLOBAL char *Client_HostnameCloaked PARAMS((CLIENT *Client)); GLOBAL char *Client_HostnameDisplayed PARAMS(( CLIENT *Client )); +GLOBAL const char *Client_IPAText PARAMS(( CLIENT *Client )); GLOBAL char *Client_Modes PARAMS(( CLIENT *Client )); GLOBAL char *Client_Flags PARAMS(( CLIENT *Client )); GLOBAL CLIENT *Client_Introducer PARAMS(( CLIENT *Client )); @@ -131,6 +133,7 @@ GLOBAL bool Client_HasMode PARAMS(( CLIENT *Client, ch GLOBAL bool Client_HasFlag PARAMS(( CLIENT *Client, char Flag )); GLOBAL void Client_SetHostname PARAMS(( CLIENT *Client, const char *Hostname )); +GLOBAL void Client_SetIPAText PARAMS(( CLIENT *Client, const char *IPAText )); GLOBAL void Client_SetID PARAMS(( CLIENT *Client, const char *Nick )); GLOBAL void Client_SetUser PARAMS(( CLIENT *Client, const char *User, bool Idented )); GLOBAL void Client_SetOrigUser PARAMS(( CLIENT *Client, const char *User )); blob - 47a3797974a0d8c9f511c86b32055aa30b4f60fb blob + 3d77237f4e08f95928d826462734dafc3f19e759 --- src/ngircd/irc-info.c +++ src/ngircd/irc-info.c @@ -407,8 +407,8 @@ IRC_WHOIS_SendReply(CLIENT *Client, CLIENT *from, CLIE (from == c || (!Conf_MorePrivacy && Client_HasMode(from, 'o')))) { /* Client hostname */ if (!IRC_WriteStrClient(from, RPL_WHOISHOST_MSG, - Client_ID(from), Client_ID(c), Client_Hostname(c), - Conn_GetIPAInfo(Client_Conn(c)))) + Client_ID(from), Client_ID(c), + Client_Hostname(c), Client_IPAText(c))) return DISCONNECTED; /* Client modes */ if (!IRC_WriteStrClient(from, RPL_WHOISMODES_MSG, blob - 26dae6b73b2826ca82a47d2263f4f7b6607fe7d6 blob + 88804ef2b8b7dd1f95b71522ebc2ff3b84496827 --- src/ngircd/irc-login.c +++ src/ngircd/irc-login.c @@ -610,6 +610,8 @@ IRC_WEBIRC(CLIENT *Client, REQUEST *Req) Client_SetUser(Client, Req->argv[1], true); Client_SetOrigUser(Client, Req->argv[1]); Client_SetHostname(Client, Req->argv[2]); + Client_SetIPAText(Client, Req->argv[3]); + return CONNECTED; } /* IRC_WEBIRC */