X-Git-Url: https://git.netwichtig.de/gitweb/?a=blobdiff_plain;ds=sidebyside;f=src%2Fmode.cpp;h=a5549a9645b0219a20a6192541d2128a70ded2dd;hb=4e6997fddf8eba872584830e0d56c8de83b76aab;hp=ca30f1b699ad569ab7cc2913f1bb0895dc1f6c4a;hpb=9ab90c52b46cc613d29174fd183330bd9ace1e97;p=user%2Fhenk%2Fcode%2Finspircd.git diff --git a/src/mode.cpp b/src/mode.cpp index ca30f1b69..a5549a964 100644 --- a/src/mode.cpp +++ b/src/mode.cpp @@ -11,7 +11,7 @@ * --------------------------------------------------- */ -/* $Core: libIRCDmode */ +/* $Core */ /* $ExtraDeps: $(RELCPPFILES) */ /* $ExtraObjects: modes/modeclasses.a */ /* $ExtraBuild: @${MAKE} -C "modes" DIRNAME="src/modes" CC="$(CC)" $(MAKEARGS) CPPFILES="$(CPPFILES)" */ @@ -43,16 +43,14 @@ #include "modes/cmode_h.h" /* +v (channel voice) */ #include "modes/cmode_v.h" -/* +s (server notices) */ -#include "modes/umode_s.h" /* +w (see wallops) */ #include "modes/umode_w.h" /* +i (invisible) */ #include "modes/umode_i.h" /* +o (operator) */ #include "modes/umode_o.h" -/* +n (notice mask - our implementation of snomasks) */ -#include "modes/umode_n.h" +/* +s (server notice masks) */ +#include "modes/umode_s.h" ModeHandler::ModeHandler(InspIRCd* Instance, char modeletter, int parameters_on, int parameters_off, bool listmode, ModeType type, bool operonly, char mprefix, char prefixrequired) : ServerInstance(Instance), mode(modeletter), n_params_on(parameters_on), n_params_off(parameters_off), list(listmode), m_type(type), oper(operonly), prefix(mprefix), count(0), prefixneeded(prefixrequired) @@ -119,6 +117,11 @@ char ModeHandler::GetModeChar() return mode; } +std::string ModeHandler::GetUserParameter(User* user) +{ + return ""; +} + ModeAction ModeHandler::OnModeChange(User*, User*, Channel*, std::string&, bool, bool) { return MODEACTION_DENY; @@ -144,6 +147,10 @@ void ModeHandler::DisplayEmptyList(User*, Channel*) { } +void ModeHandler::OnParameterMissing(User* user, User* dest, Channel* channel) +{ +} + bool ModeHandler::CheckTimeStamp(time_t theirs, time_t ours, const std::string&, const std::string&, Channel*) { return (ours < theirs); @@ -167,10 +174,6 @@ SimpleChannelModeHandler::SimpleChannelModeHandler(InspIRCd* Instance, char mode ModeAction SimpleUserModeHandler::OnModeChange(User* source, User* dest, Channel* channel, std::string ¶meter, bool adding, bool servermode) { - /* Only opers can change other users modes */ - if (source != dest) - return MODEACTION_DENY; - if (adding) { if (!dest->IsModeSet(this->GetModeChar())) @@ -334,7 +337,7 @@ void ModeParser::DisplayCurrentModes(User *user, User* targetuser, Channel* targ return; } - if ((targetuser == user) || (IS_OPER(user))) + if (targetuser == user || user->HasPrivPermission("users/auspex")) { /* Display user's current mode string */ user->WriteNumeric(RPL_UMODEIS, "%s :+%s",targetuser->nick.c_str(),targetuser->FormatModes()); @@ -412,7 +415,7 @@ void ModeParser::Process(const std::vector& parameters, User *user, continue; } - if (!IS_OPER(user)) + if (!user->HasPrivPermission("channels/auspex")) { if (ServerInstance->Config->HideModeLists[mletter] && (targetchannel->GetStatus(user) < STATUS_HOP)) { @@ -479,7 +482,7 @@ void ModeParser::Process(const std::vector& parameters, User *user, { type = MODETYPE_USER; mask = MASK_USER; - if ((user != targetuser) && (!ServerInstance->ULine(user->server))) + if (user != targetuser && IS_LOCAL(user) && !ServerInstance->ULine(user->server)) { user->WriteNumeric(ERR_USERSDONTMATCH, "%s :Can't change mode for other users", user->nick.c_str()); return; @@ -573,6 +576,7 @@ void ModeParser::Process(const std::vector& parameters, User *user, else { /* No parameter, continue to the next mode */ + modehandlers[handler_id]->OnParameterMissing(user, targetuser, targetchannel); continue; } @@ -641,6 +645,17 @@ void ModeParser::Process(const std::vector& parameters, User *user, if (abort) continue; + /* If it's disabled, they have to be an oper. + */ + if (IS_LOCAL(user) && !IS_OPER(user) && ((type == MODETYPE_CHANNEL ? ServerInstance->Config->DisabledCModes : ServerInstance->Config->DisabledUModes)[modehandlers[handler_id]->GetModeChar() - 'A'])) + { + user->WriteNumeric(ERR_NOPRIVILEGES, "%s :Permission Denied - %s mode %c has been locked by the administrator", + user->nick.c_str(), + type == MODETYPE_CHANNEL ? "channel" : "user", + modehandlers[handler_id]->GetModeChar()); + continue; + } + /* It's an oper only mode, check if theyre an oper. If they arent, * eat any parameter that came with the mode, and continue to next */ @@ -995,7 +1010,7 @@ std::string ModeParser::ModeString(User* user, Channel* channel, bool nick_suffi return types; } -std::string ModeParser::ChanModes() +std::string ModeParser::GiveModeList(ModeMasks m) { std::string type1; /* Listmodes EXCEPT those with a prefix */ std::string type2; /* Modes that take a param when adding or removing */ @@ -1007,7 +1022,7 @@ std::string ModeParser::ChanModes() if ((!ServerInstance->Config->AllowHalfop) && (mode == 'h')) continue; - unsigned char pos = (mode-65) | MASK_CHANNEL; + unsigned char pos = (mode-65) | m; /* One parameter when adding */ if (modehandlers[pos]) { @@ -1146,7 +1161,7 @@ void ModeHandler::RemoveMode(User* user, irc::modestacker* stack) sprintf(moderemove,"-%c",this->GetModeChar()); parameters.push_back(user->nick); parameters.push_back(moderemove); - ServerInstance->Parser->CallHandler("MODE", parameters, user); + ServerInstance->Modes->Process(parameters, ServerInstance->FakeClient, false); } } } @@ -1191,7 +1206,6 @@ ModeParser::ModeParser(InspIRCd* Instance) : ServerInstance(Instance) new ModeChannelOp(Instance), new ModeChannelHalfOp(Instance), new ModeChannelVoice(Instance), - new ModeUserServerNotice(Instance), new ModeUserWallops(Instance), new ModeUserInvisible(Instance), new ModeUserOperator(Instance), @@ -1210,5 +1224,5 @@ ModeParser::ModeParser(InspIRCd* Instance) : ServerInstance(Instance) this->AddMode(modes[index]); seq = 0; - memset(&sent, 0, 256); + memset(&sent, 0, sizeof(sent)); }