New function Conn_StartLogin() to finish connection initialization
Conn_StartLogin() is called after the connection has been established and fully innitialized, including the SSL handshake, for example. Up to this patch, the "NoticeAuth" option broke the SSL handshake ...
This commit is contained in:
parent
b68bb560e9
commit
01b62202b2
|
@ -625,6 +625,8 @@ ConnectAccept( CONNECTION *c, bool connect)
|
|||
#endif /* _GNUTLS */
|
||||
Conn_OPTION_DEL(c, (CONN_SSL_WANT_WRITE|CONN_SSL_WANT_READ|CONN_SSL_CONNECT));
|
||||
ConnSSL_LogCertInfo(c);
|
||||
|
||||
Conn_StartLogin(CONNECTION2ID(c));
|
||||
return 1;
|
||||
}
|
||||
|
||||
|
|
|
@ -88,7 +88,7 @@
|
|||
|
||||
static bool Handle_Write PARAMS(( CONN_ID Idx ));
|
||||
static bool Conn_Write PARAMS(( CONN_ID Idx, char *Data, size_t Len ));
|
||||
static int New_Connection PARAMS(( int Sock ));
|
||||
static int New_Connection PARAMS(( int Sock, bool IsSSL ));
|
||||
static CONN_ID Socket2Index PARAMS(( int Sock ));
|
||||
static void Read_Request PARAMS(( CONN_ID Idx ));
|
||||
static unsigned int Handle_Buffer PARAMS(( CONN_ID Idx ));
|
||||
|
@ -134,7 +134,7 @@ static void
|
|||
cb_listen(int sock, short irrelevant)
|
||||
{
|
||||
(void) irrelevant;
|
||||
(void) New_Connection(sock);
|
||||
(void) New_Connection(sock, false);
|
||||
}
|
||||
|
||||
|
||||
|
@ -152,7 +152,7 @@ cb_listen_ssl(int sock, short irrelevant)
|
|||
int fd;
|
||||
|
||||
(void) irrelevant;
|
||||
fd = New_Connection(sock);
|
||||
fd = New_Connection(sock, true);
|
||||
if (fd < 0)
|
||||
return;
|
||||
io_event_setcb(My_Connections[fd].sock, cb_clientserver_ssl);
|
||||
|
@ -1362,17 +1362,18 @@ Count_Connections(ng_ipaddr_t *a)
|
|||
* Initialize new client connection on a listening socket.
|
||||
*
|
||||
* @param Sock Listening socket descriptor.
|
||||
* @param IsSSL true if this socket expects SSL-encrypted data.
|
||||
* @returns Accepted socket descriptor or -1 on error.
|
||||
*/
|
||||
static int
|
||||
New_Connection(int Sock)
|
||||
New_Connection(int Sock, bool IsSSL)
|
||||
{
|
||||
#ifdef TCPWRAP
|
||||
struct request_info req;
|
||||
#endif
|
||||
ng_ipaddr_t new_addr;
|
||||
char ip_str[NG_INET_ADDRSTRLEN];
|
||||
int new_sock, new_sock_len, identsock;
|
||||
int new_sock, new_sock_len;
|
||||
CLIENT *c;
|
||||
long cnt;
|
||||
|
||||
|
@ -1492,33 +1493,58 @@ New_Connection(int Sock)
|
|||
Log(LOG_INFO, "Accepted connection %d from %s:%d on socket %d.",
|
||||
new_sock, My_Connections[new_sock].host,
|
||||
ng_ipaddr_getport(&new_addr), Sock);
|
||||
|
||||
identsock = new_sock;
|
||||
#ifdef IDENTAUTH
|
||||
if (!Conf_Ident)
|
||||
identsock = -1;
|
||||
#endif
|
||||
if (Conf_DNS) {
|
||||
if (Conf_NoticeAuth) {
|
||||
#ifdef IDENTAUTH
|
||||
if (Conf_Ident)
|
||||
(void)Conn_WriteStr(new_sock,
|
||||
"NOTICE AUTH :*** Looking up your hostname and checking ident");
|
||||
else
|
||||
#endif
|
||||
(void)Conn_WriteStr(new_sock,
|
||||
"NOTICE AUTH :*** Looking up your hostname");
|
||||
(void)Handle_Write(new_sock);
|
||||
}
|
||||
Resolve_Addr(&My_Connections[new_sock].proc_stat, &new_addr,
|
||||
identsock, cb_Read_Resolver_Result);
|
||||
}
|
||||
|
||||
Account_Connection();
|
||||
|
||||
#ifdef SSL_SUPPORT
|
||||
/* Delay connection initalization until SSL handshake is finished */
|
||||
if (!IsSSL)
|
||||
#endif
|
||||
Conn_StartLogin(new_sock);
|
||||
|
||||
return new_sock;
|
||||
} /* New_Connection */
|
||||
|
||||
|
||||
/**
|
||||
* Finish connection initialization, start resolver subprocess.
|
||||
*
|
||||
* @param Idx Connection index.
|
||||
*/
|
||||
GLOBAL void
|
||||
Conn_StartLogin(CONN_ID Idx)
|
||||
{
|
||||
int ident_sock = -1;
|
||||
|
||||
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)
|
||||
ident_sock = My_Connections[Idx].sock;
|
||||
#endif
|
||||
|
||||
if (Conf_NoticeAuth) {
|
||||
/* Send "NOTICE AUTH" messages to the client */
|
||||
#ifdef IDENTAUTH
|
||||
if (Conf_Ident)
|
||||
(void)Conn_WriteStr(Idx,
|
||||
"NOTICE AUTH :*** Looking up your hostname and checking ident");
|
||||
else
|
||||
#endif
|
||||
(void)Conn_WriteStr(Idx,
|
||||
"NOTICE AUTH :*** Looking up your hostname");
|
||||
(void)Handle_Write(Idx);
|
||||
}
|
||||
|
||||
Resolve_Addr(&My_Connections[Idx].proc_stat, &My_Connections[Idx].addr,
|
||||
ident_sock, cb_Read_Resolver_Result);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Update global connection counters.
|
||||
*/
|
||||
|
|
|
@ -101,6 +101,8 @@ GLOBAL CONNECTION *My_Connections;
|
|||
GLOBAL CONN_ID Pool_Size;
|
||||
GLOBAL long WCounter;
|
||||
|
||||
#define CONNECTION2ID(x) (long)(x - My_Connections)
|
||||
|
||||
#endif /* CONN_MODULE */
|
||||
|
||||
|
||||
|
@ -112,6 +114,8 @@ GLOBAL void Conn_CloseAllSockets PARAMS((int ExceptOf));
|
|||
GLOBAL unsigned int Conn_InitListeners PARAMS(( void ));
|
||||
GLOBAL void Conn_ExitListeners PARAMS(( void ));
|
||||
|
||||
GLOBAL void Conn_StartLogin PARAMS((CONN_ID Idx));
|
||||
|
||||
GLOBAL void Conn_Handler PARAMS(( void ));
|
||||
|
||||
GLOBAL bool Conn_WriteStr PARAMS(( CONN_ID Idx, const char *Format, ... ));
|
||||
|
|
Loading…
Reference in New Issue