diff options
author | Adam <Adam@anope.org> | 2011-08-28 15:46:15 -0400 |
---|---|---|
committer | Adam <Adam@anope.org> | 2011-09-10 02:05:00 -0400 |
commit | 700a585b1bb38a9dc0ac3e749083250d405488f8 (patch) | |
tree | 8af306bd60778815fe5a137590d3b888213ad231 /src/access.cpp | |
parent | 62752db4c49a8679b51d5996003fd3a23c2a3f2d (diff) |
Allow modules to add their own channel levels
Diffstat (limited to 'src/access.cpp')
-rw-r--r-- | src/access.cpp | 141 |
1 files changed, 114 insertions, 27 deletions
diff --git a/src/access.cpp b/src/access.cpp index b9b3e1e9a..49636cd04 100644 --- a/src/access.cpp +++ b/src/access.cpp @@ -19,6 +19,84 @@ enum ACCESS_FOUNDER = 10001 }; +Privilege::Privilege(const Anope::string &n, const Anope::string &d) : name(n), desc(d) +{ +} + +bool Privilege::operator==(const Privilege &other) +{ + return this->name == other.name; +} + +std::vector<Privilege> PrivilegeManager::privs; + +void PrivilegeManager::AddPrivilege(Privilege p, int pos, int def) +{ + if (pos < 0 || static_cast<size_t>(pos) > privs.size()) + pos = privs.size(); + privs.insert(privs.begin() + pos, p); + for (registered_channel_map::const_iterator cit = RegisteredChannelList.begin(), cit_end = RegisteredChannelList.end(); cit != cit_end; ++cit) + cit->second->SetLevel(p.name, def); +} + +void PrivilegeManager::RemovePrivilege(Privilege &p) +{ + std::vector<Privilege>::iterator it = std::find(privs.begin(), privs.end(), p); + if (it != privs.end()) + privs.erase(it); + for (registered_channel_map::const_iterator cit = RegisteredChannelList.begin(), cit_end = RegisteredChannelList.end(); cit != cit_end; ++cit) + cit->second->RemoveLevel(p.name); +} + +Privilege *PrivilegeManager::FindPrivilege(const Anope::string &name) +{ + for (unsigned i = privs.size(); i > 0; --i) + if (privs[i - 1].name == name) + return &privs[i - 1]; + return NULL; +} + +void PrivilegeManager::Init() +{ + AddPrivilege(Privilege("ACCESS_LIST", _("Allowed to view the access list"))); + AddPrivilege(Privilege("NOKICK", _("Prevents users being kicked by Services"))); + AddPrivilege(Privilege("FANTASIA", _("Allowed to use fantasy commands"))); + AddPrivilege(Privilege("FOUNDER", _("Allowed to issue commands restricted to channel founders"))); + AddPrivilege(Privilege("GREET", _("Greet message displayed"))); + AddPrivilege(Privilege("AUTOVOICE", _("Automatic mode +v"))); + AddPrivilege(Privilege("VOICEME", _("Allowed to (de)voice him/herself"))); + AddPrivilege(Privilege("VOICE", _("Allowed to (de)voice users"))); + AddPrivilege(Privilege("INFO", _("Allowed to use INFO command with ALL option"))); + AddPrivilege(Privilege("SAY", _("Allowed to use SAY and ACT commands"))); + AddPrivilege(Privilege("AUTOHALFOP", _("Automatic mode +h"))); + AddPrivilege(Privilege("HALFOPME", _("Allowed to (de)halfop him/herself"))); + AddPrivilege(Privilege("HALFOP", _("Allowed to (de)halfop users"))); + AddPrivilege(Privilege("KICK", _("Allowed to use the KICK command"))); + AddPrivilege(Privilege("SIGNKICK", _("No signed kick when SIGNKICK LEVEL is used"))); + AddPrivilege(Privilege("BAN", _("Allowed to use ban users"))); + AddPrivilege(Privilege("TOPIC", _("Allowed to change channel topics"))); + AddPrivilege(Privilege("MODE", _("Allowed to change channel modes"))); + AddPrivilege(Privilege("GETKEY", _("Allowed to use GETKEY command"))); + AddPrivilege(Privilege("INVITE", _("Allowed to use the INVITE command"))); + AddPrivilege(Privilege("UNBAN", _("Allowed to unban users"))); + AddPrivilege(Privilege("AUTOOP", _("Automatic channel operator status"))); + AddPrivilege(Privilege("AUTOOWNER", _("Automatic mode +q"))); + AddPrivilege(Privilege("OPDEOPME", _("Allowed to (de)op him/herself"))); + AddPrivilege(Privilege("OPDEOP", _("Allowed to (de)op users"))); + AddPrivilege(Privilege("AUTOPROTECT", _("Automatic mode +a"))); + AddPrivilege(Privilege("AKICK", _("Allowed to use AKICK command"))); + AddPrivilege(Privilege("BADWORDS", _("Allowed to modify channel badwords list"))); + AddPrivilege(Privilege("ASSIGN", _("Allowed to assign/unassign a bot"))); + AddPrivilege(Privilege("MEMO", _("Allowed to read channel memos"))); + AddPrivilege(Privilege("ACCESS_CHANGE", _("Allowed to modify the access list"))); + AddPrivilege(Privilege("PROTECTME", _("Allowed to (de)protect him/herself"))); +} + +std::vector<Privilege> &PrivilegeManager::GetPrivileges() +{ + return privs; +} + AccessProvider::AccessProvider(Module *o, const Anope::string &n) : Service<AccessProvider>(o, n) { } @@ -37,26 +115,29 @@ ChanAccess::~ChanAccess() bool ChanAccess::operator>(ChanAccess &other) { - for (size_t i = CA_SIZE; i > 0; --i) - if (this->HasPriv(static_cast<ChannelAccess>(i - 1)) && !other.HasPriv(static_cast<ChannelAccess>(i - 1))) + const std::vector<Privilege> &privs = PrivilegeManager::GetPrivileges(); + for (unsigned i = privs.size(); i > 0; --i) + if (this->HasPriv(privs[i - 1].name) && !other.HasPriv(privs[i - 1].name)) return true; return false; } bool ChanAccess::operator<(ChanAccess &other) { - for (size_t i = CA_SIZE; i > 0; --i) - if (!this->HasPriv(static_cast<ChannelAccess>(i - 1)) && other.HasPriv(static_cast<ChannelAccess>(i - 1))) + const std::vector<Privilege> &privs = PrivilegeManager::GetPrivileges(); + for (unsigned i = privs.size(); i > 0; --i) + if (!this->HasPriv(privs[i - 1].name) && other.HasPriv(privs[i - 1].name)) return true; return false; } bool ChanAccess::operator>=(ChanAccess &other) { - for (size_t i = CA_SIZE; i > 0; --i) + const std::vector<Privilege> &privs = PrivilegeManager::GetPrivileges(); + for (unsigned i = privs.size(); i > 0; --i) { - bool this_p = this->HasPriv(static_cast<ChannelAccess>(i - 1)), - other_p = other.HasPriv(static_cast<ChannelAccess>(i - 1)); + bool this_p = this->HasPriv(privs[i - 1].name), + other_p = other.HasPriv(privs[i - 1].name); if ((this_p && !other_p) || (this_p && other_p)) return true; @@ -67,10 +148,11 @@ bool ChanAccess::operator>=(ChanAccess &other) bool ChanAccess::operator<=(ChanAccess &other) { - for (size_t i = CA_SIZE; i > 0; --i) + const std::vector<Privilege> &privs = PrivilegeManager::GetPrivileges(); + for (unsigned i = privs.size(); i > 0; --i) { - bool this_p = this->HasPriv(static_cast<ChannelAccess>(i - 1)), - other_p = other.HasPriv(static_cast<ChannelAccess>(i - 1)); + bool this_p = this->HasPriv(privs[i - 1].name), + other_p = other.HasPriv(privs[i - 1].name); if ((!this_p && other_p) || (this_p && other_p)) return true; @@ -86,23 +168,23 @@ AccessGroup::AccessGroup() : std::vector<ChanAccess *>() this->SuperAdmin = this->Founder = false; } -bool AccessGroup::HasPriv(ChannelAccess priv) const +bool AccessGroup::HasPriv(const Anope::string &name) const { if (this->SuperAdmin) return true; - else if (ci->levels[priv] == ACCESS_INVALID) + else if (ci->GetLevel(name) == ACCESS_INVALID) return false; else if (this->Founder) return true; EventReturn MOD_RESULT; - FOREACH_RESULT(I_OnGroupCheckPriv, OnGroupCheckPriv(this, priv)); + FOREACH_RESULT(I_OnGroupCheckPriv, OnGroupCheckPriv(this, name)); if (MOD_RESULT != EVENT_CONTINUE) return MOD_RESULT == EVENT_ALLOW; for (unsigned i = this->size(); i > 0; --i) { ChanAccess *access = this->at(i - 1); - FOREACH_RESULT(I_OnCheckPriv, OnCheckPriv(access, priv)); - if (MOD_RESULT == EVENT_ALLOW || access->HasPriv(priv)) + FOREACH_RESULT(I_OnCheckPriv, OnCheckPriv(access, name)); + if (MOD_RESULT == EVENT_ALLOW || access->HasPriv(name)) return true; } return false; @@ -110,9 +192,10 @@ bool AccessGroup::HasPriv(ChannelAccess priv) const ChanAccess *AccessGroup::Highest() const { - for (size_t i = CA_SIZE; i > 0; --i) + const std::vector<Privilege> &privs = PrivilegeManager::GetPrivileges(); + for (unsigned i = privs.size(); i > 0; --i) for (unsigned j = this->size(); j > 0; --j) - if (this->at(j - 1)->HasPriv(static_cast<ChannelAccess>(i - 1))) + if (this->at(j - 1)->HasPriv(privs[ - 1].name)) return this->at(j - 1); return NULL; } @@ -127,8 +210,9 @@ bool AccessGroup::operator>(const AccessGroup &other) const return true; else if (!this->Founder && other.Founder) return false; - for (size_t i = CA_SIZE; i > 0; --i) - if (this->HasPriv(static_cast<ChannelAccess>(i - 1)) && !other.HasPriv(static_cast<ChannelAccess>(i - 1))) + const std::vector<Privilege> &privs = PrivilegeManager::GetPrivileges(); + for (unsigned i = privs.size(); i > 0; --i) + if (this->HasPriv(privs[i - 1].name) && !other.HasPriv(privs[i - 1].name)) return true; return false; } @@ -143,8 +227,9 @@ bool AccessGroup::operator<(const AccessGroup &other) const return true; else if (this->Founder && !other.Founder) return false; - for (size_t i = CA_SIZE; i > 0; --i) - if (!this->HasPriv(static_cast<ChannelAccess>(i - 1)) && other.HasPriv(static_cast<ChannelAccess>(i - 1))) + const std::vector<Privilege> &privs = PrivilegeManager::GetPrivileges(); + for (unsigned i = privs.size(); i > 0; --i) + if (!this->HasPriv(privs[i - 1].name) && other.HasPriv(privs[i - 1].name)) return true; return false; } @@ -159,10 +244,11 @@ bool AccessGroup::operator>=(const AccessGroup &other) const return true; else if (other.Founder) return false; - for (size_t i = CA_SIZE; i > 0; --i) + const std::vector<Privilege> &privs = PrivilegeManager::GetPrivileges(); + for (unsigned i = privs.size(); i > 0; --i) { - bool this_p = this->HasPriv(static_cast<ChannelAccess>(i - 1)), - other_p = other.HasPriv(static_cast<ChannelAccess>(i - 1)); + bool this_p = this->HasPriv(privs[i - 1].name), + other_p = other.HasPriv(privs[i - 1].name); if ((this_p && !other_p) || (this_p && other_p)) return true; @@ -181,10 +267,11 @@ bool AccessGroup::operator<=(const AccessGroup &other) const return true; else if (this->Founder) return false; - for (size_t i = CA_SIZE; i > 0; --i) + const std::vector<Privilege> &privs = PrivilegeManager::GetPrivileges(); + for (unsigned i = privs.size(); i > 0; --i) { - bool this_p = this->HasPriv(static_cast<ChannelAccess>(i - 1)), - other_p = other.HasPriv(static_cast<ChannelAccess>(i - 1)); + bool this_p = this->HasPriv(privs[i - 1].name), + other_p = other.HasPriv(privs[i - 1].name); if ((!this_p && other_p) || (this_p && other_p)) return true; |