X-Git-Url: https://git.netwichtig.de/gitweb/?a=blobdiff_plain;f=src%2Fmodules%2Fm_permchannels.cpp;h=ae69ecc4ff3f0e75a1daedef8bc39ac82c21503f;hb=eacd707421be4f2612df9bde4517649061bb062e;hp=0133c381483c216e97d7a53791c4f2df1381f9f2;hpb=8eae84e3ba8ec6d025592b9406193f73929bbf77;p=user%2Fhenk%2Fcode%2Finspircd.git diff --git a/src/modules/m_permchannels.cpp b/src/modules/m_permchannels.cpp index 0133c3814..ae69ecc4f 100644 --- a/src/modules/m_permchannels.cpp +++ b/src/modules/m_permchannels.cpp @@ -2,7 +2,7 @@ * | Inspire Internet Relay Chat Daemon | * +------------------------------------+ * - * InspIRCd: (C) 2002-2008 InspIRCd Development Team + * InspIRCd: (C) 2002-2009 InspIRCd Development Team * See: http://www.inspircd.org/wiki/index.php/Credits * * This program is free but copyrighted software; see @@ -23,8 +23,14 @@ class PermChannel : public ModeHandler public: PermChannel(InspIRCd* Instance) : ModeHandler(Instance, 'P', 0, 0, false, MODETYPE_CHANNEL, false) { } - ModeAction OnModeChange(User* source, User* dest, Channel* channel, std::string ¶meter, bool adding, bool) + ModeAction OnModeChange(User* source, User* dest, Channel* channel, std::string ¶meter, bool adding, bool sm) { + if (!source->HasPrivPermission("channels/set-permanent")) + { + source->WriteNumeric(ERR_NOPRIVILEGES, "%s :Permission Denied - You do not have the required operator privileges", source->nick.c_str()); + return MODEACTION_DENY; + } + if (adding) { if (!channel->IsModeSet('P')) @@ -37,10 +43,30 @@ class PermChannel : public ModeHandler { if (channel->IsModeSet('P')) { - channel->SetMode('P',false); + if (channel->GetUserCounter() == 0 && !sm) + { + /* + * ugh, ugh, UGH! + * + * We can't delete this channel the way things work at the moment, + * because of the following scenario: + * s1:#c <-> s2:#c + * + * s1 has a user in #c, s2 does not. s2 has +P set. s2 has a losing TS. + * + * On netmerge, s2 loses, so s2 removes all modes (including +P) which + * would subsequently delete the channel here causing big fucking problems. + * + * I don't think there's really a way around this, so just deny -P on a 0 user chan. + * -- w00t + * + * delete channel; + */ + return MODEACTION_DENY; + } - if (channel->GetUserCounter() == 0) - delete channel; + /* for servers, remove +P (to avoid desyncs) but don't bother trying to delete. */ + channel->SetMode('P',false); return MODEACTION_ALLOW; } } @@ -87,9 +113,9 @@ public: std::string topic = MyConf.ReadValue("permchannels", "topic", i); std::string modes = MyConf.ReadValue("permchannels", "modes", i); - if (channel.empty() || topic.empty()) + if (channel.empty()) { - ServerInstance->Logs->Log("blah", DEBUG, "Malformed permchannels tag with empty topic or channel name."); + ServerInstance->Logs->Log("blah", DEBUG, "Malformed permchannels tag with empty channel name."); continue; } @@ -98,7 +124,8 @@ public: if (!c) { c = new Channel(ServerInstance, channel, ServerInstance->Time()); - c->SetTopic(NULL, topic, true); + if (!topic.empty()) + c->SetTopic(NULL, topic, true); ServerInstance->Logs->Log("blah", DEBUG, "Added %s with topic %s", channel.c_str(), topic.c_str()); if (modes.empty()) @@ -130,7 +157,7 @@ public: virtual Version GetVersion() { - return Version(1,2,0,0,VF_COMMON|VF_VENDOR,API_VERSION); + return Version("$Id$",VF_COMMON|VF_VENDOR,API_VERSION); } virtual int OnChannelPreDelete(Channel *c)