]> arthur.barton.de Git - ngircd-alex.git/blobdiff - src/ngircd/login.c
Use correct sender as target for ISUPPORT replies on "VERSION"
[ngircd-alex.git] / src / ngircd / login.c
index e1959d6662adefe11ef91ba351698203bbfcde63..4011b8bcadd3216672b2ddfeb67a254eb3dff463 100644 (file)
@@ -19,6 +19,7 @@
 #include "imp.h"
 #include <assert.h>
 #include <stdlib.h>
+#include <stdio.h>
 #include <string.h>
 #include <strings.h>
 #include <unistd.h>
@@ -37,6 +38,7 @@
 #include "ngircd.h"
 #include "pam.h"
 #include "irc-info.h"
+#include "irc-mode.h"
 #include "irc-write.h"
 
 #include "exp.h"
@@ -90,17 +92,17 @@ Login_User(CLIENT * Client)
 #ifdef PAM
        if (!Conf_PAM) {
                /* Don't do any PAM authentication at all, instead emulate
-                * the beahiour of the daemon compiled without PAM support:
+                * the behavior of the daemon compiled without PAM support:
                 * because there can't be any "server password", all
                 * passwords supplied are classified as "wrong". */
-               if(Conn_Password(Client_Conn(Client))[0] == '\0')
+               if(Conn_Password(conn)[0] == '\0')
                        return Login_User_PostAuth(Client);
                Client_Reject(Client, "Non-empty password", false);
                return DISCONNECTED;
        }
 
        if (Conf_PAMIsOptional &&
-           strcmp(Conn_Password(Client_Conn(Client)), "") == 0) {
+           strcmp(Conn_Password(conn), "") == 0) {
                /* Clients are not required to send a password and to be PAM-
                 * authenticated at all. If not, they won't become "identified"
                 * and keep the "~" in their supplied user name.
@@ -130,7 +132,7 @@ Login_User(CLIENT * Client)
        }
 #else
        /* Check global server password ... */
-       if (strcmp(Conn_Password(Client_Conn(Client)), Conf_ServerPwd) != 0) {
+       if (strcmp(Conn_Password(conn), Conf_ServerPwd) != 0) {
                /* Bad password! */
                Client_Reject(Client, "Bad server password", false);
                return DISCONNECTED;
@@ -151,6 +153,9 @@ Login_User(CLIENT * Client)
 GLOBAL bool
 Login_User_PostAuth(CLIENT *Client)
 {
+       REQUEST Req;
+       char modes[CLIENT_MODE_LEN + 1];
+
        assert(Client != NULL);
 
        if (Class_HandleServerBans(Client) != CONNECTED)
@@ -163,8 +168,8 @@ Login_User_PostAuth(CLIENT *Client)
                return false;
        if (!IRC_WriteStrClient
            (Client, RPL_YOURHOST_MSG, Client_ID(Client),
-            Client_ID(Client_ThisServer()), PACKAGE_VERSION, TARGET_CPU,
-            TARGET_VENDOR, TARGET_OS))
+            Client_ID(Client_ThisServer()), PACKAGE_VERSION, HOST_CPU,
+            HOST_VENDOR, HOST_OS))
                return false;
        if (!IRC_WriteStrClient
            (Client, RPL_CREATED_MSG, Client_ID(Client), NGIRCd_StartStr))
@@ -185,8 +190,17 @@ Login_User_PostAuth(CLIENT *Client)
        if (!IRC_Show_MOTD(Client))
                return DISCONNECTED;
 
-       /* Suspend the client for a second ... */
-       IRC_SetPenalty(Client, 1);
+       /* Set default user modes */
+       if (Conf_DefaultUserModes[0]) {
+               snprintf(modes, sizeof(modes), "+%s", Conf_DefaultUserModes);
+               Req.prefix = Client_ThisServer();
+               Req.command = "MODE";
+               Req.argc = 2;
+               Req.argv[0] = Client_ID(Client);
+               Req.argv[1] = modes;
+               IRC_MODE(Client, &Req);
+       } else
+               IRC_SetPenalty(Client, 1);
 
        return CONNECTED;
 }
@@ -194,7 +208,7 @@ Login_User_PostAuth(CLIENT *Client)
 #ifdef PAM
 
 /**
- * Read result of the authenticatior sub-process from pipe
+ * Read result of the authenticator sub-process from pipe
  *
  * @param r_fd         File descriptor of the pipe.
  * @param events       (ignored IO specification)
@@ -202,6 +216,7 @@ Login_User_PostAuth(CLIENT *Client)
 static void
 cb_Read_Auth_Result(int r_fd, UNUSED short events)
 {
+       char user[CLIENT_USER_LEN], *ptr;
        CONN_ID conn;
        CLIENT *client;
        int result;
@@ -233,7 +248,14 @@ cb_Read_Auth_Result(int r_fd, UNUSED short events)
        }
 
        if (result == true) {
-               Client_SetUser(client, Client_OrigUser(client), true);
+               /* Authentication succeeded, now set the correct user name
+                * supplied by the client (without prepended '~' for exmaple),
+                * but cut it at the first '@' character: */
+               strlcpy(user, Client_OrigUser(client), sizeof(user));
+               ptr = strchr(user, '@');
+               if (ptr)
+                       *ptr = '\0';
+               Client_SetUser(client, user, true);
                (void)Login_User_PostAuth(client);
        } else
                Client_Reject(client, "Bad password", false);