]> arthur.barton.de Git - ngircd-alex.git/blobdiff - src/ngircd/client.c
Allow longer usernames for authentication
[ngircd-alex.git] / src / ngircd / client.c
index 1c710344007ab77399d270211432503022bf8614..07d448fdbaf9a84873f32e22584636251e2d3fd5 100644 (file)
@@ -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
  * Client management.
  */
 
-#include "imp.h"
 #include <assert.h>
 #include <unistd.h>
 #include <stdio.h>
 #include <stdlib.h>
 #include <string.h>
 #include <strings.h>
+#include <time.h>
 #include <netdb.h>
 
-#include "defines.h"
 #include "conn.h"
-
-#include "exp.h"
-#include "client.h"
-
-#include <imp.h>
 #include "ngircd.h"
 #include "channel.h"
 #include "conf.h"
@@ -44,8 +38,6 @@
 #include "match.h"
 #include "messages.h"
 
-#include <exp.h>
-
 #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,
@@ -120,18 +114,15 @@ Client_Exit( void )
        
        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;
@@ -239,7 +230,7 @@ Client_Destroy( CLIENT *Client, const char *LogMsg, const char *FwdMsg, bool Sen
        /* 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,7 @@ Client_SetHostname( CLIENT *Client, const char *Hostname )
        assert(Client != NULL);
        assert(Hostname != NULL);
 
-       if (strlen(Conf_CloakHost)) {
+       if (Conf_CloakHost[0]) {
                char cloak[GETID_LEN];
 
                strlcpy(cloak, Hostname, GETID_LEN);
@@ -368,6 +355,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 )
 {
@@ -419,7 +427,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 +477,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 +492,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 +537,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 )
 {
@@ -726,15 +731,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 +785,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 +865,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 +1373,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 +1394,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 )