mirror of
				https://github.com/osmarks/ngircd.git
				synced 2025-10-31 14:02:59 +00:00 
			
		
		
		
	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.
This commit is contained in:
		| @@ -128,6 +128,8 @@ Client_Exit( void ) | |||||||
| 			free(c->account_name); | 			free(c->account_name); | ||||||
| 		if (c->cloaked) | 		if (c->cloaked) | ||||||
| 			free(c->cloaked); | 			free(c->cloaked); | ||||||
|  | 		if (c->ipa_text) | ||||||
|  | 			free(c->ipa_text); | ||||||
| 		free( c ); | 		free( c ); | ||||||
| 		c = next; | 		c = next; | ||||||
| 	} | 	} | ||||||
| @@ -326,6 +328,8 @@ Client_Destroy( CLIENT *Client, const char *LogMsg, const char *FwdMsg, bool Sen | |||||||
| 				free(c->account_name); | 				free(c->account_name); | ||||||
| 			if (c->cloaked) | 			if (c->cloaked) | ||||||
| 				free(c->cloaked); | 				free(c->cloaked); | ||||||
|  | 			if (c->ipa_text) | ||||||
|  | 				free(c->ipa_text); | ||||||
| 			free( c ); | 			free( c ); | ||||||
| 			break; | 			break; | ||||||
| 		} | 		} | ||||||
| @@ -368,6 +372,27 @@ Client_SetHostname( CLIENT *Client, const char *Hostname ) | |||||||
| } /* Client_SetHostname */ | } /* 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 | GLOBAL void | ||||||
| Client_SetID( CLIENT *Client, const char *ID ) | Client_SetID( CLIENT *Client, const char *ID ) | ||||||
| { | { | ||||||
| @@ -789,6 +814,21 @@ Client_HostnameDisplayed(CLIENT *Client) | |||||||
| 	return Client->cloaked; | 	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. |  * Update (and generate, if necessary) the cloaked hostname of a client. | ||||||
|  * |  * | ||||||
|   | |||||||
| @@ -1,6 +1,6 @@ | |||||||
| /* | /* | ||||||
|  * ngIRCd -- The Next Generation IRC Daemon |  * 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 |  * 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 |  * 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) */ | 	struct _CLIENT *topserver;	/* toplevel servers (only valid if client is a server) */ | ||||||
| 	char host[CLIENT_HOST_LEN];	/* hostname of the client */ | 	char host[CLIENT_HOST_LEN];	/* hostname of the client */ | ||||||
| 	char *cloaked;			/* cloaked 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") */ | 	char user[CLIENT_USER_LEN];	/* user name ("login") */ | ||||||
| #if defined(PAM) && defined(IDENTAUTH) | #if defined(PAM) && defined(IDENTAUTH) | ||||||
| 	char orig_user[CLIENT_USER_LEN];/* user name supplied by USER command */ | 	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_Hostname PARAMS(( CLIENT *Client )); | ||||||
| GLOBAL char *Client_HostnameCloaked PARAMS((CLIENT *Client)); | GLOBAL char *Client_HostnameCloaked PARAMS((CLIENT *Client)); | ||||||
| GLOBAL char *Client_HostnameDisplayed 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_Modes PARAMS(( CLIENT *Client )); | ||||||
| GLOBAL char *Client_Flags PARAMS(( CLIENT *Client )); | GLOBAL char *Client_Flags PARAMS(( CLIENT *Client )); | ||||||
| GLOBAL CLIENT *Client_Introducer 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 bool Client_HasFlag PARAMS(( CLIENT *Client, char Flag )); | ||||||
|  |  | ||||||
| GLOBAL void Client_SetHostname PARAMS(( CLIENT *Client, const char *Hostname )); | 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_SetID PARAMS(( CLIENT *Client, const char *Nick )); | ||||||
| GLOBAL void Client_SetUser PARAMS(( CLIENT *Client, const char *User, bool Idented )); | GLOBAL void Client_SetUser PARAMS(( CLIENT *Client, const char *User, bool Idented )); | ||||||
| GLOBAL void Client_SetOrigUser PARAMS(( CLIENT *Client, const char *User )); | GLOBAL void Client_SetOrigUser PARAMS(( CLIENT *Client, const char *User )); | ||||||
|   | |||||||
| @@ -407,8 +407,8 @@ IRC_WHOIS_SendReply(CLIENT *Client, CLIENT *from, CLIENT *c) | |||||||
| 	    (from == c || (!Conf_MorePrivacy && Client_HasMode(from, 'o')))) { | 	    (from == c || (!Conf_MorePrivacy && Client_HasMode(from, 'o')))) { | ||||||
| 		/* Client hostname */ | 		/* Client hostname */ | ||||||
| 		if (!IRC_WriteStrClient(from, RPL_WHOISHOST_MSG, | 		if (!IRC_WriteStrClient(from, RPL_WHOISHOST_MSG, | ||||||
| 					Client_ID(from), Client_ID(c), Client_Hostname(c), | 					Client_ID(from), Client_ID(c), | ||||||
| 					Conn_GetIPAInfo(Client_Conn(c)))) | 					Client_Hostname(c), Client_IPAText(c))) | ||||||
| 			return DISCONNECTED; | 			return DISCONNECTED; | ||||||
| 		/* Client modes */ | 		/* Client modes */ | ||||||
| 		if (!IRC_WriteStrClient(from, RPL_WHOISMODES_MSG, | 		if (!IRC_WriteStrClient(from, RPL_WHOISMODES_MSG, | ||||||
|   | |||||||
| @@ -610,6 +610,8 @@ IRC_WEBIRC(CLIENT *Client, REQUEST *Req) | |||||||
| 	Client_SetUser(Client, Req->argv[1], true); | 	Client_SetUser(Client, Req->argv[1], true); | ||||||
| 	Client_SetOrigUser(Client, Req->argv[1]); | 	Client_SetOrigUser(Client, Req->argv[1]); | ||||||
| 	Client_SetHostname(Client, Req->argv[2]); | 	Client_SetHostname(Client, Req->argv[2]); | ||||||
|  | 	Client_SetIPAText(Client, Req->argv[3]); | ||||||
|  |  | ||||||
| 	return CONNECTED; | 	return CONNECTED; | ||||||
| } /* IRC_WEBIRC */ | } /* IRC_WEBIRC */ | ||||||
|  |  | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user
	 Alexander Barton
					Alexander Barton