1
0
mirror of https://github.com/anope/anope.git synced 2026-06-29 06:36:41 +02:00

Allowing adding hostmasks to channel access lists

This commit is contained in:
Adam
2010-11-30 03:02:33 -05:00
parent 2a4d57a1ca
commit 0ba566491e
24 changed files with 343 additions and 338 deletions
+47 -64
View File
@@ -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)