Module: ngircd.git Branch: master Commit: 1dc93286a0d5b80259604b4f25021fcc5a730b5b URL: http://ngircd.barton.de/cgi-bin/gitweb.cgi?p=ngircd.git&a=commit;h=1dc93...
Author: Alexander Barton alex@barton.de Date: Mon Aug 26 22:54:00 2013 +0200
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 <ip-address> 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.
---
src/ngircd/client.c | 40 ++++++++++++++++++++++++++++++++++++++++ src/ngircd/client.h | 5 ++++- src/ngircd/irc-info.c | 4 ++-- src/ngircd/irc-login.c | 2 ++ 4 files changed, 48 insertions(+), 3 deletions(-)
diff --git a/src/ngircd/client.c b/src/ngircd/client.c index 72774ca..26d4929 100644 --- a/src/ngircd/client.c +++ b/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, const char *FwdMsg, bool Sen free(c->account_name); if (c->cloaked) free(c->cloaked); + if (c->ipa_text) + free(c->ipa_text); free( c ); break; } @@ -368,6 +372,27 @@ Client_SetHostname( CLIENT *Client, const char *Hostname ) } /* 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 Client_SetID( CLIENT *Client, const char *ID ) { @@ -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. * diff --git a/src/ngircd/client.h b/src/ngircd/client.h index 702f114..71d413b 100644 --- a/src/ngircd/client.h +++ b/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, char Mode )); 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 )); diff --git a/src/ngircd/irc-info.c b/src/ngircd/irc-info.c index 47a3797..3d77237 100644 --- a/src/ngircd/irc-info.c +++ b/src/ngircd/irc-info.c @@ -407,8 +407,8 @@ IRC_WHOIS_SendReply(CLIENT *Client, CLIENT *from, CLIENT *c) (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, diff --git a/src/ngircd/irc-login.c b/src/ngircd/irc-login.c index 26dae6b..88804ef 100644 --- a/src/ngircd/irc-login.c +++ b/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 */