From 12c6634050984e3a7da472b603ddb63e7c7500c8 Mon Sep 17 00:00:00 2001 From: Wilmer van der Gaast Date: Sat, 17 Dec 2005 11:06:52 +0100 Subject: BitlBee now sends a (hopefully correct) 005 reply on connect. --- irc.c | 1 + 1 file changed, 1 insertion(+) (limited to 'irc.c') diff --git a/irc.c b/irc.c index 29ac2a11..61d78bc9 100644 --- a/irc.c +++ b/irc.c @@ -1075,6 +1075,7 @@ void irc_login( irc_t *irc ) irc_reply( irc, 2, ":Host %s is running BitlBee " BITLBEE_VERSION " " ARCH "/" CPU ".", irc->myhost ); irc_reply( irc, 3, ":%s", IRCD_INFO ); irc_reply( irc, 4, "%s %s %s %s", irc->myhost, BITLBEE_VERSION, UMODES, CMODES ); + irc_reply( irc, 5, "PREFIX=(ov)@% CHANTYPES=#& CHANMODES=,,,%s NICKLEN=%d NETWORK=BitlBee CASEMAPPING=rfc1459 MAXTARGETS=1 WATCH=128 :are supported by this server", CMODES, MAX_NICK_LENGTH - 1 ); irc_motd( irc ); irc_umode_set( irc, irc->myhost, "+" UMODE ); -- cgit v1.2.3 From 43f205b144412ab1186a545321b54792d92d2043 Mon Sep 17 00:00:00 2001 From: Wilmer van der Gaast Date: Sun, 18 Dec 2005 02:06:11 +0100 Subject: Crashbug fix in new MSN Passport code (plus a fix to make the 005 reply actually work). --- irc.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'irc.c') diff --git a/irc.c b/irc.c index 61d78bc9..cd84e3ca 100644 --- a/irc.c +++ b/irc.c @@ -1075,7 +1075,7 @@ void irc_login( irc_t *irc ) irc_reply( irc, 2, ":Host %s is running BitlBee " BITLBEE_VERSION " " ARCH "/" CPU ".", irc->myhost ); irc_reply( irc, 3, ":%s", IRCD_INFO ); irc_reply( irc, 4, "%s %s %s %s", irc->myhost, BITLBEE_VERSION, UMODES, CMODES ); - irc_reply( irc, 5, "PREFIX=(ov)@% CHANTYPES=#& CHANMODES=,,,%s NICKLEN=%d NETWORK=BitlBee CASEMAPPING=rfc1459 MAXTARGETS=1 WATCH=128 :are supported by this server", CMODES, MAX_NICK_LENGTH - 1 ); + irc_reply( irc, 5, "PREFIX=(ov)@%% CHANTYPES=#& CHANMODES=,,,%s NICKLEN=%d NETWORK=BitlBee CASEMAPPING=rfc1459 MAXTARGETS=1 WATCH=128 :are supported by this server", CMODES, MAX_NICK_LENGTH - 1 ); irc_motd( irc ); irc_umode_set( irc, irc->myhost, "+" UMODE ); -- cgit v1.2.3 From 578d627c65491cba8ac6a0bb0f2d05147bf87535 Mon Sep 17 00:00:00 2001 From: Wilmer van der Gaast Date: Sun, 18 Dec 2005 12:48:25 +0100 Subject: *Oops* The 005 reply sent % as the prefix for voiced people instead of +... --- irc.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'irc.c') diff --git a/irc.c b/irc.c index cd84e3ca..19b14668 100644 --- a/irc.c +++ b/irc.c @@ -1075,7 +1075,7 @@ void irc_login( irc_t *irc ) irc_reply( irc, 2, ":Host %s is running BitlBee " BITLBEE_VERSION " " ARCH "/" CPU ".", irc->myhost ); irc_reply( irc, 3, ":%s", IRCD_INFO ); irc_reply( irc, 4, "%s %s %s %s", irc->myhost, BITLBEE_VERSION, UMODES, CMODES ); - irc_reply( irc, 5, "PREFIX=(ov)@%% CHANTYPES=#& CHANMODES=,,,%s NICKLEN=%d NETWORK=BitlBee CASEMAPPING=rfc1459 MAXTARGETS=1 WATCH=128 :are supported by this server", CMODES, MAX_NICK_LENGTH - 1 ); + irc_reply( irc, 5, "PREFIX=(ov)@+ CHANTYPES=#& CHANMODES=,,,%s NICKLEN=%d NETWORK=BitlBee CASEMAPPING=rfc1459 MAXTARGETS=1 WATCH=128 :are supported by this server", CMODES, MAX_NICK_LENGTH - 1 ); irc_motd( irc ); irc_umode_set( irc, irc->myhost, "+" UMODE ); -- cgit v1.2.3 From d25f6fcbe8e291dd858bf734fa85cde176dc8415 Mon Sep 17 00:00:00 2001 From: Wilmer van der Gaast Date: Mon, 26 Dec 2005 15:02:47 +0100 Subject: Added OperPassword and RunMode = ForkDaemon settings. Oper stuff is *INSECURE* because users can just do /mode +o to become operator. --- irc.c | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) (limited to 'irc.c') diff --git a/irc.c b/irc.c index 19b14668..f9dfea8a 100644 --- a/irc.c +++ b/irc.c @@ -263,7 +263,7 @@ void irc_free(irc_t * irc) } g_free(irc); - if( global.conf->runmode == RUNMODE_INETD ) + if( global.conf->runmode == RUNMODE_INETD || global.conf->runmode == RUNMODE_FORKDAEMON ) g_main_quit( global.loop ); } @@ -421,7 +421,7 @@ int irc_exec( irc_t *irc, char **cmd ) { irc_reply( irc, 461, "%s :Need more parameters", cmd[0] ); } - else if( strcmp( cmd[1], (global.conf)->password ) == 0 ) + else if( strcmp( cmd[1], (global.conf)->auth_pass ) == 0 ) { irc->status = USTATUS_AUTHORIZED; } @@ -500,6 +500,15 @@ int irc_exec( irc_t *irc, char **cmd ) { irc_write( irc, ":%s PONG %s :%s", irc->myhost, irc->myhost, cmd[1]?cmd[1]:irc->myhost ); } + else if( g_strcasecmp( cmd[0], "OPER" ) == 0 ) + { + if( !cmd[2] ) + irc_reply( irc, 461, "%s :Need more parameters", cmd[0] ); + else if( strcmp( cmd[2], global.conf->oper_pass ) == 0 ) + irc_umode_set( irc, irc->nick, "+o" ); + // else + /* FIXME/TODO: Find out which reply to send now. */ + } else if( g_strcasecmp( cmd[0], "MODE" ) == 0 ) { if( !cmd[1] ) -- cgit v1.2.3 From 238f828cb3524a2a09337d7502cc6db9556fc67a Mon Sep 17 00:00:00 2001 From: Wilmer van der Gaast Date: Mon, 26 Dec 2005 15:42:54 +0100 Subject: Fixed that security hole, and added mode +R (don't know if that's the right one). Now to add the actual oper features (and IPC). :-) --- irc.c | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-) (limited to 'irc.c') diff --git a/irc.c b/irc.c index f9dfea8a..7453093d 100644 --- a/irc.c +++ b/irc.c @@ -505,7 +505,7 @@ int irc_exec( irc_t *irc, char **cmd ) if( !cmd[2] ) irc_reply( irc, 461, "%s :Need more parameters", cmd[0] ); else if( strcmp( cmd[2], global.conf->oper_pass ) == 0 ) - irc_umode_set( irc, irc->nick, "+o" ); + irc_umode_set( irc, "+o", 1 ); // else /* FIXME/TODO: Find out which reply to send now. */ } @@ -532,7 +532,7 @@ int irc_exec( irc_t *irc, char **cmd ) if( nick_cmp( cmd[1], irc->nick ) == 0 ) { if( cmd[2] ) - irc_umode_set( irc, irc->nick, cmd[2] ); + irc_umode_set( irc, cmd[2], 0 ); } else irc_reply( irc, 502, ":Don't touch their modes" ); @@ -1083,10 +1083,10 @@ void irc_login( irc_t *irc ) irc_reply( irc, 1, ":Welcome to the BitlBee gateway, %s", irc->nick ); irc_reply( irc, 2, ":Host %s is running BitlBee " BITLBEE_VERSION " " ARCH "/" CPU ".", irc->myhost ); irc_reply( irc, 3, ":%s", IRCD_INFO ); - irc_reply( irc, 4, "%s %s %s %s", irc->myhost, BITLBEE_VERSION, UMODES, CMODES ); + irc_reply( irc, 4, "%s %s %s %s", irc->myhost, BITLBEE_VERSION, UMODES UMODES_PRIV, CMODES ); irc_reply( irc, 5, "PREFIX=(ov)@+ CHANTYPES=#& CHANMODES=,,,%s NICKLEN=%d NETWORK=BitlBee CASEMAPPING=rfc1459 MAXTARGETS=1 WATCH=128 :are supported by this server", CMODES, MAX_NICK_LENGTH - 1 ); irc_motd( irc ); - irc_umode_set( irc, irc->myhost, "+" UMODE ); + irc_umode_set( irc, "+" UMODE, 1 ); u = user_add( irc, irc->mynick ); u->host = g_strdup( irc->myhost ); @@ -1213,8 +1213,10 @@ void irc_whois( irc_t *irc, char *nick ) } -void irc_umode_set( irc_t *irc, char *who, char *s ) +void irc_umode_set( irc_t *irc, char *s, int allow_priv ) { + /* allow_priv: Set to 0 if s contains user input, 1 if you want + to set a "privileged" mode (+o, +R, etc). */ char m[256], st = 1, *t; int i; @@ -1227,14 +1229,14 @@ void irc_umode_set( irc_t *irc, char *who, char *s ) { if( *t == '+' || *t == '-' ) st = *t == '+'; - else + else if( st == 0 || ( strchr( UMODES, *t ) || ( allow_priv && strchr( UMODES_PRIV, *t ) ) ) ) m[(int)*t] = st; } memset( irc->umode, 0, sizeof( irc->umode ) ); for( i = 0; i < 256 && strlen( irc->umode ) < ( sizeof( irc->umode ) - 1 ); i ++ ) - if( m[i] && strchr( UMODES, i ) ) + if( m[i] ) irc->umode[strlen(irc->umode)] = i; irc_reply( irc, 221, "+%s", irc->umode ); -- cgit v1.2.3 From e4d62711995840def3a2d51f62923d95cb368cee Mon Sep 17 00:00:00 2001 From: Wilmer van der Gaast Date: Tue, 27 Dec 2005 15:39:32 +0100 Subject: IPv6 socket improvements. Daemon mode can now also listen on IPv6 sockets. Also, when reverse lookup fails, BitlBee now correctly falls back to an ASCII-formatted IP instead of "localhost.". --- irc.c | 50 +++++++++++++++++++++++++++++--------------------- 1 file changed, 29 insertions(+), 21 deletions(-) (limited to 'irc.c') diff --git a/irc.c b/irc.c index 7453093d..9cba7f6e 100644 --- a/irc.c +++ b/irc.c @@ -39,14 +39,17 @@ static char *passchange (irc_t *irc, void *set, char *value) irc_t *irc_new( int fd ) { - irc_t *irc = g_new0( irc_t, 1 ); - - struct sockaddr_in sock[1]; + irc_t *irc; + struct hostent *peer; + unsigned int i; + char buf[128]; #ifdef IPV6 - struct sockaddr_in6 sock6[1]; + struct sockaddr_in6 sock[1]; +#else + struct sockaddr_in sock[1]; #endif - struct hostent *peer; - unsigned int i, j; + + irc = g_new0( irc_t, 1 ); irc->fd = fd; irc->io_channel = g_io_channel_unix_new( fd ); @@ -70,38 +73,43 @@ irc_t *irc_new( int fd ) irc->channel = g_strdup( ROOT_CHAN ); i = sizeof( *sock ); -#ifdef IPV6 - j = sizeof( *sock6 ); -#endif + if( global.conf->hostname ) irc->myhost = g_strdup( global.conf->hostname ); - else if( getsockname( irc->fd, (struct sockaddr*) sock, &i ) == 0 && sock->sin_family == AF_INET ) +#ifdef IPV6 + else if( getsockname( irc->fd, (struct sockaddr*) sock, &i ) == 0 && sock->sin6_family == AF_INETx ) { - if( ( peer = gethostbyaddr( (char*) &sock->sin_addr, sizeof( sock->sin_addr ), AF_INET ) ) ) + if( ( peer = gethostbyaddr( (char*) &sock->sin6_addr, sizeof( sock->sin6_addr ), AF_INETx ) ) ) irc->myhost = g_strdup( peer->h_name ); + else if( inet_ntop( AF_INETx, &sock->sin6_addr, buf, sizeof( buf ) - 1 ) != NULL ) + irc->myhost = g_strdup( buf ); } -#ifdef IPV6 - else if( getsockname( irc->fd, (struct sockaddr*) sock6, &j ) == 0 && sock6->sin6_family == AF_INET6 ) +#else + else if( getsockname( irc->fd, (struct sockaddr*) sock, &i ) == 0 && sock->sin_family == AF_INETx ) { - if( ( peer = gethostbyaddr( (char*) &sock6->sin6_addr, sizeof( sock6->sin6_addr ), AF_INET6 ) ) ) + if( ( peer = gethostbyaddr( (char*) &sock->sin_addr, sizeof( sock->sin_addr ), AF_INETx ) ) ) irc->myhost = g_strdup( peer->h_name ); + else if( inet_ntop( AF_INETx, &sock->sin_addr, buf, sizeof( buf ) - 1 ) != NULL ) + irc->myhost = g_strdup( buf ); } #endif i = sizeof( *sock ); #ifdef IPV6 - j = sizeof( *sock6 ); -#endif - if( getpeername( irc->fd, (struct sockaddr*) sock, &i ) == 0 && sock->sin_family == AF_INET ) + if( getpeername( irc->fd, (struct sockaddr*) sock, &i ) == 0 && sock->sin6_family == AF_INETx ) { - if( ( peer = gethostbyaddr( (char*) &sock->sin_addr, sizeof( sock->sin_addr ), AF_INET ) ) ) + if( ( peer = gethostbyaddr( (char*) &sock->sin6_addr, sizeof( sock->sin6_addr ), AF_INETx ) ) ) irc->host = g_strdup( peer->h_name ); + else if( inet_ntop( AF_INETx, &sock->sin6_addr, buf, sizeof( buf ) - 1 ) != NULL ) + irc->host = g_strdup( buf ); } -#ifdef IPV6 - else if( getpeername( irc->fd, (struct sockaddr*) sock6, &j ) == 0 && sock6->sin6_family == AF_INET6 ) +#else + if( getpeername( irc->fd, (struct sockaddr*) sock, &i ) == 0 && sock->sin_family == AF_INETx ) { - if( ( peer = gethostbyaddr( (char*) &sock6->sin6_addr, sizeof( sock6->sin6_addr ), AF_INET6 ) ) ) + if( ( peer = gethostbyaddr( (char*) &sock->sin_addr, sizeof( sock->sin_addr ), AF_INETx ) ) ) irc->host = g_strdup( peer->h_name ); + else if( inet_ntop( AF_INETx, &sock->sin_addr, buf, sizeof( buf ) - 1 ) != NULL ) + irc->host = g_strdup( buf ); } #endif -- cgit v1.2.3 From 2a6ca4f4d8c8ec86b8bb38442189c85a001a5f6c Mon Sep 17 00:00:00 2001 From: Wilmer van der Gaast Date: Wed, 4 Jan 2006 12:16:58 +0100 Subject: Better handling of IPv4 connections in IPv6 mode. (Wrapping/Unwrapping of ::ffff:style addresses.) --- irc.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) (limited to 'irc.c') diff --git a/irc.c b/irc.c index 9cba7f6e..8842ec41 100644 --- a/irc.c +++ b/irc.c @@ -82,7 +82,7 @@ irc_t *irc_new( int fd ) if( ( peer = gethostbyaddr( (char*) &sock->sin6_addr, sizeof( sock->sin6_addr ), AF_INETx ) ) ) irc->myhost = g_strdup( peer->h_name ); else if( inet_ntop( AF_INETx, &sock->sin6_addr, buf, sizeof( buf ) - 1 ) != NULL ) - irc->myhost = g_strdup( buf ); + irc->myhost = g_strdup( ipv6_unwrap( buf ) ); } #else else if( getsockname( irc->fd, (struct sockaddr*) sock, &i ) == 0 && sock->sin_family == AF_INETx ) @@ -101,7 +101,7 @@ irc_t *irc_new( int fd ) if( ( peer = gethostbyaddr( (char*) &sock->sin6_addr, sizeof( sock->sin6_addr ), AF_INETx ) ) ) irc->host = g_strdup( peer->h_name ); else if( inet_ntop( AF_INETx, &sock->sin6_addr, buf, sizeof( buf ) - 1 ) != NULL ) - irc->host = g_strdup( buf ); + irc->host = g_strdup( ipv6_unwrap( buf ) ); } #else if( getpeername( irc->fd, (struct sockaddr*) sock, &i ) == 0 && sock->sin_family == AF_INETx ) @@ -113,6 +113,7 @@ irc_t *irc_new( int fd ) } #endif + /* Rare, but possible. */ if( !irc->host ) irc->host = g_strdup( "localhost." ); if( !irc->myhost ) irc->myhost = g_strdup( "localhost." ); -- cgit v1.2.3 From 4fe4be2723eba3b7f3640396a1c8fa80b39fe2ab Mon Sep 17 00:00:00 2001 From: Wilmer van der Gaast Date: Tue, 10 Jan 2006 15:20:48 +0100 Subject: Removed send-flood protection code completely. --- irc.c | 15 --------------- 1 file changed, 15 deletions(-) (limited to 'irc.c') diff --git a/irc.c b/irc.c index 8842ec41..32dadb7c 100644 --- a/irc.c +++ b/irc.c @@ -940,21 +940,6 @@ void irc_vawrite( irc_t *irc, char *format, va_list params ) if( irc->sendbuffer != NULL ) { size = strlen( irc->sendbuffer ) + strlen( line ); -#ifdef FLOOD_SEND - if( size > FLOOD_SEND_MAXBUFFER ) { - /* Die flooder, die! >:) */ - - g_free(irc->sendbuffer); - - /* We need the \r\n at the start because else we might append our string to a half - * sent line. A bit hackish, but it works. - */ - irc->sendbuffer = g_strdup( "\r\nERROR :Sendq Exceeded\r\n" ); - irc->quit = 1; - - return; - } -#endif irc->sendbuffer = g_renew ( char, irc->sendbuffer, size + 1 ); strcpy( ( irc->sendbuffer + strlen( irc->sendbuffer ) ), line ); } -- cgit v1.2.3