]> arthur.barton.de Git - ngircd-alex.git/blobdiff - src/ngircd/client.c
New functions Client_[Set]OrigUser() to get/set user specified by peer
[ngircd-alex.git] / src / ngircd / client.c
index 50648c97ef81842807305cd330cd5643ed6c81a6..44123eaa0b8d9af5444f0098b5fe1d656017b2b2 100644 (file)
@@ -1,6 +1,6 @@
 /*
  * ngIRCd -- The Next Generation IRC Daemon
- * Copyright (c)2001-2008 Alexander Barton (alex@barton.de)
+ * Copyright (c)2001-2010 Alexander Barton (alex@barton.de)
  *
  * 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
@@ -35,7 +35,6 @@
 #include <imp.h>
 #include "ngircd.h"
 #include "channel.h"
-#include "resolve.h"
 #include "conf.h"
 #include "hash.h"
 #include "irc-write.h"
@@ -181,39 +180,48 @@ Client_NewRemoteUser(CLIENT *Introducer, const char *Nick, int Hops, const char
  */
 static CLIENT *
 Init_New_Client(CONN_ID Idx, CLIENT *Introducer, CLIENT *TopServer,
int Type, const char *ID, const char *User, const char *Hostname, const char *Info, int Hops,
- int Token, const char *Modes, bool Idented)
 int Type, const char *ID, const char *User, const char *Hostname,
 const char *Info, int Hops, int Token, const char *Modes, bool Idented)
 {
        CLIENT *client;
 
-       assert( Idx >= NONE );
-       assert( Introducer != NULL );
-       assert( Hostname != NULL );
+       assert(Idx >= NONE);
+       assert(Introducer != NULL);
+       assert(Hostname != NULL);
 
-       client = New_Client_Struct( );
-       if( ! client ) return NULL;
+       client = New_Client_Struct();
+       if (!client)
+               return NULL;
 
        client->starttime = time(NULL);
        client->conn_id = Idx;
        client->introducer = Introducer;
        client->topserver = TopServer;
        client->type = Type;
-       if( ID ) Client_SetID( client, ID );
-       if( User ) Client_SetUser( client, User, Idented );
-       if( Hostname ) Client_SetHostname( client, Hostname );
-       if( Info ) Client_SetInfo( client, Info );
+       if (ID)
+               Client_SetID(client, ID);
+       if (User) {
+               Client_SetUser(client, User, Idented);
+               Client_SetOrigUser(client, User);
+       }
+       if (Hostname)
+               Client_SetHostname(client, Hostname);
+       if (Info)
+               Client_SetInfo(client, Info);
        client->hops = Hops;
        client->token = Token;
-       if( Modes ) Client_SetModes( client, Modes );
-       if( Type == CLIENT_SERVER ) Generate_MyToken( client );
+       if (Modes)
+               Client_SetModes(client, Modes);
+       if (Type == CLIENT_SERVER)
+               Generate_MyToken(client);
 
-       if( strchr( client->modes, 'a' ))
-               strlcpy( client->away, DEFAULT_AWAY_MSG, sizeof( client->away ));
+       if (strchr(client->modes, 'a'))
+               strlcpy(client->away, DEFAULT_AWAY_MSG, sizeof(client->away));
 
        client->next = (POINTER *)My_Clients;
        My_Clients = client;
 
-       Adjust_Counters( client );
+       Adjust_Counters(client);
 
        return client;
 } /* Init_New_Client */
@@ -346,6 +354,25 @@ Client_SetUser( CLIENT *Client, const char *User, bool Idented )
 } /* Client_SetUser */
 
 
+/**
+ * Set "original" user name of a client.
+ * This function saves the "original" user name, the user name specified by
+ * the peer using the USER command, into the CLIENT structure. This user
+ * name may be used for authentication, for example.
+ * @param Client The client.
+ * @param User User name to set.
+ */
+GLOBAL void
+Client_SetOrigUser(CLIENT *Client, const char *User) {
+       assert(Client != NULL);
+       assert(User != NULL);
+
+#ifdef PAM & IDENTAUTH
+       strlcpy(Client->orig_user, User, sizeof(Client->orig_user));
+#endif
+} /* Client_SetOrigUser */
+
+
 GLOBAL void
 Client_SetInfo( CLIENT *Client, const char *Info )
 {
@@ -595,6 +622,31 @@ Client_User( CLIENT *Client )
 } /* Client_User */
 
 
+#ifdef PAM
+
+/**
+ * Get the "original" user name as supplied by the USER command.
+ * The user name as given by the client is used for authentication instead
+ * of the one detected using IDENT requests.
+ * @param Client The client.
+ * @return Original user name.
+ */
+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
+
+
 GLOBAL char *
 Client_Hostname( CLIENT *Client )
 {
@@ -758,18 +810,18 @@ Client_CheckID( CLIENT *Client, char *ID )
        assert( Client->conn_id > NONE );
        assert( ID != NULL );
 
-       /* Nick too long? */
+       /* ID too long? */
        if (strlen(ID) > CLIENT_ID_LEN) {
                IRC_WriteStrClient(Client, ERR_ERRONEUSNICKNAME_MSG, Client_ID(Client), ID);
                return false;
        }
 
-       /* does ID already exist? */
+       /* ID already in use? */
        c = My_Clients;
        while (c) {
                if (strcasecmp(c->id, ID) == 0) {
                        snprintf(str, sizeof(str), "ID \"%s\" already registered", ID);
-                       if (Client->conn_id != c->conn_id)
+                       if (c->conn_id != NONE)
                                Log(LOG_ERR, "%s (on connection %d)!", str, c->conn_id);
                        else
                                Log(LOG_ERR, "%s (via network)!", str);
@@ -1097,7 +1149,7 @@ Client_RegisterWhowas( CLIENT *Client )
 } /* Client_RegisterWhowas */
 
 
-GLOBAL char *
+GLOBAL const char *
 Client_TypeText(CLIENT *Client)
 {
        assert(Client != NULL);
@@ -1129,6 +1181,9 @@ Destroy_UserOrService(CLIENT *Client, const char *Txt, const char *FwdMsg, bool
                    "%s \"%s\" unregistered (connection %d): %s",
                    Client_TypeText(Client), Client_Mask(Client),
                    Client->conn_id, Txt);
+               Log_ServerNotice('c', "Client exiting: %s (%s@%s) [%s]",
+                                Client_ID(Client), Client_User(Client),
+                                Client_Hostname(Client), Txt);
 
                if (SendQuit) {
                        /* Inforam all the other servers */