/*
* ngIRCd -- The Next Generation IRC Daemon
- * Copyright (c)2001-2010 Alexander Barton (alex@barton.de)
+ * Copyright (c)2001-2011 Alexander Barton (alex@barton.de) and Contributors.
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
ERR_NOPRIVILEGES_MSG,
Client_ID(Origin));
break;
+
case 'o': /* IRC operator (only unsettable!) */
if(( ! set ) || ( Client_Type( Client ) == CLIENT_SERVER ))
{
else ok = IRC_WriteStrClient( Origin, ERR_RESTRICTED_MSG, Client_ID( Origin ));
break;
+ case 'x': /* Cloak hostname */
+ if (Client_HasMode(Client, 'r'))
+ IRC_WriteStrClient(Origin,
+ ERR_RESTRICTED_MSG,
+ Client_ID(Origin));
+ else
+ x[0] = 'x';
+ break;
+
default:
Log( LOG_DEBUG, "Unknown mode \"%c%c\" from \"%s\"!?", set ? '+' : '-', *mode_ptr, Client_ID( Origin ));
if( Client_Type( Client ) != CLIENT_SERVER ) ok = IRC_WriteStrClient( Origin, ERR_UMODEUNKNOWNFLAG2_MSG, Client_ID( Origin ), set ? '+' : '-', *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);
+ if (!IRC_WriteStrClient(Origin, RPL_CHANNELMODEIS_MSG,
+ Client_ID(Origin), Channel_Name(Channel),
+ the_modes))
+ return DISCONNECTED;
+#ifndef STRICT_RFC
+ if (!IRC_WriteStrClient(Origin, RPL_CREATIONTIME_MSG,
+ Client_ID(Origin), Channel_Name(Channel),
+ Channel_CreationTime(Channel)))
+ return DISCONNECTED;
+#endif
+ return CONNECTED;
}
{
char the_modes[COMMAND_LEN], the_args[COMMAND_LEN], x[2],
argadd[CLIENT_PASS_LEN], *mode_ptr;
- bool connected, set, modeok = true, skiponce, use_servermode = false, retval;
+ bool connected, set, skiponce, retval, onchannel, modeok, use_servermode;
int mode_arg, arg_arg;
CLIENT *client;
long l;
if (Req->argc <= 1)
return Channel_Mode_Answer_Request(Origin, Channel);
- /* 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));
- modeok = false;
- /* channel operator? */
- if (strchr(Channel_UserModes(Channel, Origin), 'o'))
- modeok = true;
- else if (Conf_OperCanMode) {
- /* IRC-Operators can use MODE as well */
- if (Client_OperByMe(Origin)) {
- modeok = true;
- if (Conf_OperServerMode)
- use_servermode = true; /* Change Origin to Server */
- }
- }
- }
+ Channel_CheckAdminRights(Channel, Client, Origin,
+ &onchannel, &modeok, &use_servermode);
+
+ if (!onchannel && !modeok)
+ return IRC_WriteStrClient(Origin, ERR_NOTONCHANNEL_MSG,
+ Client_ID(Origin),
+ Channel_Name(Channel));
mode_arg = 1;
mode_ptr = Req->argv[mode_arg];