X-Git-Url: https://arthur.barton.de/cgi-bin/gitweb.cgi?p=ngircd-alex.git;a=blobdiff_plain;f=src%2Fngircd%2Fconn.c;h=8fd162b7122eee89c37ca319e8d2cafb71ebb16a;hp=f743d1f81b2331a81a3cbcc6bbbf9ca99b645b58;hb=864015fa3ff42a026b90e39f73fb9d5f6eaab826;hpb=5a200e154347bde2a885ad1ede620d8d946b6420 diff --git a/src/ngircd/conn.c b/src/ngircd/conn.c index f743d1f8..8fd162b7 100644 --- a/src/ngircd/conn.c +++ b/src/ngircd/conn.c @@ -1,6 +1,6 @@ /* * ngIRCd -- The Next Generation IRC Daemon - * Copyright (c)2001-2011 Alexander Barton (alex@barton.de) and Contributors. + * Copyright (c)2001-2012 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 @@ -82,8 +82,8 @@ #define SERVER_WAIT (NONE - 1) #define MAX_COMMANDS 3 -#define MAX_COMMANDS_SERVER 10 -#define MAX_COMMANDS_SERVICE MAX_COMMANDS_SERVER +#define MAX_COMMANDS_SERVER_MIN 10 +#define MAX_COMMANDS_SERVICE 10 static bool Handle_Write PARAMS(( CONN_ID Idx )); @@ -918,6 +918,30 @@ va_dcl return ok; } /* Conn_WriteStr */ +GLOBAL char* +Conn_Password( CONN_ID Idx ) +{ + assert( Idx > NONE ); + if (My_Connections[Idx].pwd == NULL) + return (char*)"\0"; + else + return My_Connections[Idx].pwd; +} /* Conn_Password */ + +GLOBAL void +Conn_SetPassword( CONN_ID Idx, const char *Pwd ) +{ + assert( Idx > NONE ); + + if (My_Connections[Idx].pwd) + free(My_Connections[Idx].pwd); + + My_Connections[Idx].pwd = strdup(Pwd); + if (My_Connections[Idx].pwd == NULL) { + Log(LOG_EMERG, "Can't allocate memory! [Conn_SetPassword]"); + exit(1); + } +} /* Conn_SetPassword */ /** * Append Data to the outbound write buffer of a connection. @@ -1146,6 +1170,8 @@ Conn_Close( CONN_ID Idx, const char *LogMsg, const char *FwdMsg, bool InformClie array_free(&My_Connections[Idx].rbuf); array_free(&My_Connections[Idx].wbuf); + if (My_Connections[Idx].pwd != NULL) + free(My_Connections[Idx].pwd); /* Clean up connection structure (=free it) */ Init_Conn_Struct( Idx ); @@ -1438,7 +1464,7 @@ New_Connection(int Sock) return -1; } - c = Client_NewLocal(new_sock, ip_str, CLIENT_UNKNOWN, false); + c = Client_NewLocal(new_sock, NULL, CLIENT_UNKNOWN, false); if (!c) { Log(LOG_ALERT, "Can't accept connection: can't create client structure!"); @@ -1482,6 +1508,7 @@ New_Connection(int Sock) #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); @@ -1589,7 +1616,7 @@ Read_Request( CONN_ID Idx ) if (!array_catb(&My_Connections[Idx].zip.rbuf, readbuf, (size_t) len)) { Log(LOG_ERR, - "Could not append recieved data to zip input buffer (connection %d): %d bytes!", + "Could not append received data to zip input buffer (connection %d): %d bytes!", Idx, len); Conn_Close(Idx, "Receive buffer space exhausted", NULL, false); @@ -1600,7 +1627,7 @@ Read_Request( CONN_ID Idx ) { if (!array_catb( &My_Connections[Idx].rbuf, readbuf, len)) { Log(LOG_ERR, - "Could not append recieved data to input buffer (connection %d): %d bytes!", + "Could not append received data to input buffer (connection %d): %d bytes!", Idx, len); Conn_Close(Idx, "Receive buffer space exhausted", NULL, false ); } @@ -1674,16 +1701,15 @@ Handle_Buffer(CONN_ID Idx) assert(c != NULL); - /* Servers do get special command limits, so they can process - * all the messages that are required while peering. */ + /* Servers get special command limits that depend on the user count */ switch (Client_Type(c)) { case CLIENT_SERVER: - /* Allow servers to send more commands in the first 10 secods + maxcmd = (int)(Client_UserCount() / 5) + + MAX_COMMANDS_SERVER_MIN; + /* Allow servers to handle even more commands while peering * to speed up server login and network synchronisation. */ - if (starttime - Client_StartTime(c) < 10) - maxcmd = MAX_COMMANDS_SERVER * 5; - else - maxcmd = MAX_COMMANDS_SERVER; + if (Conn_LastPing(Idx) == 0) + maxcmd *= 5; break; case CLIENT_SERVICE: maxcmd = MAX_COMMANDS_SERVICE; break; @@ -1840,10 +1866,10 @@ Check_Connections(void) if (My_Connections[i].lastping < time(NULL) - Conf_PongTimeout) { /* Timeout */ - LogDebug - ("Connection %d: Ping timeout: %d seconds.", - i, Conf_PongTimeout); - snprintf(msg, sizeof(msg), "Ping timeout: %d seconds", Conf_PongTimeout); + snprintf(msg, sizeof(msg), + "Ping timeout: %d seconds", + Conf_PongTimeout); + LogDebug("Connection %d: %s.", i, msg); Conn_Close(i, NULL, msg, true); } } else if (My_Connections[i].lastdata < @@ -1936,6 +1962,14 @@ New_Server( int Server , ng_ipaddr_t *dest) assert( Server > NONE ); + /* Make sure that the remote server hasn't re-linked to this server + * asynchronously on its own */ + if (Conf_Server[Server].conn_id > NONE) { + Log(LOG_INFO, + "Connection to \"%s\" meanwhile re-established, aborting preparation."); + return; + } + if (!ng_ipaddr_tostr_r(dest, ip_str)) { Log(LOG_WARNING, "New_Server: Could not convert IP to string"); return; @@ -2009,7 +2043,7 @@ New_Server( int Server , ng_ipaddr_t *dest) Client_SetToken( c, TOKEN_OUTBOUND ); /* Register connection */ - Conf_Server[Server].conn_id = new_sock; + Conf_SetServer(Server, new_sock); My_Connections[new_sock].sock = new_sock; My_Connections[new_sock].addr = *dest; My_Connections[new_sock].client = c; @@ -2175,6 +2209,7 @@ cb_Read_Resolver_Result( int r_fd, UNUSED short events ) char *identptr; #ifdef IDENTAUTH char readbuf[HOST_LEN + 2 + CLIENT_USER_LEN]; + char *ptr; #else char readbuf[HOST_LEN + 1]; #endif @@ -2223,15 +2258,37 @@ cb_Read_Resolver_Result( int r_fd, UNUSED short events ) Client_SetHostname(c, readbuf); if (Conf_NoticeAuth) (void)Conn_WriteStr(i, - "NOTICE AUTH :*** Found your hostname"); + "NOTICE AUTH :*** Found your hostname: %s", + My_Connections[i].host); #ifdef IDENTAUTH ++identptr; if (*identptr) { - Log(LOG_INFO, "IDENT lookup for connection %d: \"%s\".", i, identptr); - Client_SetUser(c, identptr, true); - if (Conf_NoticeAuth) + ptr = identptr; + while (*ptr) { + if ((*ptr < '0' || *ptr > '9') && + (*ptr < 'A' || *ptr > 'Z') && + (*ptr < 'a' || *ptr > 'z')) + break; + ptr++; + } + if (*ptr) { + /* Erroneous IDENT reply */ + Log(LOG_NOTICE, + "Got invalid IDENT reply for connection %d! Ignored.", + i); + } else { + Log(LOG_INFO, + "IDENT lookup for connection %d: \"%s\".", + i, identptr); + Client_SetUser(c, identptr, true); + } + if (Conf_NoticeAuth) { (void)Conn_WriteStr(i, - "NOTICE AUTH :*** Got ident response"); + "NOTICE AUTH :*** Got %sident response%s%s", + *ptr ? "invalid " : "", + *ptr ? "" : ": ", + *ptr ? "" : identptr); + } } else { Log(LOG_INFO, "IDENT lookup for connection %d: no result.", i); if (Conf_NoticeAuth && Conf_Ident) @@ -2239,6 +2296,10 @@ cb_Read_Resolver_Result( int r_fd, UNUSED short events ) "NOTICE AUTH :*** No ident response"); } #endif + + if (Conf_NoticeAuth) + (void)Handle_Write(i); + Class_HandleServerBans(c); } #ifdef DEBUG