X-Git-Url: https://arthur.barton.de/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=src%2Fngircd%2Firc-mode.c;h=cf6354171df7a454dbd704163b0a146e90673729;hb=f179070113dd04340b41b18efe9227dd5af40d99;hp=4827c03fbdebd41b3742527a994963b03ce5d960;hpb=695631b2984111a825346396dc56635a2fe3a7c4;p=ngircd-alex.git diff --git a/src/ngircd/irc-mode.c b/src/ngircd/irc-mode.c index 4827c03f..cf635417 100644 --- a/src/ngircd/irc-mode.c +++ b/src/ngircd/irc-mode.c @@ -14,7 +14,7 @@ #include "portab.h" -static char UNUSED id[] = "$Id: irc-mode.c,v 1.26 2002/12/26 17:04:54 alex Exp $"; +static char UNUSED id[] = "$Id: irc-mode.c,v 1.31 2003/01/21 21:04:16 alex Exp $"; #include "imp.h" #include @@ -157,7 +157,11 @@ Client_Mode( CLIENT *Client, REQUEST *Req, CLIENT *Origin, CLIENT *Target ) { case 'a': /* Away */ - if( Client_Type( Client ) == CLIENT_SERVER ) x[0] = 'a'; + if( Client_Type( Client ) == CLIENT_SERVER ) + { + x[0] = 'a'; + Client_SetAway( Client, DEFAULT_AWAY_MSG ); + } else ok = IRC_WriteStrClient( Origin, ERR_NOPRIVILEGES_MSG, Client_ID( Origin )); break; case 'i': @@ -243,11 +247,42 @@ Channel_Mode( CLIENT *Client, REQUEST *Req, CLIENT *Origin, CHANNEL *Channel ) LONG l; /* Mode request: let's answer it :-) */ - if( Req->argc == 1 ) return IRC_WriteStrClient( Origin, RPL_CHANNELMODEIS_MSG, Client_ID( Origin ), Channel_Name( Channel ), Channel_Modes( Channel )); + if( Req->argc == 1 ) + { + /* Member or not? -- That's the question! */ + if( ! Channel_IsMemberOf( Channel, Origin )) return IRC_WriteStrClient( Origin, RPL_CHANNELMODEIS_MSG, Client_ID( Origin ), Channel_Name( Channel ), Channel_Modes( Channel )); + + /* The sender is a member: generate extended reply */ + strlcpy( the_modes, Channel_Modes( Channel ), sizeof( the_modes )); + mode_ptr = the_modes; + strcpy( the_args, "" ); + while( *mode_ptr ) + { + switch( *mode_ptr ) + { + case 'l': + snprintf( argadd, sizeof( argadd ), " %ld", Channel_MaxUsers( Channel )); + strlcat( the_args, argadd, sizeof( the_args )); + break; + case 'k': + strlcat( the_args, " ", sizeof( the_args )); + strlcat( the_args, Channel_Key( Channel ), sizeof( the_args )); + break; + } + mode_ptr++; + } + if( the_args[0] ) strlcat( the_modes, the_args, sizeof( the_modes )); + + return IRC_WriteStrClient( Origin, RPL_CHANNELMODEIS_MSG, Client_ID( Origin ), Channel_Name( Channel ), the_modes ); + } /* Is the user allowed to change modes? */ if( Client_Type( Client ) == CLIENT_USER ) { + /* Is the originating user on that channel? */ + if( ! Channel_IsMemberOf( Channel, Origin )) return IRC_WriteStrClient( Origin, ERR_NOTONCHANNEL_MSG, Client_ID( Origin ), Channel_Name( Channel )); + + /* Is he channel operator? */ if( strchr( Channel_UserModes( Channel, Origin ), 'o' )) modeok = TRUE; else modeok = FALSE; if( Conf_OperCanMode ) @@ -418,7 +453,7 @@ Channel_Mode( CLIENT *Client, REQUEST *Req, CLIENT *Origin, CHANNEL *Channel ) { Channel_ModeDel( Channel, 'l' ); Channel_SetMaxUsers( Channel, l ); - sprintf( argadd, "%ld", l ); + snprintf( argadd, sizeof( argadd ), "%ld", l ); x[0] = *mode_ptr; } } @@ -474,6 +509,13 @@ Channel_Mode( CLIENT *Client, REQUEST *Req, CLIENT *Origin, CHANNEL *Channel ) /* Is there a valid mode change? */ if( ! x[0] ) continue; + /* Validate target client */ + if( client && ( ! Channel_IsMemberOf( Channel, client ))) + { + if( ! IRC_WriteStrClient( Origin, ERR_USERNOTINCHANNEL_MSG, Client_ID( Origin ), Client_ID( client ), Channel_Name( Channel ))) break; + continue; + } + if( set ) { /* Set mode */ @@ -573,13 +615,14 @@ IRC_AWAY( CLIENT *Client, REQUEST *Req ) { /* AWAY setzen */ Client_SetAway( Client, Req->argv[0] ); + Client_ModeAdd( Client, 'a' ); IRC_WriteStrServersPrefix( Client, Client, "MODE %s :+a", Client_ID( Client )); return IRC_WriteStrClient( Client, RPL_NOWAWAY_MSG, Client_ID( Client )); } else { /* AWAY loeschen */ - Client_SetAway( Client, NULL ); + Client_ModeDel( Client, 'a' ); IRC_WriteStrServersPrefix( Client, Client, "MODE %s :-a", Client_ID( Client )); return IRC_WriteStrClient( Client, RPL_UNAWAY_MSG, Client_ID( Client )); }