]> arthur.barton.de Git - ngircd.git/commitdiff
Do IDENT requests even when DNS lookups are disabled
authorAlexander Barton <alex@barton.de>
Mon, 15 Jan 2024 20:12:10 +0000 (21:12 +0100)
committerAlexander Barton <alex@barton.de>
Tue, 16 Jan 2024 21:32:33 +0000 (22:32 +0100)
Without this patch, disabling DNS in the configuration disabled IDENT
lookups as well (for no good reason).

This patch allows enabling/disabling DNS lookups and IDENT requests
completely separately and enhances the messages sent to the client when
"NoticeBeforeRegistration" is enabled, too.

Thanks for reporting this, Miniontoby!

Closes #291.

src/ngircd/conn.c
src/ngircd/resolve.c
src/ngircd/resolve.h

index fe8eecf4e103a4c109363b14a249186544523598..f8c6e2c76fdf45d4269d8c1046626ab42ab6f0d6 100644 (file)
@@ -1,6 +1,6 @@
 /*
  * ngIRCd -- The Next Generation IRC Daemon
- * Copyright (c)2001-2019 Alexander Barton (alex@barton.de) and Contributors.
+ * Copyright (c)2001-2024 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
@@ -1485,10 +1485,6 @@ Conn_StartLogin(CONN_ID Idx)
 
        assert(Idx >= 0);
 
-       /* Nothing to do if DNS (and resolver subprocess) is disabled */
-       if (!Conf_DNS)
-               return;
-
 #ifdef IDENTAUTH
        /* Should we make an IDENT request? */
        if (Conf_Ident)
@@ -1498,13 +1494,21 @@ Conn_StartLogin(CONN_ID Idx)
        if (Conf_NoticeBeforeRegistration) {
                /* Send "NOTICE *" messages to the client */
 #ifdef IDENTAUTH
-               if (Conf_Ident)
-                       (void)Conn_WriteStr(Idx,
-                               "NOTICE * :*** Looking up your hostname and checking ident");
-               else
+               if (Conf_Ident) {
+                       if (Conf_DNS)
+                               (void)Conn_WriteStr(Idx,
+                                       "NOTICE * :*** Looking up your hostname and checking ident");
+                       else
+                               (void)Conn_WriteStr(Idx,
+                                       "NOTICE * :*** Checking ident");
+               } else
 #endif
+               if(Conf_DNS)
                        (void)Conn_WriteStr(Idx,
                                "NOTICE * :*** Looking up your hostname");
+               else
+                       (void)Conn_WriteStr(Idx,
+                               "NOTICE * :*** Processing your connection");
                /* Send buffered data to the client, but break on errors
                 * because Handle_Write() would have closed the connection
                 * again in this case! */
@@ -1512,8 +1516,9 @@ Conn_StartLogin(CONN_ID Idx)
                        return;
        }
 
