summaryrefslogtreecommitdiff
path: root/modules/core/cs_access.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'modules/core/cs_access.cpp')
-rw-r--r--modules/core/cs_access.cpp111
1 files changed, 47 insertions, 64 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)