]> 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 c565830a6b82957c8cc0287046c2175b7459b60c..44123eaa0b8d9af5444f0098b5fe1d656017b2b2 100644 (file)
@@ -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"
@@ -201,8 +200,10 @@ Init_New_Client(CONN_ID Idx, CLIENT *Introducer, CLIENT *TopServer,
        client->type = Type;
        if (ID)
                Client_SetID(client, ID);
-       if (User)
+       if (User) {
                Client_SetUser(client, User, Idented);
+               Client_SetOrigUser(client, User);
+       }
        if (Hostname)
                Client_SetHostname(client, Hostname);
        if (Info)
@@ -353,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 )
 {
@@ -602,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 )
 {
@@ -1104,7 +1149,7 @@ Client_RegisterWhowas( CLIENT *Client )
 } /* Client_RegisterWhowas */
 
 
-GLOBAL char *
+GLOBAL const char *
 Client_TypeText(CLIENT *Client)
 {
        assert(Client != NULL);
@@ -1136,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 */