-       Resolve_Addr(&My_Connections[Idx].proc_stat, &My_Connections[Idx].addr,
-                    ident_sock, cb_Read_Resolver_Result);
+       Resolve_Addr_Ident(&My_Connections[Idx].proc_stat,
+                          &My_Connections[Idx].addr,
+                          ident_sock, cb_Read_Resolver_Result);
 }
 
 /**
@@ -2298,13 +2303,16 @@ cb_Read_Resolver_Result( int r_fd, UNUSED short events )
         * the resolver results, so we don't have to worry to override settings
         * from these commands here. */
        if(Client_Type(c) == CLIENT_UNKNOWN) {
-               strlcpy(My_Connections[i].host, readbuf,
-                       sizeof(My_Connections[i].host));
-               Client_SetHostname(c, readbuf);
-               if (Conf_NoticeBeforeRegistration)
-                       (void)Conn_WriteStr(i,
+               if (readbuf[0]) {
+                       /* We got a hostname */
+                       strlcpy(My_Connections[i].host, readbuf,
+                               sizeof(My_Connections[i].host));
+                       Client_SetHostname(c, readbuf);
+                       if (Conf_NoticeBeforeRegistration)
+                               (void)Conn_WriteStr(i,
                                        "NOTICE * :*** Found your hostname: %s",
                                        My_Connections[i].host);
+               }
 #ifdef IDENTAUTH
                ++identptr;
                if (*identptr) {
index 1931bc712e3be470672b92d484c7c9a9c9846f41..25be58a456ed4e9cb5126c6b0a8cb50d830b0f39 100644 (file)
@@ -1,6 +1,6 @@
 /*
  * ngIRCd -- The Next Generation IRC Daemon
- * Copyright (c)2001-2014 Alexander Barton (alex@barton.de) and Contributors.
+ * Copyright (c)2001-2024 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
@@ -42,7 +42,7 @@
 
 #include "resolve.h"
 
-static void Do_ResolveAddr PARAMS(( const ng_ipaddr_t *Addr, int Sock, int w_fd ));
+static void Do_ResolveAddr_Ident PARAMS(( const ng_ipaddr_t *Addr, int Sock, int w_fd ));
 static void Do_ResolveName PARAMS(( const char *Host, int w_fd ));
 
 #ifdef WANT_IPV6
@@ -52,11 +52,11 @@ extern bool Conf_ConnectIPv6;
 
 
 /**
- * Resolve IP (asynchronous!).
+ * Resolve IP address and do IDENT lookup asynchronously.
  */
 GLOBAL bool
-Resolve_Addr(PROC_STAT * s, const ng_ipaddr_t *Addr, int identsock,
-            void (*cbfunc) (int, short))
+Resolve_Addr_Ident(PROC_STAT * s, const ng_ipaddr_t *Addr, int identsock,
+                  void (*cbfunc) (int, short))
 {
        int pipefd[2];
        pid_t pid;
@@ -71,7 +71,7 @@ Resolve_Addr(PROC_STAT * s, const ng_ipaddr_t *Addr, int identsock,
                /* Sub process */
                Log_Init_Subprocess("Resolver");
                Conn_CloseAllSockets(identsock);
-               Do_ResolveAddr(Addr, identsock, pipefd[1]);
+               Do_ResolveAddr_Ident(Addr, identsock, pipefd[1]);
                Log_Exit_Subprocess("Resolver");
                exit(0);
        }
@@ -356,7 +356,7 @@ ArrayWrite(int fd, const array *a)
 
 
 static void
-Do_ResolveAddr(const ng_ipaddr_t *Addr, int identsock, int w_fd)
+Do_ResolveAddr_Ident(const ng_ipaddr_t *Addr, int identsock, int w_fd)
 {
        /* Resolver sub-process: resolve IP address and write result into
         * pipe to parent. */
@@ -365,8 +365,15 @@ Do_ResolveAddr(const ng_ipaddr_t *Addr, int identsock, int w_fd)
        size_t len;
        array resolved_addr;
 
+       hostname[0] = '\0';
        array_init(&resolved_addr);
        ng_ipaddr_tostr_r(Addr, tmp_ip_str);
+
+       /* Skip DNS lookup when DNS is disabled; just return an empty ("") host
+        * name but still issue an IDENT query, if supported and enabled. */
+       if (!Conf_DNS)
+               goto dns_done;
+
        Log_Subprocess(LOG_DEBUG, "Now resolving %s ...", tmp_ip_str);
        if (!ReverseLookup(Addr, hostname, sizeof(hostname)))
                goto dns_done;
@@ -397,7 +404,7 @@ Do_ResolveAddr(const ng_ipaddr_t *Addr, int identsock, int w_fd)
        ArrayWrite(w_fd, &resolved_addr);
 
        array_free(&resolved_addr);
-} /* Do_ResolveAddr */
+} /* Do_ResolveAddr_Ident */
 
 
 static void
index c0b734b8e58cb6426343e9ffdc4b595802cf4245..92257c39f6c61cbbae4126b7cb36b202a91757c3 100644 (file)
@@ -1,6 +1,6 @@
 /*
  * ngIRCd -- The Next Generation IRC Daemon
- * Copyright (c)2001-2010 by Alexander Barton (alex@barton.de)
+ * Copyright (c)2001-2024 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
@@ -17,7 +17,7 @@
  * Asynchronous resolver (header)
  */
 
-GLOBAL bool Resolve_Addr PARAMS((PROC_STAT * s, const ng_ipaddr_t * Addr,
+GLOBAL bool Resolve_Addr_Ident PARAMS((PROC_STAT * s, const ng_ipaddr_t * Addr,
                                 int identsock, void (*cbfunc) (int, short)));
 GLOBAL bool Resolve_Name PARAMS((PROC_STAT * s, const char *Host,
                                 void (*cbfunc) (int, short)));