X-Git-Url: https://git.netwichtig.de/gitweb/?a=blobdiff_plain;f=src%2Fcoremods%2Fcore_channel%2Fcmd_invite.cpp;h=7bf669b296837b469ea56072acf4209e34ad7589;hb=127fe6ed1076c294e01925e4fa8ab2bd64c1b0e0;hp=25afc071318da79bd4e9d5845bbbd67640967c00;hpb=c67d3103e9f7397f0ab9631bf07a5e5547deb2c3;p=user%2Fhenk%2Fcode%2Finspircd.git diff --git a/src/coremods/core_channel/cmd_invite.cpp b/src/coremods/core_channel/cmd_invite.cpp index 25afc0713..7bf669b29 100644 --- a/src/coremods/core_channel/cmd_invite.cpp +++ b/src/coremods/core_channel/cmd_invite.cpp @@ -21,26 +21,14 @@ #include "inspircd.h" +#include "core_channel.h" -/** Handle /INVITE. - */ -class CommandInvite : public Command +CommandInvite::CommandInvite(Module* parent) + : Command(parent, "INVITE", 0, 0) { - public: - /** Constructor for invite. - */ - CommandInvite ( Module* parent) : Command(parent,"INVITE", 0, 0) { Penalty = 4; syntax = "[ ]"; } - /** Handle command. - * @param parameters The parameters to the command - * @param user The user issuing the command - * @return A value from CmdResult to indicate command success or failure. - */ - CmdResult Handle(const std::vector& parameters, User *user); - RouteDescriptor GetRouting(User* user, const std::vector& parameters) - { - return (IS_LOCAL(user) ? ROUTE_LOCALONLY : ROUTE_BROADCAST); - } -}; + Penalty = 4; + syntax = "[ ]"; +} /** Handle /INVITE */ @@ -48,7 +36,7 @@ CmdResult CommandInvite::Handle (const std::vector& parameters, Use { ModResult MOD_RESULT; - if (parameters.size() == 2 || parameters.size() == 3) + if (parameters.size() >= 2) { User* u; if (IS_LOCAL(user)) @@ -58,12 +46,12 @@ CmdResult CommandInvite::Handle (const std::vector& parameters, Use Channel* c = ServerInstance->FindChan(parameters[1]); time_t timeout = 0; - if (parameters.size() == 3) + if (parameters.size() >= 3) { if (IS_LOCAL(user)) timeout = ServerInstance->Time() + InspIRCd::Duration(parameters[2]); - else - timeout = ConvToInt(parameters[2]); + else if (parameters.size() > 3) + timeout = ConvToInt(parameters[3]); } if ((!c) || (!u) || (u->registered != REG_ALL)) @@ -72,6 +60,19 @@ CmdResult CommandInvite::Handle (const std::vector& parameters, Use return CMD_FAILURE; } + // Verify channel timestamp if the INVITE is coming from a remote server + if (!IS_LOCAL(user)) + { + // Remote INVITE commands must carry a channel timestamp + if (parameters.size() < 3) + return CMD_INVALID; + + // Drop the invite if our channel TS is lower + time_t RemoteTS = ConvToInt(parameters[2]); + if (c->age < RemoteTS) + return CMD_FAILURE; + } + if ((IS_LOCAL(user)) && (!c->HasUser(user))) { user->WriteNumeric(ERR_NOTONCHANNEL, "%s :You're not on that channel!", c->name.c_str()); @@ -113,7 +114,11 @@ CmdResult CommandInvite::Handle (const std::vector& parameters, Use } if (IS_LOCAL(user)) + { user->WriteNumeric(RPL_INVITING, "%s %s", u->nick.c_str(),c->name.c_str()); + if (u->IsAway()) + user->WriteNumeric(RPL_AWAY, "%s :%s", u->nick.c_str(), u->awaymsg.c_str()); + } if (ServerInstance->Config->AnnounceInvites != ServerConfig::INVITE_ANNOUNCE_NONE) { @@ -155,5 +160,7 @@ CmdResult CommandInvite::Handle (const std::vector& parameters, Use return CMD_SUCCESS; } - -COMMAND_INIT(CommandInvite) +RouteDescriptor CommandInvite::GetRouting(User* user, const std::vector& parameters) +{ + return (IS_LOCAL(user) ? ROUTE_LOCALONLY : ROUTE_BROADCAST); +}