* IRC commands for mode changes (like MODE, AWAY, etc.)
*/
-#include "imp.h"
#include <assert.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
-#include "defines.h"
#include "conn.h"
#include "channel.h"
#include "irc-macros.h"
#include "messages.h"
#include "conf.h"
-#include "exp.h"
-#include "irc-mode.h"
-
static bool Client_Mode PARAMS((CLIENT *Client, REQUEST *Req, CLIENT *Origin,
CLIENT *Target));
static bool Channel_Mode PARAMS((CLIENT *Client, REQUEST *Req, CLIENT *Origin,
assert(Client != NULL);
assert(Req != NULL);
- _IRC_ARGC_GE_OR_RETURN_(Client, Req, 1)
_IRC_GET_SENDER_OR_RETURN_(origin, Req, Client)
/* Channel or user mode? */
return Channel_Mode(Client, Req, origin, chan);
/* No target found! */
- return IRC_WriteStrClient(Client, ERR_NOSUCHNICK_MSG,
+ return IRC_WriteErrClient(Client, ERR_NOSUCHNICK_MSG,
Client_ID(Client), Req->argv[0]);
} /* IRC_MODE */
if (Client_Type(Client) == CLIENT_USER) {
/* Users are only allowed to manipulate their own modes! */
if (Target != Client)
- return IRC_WriteStrClient(Client,
+ return IRC_WriteErrClient(Client,
ERR_USERSDONTMATCH_MSG,
Client_ID(Client));
}
set = false;
strcpy(the_modes, "-");
} else
- return IRC_WriteStrClient(Origin, ERR_UMODEUNKNOWNFLAG_MSG,
+ return IRC_WriteErrClient(Origin, ERR_UMODEUNKNOWNFLAG_MSG,
Client_ID(Origin));
x[1] = '\0';
x[0] = 'a';
Client_SetAway(Origin, DEFAULT_AWAY_MSG);
} else
- ok = IRC_WriteStrClient(Origin,
+ ok = IRC_WriteErrClient(Origin,
ERR_NOPRIVILEGES_MSG,
Client_ID(Origin));
break;
case 'B': /* Bot */
if (Client_HasMode(Client, 'r'))
- ok = IRC_WriteStrClient(Origin,
+ ok = IRC_WriteErrClient(Origin,
ERR_RESTRICTED_MSG,
Client_ID(Origin));
else
x[0] = 'B';
break;
- case 'c': /* Receive connect notices
- * (only settable by IRC operators!) */
+ case 'c': /* Receive connect notices */
+ case 'q': /* KICK-protected user */
+ /* (only settable by IRC operators!) */
if (!set || Client_Type(Client) == CLIENT_SERVER
- || Client_OperByMe(Origin))
- x[0] = 'c';
+ || Client_HasMode(Origin, 'o'))
+ x[0] = *mode_ptr;
else
- ok = IRC_WriteStrClient(Origin,
+ ok = IRC_WriteErrClient(Origin,
ERR_NOPRIVILEGES_MSG,
Client_ID(Origin));
break;
case 'o': /* IRC operator (only unsettable!) */
if (!set || Client_Type(Client) == CLIENT_SERVER) {
- Client_SetOperByMe(Target, false);
x[0] = 'o';
} else
- ok = IRC_WriteStrClient(Origin,
- ERR_NOPRIVILEGES_MSG,
- Client_ID(Origin));
- break;
- case 'q': /* KICK-protected user */
- if (!set || Client_Type(Client) == CLIENT_SERVER
- || Client_OperByMe(Origin))
- x[0] = 'q';
- else
- ok = IRC_WriteStrClient(Origin,
+ ok = IRC_WriteErrClient(Origin,
ERR_NOPRIVILEGES_MSG,
Client_ID(Origin));
break;
if (set || Client_Type(Client) == CLIENT_SERVER)
x[0] = 'r';
else
- ok = IRC_WriteStrClient(Origin,
+ ok = IRC_WriteErrClient(Origin,
ERR_RESTRICTED_MSG,
Client_ID(Origin));
break;
if (Client_Type(Client) == CLIENT_SERVER)
x[0] = 'R';
else
- ok = IRC_WriteStrClient(Origin,
+ ok = IRC_WriteErrClient(Origin,
ERR_NICKREGISTER_MSG,
Client_ID(Origin));
break;
case 'x': /* Cloak hostname */
if (Client_HasMode(Client, 'r'))
- ok = IRC_WriteStrClient(Origin,
+ ok = IRC_WriteErrClient(Origin,
ERR_RESTRICTED_MSG,
Client_ID(Origin));
else if (!set || Conf_CloakHostModeX[0]
|| Client_Type(Client) == CLIENT_SERVER
- || Client_OperByMe(Client)) {
+ || Client_HasMode(Origin, 'o')) {
x[0] = 'x';
send_RPL_HOSTHIDDEN_MSG = true;
} else
- ok = IRC_WriteStrClient(Origin,
+ ok = IRC_WriteErrClient(Origin,
ERR_NOPRIVILEGES_MSG,
Client_ID(Origin));
break;
"Unknown mode \"%c%c\" from \"%s\"!?",
set ? '+' : '-', *mode_ptr,
Client_ID(Origin));
- ok = IRC_WriteStrClient(Origin,
+ ok = IRC_WriteErrClient(Origin,
ERR_UMODEUNKNOWNFLAG2_MSG,
Client_ID(Origin),
set ? '+' : '-',
Client_Modes(Target));
}
- IRC_SetPenalty(Client, 1);
return ok;
} /* Client_Mode */
is_halfop = is_op = is_admin = is_owner = is_machine = is_oper = false;
if (Channel_IsModeless(Channel))
- return IRC_WriteStrClient(Client, ERR_NOCHANMODES_MSG,
+ return IRC_WriteErrClient(Client, ERR_NOCHANMODES_MSG,
Client_ID(Client), Channel_Name(Channel));
/* Mode request: let's answer it :-) */
/* Check if origin is oper and opers can use mode */
use_servermode = Conf_OperServerMode;
- if(Client_OperByMe(Client) && Conf_OperCanMode) {
+ if(Client_HasMode(Client, 'o') && Conf_OperCanMode) {
is_oper = true;
}
/* Check if client is member of channel or an oper or an server/service */
if(!Channel_IsMemberOf(Channel, Client) && !is_oper && !is_machine)
- return IRC_WriteStrClient(Origin, ERR_NOTONCHANNEL_MSG,
+ return IRC_WriteErrClient(Origin, ERR_NOTONCHANNEL_MSG,
Client_ID(Origin),
Channel_Name(Channel));
case 'z': /* Secure connections only */
if(!is_oper && !is_machine && !is_owner &&
!is_admin && !is_op) {
- connected = IRC_WriteStrClient(Origin,
+ connected = IRC_WriteErrClient(Origin,
ERR_CHANOPRIVSNEEDED_MSG,
Client_ID(Origin), Channel_Name(Channel));
goto chan_exit;
is_admin || is_op || is_halfop)
x[0] = *mode_ptr;
else
- connected = IRC_WriteStrClient(Origin,
+ connected = IRC_WriteErrClient(Origin,
ERR_CHANOPRIVSNEEDED_MSG,
Client_ID(Origin), Channel_Name(Channel));
break;
goto chan_exit;
if (!set) {
if (is_oper || is_machine || is_owner ||
- is_admin || is_op || is_halfop)
+ is_admin || is_op || is_halfop) {
x[0] = *mode_ptr;
- else
- connected = IRC_WriteStrClient(Origin,
+ if (Channel_HasMode(Channel, 'k'))
+ strlcpy(argadd, "*", sizeof(argadd));
+ if (arg_arg > mode_arg)
+ arg_arg++;
+ } else
+ connected = IRC_WriteErrClient(Origin,
ERR_CHANOPRIVSNEEDED_MSG,
Client_ID(Origin),
Channel_Name(Channel));
sizeof(argadd));
x[0] = *mode_ptr;
} else {
- connected = IRC_WriteStrClient(Origin,
+ connected = IRC_WriteErrClient(Origin,
ERR_CHANOPRIVSNEEDED_MSG,
Client_ID(Origin),
Channel_Name(Channel));
#ifdef STRICT_RFC
/* Only send error message in "strict" mode,
* this is how ircd2.11 and others behave ... */
- connected = IRC_WriteStrClient(Origin,
+ connected = IRC_WriteErrClient(Origin,
ERR_NEEDMOREPARAMS_MSG,
Client_ID(Origin), Req->command);
#endif
is_admin || is_op || is_halfop)
x[0] = *mode_ptr;
else
- connected = IRC_WriteStrClient(Origin,
+ connected = IRC_WriteErrClient(Origin,
ERR_CHANOPRIVSNEEDED_MSG,
Client_ID(Origin),
Channel_Name(Channel));
x[0] = *mode_ptr;
}
} else {
- connected = IRC_WriteStrClient(Origin,
+ connected = IRC_WriteErrClient(Origin,
ERR_CHANOPRIVSNEEDED_MSG,
Client_ID(Origin),
Channel_Name(Channel));
#ifdef STRICT_RFC
/* Only send error message in "strict" mode,
* this is how ircd2.11 and others behave ... */
- connected = IRC_WriteStrClient(Origin,
+ connected = IRC_WriteErrClient(Origin,
ERR_NEEDMOREPARAMS_MSG,
Client_ID(Origin), Req->command);
#endif
if(is_oper || is_machine)
x[0] = 'O';
else
- connected = IRC_WriteStrClient(Origin,
+ connected = IRC_WriteErrClient(Origin,
ERR_NOPRIVILEGES_MSG,
Client_ID(Origin));
} else if(is_oper || is_machine || is_owner ||
is_admin || is_op)
x[0] = 'O';
else
- connected = IRC_WriteStrClient(Origin,
+ connected = IRC_WriteErrClient(Origin,
ERR_CHANOPRIVSNEEDED_MSG,
Client_ID(Origin),
Channel_Name(Channel));
if(is_oper || is_machine)
x[0] = 'P';
else
- connected = IRC_WriteStrClient(Origin,
+ connected = IRC_WriteErrClient(Origin,
ERR_NOPRIVILEGES_MSG,
Client_ID(Origin));
} else if(is_oper || is_machine || is_owner ||
is_admin || is_op)
x[0] = 'P';
else
- connected = IRC_WriteStrClient(Origin,
+ connected = IRC_WriteErrClient(Origin,
ERR_CHANOPRIVSNEEDED_MSG,
Client_ID(Origin),
Channel_Name(Channel));
case 'q': /* Owner */
case 'a': /* Channel admin */
if(!is_oper && !is_machine && !is_owner && !is_admin) {
- connected = IRC_WriteStrClient(Origin,
+ connected = IRC_WriteErrClient(Origin,
ERR_CHANOPPRIVTOOLOW_MSG,
Client_ID(Origin),
Channel_Name(Channel));
case 'o': /* Channel operator */
if(!is_oper && !is_machine && !is_owner &&
!is_admin && !is_op) {
- connected = IRC_WriteStrClient(Origin,
+ connected = IRC_WriteErrClient(Origin,
ERR_CHANOPRIVSNEEDED_MSG,
Client_ID(Origin),
Channel_Name(Channel));
case 'h': /* Half Op */
if(!is_oper && !is_machine && !is_owner &&
!is_admin && !is_op) {
- connected = IRC_WriteStrClient(Origin,
+ connected = IRC_WriteErrClient(Origin,
ERR_CHANOPRIVSNEEDED_MSG,
Client_ID(Origin),
Channel_Name(Channel));
if (client)
x[0] = *mode_ptr;
else
- connected = IRC_WriteStrClient(Origin,
+ connected = IRC_WriteErrClient(Origin,
ERR_NOSUCHNICK_MSG,
Client_ID(Origin),
Req->argv[arg_arg]);
} else {
- connected = IRC_WriteStrClient(Origin,
+ connected = IRC_WriteErrClient(Origin,
ERR_CHANOPRIVSNEEDED_MSG,
Client_ID(Origin),
Channel_Name(Channel));
* mode, because most other servers don't do
* it as well and some clients send "wired"
* MODE commands like "MODE #chan -ooo nick". */
- connected = IRC_WriteStrClient(Origin,
+ connected = IRC_WriteErrClient(Origin,
ERR_NEEDMOREPARAMS_MSG,
Client_ID(Origin), Req->command);
#endif
Client, Channel,
Req->argv[arg_arg]);
} else {
- connected = IRC_WriteStrClient(Origin,
+ connected = IRC_WriteErrClient(Origin,
ERR_CHANOPRIVSNEEDED_MSG,
Client_ID(Origin),
Channel_Name(Channel));
"Unknown mode \"%c%c\" from \"%s\" on %s!?",
set ? '+' : '-', *mode_ptr,
Client_ID(Origin), Channel_Name(Channel));
- connected = IRC_WriteStrClient(Origin,
+ connected = IRC_WriteErrClient(Origin,
ERR_UNKNOWNMODE_MSG,
Client_ID(Origin), *mode_ptr,
Channel_Name(Channel));
/* 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)))
+ if (!IRC_WriteErrClient(Origin, ERR_USERNOTINCHANNEL_MSG,
+ Client_ID(Origin),
+ Client_ID(client),
+ Channel_Name(Channel)))
break;
-
continue;
}
}
}
- IRC_SetPenalty(Client, 1);
return connected;
} /* Channel_Mode */
assert (Client != NULL);
assert (Req != NULL);
- _IRC_ARGC_LE_OR_RETURN_(Client, Req, 1)
-
if (Req->argc == 1 && Req->argv[0][0]) {
Client_SetAway(Client, Req->argv[0]);
Client_ModeAdd(Client, 'a');
return CONNECTED;
if (Client_Type(Client) == CLIENT_USER &&
current_count >= MAX_HNDL_CHANNEL_LISTS)
- return IRC_WriteStrClient(Client, ERR_LISTFULL_MSG,
+ return IRC_WriteErrClient(Client, ERR_LISTFULL_MSG,
Client_ID(Client),
Channel_Name(Channel), mask,
MAX_HNDL_CHANNEL_LISTS);