diff options
| author | Adam <Adam@anope.org> | 2010-11-30 03:02:33 -0500 |
|---|---|---|
| committer | Adam <Adam@anope.org> | 2010-12-12 19:37:02 -0500 |
| commit | 0ba566491ea246fcc895862d0ef80bdf4ee43b4b (patch) | |
| tree | 9852671d32476ddad58e264a8e074c41fef9f69f /modules/core | |
| parent | 2a4d57a1cacd22084abea5dd21c87dc733a7b5bf (diff) | |
Allowing adding hostmasks to channel access lists
Diffstat (limited to 'modules/core')
| -rw-r--r-- | modules/core/cs_access.cpp | 111 | ||||
| -rw-r--r-- | modules/core/cs_akick.cpp | 12 | ||||
| -rw-r--r-- | modules/core/cs_ban.cpp | 10 | ||||
| -rw-r--r-- | modules/core/cs_clone.cpp | 2 | ||||
| -rw-r--r-- | modules/core/cs_kick.cpp | 10 | ||||
| -rw-r--r-- | modules/core/cs_modes.cpp | 10 | ||||
| -rw-r--r-- | modules/core/cs_register.cpp | 4 | ||||
| -rw-r--r-- | modules/core/cs_status.cpp | 3 | ||||
| -rw-r--r-- | modules/core/cs_xop.cpp | 119 | ||||
| -rw-r--r-- | modules/core/db_plain.cpp | 12 | ||||
| -rw-r--r-- | modules/core/ms_staff.cpp | 1 | ||||
| -rw-r--r-- | modules/core/ns_access.cpp | 3 | ||||
| -rw-r--r-- | modules/core/ns_alist.cpp | 12 |
13 files changed, 133 insertions, 176 deletions
diff --git a/modules/core/cs_access.cpp b/modules/core/cs_access.cpp index 96856da60..43cb58cf1 100644 --- a/modules/core/cs_access.cpp +++ b/modules/core/cs_access.cpp @@ -50,10 +50,10 @@ class AccessListCallback : public NumberList if (source.ci->HasFlag(CI_XOP)) { Anope::string xop = get_xop_level(access->level); - source.Reply(CHAN_ACCESS_LIST_XOP_FORMAT, Number + 1, xop.c_str(), access->nc->display.c_str()); + source.Reply(CHAN_ACCESS_LIST_XOP_FORMAT, Number + 1, xop.c_str(), access->mask.c_str()); } else - source.Reply(CHAN_ACCESS_LIST_AXS_FORMAT, Number + 1, access->level, access->nc->display.c_str()); + source.Reply(CHAN_ACCESS_LIST_AXS_FORMAT, Number + 1, access->level, access->mask.c_str()); } }; @@ -93,10 +93,10 @@ class AccessViewCallback : public AccessListCallback if (ci->HasFlag(CI_XOP)) { Anope::string xop = get_xop_level(access->level); - source.Reply(CHAN_ACCESS_VIEW_XOP_FORMAT, Number + 1, xop.c_str(), access->nc->display.c_str(), access->creator.c_str(), timebuf.c_str()); + source.Reply(CHAN_ACCESS_VIEW_XOP_FORMAT, Number + 1, xop.c_str(), access->mask.c_str(), access->creator.c_str(), timebuf.c_str()); } else - source.Reply(CHAN_ACCESS_VIEW_AXS_FORMAT, Number + 1, access->level, access->nc->display.c_str(), access->creator.c_str(), timebuf.c_str()); + source.Reply(CHAN_ACCESS_VIEW_AXS_FORMAT, Number + 1, access->level, access->mask.c_str(), access->creator.c_str(), timebuf.c_str()); } }; @@ -142,7 +142,9 @@ class AccessDelCallback : public NumberList ChanAccess *access = ci->GetAccess(Number - 1); - if (get_access(u, ci) <= access->level && !u->Account()->HasPriv("chanserv/access/modify")) + ChanAccess *u_access = ci->GetAccess(u); + int16 u_level = u_access ? u_access->level : 0; + if (u_level <= access->level && !u->Account()->HasPriv("chanserv/access/modify")) { Denied = true; return; @@ -150,11 +152,11 @@ class AccessDelCallback : public NumberList ++Deleted; if (!Nicks.empty()) - Nicks += ", " + access->nc->display; + Nicks += ", " + access->mask; else - Nicks = access->nc->display; + Nicks = access->mask; - FOREACH_MOD(I_OnAccessDel, OnAccessDel(ci, u, access->nc)); + FOREACH_MOD(I_OnAccessDel, OnAccessDel(ci, u, access)); ci->EraseAccess(Number - 1); } @@ -167,11 +169,12 @@ class CommandCSAccess : public Command User *u = source.u; ChannelInfo *ci = source.ci; - const Anope::string &nick = params[2]; + Anope::string mask = params[2]; int level = params[3].is_number_only() ? convertTo<int>(params[3]) : ACCESS_INVALID; - int ulev = get_access(u, ci); - if (level >= ulev && !u->Account()->HasPriv("chanserv/access/modify")) + ChanAccess *u_access = ci->GetAccess(u); + int16 u_level = u_access ? u_access->level : 0; + if (level >= u_level && !u->Account()->HasPriv("chanserv/access/modify")) { source.Reply(ACCESS_DENIED); return MOD_CONT; @@ -188,41 +191,37 @@ class CommandCSAccess : public Command return MOD_CONT; } - bool override = !check_access(u, ci, CA_ACCESS_CHANGE) || level >= ulev; + bool override = !check_access(u, ci, CA_ACCESS_CHANGE) || level >= u_level; - NickAlias *na = findnick(nick); - if (!na) + NickAlias *na = findnick(mask); + if (!na && mask.find_first_of("!@*") == Anope::string::npos) + mask += "!*@*"; + else if (na && na->HasFlag(NS_FORBIDDEN)) { - source.Reply(CHAN_ACCESS_NICKS_ONLY); - return MOD_CONT; - } - else if (na->HasFlag(NS_FORBIDDEN)) - { - source.Reply(NICK_X_FORBIDDEN, nick.c_str()); + source.Reply(NICK_X_FORBIDDEN, mask.c_str()); return MOD_CONT; } - NickCore *nc = na->nc; - ChanAccess *access = ci->GetAccess(nc); + ChanAccess *access = ci->GetAccess(mask); if (access) { - /* Don't allow lowering from a level >= ulev */ - if (access->level >= ulev && !u->Account()->HasPriv("chanserv/access/modify")) + /* Don't allow lowering from a level >= u_level */ + if (access->level >= u_level && !u->Account()->HasPriv("chanserv/access/modify")) { source.Reply(ACCESS_DENIED); return MOD_CONT; } if (access->level == level) { - source.Reply(CHAN_ACCESS_LEVEL_UNCHANGED, access->nc->display.c_str(), ci->name.c_str(), level); + source.Reply(CHAN_ACCESS_LEVEL_UNCHANGED, access->mask.c_str(), ci->name.c_str(), level); return MOD_CONT; } access->level = level; - FOREACH_MOD(I_OnAccessChange, OnAccessChange(ci, u, na->nc, level)); + FOREACH_MOD(I_OnAccessChange, OnAccessChange(ci, u, access)); - Log(override ? LOG_OVERRIDE : LOG_COMMAND, u, this, ci) << "ADD " << na->nick << " (group: " << nc->display << ") (level: " << level << ") as level " << ulev; - source.Reply(CHAN_ACCESS_LEVEL_CHANGED, nc->display.c_str(), ci->name.c_str(), level); + Log(override ? LOG_OVERRIDE : LOG_COMMAND, u, this, ci) << "ADD " << na->nick << " (level: " << level << ") as level " << u_level; + source.Reply(CHAN_ACCESS_LEVEL_CHANGED, access->mask.c_str(), ci->name.c_str(), level); return MOD_CONT; } @@ -232,12 +231,12 @@ class CommandCSAccess : public Command return MOD_CONT; } - ci->AddAccess(nc, level, u->nick); + access = ci->AddAccess(mask, level, u->nick); - FOREACH_MOD(I_OnAccessAdd, OnAccessAdd(ci, u, nc, level)); + FOREACH_MOD(I_OnAccessAdd, OnAccessAdd(ci, u, access)); - Log(override ? LOG_OVERRIDE : LOG_COMMAND, u, this, ci) << "ADD " << na->nick << " (group: " << nc->display << ") (level: " << level << ") as level " << ulev; - source.Reply(CHAN_ACCESS_ADDED, nc->display.c_str(), ci->name.c_str(), level); + Log(override ? LOG_OVERRIDE : LOG_COMMAND, u, this, ci) << "ADD " << mask << " (level: " << level << ") as level " << u_level; + source.Reply(CHAN_ACCESS_ADDED, access->mask.c_str(), ci->name.c_str(), level); return MOD_CONT; } @@ -247,49 +246,33 @@ class CommandCSAccess : public Command User *u = source.u; ChannelInfo *ci = source.ci; - const Anope::string &nick = params[2]; + const Anope::string &mask = params[2]; if (!ci->GetAccessCount()) source.Reply(CHAN_ACCESS_LIST_EMPTY, ci->name.c_str()); - else if (isdigit(nick[0]) && nick.find_first_not_of("1234567890,-") == Anope::string::npos) + else if (isdigit(mask[0]) && mask.find_first_not_of("1234567890,-") == Anope::string::npos) { - AccessDelCallback list(source, this, nick); + AccessDelCallback list(source, this, mask); list.Process(); } else { - NickAlias *na = findnick(nick); - if (!na) - { - source.Reply(NICK_X_NOT_REGISTERED, nick.c_str()); - return MOD_CONT; - } - - NickCore *nc = na->nc; - - unsigned i, end; - ChanAccess *access = NULL; - for (i = 0, end = ci->GetAccessCount(); i < end; ++i) - { - access = ci->GetAccess(i); - - if (access->nc == nc) - break; - } - - if (i == end) - source.Reply(CHAN_ACCESS_NOT_FOUND, nick.c_str(), ci->name.c_str()); - else if (nc != u->Account() && check_access(u, ci, CA_NOJOIN) && get_access(u, ci) <= access->level && !u->Account()->HasPriv("chanserv/access/modify")) + ChanAccess *access = ci->GetAccess(mask); + ChanAccess *u_access = ci->GetAccess(u); + int16 u_level = u_access ? u_access->level : 0; + if (!access) + source.Reply(CHAN_ACCESS_NOT_FOUND, mask.c_str(), ci->name.c_str()); + else if (access->nc != u->Account() && check_access(u, ci, CA_NOJOIN) && u_level <= access->level && !u->Account()->HasPriv("chanserv/access/modify")) source.Reply(ACCESS_DENIED); else { - source.Reply(CHAN_ACCESS_DELETED, access->nc->display.c_str(), ci->name.c_str()); - bool override = !check_access(u, ci, CA_ACCESS_CHANGE) && nc != u->Account(); - Log(override ? LOG_OVERRIDE : LOG_COMMAND, u, this, ci) << "DEL " << na->nick << " (group: " << access->nc->display << ") from level " << access->level; + source.Reply(CHAN_ACCESS_DELETED, access->mask.c_str(), ci->name.c_str()); + bool override = !check_access(u, ci, CA_ACCESS_CHANGE) && access->nc != u->Account(); + Log(override ? LOG_OVERRIDE : LOG_COMMAND, u, this, ci) << "DEL " << access->mask << " from level " << access->level; - FOREACH_MOD(I_OnAccessDel, OnAccessDel(ci, u, na->nc)); + FOREACH_MOD(I_OnAccessDel, OnAccessDel(ci, u, access)); - ci->EraseAccess(i); + ci->EraseAccess(access); } } @@ -317,7 +300,7 @@ class CommandCSAccess : public Command { ChanAccess *access = ci->GetAccess(i); - if (!nick.empty() && access->nc && !Anope::Match(access->nc->display, nick)) + if (!nick.empty() && !Anope::Match(access->mask, nick)) continue; if (!SentHeader) @@ -359,7 +342,7 @@ class CommandCSAccess : public Command { ChanAccess *access = ci->GetAccess(i); - if (!nick.empty() && access->nc && !Anope::Match(access->nc->display, nick)) + if (!nick.empty() && !Anope::Match(access->mask, nick)) continue; if (!SentHeader) diff --git a/modules/core/cs_akick.cpp b/modules/core/cs_akick.cpp index 4df83d121..20ceb7c10 100644 --- a/modules/core/cs_akick.cpp +++ b/modules/core/cs_akick.cpp @@ -202,7 +202,9 @@ class CommandCSAKick : public Command * or whether the mask matches a user with higher/equal access - Viper */ if (ci->HasFlag(CI_PEACE) && nc) { - if (nc == ci->founder || get_access_level(ci, nc) >= get_access(u, ci)) + ChanAccess *nc_access = ci->GetAccess(nc), *u_access = ci->GetAccess(u); + int16 nc_level = nc_access ? nc_access->level : 0, u_level = u_access ? u_access->level : 0; + if (nc == ci->founder || nc_level >= u_level) { source.Reply(ACCESS_DENIED); return; @@ -216,7 +218,9 @@ class CommandCSAKick : public Command { User *u2 = *it; - if ((check_access(u2, ci, CA_FOUNDER) || get_access(u2, ci) >= get_access(u, ci)) && match_usermask(mask, u2)) + ChanAccess *u2_access = ci->GetAccess(nc), *u_access = ci->GetAccess(u); + int16 u2_level = u2_access ? u2_access->level : 0, u_level = u_access ? u_access->level : 0; + if ((check_access(u2, ci, CA_FOUNDER) || u2_level >= u_level) && match_usermask(mask, u2)) { source.Reply(ACCESS_DENIED); return; @@ -232,7 +236,9 @@ class CommandCSAKick : public Command if (na2->HasFlag(NS_FORBIDDEN)) continue; - if (na2->nc && (na2->nc == ci->founder || get_access_level(ci, na2->nc) >= get_access(u, ci))) + ChanAccess *na2_access = ci->GetAccess(na2->nc), *u_access = ci->GetAccess(u); + int16 na2_level = na2_access ? na2_access->level : 0, u_level = u_access ? u_access->level : 0; + if (na2->nc && (na2->nc == ci->founder || na2_level >= u_level)) { Anope::string buf = na2->nick + "!" + na2->last_usermask; if (Anope::Match(buf, mask)) diff --git a/modules/core/cs_ban.cpp b/modules/core/cs_ban.cpp index bbcfd1325..a187b5737 100644 --- a/modules/core/cs_ban.cpp +++ b/modules/core/cs_ban.cpp @@ -29,17 +29,19 @@ class CommandCSBan : public Command User *u = source.u; ChannelInfo *ci = source.ci; Channel *c = ci->c; - User *u2; - bool is_same = target.equals_ci(u->nick); + User *u2 = is_same ? u : finduser(target); + + ChanAccess *u_access = ci->GetAccess(u), *u2_access = ci->GetAccess(u2); + uint16 u_level = u_access ? u_access->level : 0, u2_level = u2_access ? u2_access->level : 0; if (!c) source.Reply(CHAN_X_NOT_IN_USE, chan.c_str()); - else if (is_same ? !(u2 = u) : !(u2 = finduser(target))) + else if (!u2) source.Reply(NICK_X_NOT_IN_USE, target.c_str()); else if (!is_same ? !check_access(u, ci, CA_BAN) : !check_access(u, ci, CA_BANME)) source.Reply(ACCESS_DENIED); - else if (!is_same && (ci->HasFlag(CI_PEACE)) && (get_access(u2, ci) >= get_access(u, ci))) + else if (!is_same && ci->HasFlag(CI_PEACE) && u2_level >= u_level) source.Reply(ACCESS_DENIED); /* * Dont ban/kick the user on channels where he is excepted diff --git a/modules/core/cs_clone.cpp b/modules/core/cs_clone.cpp index b36d75dc5..7eb5fd6bd 100644 --- a/modules/core/cs_clone.cpp +++ b/modules/core/cs_clone.cpp @@ -108,7 +108,7 @@ public: for (unsigned i = 0; i < ci->GetAccessCount(); ++i) { ChanAccess *access = ci->GetAccess(i); - target_ci->AddAccess(access->nc, access->level, access->creator, access->last_seen); + target_ci->AddAccess(access->mask, access->level, access->creator, access->last_seen); } source.Reply(CHAN_CLONED_ACCESS, channel.c_str(), target.c_str()); diff --git a/modules/core/cs_kick.cpp b/modules/core/cs_kick.cpp index 8a2dd8b04..b829ce249 100644 --- a/modules/core/cs_kick.cpp +++ b/modules/core/cs_kick.cpp @@ -29,17 +29,19 @@ class CommandCSKick : public Command User *u = source.u; ChannelInfo *ci = source.ci; Channel *c = ci->c; - User *u2; - bool is_same = target.equals_ci(u->nick); + User *u2 = is_same ? u : finduser(target); + + ChanAccess *u_access = ci->GetAccess(u), *u2_access = ci->GetAccess(u2); + uint16 u_level = u_access ? u_access->level : 0, u2_level = u2_access ? u2_access->level : 0; if (!c) source.Reply(CHAN_X_NOT_IN_USE, chan.c_str()); - else if (is_same ? !(u2 = u) : !(u2 = finduser(target))) + else if (!u2) source.Reply(NICK_X_NOT_IN_USE, target.c_str()); else if (!is_same ? !check_access(u, ci, CA_KICK) : !check_access(u, ci, CA_KICKME)) source.Reply(ACCESS_DENIED); - else if (!is_same && (ci->HasFlag(CI_PEACE)) && get_access(u2, ci) >= get_access(u, ci)) + else if (!is_same && (ci->HasFlag(CI_PEACE)) && u2_level >= u_level) source.Reply(ACCESS_DENIED); else if (u2->IsProtected()) source.Reply(ACCESS_DENIED); diff --git a/modules/core/cs_modes.cpp b/modules/core/cs_modes.cpp index 86e1193ef..885b4d81e 100644 --- a/modules/core/cs_modes.cpp +++ b/modules/core/cs_modes.cpp @@ -30,18 +30,20 @@ static CommandReturn do_util(CommandSource &source, Command *com, ChannelMode *c User *u = source.u; Channel *c = findchan(chan); ChannelInfo *ci = c ? c->ci : NULL; - User *u2; - Anope::string realnick = (!nick.empty() ? nick : u->nick); bool is_same = u->nick.equals_ci(realnick); + User *u2 = is_same ? u : finduser(realnick); + + ChanAccess *u_access = ci->GetAccess(u), *u2_access = ci->GetAccess(u2); + uint16 u_level = u_access ? u_access->level : 0, u2_level = u2_access ? u2_access->level : 0; if (!c) source.Reply(CHAN_X_NOT_IN_USE, chan.c_str()); - else if (is_same ? !(u2 = u) : !(u2 = finduser(realnick))) + else if (!u2) source.Reply(NICK_X_NOT_IN_USE, realnick.c_str()); else if (is_same ? !check_access(u, ci, levelself) : !check_access(u, ci, level)) source.Reply(ACCESS_DENIED); - else if (!set && !is_same && (ci->HasFlag(CI_PEACE)) && (get_access(u2, ci) >= get_access(u, ci))) + else if (!set && !is_same && ci->HasFlag(CI_PEACE) && u2_level >= u_level) source.Reply(ACCESS_DENIED); else if (!set && u2->IsProtected() && !is_same) source.Reply(ACCESS_DENIED); diff --git a/modules/core/cs_register.cpp b/modules/core/cs_register.cpp index 39155fe84..db756afa2 100644 --- a/modules/core/cs_register.cpp +++ b/modules/core/cs_register.cpp @@ -28,7 +28,7 @@ class CommandCSRegister : public Command User *u = source.u; ChannelInfo *ci = source.ci; - Channel *c = ci->c; + Channel *c = findchan(chan); if (readonly) { @@ -42,7 +42,7 @@ class CommandCSRegister : public Command source.Reply(CHAN_SYMBOL_REQUIRED); else if (!ircdproto->IsChannelValid(chan)) source.Reply(CHAN_X_INVALID, chan.c_str()); - else if ((ci = cs_findchan(chan))) + else if (ci) source.Reply(CHAN_ALREADY_REGISTERED, chan.c_str()); else if (c && !c->HasUserStatus(u, CMODE_OP)) source.Reply(CHAN_MUST_BE_CHANOP); diff --git a/modules/core/cs_status.cpp b/modules/core/cs_status.cpp index 899632bbf..a2a69b18e 100644 --- a/modules/core/cs_status.cpp +++ b/modules/core/cs_status.cpp @@ -26,8 +26,9 @@ class CommandCSStatus : public Command const Anope::string &nick = params[1]; User *u2 = finduser(nick); + ChanAccess *u2_access = ci->GetAccess(u2); if (u2) - source.Reply(CHAN_STATUS_INFO, ci->name.c_str(), u2->nick.c_str(), get_access(u2, ci)); + source.Reply(CHAN_STATUS_INFO, ci->name.c_str(), u2->nick.c_str(), u2_access ? u2_access->level : 0); else /* !u2 */ source.Reply(CHAN_STATUS_NOTONLINE, nick.c_str()); return MOD_CONT; diff --git a/modules/core/cs_xop.cpp b/modules/core/cs_xop.cpp index 1b15d07fd..f883d1baa 100644 --- a/modules/core/cs_xop.cpp +++ b/modules/core/cs_xop.cpp @@ -26,7 +26,6 @@ enum enum { XOP_DISABLED, - XOP_NICKS_ONLY, XOP_ADDED, XOP_MOVED, XOP_NO_SUCH_ENTRY, @@ -43,7 +42,6 @@ enum LanguageString xop_msgs[XOP_TYPES][XOP_MESSAGES] = { {CHAN_AOP_DISABLED, - CHAN_AOP_NICKS_ONLY, CHAN_AOP_ADDED, CHAN_AOP_MOVED, CHAN_AOP_NO_SUCH_ENTRY, @@ -56,7 +54,6 @@ LanguageString xop_msgs[XOP_TYPES][XOP_MESSAGES] = { CHAN_AOP_LIST_HEADER, CHAN_AOP_CLEAR}, {CHAN_SOP_DISABLED, - CHAN_SOP_NICKS_ONLY, CHAN_SOP_ADDED, CHAN_SOP_MOVED, CHAN_SOP_NO_SUCH_ENTRY, @@ -69,7 +66,6 @@ LanguageString xop_msgs[XOP_TYPES][XOP_MESSAGES] = { CHAN_SOP_LIST_HEADER, CHAN_SOP_CLEAR}, {CHAN_VOP_DISABLED, - CHAN_VOP_NICKS_ONLY, CHAN_VOP_ADDED, CHAN_VOP_MOVED, CHAN_VOP_NO_SUCH_ENTRY, @@ -82,7 +78,6 @@ LanguageString xop_msgs[XOP_TYPES][XOP_MESSAGES] = { CHAN_VOP_LIST_HEADER, CHAN_VOP_CLEAR}, {CHAN_HOP_DISABLED, - CHAN_HOP_NICKS_ONLY, CHAN_HOP_ADDED, CHAN_HOP_MOVED, CHAN_HOP_NO_SUCH_ENTRY, @@ -95,7 +90,6 @@ LanguageString xop_msgs[XOP_TYPES][XOP_MESSAGES] = { CHAN_HOP_LIST_HEADER, CHAN_HOP_CLEAR}, {CHAN_QOP_DISABLED, - CHAN_QOP_NICKS_ONLY, CHAN_QOP_ADDED, CHAN_QOP_MOVED, CHAN_QOP_NO_SUCH_ENTRY, @@ -141,7 +135,7 @@ class XOPListCallback : public NumberList static void DoList(CommandSource &source, ChanAccess *access, unsigned index, int level, LanguageString *messages) { - source.Reply(CHAN_XOP_LIST_FORMAT, index, access->nc->display.c_str()); + source.Reply(CHAN_XOP_LIST_FORMAT, index, access->mask.c_str()); } }; @@ -182,11 +176,11 @@ class XOPDelCallback : public NumberList ++Deleted; if (!Nicks.empty()) - Nicks += ", " + access->nc->display; + Nicks += ", " + access->mask; else - Nicks = access->nc->display; + Nicks = access->mask; - FOREACH_MOD(I_OnAccessDel, OnAccessDel(source.ci, source.u, access->nc)); + FOREACH_MOD(I_OnAccessDel, OnAccessDel(source.ci, source.u, access)); source.ci->EraseAccess(Number - 1); } @@ -200,11 +194,10 @@ class XOPBase : public Command User *u = source.u; ChannelInfo *ci = source.ci; - const Anope::string &nick = params.size() > 2 ? params[2] : ""; - ChanAccess *access; + Anope::string mask = params.size() > 2 ? params[2] : ""; int change = 0; - if (nick.empty()) + if (mask.empty()) { this->OnSyntaxError(source, "ADD"); return MOD_CONT; @@ -216,7 +209,8 @@ class XOPBase : public Command return MOD_CONT; } - short ulev = get_access(u, ci); + ChanAccess *access = ci->GetAccess(u); + uint16 ulev = access ? access->level : 0; if ((level >= ulev || ulev < ACCESS_AOP) && !u->Account()->HasPriv("chanserv/access/modify")) { @@ -224,20 +218,16 @@ class XOPBase : public Command return MOD_CONT; } - NickAlias *na = findnick(nick); - if (!na) - { - source.Reply(messages[XOP_NICKS_ONLY]); - return MOD_CONT; - } - else if (na->HasFlag(NS_FORBIDDEN)) + NickAlias *na = findnick(mask); + if (!na && mask.find_first_of("!@*") == Anope::string::npos) + mask += "!*@*"; + else if (na && na->HasFlag(NS_FORBIDDEN)) { source.Reply(NICK_X_FORBIDDEN, na->nick.c_str()); return MOD_CONT; } - NickCore *nc = na->nc; - access = ci->GetAccess(nc); + access = ci->GetAccess(mask); if (access) { /** @@ -258,7 +248,7 @@ class XOPBase : public Command } if (!change) - ci->AddAccess(nc, level, u->nick); + access = ci->AddAccess(mask, level, u->nick); else { access->level = level; @@ -267,17 +257,17 @@ class XOPBase : public Command } bool override = (level >= ulev || ulev < ACCESS_AOP || (access && access->level > ulev)); - Log(override ? LOG_OVERRIDE : LOG_COMMAND, u, this, ci) << "ADD " << na->nick << " (group: " << nc->display << ") as level " << level; + Log(override ? LOG_OVERRIDE : LOG_COMMAND, u, this, ci) << "ADD " << mask << " as level " << level; if (!change) { - FOREACH_MOD(I_OnAccessAdd, OnAccessAdd(ci, u, nc, level)); - source.Reply(messages[XOP_ADDED], nc->display.c_str(), ci->name.c_str()); + FOREACH_MOD(I_OnAccessAdd, OnAccessAdd(ci, u, access)); + source.Reply(messages[XOP_ADDED], access->mask.c_str(), ci->name.c_str()); } else { - FOREACH_MOD(I_OnAccessChange, OnAccessChange(ci, u, na->nc, level)); - source.Reply(messages[XOP_MOVED], nc->display.c_str(), ci->name.c_str()); + FOREACH_MOD(I_OnAccessChange, OnAccessChange(ci, u, access)); + source.Reply(messages[XOP_MOVED], access->mask.c_str(), ci->name.c_str()); } return MOD_CONT; @@ -288,10 +278,9 @@ class XOPBase : public Command User *u = source.u; ChannelInfo *ci = source.ci; - const Anope::string &nick = params.size() > 2 ? params[2] : ""; - ChanAccess *access; + const Anope::string &mask = params.size() > 2 ? params[2] : ""; - if (nick.empty()) + if (mask.empty()) { this->OnSyntaxError(source, "DEL"); return MOD_CONT; @@ -309,62 +298,43 @@ class XOPBase : public Command return MOD_CONT; } - NickAlias *na = NULL; - if (!isdigit(nick[0])) - { - na = findnick(nick); - if (!na) - { - source.Reply(NICK_X_NOT_REGISTERED, nick.c_str()); - return MOD_CONT; - } - } - - short ulev = get_access(u, ci); + ChanAccess *access = ci->GetAccess(u); + uint16 ulev = access ? access->level : 0; - if ((!na || na->nc != u->Account()) && (level >= ulev || ulev < ACCESS_AOP) && !u->Account()->HasPriv("chanserv/access/modify")) + if ((!access || access->nc != u->Account()) && (level >= ulev || ulev < ACCESS_AOP) && !u->Account()->HasPriv("chanserv/access/modify")) { source.Reply(ACCESS_DENIED); return MOD_CONT; } + access = ci->GetAccess(mask); + /* Special case: is it a number/list? Only do search if it isn't. */ - if (isdigit(nick[0]) && nick.find_first_not_of("1234567890,-") == Anope::string::npos) + if (isdigit(mask[0]) && mask.find_first_not_of("1234567890,-") == Anope::string::npos) { bool override = level >= ulev || ulev < ACCESS_AOP; - XOPDelCallback list(source, this, messages, override, nick); + XOPDelCallback list(source, this, messages, override, mask); list.Process(); } + else if (!access) + { + source.Reply(messages[XOP_NOT_FOUND], mask.c_str(), ci->name.c_str()); + return MOD_CONT; + } else { - NickCore *nc = na->nc; - unsigned i, end; - for (i = 0, end = ci->GetAccessCount(); i < end; ++i) - { - access = ci->GetAccess(nc, level); - - if (access->nc == nc) - break; - } - - if (i == end) - { - source.Reply(messages[XOP_NOT_FOUND], nick.c_str(), ci->name.c_str()); - return MOD_CONT; - } - - if (nc != u->Account() && ulev <= access->level && !u->Account()->HasPriv("chanserv/access/modify")) + if (access->nc != u->Account() && ulev <= access->level && !u->Account()->HasPriv("chanserv/access/modify")) source.Reply(ACCESS_DENIED); else { bool override = ulev <= access->level; - Log(override ? LOG_OVERRIDE : LOG_COMMAND, u, this, ci) << "DEL " << access->nc->display; + Log(override ? LOG_OVERRIDE : LOG_COMMAND, u, this, ci) << "DEL " << access->mask; - source.Reply(messages[XOP_DELETED], access->nc->display.c_str(), ci->name.c_str()); + source.Reply(messages[XOP_DELETED], access->mask.c_str(), ci->name.c_str()); - FOREACH_MOD(I_OnAccessDel, OnAccessDel(ci, u, na->nc)); + FOREACH_MOD(I_OnAccessDel, OnAccessDel(ci, u, access)); - ci->EraseAccess(i); + ci->EraseAccess(access); } } @@ -378,13 +348,16 @@ class XOPBase : public Command const Anope::string &nick = params.size() > 2 ? params[2] : ""; - if (!get_access(u, ci) && !u->Account()->HasCommand("chanserv/access/list")) + ChanAccess *access = ci->GetAccess(u); + uint16 ulev = access ? access->level : 0; + + if (!ulev && !u->Account()->HasCommand("chanserv/access/list")) { source.Reply(ACCESS_DENIED); return MOD_CONT; } - bool override = !get_access(u, ci); + bool override = !ulev; Log(override ? LOG_OVERRIDE : LOG_COMMAND, u, this, ci); if (!ci->GetAccessCount()) @@ -404,11 +377,11 @@ class XOPBase : public Command for (unsigned i = 0, end = ci->GetAccessCount(); i < end; ++i) { - ChanAccess *access = ci->GetAccess(i); + access = ci->GetAccess(i); if (access->level != level) continue; - else if (!nick.empty() && access->nc && !Anope::Match(access->nc->display, nick)) + else if (!nick.empty() && !Anope::Match(access->mask, nick)) continue; if (!SentHeader) @@ -489,7 +462,7 @@ class XOPBase : public Command return MOD_CONT; } public: - XOPBase(const Anope::string &command) : Command(command, 2, 3) + XOPBase(const Anope::string &command) : Command(command, 2, 4) { } diff --git a/modules/core/db_plain.cpp b/modules/core/db_plain.cpp index 2c655b7d9..44058d5e5 100644 --- a/modules/core/db_plain.cpp +++ b/modules/core/db_plain.cpp @@ -697,17 +697,9 @@ class DBPlain : public Module } else if (key.equals_ci("ACCESS")) { - NickCore *nc = findcore(params[0]); - if (!nc) - { - std::stringstream reason; - reason << "Access entry for nonexistant core " << params[0] << " on " << ci->name; - throw DatabaseException(reason.str()); - } - int level = params[1].is_number_only() ? convertTo<int>(params[1]) : 0; time_t last_seen = params[2].is_pos_number_only() ? convertTo<time_t>(params[2]) : 0; - ci->AddAccess(nc, level, params[3], last_seen); + ci->AddAccess(params[0], level, params[3], last_seen); } else if (key.equals_ci("AKICK")) { @@ -972,7 +964,7 @@ class DBPlain : public Module db << "MD FORBID " << ci->forbidby << " :" << ci->forbidreason << endl; } for (unsigned k = 0, end = ci->GetAccessCount(); k < end; ++k) - db << "MD ACCESS " << ci->GetAccess(k)->nc->display << " " << ci->GetAccess(k)->level << " " << ci->GetAccess(k)->last_seen << " " << ci->GetAccess(k)->creator << endl; + db << "MD ACCESS " << ci->GetAccess(k)->mask << " " << ci->GetAccess(k)->level << " " << ci->GetAccess(k)->last_seen << " " << ci->GetAccess(k)->creator << endl; for (unsigned k = 0, end = ci->GetAkickCount(); k < end; ++k) { db << "MD AKICK 0 " << (ci->GetAkick(k)->HasFlag(AK_ISNICK) ? "NICK " : "MASK ") << diff --git a/modules/core/ms_staff.cpp b/modules/core/ms_staff.cpp index 76ab0cf2e..fcbf1aee9 100644 --- a/modules/core/ms_staff.cpp +++ b/modules/core/ms_staff.cpp @@ -22,7 +22,6 @@ class CommandMSStaff : public Command CommandReturn Execute(CommandSource &source, const std::vector<Anope::string> ¶ms) { - User *u = source.u; const Anope::string &text = params[0]; if (readonly) diff --git a/modules/core/ns_access.cpp b/modules/core/ns_access.cpp index 16e8690c2..51baab194 100644 --- a/modules/core/ns_access.cpp +++ b/modules/core/ns_access.cpp @@ -47,7 +47,6 @@ class CommandNSAccess : public Command CommandReturn DoAdd(CommandSource &source, NickCore *nc, const Anope::string &mask) { - User *u = source.u; if (mask.empty()) { @@ -75,8 +74,6 @@ class CommandNSAccess : public Command CommandReturn DoDel(CommandSource &source, NickCore *nc, const Anope::string &mask) { - User *u = source.u; - if (mask.empty()) { this->OnSyntaxError(source, "DEL"); diff --git a/modules/core/ns_alist.cpp b/modules/core/ns_alist.cpp index f6879b6e7..fc3c9f828 100644 --- a/modules/core/ns_alist.cpp +++ b/modules/core/ns_alist.cpp @@ -84,7 +84,6 @@ class CommandNSAList : public Command source.Reply(CHAN_ACCESS_LEVEL_RANGE, ACCESS_INVALID + 1, ACCESS_FOUNDER - 1); else { - int level; int chan_count = 0; int match_count = 0; @@ -94,23 +93,24 @@ class CommandNSAList : public Command { ChannelInfo *ci = it->second; - if ((level = get_access_level(ci, na))) + ChanAccess *access = ci->GetAccess(na->nc); + if (access) { ++chan_count; - if (min_level > level) + if (min_level > access->level) continue; ++match_count; - if (ci->HasFlag(CI_XOP) || level == ACCESS_FOUNDER) + if (ci->HasFlag(CI_XOP) || access->level == ACCESS_FOUNDER) { - Anope::string xop = get_xop_level(level); + Anope::string xop = get_xop_level(access->level); source.Reply(NICK_ALIST_XOP_FORMAT, match_count, ci->HasFlag(CI_NO_EXPIRE) ? '!' : ' ', ci->name.c_str(), xop.c_str(), !ci->desc.empty() ? ci->desc.c_str() : ""); } else - source.Reply(NICK_ALIST_ACCESS_FORMAT, match_count, ci->HasFlag(CI_NO_EXPIRE) ? '!' : ' ', ci->name.c_str(), level, !ci->desc.empty() ? ci->desc.c_str() : ""); + source.Reply(NICK_ALIST_ACCESS_FORMAT, match_count, ci->HasFlag(CI_NO_EXPIRE) ? '!' : ' ', ci->name.c_str(), access->level, !ci->desc.empty() ? ci->desc.c_str() : ""); } } |
