summaryrefslogtreecommitdiff
path: root/modules/core
diff options
context:
space:
mode:
authorAdam <Adam@anope.org>2010-11-30 03:02:33 -0500
committerAdam <Adam@anope.org>2010-12-12 19:37:02 -0500
commit0ba566491ea246fcc895862d0ef80bdf4ee43b4b (patch)
tree9852671d32476ddad58e264a8e074c41fef9f69f /modules/core
parent2a4d57a1cacd22084abea5dd21c87dc733a7b5bf (diff)
Allowing adding hostmasks to channel access lists
Diffstat (limited to 'modules/core')
-rw-r--r--modules/core/cs_access.cpp111
-rw-r--r--modules/core/cs_akick.cpp12
-rw-r--r--modules/core/cs_ban.cpp10
-rw-r--r--modules/core/cs_clone.cpp2
-rw-r--r--modules/core/cs_kick.cpp10
-rw-r--r--modules/core/cs_modes.cpp10
-rw-r--r--modules/core/cs_register.cpp4
-rw-r--r--modules/core/cs_status.cpp3
-rw-r--r--modules/core/cs_xop.cpp119
-rw-r--r--modules/core/db_plain.cpp12
-rw-r--r--modules/core/ms_staff.cpp1
-rw-r--r--modules/core/ns_access.cpp3
-rw-r--r--modules/core/ns_alist.cpp12
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> &params)
{
- 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() : "");
}
}