/*
* 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
/* not using systemd socket activation, initialize listening sockets: */
+#ifdef SSL_SUPPORT
+ if (!Conf_SSLOptions.KeyFile &&
+ array_length(&Conf_SSLOptions.ListenPorts, sizeof (UINT16))) {
+ Log(LOG_ERR,
+ "Ignoring SSL-enabled listening ports: No key file set!");
+ array_free(&Conf_SSLOptions.ListenPorts);
+ }
+#endif
+
/* can't use Conf_ListenAddress directly, see below */
copy = strdup(Conf_ListenAddress);
if (!copy) {
/**
* Set a socket to "IPv6 only". If the given socket doesn't belong to the
* AF_INET6 family, or the operating system doesn't support this functionality,
- * this function retruns silently.
+ * this function returns silently.
*
* @param af Address family of the socket.
* @param sock Socket handle.
* the result is a valid IRC message (oversized messages are shortened, for
* example). Then it calls the Conn_Write() function to do the actual sending.
*
- * @param Idx Index fo the connection.
+ * @param Idx Index of the connection.
* @param Format Format string, see printf().
* @returns true on success, false otherwise.
*/
} /* Conn_CountMax */
/**
- * Get number of connections accepted since the daemon startet.
+ * Get number of connections accepted since the daemon started.
*
* @returns Number of connections accepted.
*/
if (errno == EAGAIN || errno == EINTR)
return true;
- /* Log write errors but do not close the connection yet.
- * Calling Conn_Close() now could result in too many recursive calls.
- */
- if (!Conn_OPTION_ISSET(&My_Connections[Idx], CONN_ISCLOSING))
+ if (!Conn_OPTION_ISSET(&My_Connections[Idx], CONN_ISCLOSING)) {
Log(LOG_ERR,
"Write error on connection %d (socket %d): %s!",
Idx, My_Connections[Idx].sock, strerror(errno));
- else
+ Conn_Close(Idx, "Write error", NULL, false);
+ } else
LogDebug("Recursive write error on connection %d (socket %d): %s!",
Idx, My_Connections[Idx].sock, strerror(errno));
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)
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! */
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);
}
/**
* a 1:1 mapping today) and enlarge the "connection pool" accordingly.
*
* @param Sock Socket handle.
- * @returns Connecion index or NONE when the pool is too small.
+ * @returns Connection index or NONE when the pool is too small.
*/
static CONN_ID
Socket2Index( int Sock )
* 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) {
cb_connserver_login_ssl(int sock, short unused)
{
CONN_ID idx = Socket2Index(sock);
+ int serveridx;
(void) unused;
return;
}
+ serveridx = Conf_GetServer(idx);
+ assert(serveridx >= 0);
+ if (serveridx < 0)
+ goto err;
+
Log( LOG_INFO, "SSL connection %d with \"%s:%d\" established.", idx,
My_Connections[idx].host, Conf_Server[Conf_GetServer( idx )].port );
+ if (!Conn_OPTION_ISSET(&My_Connections[idx], CONN_SSL_PEERCERT_OK)) {
+ if (Conf_Server[serveridx].SSLVerify) {
+ Log(LOG_ERR,
+ "SSLVerify enabled for %d, but peer certificate check failed",
+ idx);
+ goto err;
+ }
+ Log(LOG_WARNING,
+ "Peer certificate check failed for %d, but SSLVerify is disabled, continuing",
+ idx);
+ }
server_login(idx);
+ return;
+ err:
+ Log(LOG_ERR, "SSL connection on socket %d failed!", sock);
+ Conn_Close(idx, "Can't connect!", NULL, false);
}