From 00dc9d284564f1c05026120d2d72c580a1705a05 Mon Sep 17 00:00:00 2001 From: Alexander Barton Date: Mon, 15 Jan 2024 21:12:10 +0100 Subject: [PATCH] Do IDENT requests even when DNS lookups are disabled 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 | 40 ++++++++++++++++++++++++---------------- src/ngircd/resolve.c | 23 +++++++++++++++-------- src/ngircd/resolve.h | 4 ++-- 3 files changed, 41 insertions(+), 26 deletions(-) diff --git a/src/ngircd/conn.c b/src/ngircd/conn.c index fe8eecf4..f8c6e2c7 100644 --- a/src/ngircd/conn.c +++ b/src/ngircd/conn.c @@ -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) { diff --git a/src/ngircd/resolve.c b/src/ngircd/resolve.c index 1931bc71..25be58a4 100644 --- a/src/ngircd/resolve.c +++ b/src/ngircd/resolve.c @@ -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 diff --git a/src/ngircd/resolve.h b/src/ngircd/resolve.h index c0b734b8..92257c39 100644 --- a/src/ngircd/resolve.h +++ b/src/ngircd/resolve.h @@ -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))); -- 2.39.2