From 5adc8bfefc126aff32a88219409ec9131229d86a Mon Sep 17 00:00:00 2001 From: Adam Date: Thu, 27 Feb 2014 04:23:57 -0500 Subject: [PATCH] Do not take modes from users in channels with secureops off if we are always lowering channels timestamps to their creations --- modules/commands/cs_set.cpp | 1 + modules/pseudoclients/chanserv.cpp | 11 +++++++++++ src/channels.cpp | 9 ++------- 3 files changed, 14 insertions(+), 7 deletions(-) diff --git a/modules/commands/cs_set.cpp b/modules/commands/cs_set.cpp index 4ade813c1..5769adb30 100644 --- a/modules/commands/cs_set.cpp +++ b/modules/commands/cs_set.cpp @@ -1319,6 +1319,7 @@ class CSSet : public Module if (noautoop.HasExt(chan->ci)) give_modes = false; if (secureops.HasExt(chan->ci)) + // This overrides what chanserv does because it is loaded after chanserv take_modes = true; } } diff --git a/modules/pseudoclients/chanserv.cpp b/modules/pseudoclients/chanserv.cpp index 3e066527e..388a14649 100644 --- a/modules/pseudoclients/chanserv.cpp +++ b/modules/pseudoclients/chanserv.cpp @@ -457,6 +457,17 @@ class ChanServCore : public Module, public ChanServService if (!ci->HasExt("CS_NO_EXPIRE") && chanserv_expire && !Anope::NoExpire && ci->last_used != Anope::CurTime) info[_("Expires")] = Anope::strftime(ci->last_used + chanserv_expire, source.GetAccount()); } + + void OnSetCorrectModes(User *user, Channel *chan, AccessGroup &access, bool &give_modes, bool &take_modes) anope_override + { + if (always_lower) + // Since we always lower the TS, the other side will remove the modes if the channel ts lowers, so we don't + // have to worry about it + take_modes = false; + else if (ModeManager::FindChannelModeByName("REGISTERED")) + // Otherwise if the registered channel mode exists, we should remove modes if the channel is not +r + take_modes = !chan->HasMode("REGISTERED"); + } }; MODULE_INIT(ChanServCore) diff --git a/src/channels.cpp b/src/channels.cpp index 27e186b83..a9ad68b93 100644 --- a/src/channels.cpp +++ b/src/channels.cpp @@ -788,14 +788,9 @@ void Channel::SetCorrectModes(User *user, bool give_modes) Log(LOG_DEBUG) << "Setting correct user modes for " << user->nick << " on " << this->name << " (" << (give_modes ? "" : "not ") << "giving modes)"; AccessGroup u_access = ci->AccessFor(user); - ChannelMode *registered = ModeManager::FindChannelModeByName("REGISTERED"); - /* If this channel has secureops, or the registered channel mode exists and the channel does not have +r set (aka the channel - * was created just now or while we were off), or the registered channel mode does not exist and channel is syncing (aka just - * created *to us*) and the user's server is synced (aka this isn't us doing our initial uplink - without this we would be deopping all - * users with no access on a non-secureops channel on startup), and the user's server isn't ulined, then set negative modes. - */ - bool take_modes = (registered && !this->HasMode("REGISTERED")) || (!registered && this->syncing && user->server->IsSynced()); + /* Initially only take modes if the channel is being created by a non netmerge */ + bool take_modes = this->syncing && user->server->IsSynced(); FOREACH_MOD(OnSetCorrectModes, (user, this, u_access, give_modes, take_modes));