diff options
| author | Wilmer van der Gaast <wilmer@gaast.net> | 2008-03-29 22:19:17 +0000 | 
|---|---|---|
| committer | Wilmer van der Gaast <wilmer@gaast.net> | 2008-03-29 22:19:17 +0000 | 
| commit | a199d33ed818820ffba328f718799bbd77392f6a (patch) | |
| tree | d01fe78e41871dd73f35dfe4e87d91cfc54f466e | |
| parent | 89681335303b1118eda246c901f3c99470de19fc (diff) | |
Closing bug #209: The PASS command can now be used to identify yourself
to BitlBee. The advantage: No more messing with NickServ hooks. Just set
a server password.
| -rw-r--r-- | irc.c | 17 | ||||
| -rw-r--r-- | irc.h | 4 | ||||
| -rw-r--r-- | irc_commands.c | 24 | 
3 files changed, 40 insertions, 5 deletions
| @@ -735,12 +735,27 @@ void irc_login( irc_t *irc )  	u->online = 1;  	irc_spawn( irc, u ); -	irc_usermsg( irc, "Welcome to the BitlBee gateway!\n\nIf you've never used BitlBee before, please do read the help information using the \x02help\x02 command. Lots of FAQs are answered there." ); +	irc_usermsg( irc, "Welcome to the BitlBee gateway!\n\n" +	                  "If you've never used BitlBee before, please do read the help " +	                  "information using the \x02help\x02 command. Lots of FAQs are " +	                  "answered there.\n" +	                  "If you already have an account on this server, just use the " +	                  "\x02identify\x02 command to identify yourself." );  	if( global.conf->runmode == RUNMODE_FORKDAEMON || global.conf->runmode == RUNMODE_DAEMON )  		ipc_to_master_str( "CLIENT %s %s :%s\r\n", irc->host, irc->nick, irc->realname );  	irc->status |= USTATUS_LOGGED_IN; +	 +	/* This is for bug #209 (use PASS to identify to NickServ). */ +	if( irc->password != NULL ) +	{ +		char *send_cmd[] = { "identify", g_strdup( irc->password ), NULL }; +		 +		irc_setpass( irc, NULL ); +		root_command( irc, send_cmd ); +		g_free( send_cmd[1] ); +	}  }  void irc_motd( irc_t *irc ) @@ -68,7 +68,9 @@ typedef struct irc  	char *user;  	char *host;  	char *realname; -	char *password; +	char *password; /* HACK: Used to save the user's password, but before +	                   logging in, this may contain a password we should +	                   send to identify after USER/NICK are received. */  	char umode[8]; diff --git a/irc_commands.c b/irc_commands.c index b8bae541..61517614 100644 --- a/irc_commands.c +++ b/irc_commands.c @@ -29,7 +29,19 @@  static void irc_cmd_pass( irc_t *irc, char **cmd )  { -	if( global.conf->auth_pass && +	if( irc->status & USTATUS_LOGGED_IN ) +	{ +		char *send_cmd[] = { "identify", cmd[1], NULL }; +		 +		/* We're already logged in, this client seems to send the PASS +		   command last. (Possibly it won't send it at all if it turns +		   out we don't require it, which will break this feature.) +		   Try to identify using the given password. */ +		return root_command( irc, send_cmd ); +	} +	/* Handling in pre-logged-in state, first see if this server is +	   password-protected: */ +	else if( global.conf->auth_pass &&  	    ( strncmp( global.conf->auth_pass, "md5:", 4 ) == 0 ?  	        md5_verify_password( cmd[1], global.conf->auth_pass + 4 ) == 0 :  	        strcmp( cmd[1], global.conf->auth_pass ) == 0 ) ) @@ -37,10 +49,16 @@ static void irc_cmd_pass( irc_t *irc, char **cmd )  		irc->status |= USTATUS_AUTHORIZED;  		irc_check_login( irc );  	} -	else +	else if( global.conf->auth_pass )  	{  		irc_reply( irc, 464, ":Incorrect password" );  	} +	else +	{ +		/* Remember the password and try to identify after USER/NICK. */ +		irc_setpass( irc, cmd[1] ); +		irc_check_login( irc ); +	}  }  static void irc_cmd_user( irc_t *irc, char **cmd ) @@ -580,7 +598,7 @@ static void irc_cmd_rehash( irc_t *irc, char **cmd )  }  static const command_t irc_commands[] = { -	{ "pass",        1, irc_cmd_pass,        IRC_CMD_PRE_LOGIN }, +	{ "pass",        1, irc_cmd_pass,        0 },  	{ "user",        4, irc_cmd_user,        IRC_CMD_PRE_LOGIN },  	{ "nick",        1, irc_cmd_nick,        0 },  	{ "quit",        0, irc_cmd_quit,        0 }, | 
