X-Git-Url: https://arthur.barton.de/cgi-bin/gitweb.cgi?p=ngircd-alex.git;a=blobdiff_plain;f=src%2Fngircd%2Fclient.c;h=1c7bd1ead0cc510a814d59f0c43d12c1e1bb65da;hp=1c710344007ab77399d270211432503022bf8614;hb=1f40776bc166ece8dad0d333905481aa28786cb5;hpb=eb86d234f8553cb018fe86483ee754817689439a diff --git a/src/ngircd/client.c b/src/ngircd/client.c index 1c710344..1c7bd1ea 100644 --- a/src/ngircd/client.c +++ b/src/ngircd/client.c @@ -1,6 +1,6 @@ /* * ngIRCd -- The Next Generation IRC Daemon - * Copyright (c)2001-2013 Alexander Barton (alex@barton.de) and Contributors. + * Copyright (c)2001-2014 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 @@ -18,22 +18,16 @@ * Client management. */ -#include "imp.h" #include #include #include #include #include #include +#include #include -#include "defines.h" #include "conn.h" - -#include "exp.h" -#include "client.h" - -#include #include "ngircd.h" #include "channel.h" #include "conf.h" @@ -44,8 +38,6 @@ #include "match.h" #include "messages.h" -#include - #define GETID_LEN (CLIENT_NICK_LEN-1) + 1 + (CLIENT_USER_LEN-1) + 1 + (CLIENT_HOST_LEN-1) + 1 static CLIENT *This_Server, *My_Clients; @@ -62,6 +54,8 @@ static CLIENT *New_Client_Struct PARAMS(( void )); static void Generate_MyToken PARAMS(( CLIENT *Client )); static void Adjust_Counters PARAMS(( CLIENT *Client )); +static void Free_Client PARAMS(( CLIENT **Client )); + static CLIENT *Init_New_Client PARAMS((CONN_ID Idx, CLIENT *Introducer, CLIENT *TopServer, int Type, const char *ID, const char *User, const char *Hostname, const char *Info, @@ -78,7 +72,7 @@ GLOBAL void Client_Init( void ) { struct hostent *h; - + This_Server = New_Client_Struct( ); if( ! This_Server ) { @@ -104,7 +98,7 @@ Client_Init( void ) Client_SetInfo( This_Server, Conf_ServerInfo ); My_Clients = This_Server; - + memset( &My_Whowas, 0, sizeof( My_Whowas )); } /* Client_Init */ @@ -117,21 +111,18 @@ Client_Exit( void ) if( NGIRCd_SignalRestart ) Client_Destroy( This_Server, "Server going down (restarting).", NULL, false ); else Client_Destroy( This_Server, "Server going down.", NULL, false ); - + cnt = 0; c = My_Clients; - while( c ) - { + while(c) { cnt++; next = (CLIENT *)c->next; - if (c->account_name) - free(c->account_name); - if (c->cloaked) - free(c->cloaked); - free( c ); + Free_Client(&c); c = next; } - if( cnt ) Log( LOG_INFO, "Freed %d client structure%s.", cnt, cnt == 1 ? "" : "s" ); + if (cnt) + Log(LOG_INFO, "Freed %d client structure%s.", + cnt, cnt == 1 ? "" : "s"); } /* Client_Exit */ @@ -222,7 +213,7 @@ Init_New_Client(CONN_ID Idx, CLIENT *Introducer, CLIENT *TopServer, Generate_MyToken(client); if (Client_HasMode(client, 'a')) - strlcpy(client->away, DEFAULT_AWAY_MSG, sizeof(client->away)); + client->away = strndup(DEFAULT_AWAY_MSG, CLIENT_AWAY_LEN - 1); client->next = (POINTER *)My_Clients; My_Clients = client; @@ -237,9 +228,9 @@ GLOBAL void Client_Destroy( CLIENT *Client, const char *LogMsg, const char *FwdMsg, bool SendQuit ) { /* remove a client */ - + CLIENT *last, *c; - char msg[LINE_LEN]; + char msg[COMMAND_LEN]; const char *txt; assert( Client != NULL ); @@ -322,11 +313,7 @@ Client_Destroy( CLIENT *Client, const char *LogMsg, const char *FwdMsg, bool Sen } } - if (c->account_name) - free(c->account_name); - if (c->cloaked) - free(c->cloaked); - free( c ); + Free_Client(&c); break; } last = c; @@ -350,7 +337,11 @@ Client_SetHostname( CLIENT *Client, const char *Hostname ) assert(Client != NULL); assert(Hostname != NULL); - if (strlen(Conf_CloakHost)) { + /* Only cloak the hostmask if it has not yet been cloaked. + * The period or colon indicates it's still an IP address. + * An empty string means a rDNS lookup did not happen (yet). + */ + if (Conf_CloakHost[0] && (!Client->host[0] || strpbrk(Client->host, ".:"))) { char cloak[GETID_LEN]; strlcpy(cloak, Hostname, GETID_LEN); @@ -368,12 +359,33 @@ 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 ) { assert( Client != NULL ); assert( ID != NULL ); - + strlcpy( Client->id, ID, sizeof( Client->id )); if (Conf_CloakUserToNick) { @@ -419,7 +431,7 @@ Client_SetOrigUser(CLIENT UNUSED *Client, const char UNUSED *User) assert(Client != NULL); assert(User != NULL); -#if defined(PAM) && defined(IDENTAUTH) +#if defined(PAM) strlcpy(Client->orig_user, User, sizeof(Client->orig_user)); #endif } /* Client_SetOrigUser */ @@ -469,7 +481,8 @@ Client_SetAccountName(CLIENT *Client, const char *AccountName) free(Client->account_name); if (*AccountName) - Client->account_name = strdup(AccountName); + Client->account_name = strndup(AccountName, + CLIENT_NICK_LEN - 1); else Client->account_name = NULL; } @@ -483,7 +496,11 @@ Client_SetAway( CLIENT *Client, const char *Txt ) assert( Client != NULL ); assert( Txt != NULL ); - strlcpy( Client->away, Txt, sizeof( Client->away )); + if (Client->away) + free(Client->away); + + Client->away = strndup(Txt, CLIENT_AWAY_LEN - 1); + LogDebug("%s \"%s\" is away: %s", Client_TypeText(Client), Client_Mask(Client), Txt); } /* Client_SetAway */ @@ -524,14 +541,6 @@ Client_SetIntroducer( CLIENT *Client, CLIENT *Introducer ) } /* Client_SetIntroducer */ -GLOBAL void -Client_SetOperByMe( CLIENT *Client, bool OperByMe ) -{ - assert( Client != NULL ); - Client->oper_by_me = OperByMe; -} /* Client_SetOperByMe */ - - GLOBAL bool Client_ModeAdd( CLIENT *Client, char Mode ) { @@ -693,7 +702,7 @@ Client_ID( CLIENT *Client ) if(Client->type == CLIENT_USER) assert(strlen(Client->id) < Conf_MaxNickLength); #endif - + if( Client->id[0] ) return Client->id; else return "*"; } /* Client_ID */ @@ -726,15 +735,7 @@ Client_User( CLIENT *Client ) */ GLOBAL char * Client_OrigUser(CLIENT *Client) { -#ifndef IDENTAUTH - char *user = Client->user; - - if (user[0] == '~') - user++; - return user; -#else return Client->orig_user; -#endif } /* Client_OrigUser */ #endif @@ -788,6 +789,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. * @@ -853,14 +869,6 @@ Client_Flags( CLIENT *Client ) } /* Client_Flags */ -GLOBAL bool -Client_OperByMe( CLIENT *Client ) -{ - assert( Client != NULL ); - return Client->oper_by_me; -} /* Client_OperByMe */ - - GLOBAL int Client_Hops( CLIENT *Client ) { @@ -1369,6 +1377,11 @@ MyCount( CLIENT_TYPE Type ) } /* MyCount */ +/** + * Allocate and initialize new CLIENT strcuture. + * + * @return Pointer to CLIENT structure or NULL on error. + */ static CLIENT * New_Client_Struct( void ) { @@ -1385,14 +1398,34 @@ New_Client_Struct( void ) c->type = CLIENT_UNKNOWN; c->conn_id = NONE; - c->oper_by_me = false; c->hops = -1; c->token = -1; c->mytoken = -1; return c; -} /* New_Client */ +} +/** + * Free a CLIENT structure and its member variables. + */ +static void +Free_Client(CLIENT **Client) +{ + assert(Client != NULL); + assert(*Client != NULL); + + if ((*Client)->account_name) + free((*Client)->account_name); + if ((*Client)->away) + free((*Client)->away); + if ((*Client)->cloaked) + free((*Client)->cloaked); + if ((*Client)->ipa_text) + free((*Client)->ipa_text); + + free(*Client); + *Client = NULL; +} static void Generate_MyToken( CLIENT *Client )