X-Git-Url: https://git.netwichtig.de/gitweb/?a=blobdiff_plain;f=src%2Fmode.cpp;h=7b99eedb959d53572469a58d169af3929b8e583b;hb=6ffca6b9565b04aa9a4ffb83732d2c077dfc681d;hp=d04b7df975bdb69484544f2ccb8a8ece48d94103;hpb=b2f7888b7ac0e72041ceea7dd9e7e6d4c46dcb5c;p=user%2Fhenk%2Fcode%2Finspircd.git diff --git a/src/mode.cpp b/src/mode.cpp index d04b7df97..7b99eedb9 100644 --- a/src/mode.cpp +++ b/src/mode.cpp @@ -2,7 +2,7 @@ * | Inspire Internet Relay Chat Daemon | * +------------------------------------+ * - * InspIRCd: (C) 2002-2007 InspIRCd Development Team + * InspIRCd: (C) 2002-2008 InspIRCd Development Team * See: http://www.inspircd.org/wiki/index.php/Credits * * This program is free but copyrighted software; see @@ -11,11 +11,13 @@ * --------------------------------------------------- */ +/* $Core: libIRCDmode */ +/* $ExtraDeps: $(RELCPPFILES) */ +/* $ExtraObjects: modes/modeclasses.a */ +/* $ExtraBuild: @${MAKE} -C "modes" DIRNAME="src/modes" CC="$(CC)" $(MAKEARGS) CPPFILES="$(CPPFILES)" */ + #include "inspircd.h" -#include "users.h" -#include "modules.h" #include "inspstring.h" -#include "mode.h" /* +s (secret) */ #include "modes/cmode_s.h" @@ -107,12 +109,12 @@ char ModeHandler::GetModeChar() return mode; } -ModeAction ModeHandler::OnModeChange(userrec* source, userrec* dest, chanrec* channel, std::string ¶meter, bool adding) +ModeAction ModeHandler::OnModeChange(User*, User*, Channel*, std::string&, bool) { return MODEACTION_DENY; } -ModePair ModeHandler::ModeSet(userrec* source, userrec* dest, chanrec* channel, const std::string ¶meter) +ModePair ModeHandler::ModeSet(User*, User* dest, Channel* channel, const std::string&) { if (dest) { @@ -124,11 +126,15 @@ ModePair ModeHandler::ModeSet(userrec* source, userrec* dest, chanrec* channel, } } -void ModeHandler::DisplayList(userrec* user, chanrec* channel) +void ModeHandler::DisplayList(User*, Channel*) +{ +} + +void ModeHandler::DisplayEmptyList(User*, Channel*) { } -bool ModeHandler::CheckTimeStamp(time_t theirs, time_t ours, const std::string &their_param, const std::string &our_param, chanrec* channel) +bool ModeHandler::CheckTimeStamp(time_t theirs, time_t ours, const std::string&, const std::string&, Channel*) { return (ours < theirs); } @@ -151,18 +157,18 @@ ModeType ModeWatcher::GetModeType() return m_type; } -bool ModeWatcher::BeforeMode(userrec* source, userrec* dest, chanrec* channel, std::string ¶meter, bool adding, ModeType type) +bool ModeWatcher::BeforeMode(User*, User*, Channel*, std::string&, bool, ModeType) { return true; } -void ModeWatcher::AfterMode(userrec* source, userrec* dest, chanrec* channel, const std::string ¶meter, bool adding, ModeType type) +void ModeWatcher::AfterMode(User*, User*, Channel*, const std::string&, bool, ModeType) { } -userrec* ModeParser::SanityChecks(userrec *user,const char *dest,chanrec *chan,int status) +User* ModeParser::SanityChecks(User *user, const char *dest, Channel *chan, int) { - userrec *d; + User *d; if ((!user) || (!dest) || (!chan) || (!*dest)) { return NULL; @@ -176,7 +182,7 @@ userrec* ModeParser::SanityChecks(userrec *user,const char *dest,chanrec *chan,i return d; } -const char* ModeParser::Grant(userrec *d,chanrec *chan,int MASK) +const char* ModeParser::Grant(User *d,Channel *chan,int MASK) { if (!chan) return ""; @@ -206,7 +212,7 @@ const char* ModeParser::Grant(userrec *d,chanrec *chan,int MASK) return ""; } -const char* ModeParser::Revoke(userrec *d,chanrec *chan,int MASK) +const char* ModeParser::Revoke(User *d,Channel *chan,int MASK) { if (!chan) return ""; @@ -236,7 +242,7 @@ const char* ModeParser::Revoke(userrec *d,chanrec *chan,int MASK) return ""; } -void ModeParser::DisplayCurrentModes(userrec *user, userrec* targetuser, chanrec* targetchannel, const char* text) +void ModeParser::DisplayCurrentModes(User *user, User* targetuser, Channel* targetchannel, const char* text) { if (targetchannel) { @@ -273,13 +279,13 @@ void ModeParser::DisplayCurrentModes(userrec *user, userrec* targetuser, chanrec return; } -void ModeParser::Process(const char** parameters, int pcnt, userrec *user, bool servermode) +void ModeParser::Process(const char** parameters, int pcnt, User *user, bool servermode) { std::string target = parameters[0]; ModeType type = MODETYPE_USER; unsigned char mask = 0; - chanrec* targetchannel = ServerInstance->FindChan(parameters[0]); - userrec* targetuser = ServerInstance->FindNick(parameters[0]); + Channel* targetchannel = ServerInstance->FindChan(parameters[0]); + User* targetuser = ServerInstance->FindNick(parameters[0]); LastParse.clear(); @@ -300,6 +306,11 @@ void ModeParser::Process(const char** parameters, int pcnt, userrec *user, bool { unsigned char mletter = *mode; + int MOD_RESULT = 0; + FOREACH_RESULT(I_OnRawMode, OnRawMode(user, targetchannel, *mode, "", true, 0)); + if (MOD_RESULT == ACR_DENY) + continue; + if (*mode == '+') { mode++; @@ -327,6 +338,7 @@ void ModeParser::Process(const char** parameters, int pcnt, userrec *user, bool if (ServerInstance->Config->HideModeLists[mletter] && (targetchannel->GetStatus(user) < STATUS_HOP)) { user->WriteServ("482 %s %s :Only half-operators and above may view the +%c list",user->nick, targetchannel->name, *mode++); + mh->DisplayEmptyList(user, targetchannel); continue; } @@ -388,7 +400,8 @@ void ModeParser::Process(const char** parameters, int pcnt, userrec *user, bool * NOT a uline and NOT a servermode, * OR, NOT halfop or above. */ - user->WriteServ("482 %s %s :You're not a channel (half)operator",user->nick, targetchannel->name); + user->WriteServ("482 %s %s :You're not a channel %soperator",user->nick, targetchannel->name, + ServerInstance->Config->AllowHalfop ? "(half)" : ""); return; } } @@ -493,6 +506,11 @@ void ModeParser::Process(const char** parameters, int pcnt, userrec *user, bool continue; } + int MOD_RESULT = 0; + FOREACH_RESULT(I_OnRawMode, OnRawMode(user, targetchannel, modechar, parameter, adding, 1)); + if (MOD_RESULT == ACR_DENY) + return; + bool had_parameter = !parameter.empty(); for (ModeWatchIter watchers = modewatchers[handler_id].begin(); watchers != modewatchers[handler_id].end(); watchers++) @@ -515,6 +533,11 @@ void ModeParser::Process(const char** parameters, int pcnt, userrec *user, bool } else { + int MOD_RESULT = 0; + FOREACH_RESULT(I_OnRawMode, OnRawMode(user, targetchannel, modechar, "", adding, 0)); + if (MOD_RESULT == ACR_DENY) + return; + /* Fix by brain: mode watchers not being called for parameterless modes */ for (ModeWatchIter watchers = modewatchers[handler_id].begin(); watchers != modewatchers[handler_id].end(); watchers++) { @@ -575,7 +598,7 @@ void ModeParser::Process(const char** parameters, int pcnt, userrec *user, bool /* Does this mode have a prefix? */ if (modehandlers[handler_id]->GetPrefix() && targetchannel) { - userrec* user_to_prefix = ServerInstance->FindNick(parameter); + User* user_to_prefix = ServerInstance->FindNick(parameter); if (user_to_prefix) targetchannel->SetPrefix(user_to_prefix, modehandlers[handler_id]->GetPrefix(), modehandlers[handler_id]->GetPrefixRank(), adding); @@ -602,7 +625,7 @@ void ModeParser::Process(const char** parameters, int pcnt, userrec *user, bool else { /* No mode handler? Unknown mode character then. */ - user->WriteServ("472 %s %c :is unknown mode char to me",user->nick, modechar); + user->WriteServ("%d %s %c :is unknown mode char to me", type == MODETYPE_CHANNEL ? 472 : 501, user->nick, modechar); } break; } @@ -685,7 +708,7 @@ void ModeParser::CleanMask(std::string &mask) } } -bool ModeParser::AddMode(ModeHandler* mh, unsigned const char modeletter) +bool ModeParser::AddMode(ModeHandler* mh) { unsigned char mask = 0; unsigned char pos = 0; @@ -731,7 +754,7 @@ bool ModeParser::DelMode(ModeHandler* mh) switch (mh->GetModeType()) { case MODETYPE_USER: - for (user_hash::iterator i = ServerInstance->clientlist->begin(); i != ServerInstance->clientlist->end(); i++) + for (user_hash::iterator i = ServerInstance->Users->clientlist->begin(); i != ServerInstance->Users->clientlist->end(); i++) { mh->RemoveMode(i->second); } @@ -831,7 +854,7 @@ ModeHandler* ModeParser::FindPrefix(unsigned const char pfxletter) return NULL; } -std::string ModeParser::ModeString(userrec* user, chanrec* channel) +std::string ModeParser::ModeString(User* user, Channel* channel) { std::string types; std::string pars; @@ -994,7 +1017,7 @@ bool ModeParser::DelModeWatcher(ModeWatcher* mw) /** This default implementation can remove simple user modes */ -void ModeHandler::RemoveMode(userrec* user) +void ModeHandler::RemoveMode(User* user) { char moderemove[MAXBUF]; const char* parameters[] = { user->nick, moderemove }; @@ -1009,51 +1032,40 @@ void ModeHandler::RemoveMode(userrec* user) /** This default implementation can remove simple channel modes * (no parameters) */ -void ModeHandler::RemoveMode(chanrec* channel) +void ModeHandler::RemoveMode(Channel* channel) { char moderemove[MAXBUF]; const char* parameters[] = { channel->name, moderemove }; if (channel->IsModeSet(this->GetModeChar())) { - userrec* n = new userrec(ServerInstance); - sprintf(moderemove,"-%c",this->GetModeChar()); - n->SetFd(FD_MAGIC_NUMBER); - - ServerInstance->SendMode(parameters, 2, n); - - delete n; + ServerInstance->SendMode(parameters, 2, ServerInstance->FakeClient); } } ModeParser::ModeParser(InspIRCd* Instance) : ServerInstance(Instance) { - struct Initializer + ModeHandler* modes[] = { - char modechar; - ModeHandler* handler; - }; - - Initializer modes[] = { - { 's', new ModeChannelSecret(Instance) }, - { 'p', new ModeChannelPrivate(Instance) }, - { 'm', new ModeChannelModerated(Instance) }, - { 't', new ModeChannelTopicOps(Instance) }, - { 'n', new ModeChannelNoExternal(Instance) }, - { 'i', new ModeChannelInviteOnly(Instance) }, - { 'k', new ModeChannelKey(Instance) }, - { 'l', new ModeChannelLimit(Instance) }, - { 'b', new ModeChannelBan(Instance) }, - { 'o', new ModeChannelOp(Instance) }, - { 'h', new ModeChannelHalfOp(Instance) }, - { 'v', new ModeChannelVoice(Instance) }, - { 's', new ModeUserServerNotice(Instance) }, - { 'w', new ModeUserWallops(Instance) }, - { 'i', new ModeUserInvisible(Instance) }, - { 'o', new ModeUserOperator(Instance) }, - { 'n', new ModeUserServerNoticeMask(Instance) }, - { 0, NULL } + new ModeChannelSecret(Instance), + new ModeChannelPrivate(Instance), + new ModeChannelModerated(Instance), + new ModeChannelTopicOps(Instance), + new ModeChannelNoExternal(Instance), + new ModeChannelInviteOnly(Instance), + new ModeChannelKey(Instance), + new ModeChannelLimit(Instance), + new ModeChannelBan(Instance), + new ModeChannelOp(Instance), + new ModeChannelHalfOp(Instance), + new ModeChannelVoice(Instance), + new ModeUserServerNotice(Instance), + new ModeUserWallops(Instance), + new ModeUserInvisible(Instance), + new ModeUserOperator(Instance), + new ModeUserServerNoticeMask(Instance), + NULL }; /* Clear mode list */ @@ -1064,6 +1076,6 @@ ModeParser::ModeParser(InspIRCd* Instance) : ServerInstance(Instance) LastParse.clear(); /* Initialise the RFC mode letters */ - for (int index = 0; modes[index].modechar; index++) - this->AddMode(modes[index].handler, modes[index].modechar); + for (int index = 0; modes[index]; index++) + this->AddMode(modes[index]); }