X-Git-Url: https://git.netwichtig.de/gitweb/?a=blobdiff_plain;ds=sidebyside;f=src%2Fmode.cpp;h=6dea66464914af64c9ee1d173b6fcb644e59b741;hb=8b96626119ecdcece7541e5debdf7e234edbee3a;hp=c8ab6cc6276ca7698cc7ff463569094cabd9622e;hpb=64362e2fcd50ea2492d6ceb94bccec9764f3e4ef;p=user%2Fhenk%2Fcode%2Finspircd.git diff --git a/src/mode.cpp b/src/mode.cpp index c8ab6cc62..6dea66464 100644 --- a/src/mode.cpp +++ b/src/mode.cpp @@ -2,7 +2,7 @@ * | Inspire Internet Relay Chat Daemon | * +------------------------------------+ * - * InspIRCd: (C) 2002-2009 InspIRCd Development Team + * InspIRCd: (C) 2002-2010 InspIRCd Development Team * See: http://wiki.inspircd.org/Credits * * This program is free but copyrighted software; see @@ -34,8 +34,6 @@ #include "modes/cmode_l.h" /* +o (channel op) */ #include "modes/cmode_o.h" -/* +h (channel halfop) */ -#include "modes/cmode_h.h" /* +v (channel voice) */ #include "modes/cmode_v.h" /* +w (see wallops) */ @@ -48,8 +46,9 @@ #include "modes/umode_s.h" ModeHandler::ModeHandler(Module* Creator, const std::string& Name, char modeletter, ParamSpec Params, ModeType type) - : m_paramtype(TR_TEXT), parameters_taken(Params), mode(modeletter), prefix(0), oper(false), - list(false), m_type(type), count(0), levelrequired(HALFOP_VALUE), creator(Creator), name(Name) + : ServiceProvider(Creator, Name, type == MODETYPE_CHANNEL ? SERVICE_CMODE : SERVICE_UMODE), m_paramtype(TR_TEXT), + parameters_taken(Params), mode(modeletter), prefix(0), oper(false), + list(false), m_type(type), levelrequired(HALFOP_VALUE) { } @@ -76,17 +75,6 @@ unsigned int ModeHandler::GetPrefixRank() return 0; } -unsigned int ModeHandler::GetCount() -{ - return 0; -} - -void ModeHandler::ChangeCount(int modifier) -{ - count += modifier; - ServerInstance->Logs->Log("MODE", DEBUG,"Change count for mode %c is now %d", mode, count); -} - int ModeHandler::GetNumParams(bool adding) { switch (parameters_taken) @@ -101,11 +89,6 @@ int ModeHandler::GetNumParams(bool adding) return 0; } -char ModeHandler::GetModeChar() -{ - return mode; -} - std::string ModeHandler::GetUserParameter(User* user) { return ""; @@ -121,18 +104,6 @@ ModeAction ModeHandler::OnModeChange(User*, User*, Channel*, std::string&, bool) return MODEACTION_DENY; } -ModePair ModeHandler::ModeSet(User*, User* dest, Channel* channel, const std::string&) -{ - if (dest) - { - return std::make_pair(dest->IsModeSet(this->mode), ""); - } - else - { - return std::make_pair(channel->IsModeSet(this->mode), ""); - } -} - void ModeHandler::DisplayList(User*, Channel*) { } @@ -195,6 +166,25 @@ ModeAction SimpleChannelModeHandler::OnModeChange(User* source, User* dest, Chan return MODEACTION_DENY; } +ModeAction ParamChannelModeHandler::OnModeChange(User* source, User* dest, Channel* channel, std::string ¶meter, bool adding) +{ + if (adding && !ParamValidate(parameter)) + return MODEACTION_DENY; + std::string now = channel->GetModeParameter(this); + if (parameter == now) + return MODEACTION_DENY; + if (adding) + channel->SetModeParam(this, parameter); + else + channel->SetModeParam(this, ""); + return MODEACTION_ALLOW; +} + +bool ParamChannelModeHandler::ParamValidate(std::string& parameter) +{ + return true; +} + ModeWatcher::ModeWatcher(Module* Creator, char modeletter, ModeType type) : mode(modeletter), m_type(type), creator(Creator) { @@ -298,11 +288,23 @@ ModeAction ModeParser::TryMode(User* user, User* targetuser, Channel* chan, bool unsigned int ourrank = chan->GetPrefixValue(user); if (ourrank < neededrank) { - /* Bog off */ - // TODO replace with a real search for the proper prefix - char needed = neededrank > HALFOP_VALUE ? '@' : '%'; - user->WriteNumeric(ERR_CHANOPRIVSNEEDED, "%s %s :You must have channel privilege %c or above to %sset channel mode %c", - user->nick.c_str(), chan->name.c_str(), needed, adding ? "" : "un", modechar); + ModeHandler* neededmh = NULL; + for(char c='A'; c <= 'z'; c++) + { + ModeHandler *privmh = FindMode(modechar, type); + if (privmh->GetPrefixRank() >= neededrank) + { + // this mode is sufficient to allow this action + if (!neededmh || privmh->GetPrefixRank() < neededmh->GetPrefixRank()) + neededmh = privmh; + } + } + if (neededmh) + user->WriteNumeric(ERR_CHANOPRIVSNEEDED, "%s %s :You must have channel %s access or above to %sset channel mode %c", + user->nick.c_str(), chan->name.c_str(), neededmh->name.c_str(), adding ? "" : "un", modechar); + else + user->WriteNumeric(ERR_CHANOPRIVSNEEDED, "%s %s :You cannot %sset channel mode %c", + user->nick.c_str(), chan->name.c_str(), adding ? "" : "un", modechar); return MODEACTION_DENY; } } @@ -336,7 +338,7 @@ ModeAction ModeParser::TryMode(User* user, User* targetuser, Channel* chan, bool if (IS_OPER(user)) { user->WriteNumeric(ERR_NOPRIVILEGES, "%s :Permission Denied - Oper type %s does not have access to set %s mode %c", - user->nick.c_str(), irc::Spacify(user->oper.c_str()), type == MODETYPE_CHANNEL ? "channel" : "user", modechar); + user->nick.c_str(), user->oper->NameStr(), type == MODETYPE_CHANNEL ? "channel" : "user", modechar); } else { @@ -352,6 +354,15 @@ ModeAction ModeParser::TryMode(User* user, User* targetuser, Channel* chan, bool return MODEACTION_DENY; } + if (mh->GetPrefixRank() && chan) + { + User* user_to_prefix = ServerInstance->FindNick(parameter); + if (!user_to_prefix) + return MODEACTION_DENY; + if (!chan->SetPrefix(user_to_prefix, modechar, adding)) + return MODEACTION_DENY; + } + /* Call the handler for the mode */ ModeAction ma = mh->OnModeChange(user, targetuser, chan, parameter, adding); @@ -361,15 +372,6 @@ ModeAction ModeParser::TryMode(User* user, User* targetuser, Channel* chan, bool if (ma != MODEACTION_ALLOW) return ma; - mh->ChangeCount(adding ? 1 : -1); - - if (mh->GetPrefixRank() && chan) - { - User* user_to_prefix = ServerInstance->FindNick(parameter); - if (user_to_prefix) - chan->SetPrefix(user_to_prefix, modechar, adding); - } - for (ModeWatchIter watchers = modewatchers[handler_id].begin(); watchers != modewatchers[handler_id].end(); watchers++) (*watchers)->AfterMode(user, targetuser, chan, parameter, adding, type); @@ -561,13 +563,11 @@ void ModeParser::DisplayListModes(User* user, Channel* chan, std::string &mode_s bool display = true; if (!user->HasPrivPermission("channels/auspex") && ServerInstance->Config->HideModeLists[mletter] && (chan->GetPrefixValue(user) < HALFOP_VALUE)) { - user->WriteNumeric(ERR_CHANOPRIVSNEEDED, "%s %s :Only half-operators and above may view the +%c list", + user->WriteNumeric(ERR_CHANOPRIVSNEEDED, "%s %s :You do not have access to view the +%c list", user->nick.c_str(), chan->name.c_str(), mletter); display = false; } - /** See below for a description of what craq this is :D - */ unsigned char handler_id = (mletter - 'A') | MASK_CHANNEL; for(ModeWatchIter watchers = modewatchers[handler_id].begin(); watchers != modewatchers[handler_id].end(); watchers++) @@ -768,40 +768,6 @@ ModeHandler* ModeParser::FindPrefix(unsigned const char pfxletter) return NULL; } -std::string ModeParser::ModeString(User* user, Channel* channel, bool nick_suffix) -{ - std::string types; - std::string pars; - - if (!channel || !user) - return ""; - - for (unsigned char mode = 'A'; mode <= 'z'; mode++) - { - unsigned char pos = (mode-65) | MASK_CHANNEL; - ModeHandler* mh = modehandlers[pos]; - if ((mh) && (mh->GetNumParams(true)) && (mh->GetNumParams(false))) - { - ModePair ret; - ret = mh->ModeSet(NULL, user, channel, user->nick); - if ((ret.first) && (ret.second == user->nick)) - { - if (nick_suffix) - { - pars.append(" "); - pars.append(user->nick); - } - types.push_back(mh->GetModeChar()); - } - } - } - - if (nick_suffix) - return types+pars; - else - return types; -} - std::string ModeParser::GiveModeList(ModeMasks m) { std::string type1; /* Listmodes EXCEPT those with a prefix */ @@ -849,7 +815,7 @@ std::string ModeParser::GiveModeList(ModeMasks m) return type1 + "," + type2 + "," + type3 + "," + type4; } -std::string ModeParser::BuildPrefixes() +std::string ModeParser::BuildPrefixes(bool lettersAndModes) { std::string mletters; std::string mprefixes; @@ -872,7 +838,7 @@ std::string ModeParser::BuildPrefixes() mprefixes = mprefixes + n->second.second; } - return "(" + mprefixes + ")" + mletters; + return lettersAndModes ? "(" + mprefixes + ")" + mletters : mletters; } bool ModeParser::AddModeWatcher(ModeWatcher* mw) @@ -981,7 +947,6 @@ struct builtin_modes ModeChannelBan b; ModeChannelOp o; - // halfop is added by configreader ModeChannelVoice v; ModeUserWallops uw; @@ -1027,10 +992,4 @@ ModeParser::ModeParser() ModeParser::~ModeParser() { - ModeHandler* mh = FindMode('h', MODETYPE_CHANNEL); - if (mh) - { - mh->cull(); - delete mh; - } }