- fixed broken handling of modes received from other servers.

This commit is contained in:
Alexander Barton 2002-12-16 10:52:53 +00:00
parent 865c43080a
commit 7f61f413f4
1 changed files with 116 additions and 134 deletions

View File

@ -14,7 +14,7 @@
#include "portab.h" #include "portab.h"
static char UNUSED id[] = "$Id: irc-mode.c,v 1.21 2002/12/15 16:29:18 alex Exp $"; static char UNUSED id[] = "$Id: irc-mode.c,v 1.22 2002/12/16 10:52:53 alex Exp $";
#include "imp.h" #include "imp.h"
#include <assert.h> #include <assert.h>
@ -148,45 +148,36 @@ Client_Mode( CLIENT *Client, REQUEST *Req, CLIENT *Origin, CLIENT *Target )
continue; continue;
} }
/* Validate modes */
x[0] = '\0'; x[0] = '\0';
if( Client_Type( Client ) == CLIENT_SERVER ) switch( *mode_ptr )
{ {
/* MODE request was received from a server: case 'i':
* therefore don't validate but trust it! */ /* Invisible */
x[0] = *mode_ptr; x[0] = 'i';
} break;
else case 'o':
{ /* IRC operator (only unsetable!) */
/* Validate modes */ if( ! set )
switch( *mode_ptr ) {
{ Client_SetOperByMe( Target, FALSE );
case 'i': x[0] = 'o';
/* Invisible */ }
x[0] = 'i'; else ok = IRC_WriteStrClient( Origin, ERR_NOPRIVILEGES_MSG, Client_ID( Origin ));
break; break;
case 'o': case 'r':
/* IRC operator (only unsetable!) */ /* Restricted (only setable) */
if( ! set ) if( set ) x[0] = 'r';
{ else ok = IRC_WriteStrClient( Origin, ERR_RESTRICTED_MSG, Client_ID( Origin ));
Client_SetOperByMe( Target, FALSE ); break;
x[0] = 'o'; case 's':
} /* Server messages */
else ok = IRC_WriteStrClient( Origin, ERR_NOPRIVILEGES_MSG, Client_ID( Origin )); x[0] = 's';
break; break;
case 'r': default:
/* Restricted (only setable) */ Log( LOG_DEBUG, "Unknown mode \"%c%c\" from \"%s\"!?", set ? '+' : '-', *mode_ptr, Client_ID( Origin ));
if( set ) x[0] = 'r'; if( Client_Type( Client ) != CLIENT_SERVER ) ok = IRC_WriteStrClient( Origin, ERR_UMODEUNKNOWNFLAG2_MSG, Client_ID( Origin ), set ? '+' : '-', *mode_ptr );
else ok = IRC_WriteStrClient( Origin, ERR_RESTRICTED_MSG, Client_ID( Origin )); x[0] = '\0';
break;
case 's':
/* Server messages */
x[0] = 's';
break;
default:
Log( LOG_DEBUG, "Unknown mode \"%c%c\" from \"%s\"!?", set ? '+' : '-', *mode_ptr, Client_ID( Origin ));
ok = IRC_WriteStrClient( Origin, ERR_UMODEUNKNOWNFLAG2_MSG, Client_ID( Origin ), set ? '+' : '-', *mode_ptr );
x[0] = '\0';
}
} }
if( ! ok ) break; if( ! ok ) break;
@ -315,113 +306,104 @@ Channel_Mode( CLIENT *Client, REQUEST *Req, CLIENT *Origin, CHANNEL *Channel )
/* Are there arguments left? */ /* Are there arguments left? */
if( arg_arg >= Req->argc ) arg_arg = -1; if( arg_arg >= Req->argc ) arg_arg = -1;
/* Validate modes */
x[0] = '\0'; x[0] = '\0';
client = NULL; client = NULL;
if( Client_Type( Client ) == CLIENT_SERVER ) switch( *mode_ptr )
{ {
/* MODE request was received from a server: /* Channel modes */
* therefore don't validate but trust it! */ case 'i':
x[0] = *mode_ptr; /* Invite-Only */
} if( modeok ) x[0] = 'i';
else else ok = IRC_WriteStrClient( Origin, ERR_CHANOPRIVSNEEDED_MSG, Client_ID( Origin ), Channel_Name( Channel ));
{ break;
/* Validate modes */ case 'm':
switch( *mode_ptr ) /* Moderated */
{ if( modeok ) x[0] = 'm';
/* Channel modes */ else ok = IRC_WriteStrClient( Origin, ERR_CHANOPRIVSNEEDED_MSG, Client_ID( Origin ), Channel_Name( Channel ));
case 'i': break;
/* Invite-Only */ case 'n':
if( modeok ) x[0] = 'i'; /* kein Schreiben in den Channel von aussen */
else ok = IRC_WriteStrClient( Origin, ERR_CHANOPRIVSNEEDED_MSG, Client_ID( Origin ), Channel_Name( Channel )); if( modeok ) x[0] = 'n';
break; else ok = IRC_WriteStrClient( Origin, ERR_CHANOPRIVSNEEDED_MSG, Client_ID( Origin ), Channel_Name( Channel ));
case 'm': break;
/* Moderated */ case 't':
if( modeok ) x[0] = 'm'; /* Topic Lock */
else ok = IRC_WriteStrClient( Origin, ERR_CHANOPRIVSNEEDED_MSG, Client_ID( Origin ), Channel_Name( Channel )); if( modeok ) x[0] = 't';
break; else ok = IRC_WriteStrClient( Origin, ERR_CHANOPRIVSNEEDED_MSG, Client_ID( Origin ), Channel_Name( Channel ));
case 'n': break;
/* kein Schreiben in den Channel von aussen */ case 'P':
if( modeok ) x[0] = 'n'; /* Persistent channel */
else ok = IRC_WriteStrClient( Origin, ERR_CHANOPRIVSNEEDED_MSG, Client_ID( Origin ), Channel_Name( Channel )); if( modeok )
break; {
case 't': if( set && ( ! Client_OperByMe( Client )))
/* Topic Lock */ {
if( modeok ) x[0] = 't'; /* Only IRC operators are allowed to set P mode */
else ok = IRC_WriteStrClient( Origin, ERR_CHANOPRIVSNEEDED_MSG, Client_ID( Origin ), Channel_Name( Channel )); ok = IRC_WriteStrClient( Origin, ERR_NOPRIVILEGES_MSG, Client_ID( Origin ));
break; }
case 'P': else x[0] = 'P';
/* Persistent channel */ }
else ok = IRC_WriteStrClient( Origin, ERR_CHANOPRIVSNEEDED_MSG, Client_ID( Origin ), Channel_Name( Channel ));
break;
/* Channel user modes */
case 'o':
/* Channel operator */
case 'v':
/* Voice */
if( arg_arg > mode_arg )
{
if( modeok ) if( modeok )
{ {
if( set && ( ! Client_OperByMe( Client ))) client = Client_Search( Req->argv[arg_arg] );
{ if( client ) x[0] = *mode_ptr;
/* Only IRC operators are allowed to set P mode */ else ok = IRC_WriteStrClient( Client, ERR_NOSUCHNICK_MSG, Client_ID( Client ), Req->argv[arg_arg] );
ok = IRC_WriteStrClient( Origin, ERR_NOPRIVILEGES_MSG, Client_ID( Origin ));
}
else x[0] = 'P';
} }
else ok = IRC_WriteStrClient( Origin, ERR_CHANOPRIVSNEEDED_MSG, Client_ID( Origin ), Channel_Name( Channel )); else ok = IRC_WriteStrClient( Origin, ERR_CHANOPRIVSNEEDED_MSG, Client_ID( Origin ), Channel_Name( Channel ));
break; Req->argv[arg_arg][0] = '\0';
arg_arg++;
}
else ok = IRC_WriteStrClient( Origin, ERR_NEEDMOREPARAMS_MSG, Client_ID( Origin ), Req->command );
break;
/* Channel user modes */ /* Channel lists */
case 'o': case 'I':
/* Channel operator */ /* Invite lists */
case 'v': if( arg_arg > mode_arg )
/* Voice */ {
if( arg_arg > mode_arg ) /* modify list */
if( modeok )
{ {
if( modeok ) if( set ) Add_Invite( Origin, Client, Channel, Req->argv[arg_arg] );
{ else Del_Invite( Origin, Client, Channel, Req->argv[arg_arg] );
client = Client_Search( Req->argv[arg_arg] );
if( client ) x[0] = *mode_ptr;
else ok = IRC_WriteStrClient( Client, ERR_NOSUCHNICK_MSG, Client_ID( Client ), Req->argv[arg_arg] );
}
else ok = IRC_WriteStrClient( Origin, ERR_CHANOPRIVSNEEDED_MSG, Client_ID( Origin ), Channel_Name( Channel ));
Req->argv[arg_arg][0] = '\0';
arg_arg++;
} }
else ok = IRC_WriteStrClient( Origin, ERR_NEEDMOREPARAMS_MSG, Client_ID( Origin ), Req->command ); else ok = IRC_WriteStrClient( Origin, ERR_CHANOPRIVSNEEDED_MSG, Client_ID( Origin ), Channel_Name( Channel ));
break; Req->argv[arg_arg][0] = '\0';
arg_arg++;
}
else Lists_ShowInvites( Origin, Channel );
break;
case 'b':
/* Ban lists */
if( arg_arg > mode_arg )
{
/* modify list */
if( modeok )
{
if( set ) Add_Ban( Origin, Client, Channel, Req->argv[arg_arg] );
else Del_Ban( Origin, Client, Channel, Req->argv[arg_arg] );
}
else ok = IRC_WriteStrClient( Origin, ERR_CHANOPRIVSNEEDED_MSG, Client_ID( Origin ), Channel_Name( Channel ));
Req->argv[arg_arg][0] = '\0';
arg_arg++;
}
else Lists_ShowBans( Origin, Channel );
break;
/* Channel lists */ default:
case 'I': Log( LOG_DEBUG, "Unknown mode \"%c%c\" from \"%s\" on %s!?", set ? '+' : '-', *mode_ptr, Client_ID( Origin ), Channel_Name( Channel ));
/* Invite lists */ if( Client_Type( Client ) != CLIENT_SERVER ) ok = IRC_WriteStrClient( Origin, ERR_UMODEUNKNOWNFLAG2_MSG, Client_ID( Origin ), set ? '+' : '-', *mode_ptr );
if( arg_arg > mode_arg ) x[0] = '\0';
{
/* modify list */
if( modeok )
{
if( set ) Add_Invite( Origin, Client, Channel, Req->argv[arg_arg] );
else Del_Invite( Origin, Client, Channel, Req->argv[arg_arg] );
}
else ok = IRC_WriteStrClient( Origin, ERR_CHANOPRIVSNEEDED_MSG, Client_ID( Origin ), Channel_Name( Channel ));
Req->argv[arg_arg][0] = '\0';
arg_arg++;
}
else Lists_ShowInvites( Origin, Channel );
break;
case 'b':
/* Ban lists */
if( arg_arg > mode_arg )
{
/* modify list */
if( modeok )
{
if( set ) Add_Ban( Origin, Client, Channel, Req->argv[arg_arg] );
else Del_Ban( Origin, Client, Channel, Req->argv[arg_arg] );
}
else ok = IRC_WriteStrClient( Origin, ERR_CHANOPRIVSNEEDED_MSG, Client_ID( Origin ), Channel_Name( Channel ));
Req->argv[arg_arg][0] = '\0';
arg_arg++;
}
else Lists_ShowBans( Origin, Channel );
break;
default:
Log( LOG_DEBUG, "Unknown mode \"%c%c\" from \"%s\" on %s!?", set ? '+' : '-', *mode_ptr, Client_ID( Origin ), Channel_Name( Channel ));
ok = IRC_WriteStrClient( Origin, ERR_UMODEUNKNOWNFLAG2_MSG, Client_ID( Origin ), set ? '+' : '-', *mode_ptr );
x[0] = '\0';
}
} }
if( ! ok ) break; if( ! ok ) break;