aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorWilmer van der Gaast <wilmer@gaast.net>2005-12-26 15:42:54 +0100
committerWilmer van der Gaast <wilmer@gaast.net>2005-12-26 15:42:54 +0100
commit238f828cb3524a2a09337d7502cc6db9556fc67a (patch)
tree7bb7abcda5525d0b4ed7445dd5368783c464ecdd
parentd25f6fcbe8e291dd858bf734fa85cde176dc8415 (diff)
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). :-)
-rw-r--r--commands.c4
-rw-r--r--irc.c16
-rw-r--r--irc.h5
3 files changed, 16 insertions, 9 deletions
diff --git a/commands.c b/commands.c
index fe1607c4..764706e4 100644
--- a/commands.c
+++ b/commands.c
@@ -96,6 +96,7 @@ int cmd_identify( irc_t *irc, char **cmd )
break;
case STORAGE_OK:
irc_usermsg( irc, "Password accepted" );
+ irc_umode_set( irc, "+R", 1 );
break;
default:
irc_usermsg( irc, "Something very weird happened" );
@@ -121,6 +122,7 @@ int cmd_register( irc_t *irc, char **cmd )
case STORAGE_OK:
irc->status = USTATUS_IDENTIFIED;
+ irc_umode_set( irc, "+R", 1 );
break;
default:
@@ -145,6 +147,8 @@ int cmd_drop( irc_t *irc, char **cmd )
return( 0 );
case STORAGE_OK:
irc_setpass( irc, NULL );
+ irc->status = USTATUS_LOGGED_IN;
+ irc_umode_set( irc, "-R", 1 );
irc_usermsg( irc, "Account `%s' removed", irc->nick );
return( 0 );
default:
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 );
diff --git a/irc.h b/irc.h
index 21ef63db..affeaa44 100644
--- a/irc.h
+++ b/irc.h
@@ -39,7 +39,8 @@
#define FLOOD_SEND_BYTES (1024*10)
#define FLOOD_SEND_MAXBUFFER (1024*20)
-#define UMODES "aiso"
+#define UMODES "ias"
+#define UMODES_PRIV "Ro"
#define CMODES "nt"
#define CMODE "t"
#define UMODE "s"
@@ -126,7 +127,7 @@ void irc_login( irc_t *irc );
void irc_motd( irc_t *irc );
void irc_names( irc_t *irc, char *channel );
void irc_topic( irc_t *irc, char *channel );
-void irc_umode_set( irc_t *irc, char *who, char *s );
+void irc_umode_set( irc_t *irc, char *s, int allow_priv );
void irc_who( irc_t *irc, char *channel );
void irc_spawn( irc_t *irc, user_t *u );
void irc_join( irc_t *irc, user_t *u, char *channel );