aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorWilmer van der Gaast <wilmer@gaast.net>2008-03-29 22:19:17 +0000
committerWilmer van der Gaast <wilmer@gaast.net>2008-03-29 22:19:17 +0000
commita199d33ed818820ffba328f718799bbd77392f6a (patch)
treed01fe78e41871dd73f35dfe4e87d91cfc54f466e
parent89681335303b1118eda246c901f3c99470de19fc (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.c17
-rw-r--r--irc.h4
-rw-r--r--irc_commands.c24
3 files changed, 40 insertions, 5 deletions
diff --git a/irc.c b/irc.c
index 3589256e..fa0c03fe 100644
--- a/irc.c
+++ b/irc.c
@@ -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 )
diff --git a/irc.h b/irc.h
index eb70ad1c..eaf531b7 100644
--- a/irc.h
+++ b/irc.h
@@ -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 },