1
0
mirror of https://github.com/anope/anope.git synced 2026-07-01 20:26:39 +02:00

Some access level fixes from Robby to more closely match the historic levels, and some code cleanup

This commit is contained in:
Adam
2012-05-26 02:15:48 -04:00
parent 38d5f20deb
commit 2cbfbc98e9
5 changed files with 59 additions and 43 deletions
+4 -4
View File
@@ -232,7 +232,7 @@ privilege
{
name = "ACCESS_CHANGE"
desc = "Allowed to modify the access list"
rank = 290
rank = 0
level = 10
flag = "f"
}
@@ -249,7 +249,7 @@ privilege
name = "ACCESS_LIST"
desc = "Allowed to view the access list"
rank = 10
level = 10
level = 3
flag = "f"
}
@@ -579,7 +579,7 @@ privilege
name = "MODE"
desc = "Allowed to use the MODE command"
rank = 170
level = 5
level = 9999
flag = "s"
}
@@ -663,7 +663,7 @@ privilege
name = "OWNERME"
desc = "Allowed to (de)owner him/herself"
rank = 340
level = "9999"
level = 9999
flag = "q"
}
+22 -15
View File
@@ -106,22 +106,31 @@ class CommandCSAccess : public Command
source.Reply(_("Access level must be non-zero."));
return;
}
AccessGroup u_access = ci->AccessFor(u);
const ChanAccess *highest = u_access.Highest();
int u_level = (highest ? AccessChanAccess::DetermineLevel(highest) : 0);
if (level >= u_level && !u_access.Founder && !u->HasPriv("chanserv/access/modify"))
{
source.Reply(ACCESS_DENIED);
return;
}
else if (level <= ACCESS_INVALID || level >= ACCESS_FOUNDER)
{
source.Reply(CHAN_ACCESS_LEVEL_RANGE, ACCESS_INVALID + 1, ACCESS_FOUNDER - 1);
return;
}
bool override = !ci->AccessFor(u).HasPriv("ACCESS_CHANGE") || (level >= u_level && !u_access.Founder);
AccessGroup u_access = ci->AccessFor(u);
const ChanAccess *highest = u_access.Highest();
AccessChanAccess tmp_access(NULL);
tmp_access.ci = ci;
tmp_access.level = level;
bool override = false;
if ((!highest || *highest <= tmp_access) && !u_access.Founder)
{
if (u->HasPriv("chanserv/access/modify"))
override = true;
else
{
source.Reply(ACCESS_DENIED);
return;
}
}
if (mask.find_first_of("!*@") == Anope::string::npos && !findnick(mask))
{
@@ -141,7 +150,7 @@ class CommandCSAccess : public Command
if (mask.equals_ci(access->mask))
{
/* Don't allow lowering from a level >= u_level */
if (AccessChanAccess::DetermineLevel(access) >= u_level && !u_access.Founder && !u->HasPriv("chanserv/access/modify"))
if ((!highest || *access >= *highest) && !u_access.Founder && !u->HasPriv("chanserv/access/modify"))
{
source.Reply(ACCESS_DENIED);
return;
@@ -232,7 +241,7 @@ class CommandCSAccess : public Command
AccessGroup u_access = ci->AccessFor(user);
const ChanAccess *u_highest = u_access.Highest();
if ((u_highest ? AccessChanAccess::DetermineLevel(u_highest) : 0) <= AccessChanAccess::DetermineLevel(access) && !u_access.Founder && !this->override && !access->mask.equals_ci(user->Account()->display))
if ((!u_highest || *u_highest <= *access) && !u_access.Founder && !this->override && !access->mask.equals_ci(user->Account()->display))
{
Denied = true;
return;
@@ -256,15 +265,13 @@ class CommandCSAccess : public Command
{
AccessGroup u_access = ci->AccessFor(u);
const ChanAccess *highest = u_access.Highest();
int u_level = (highest ? AccessChanAccess::DetermineLevel(highest) : 0);
for (unsigned i = ci->GetAccessCount(); i > 0; --i)
{
ChanAccess *access = ci->GetAccess(i - 1);
if (mask.equals_ci(access->mask))
{
int access_level = AccessChanAccess::DetermineLevel(access);
if (!access->mask.equals_ci(u->Account()->display) && !u_access.Founder && u_level <= access_level && !u->HasPriv("chanserv/access/modify"))
if (!access->mask.equals_ci(u->Account()->display) && !u_access.Founder && (!highest || *highest <= *access) && !u->HasPriv("chanserv/access/modify"))
source.Reply(ACCESS_DENIED);
else
{
+3 -2
View File
@@ -166,7 +166,7 @@ class CommandCSFlags : public Command
else
{
source.Reply(_("You can not set the \002%c\002 flag."), f);
continue;
break;
}
}
if (add == 1)
@@ -235,10 +235,11 @@ class CommandCSFlags : public Command
for (unsigned i = 0, end = ci->GetAccessCount(); i < end; ++i)
{
const ChanAccess *access = ci->GetAccess(i);
const Anope::string &flags = FlagsChanAccess::DetermineFlags(access);
if (!arg.empty())
{
const Anope::string &flags = FlagsChanAccess::DetermineFlags(access);
if (arg[0] == '+')
{
bool pass = true;
+27 -12
View File
@@ -33,12 +33,12 @@ static struct XOPAccess
{
"SIGNKICK",
"SET",
"MODE",
"AUTOOWNER",
"OWNERME",
"PROTECT",
"INFO",
"ASSIGN",
"TOPIC",
""
}
},
@@ -56,15 +56,14 @@ static struct XOPAccess
},
{ XOP_AOP, "AOP",
{
"MODE",
"TOPIC",
"GETKEY",
"INVITE",
"UNBAN",
"AUTOOP",
"OPDEOPME",
"HALFOP",
"SAY",
"NOKICK",
"GREET",
""
}
},
@@ -72,9 +71,10 @@ static struct XOPAccess
{
"AUTOHALFOP",
"HALFOPME",
"VOICE",
"KICK",
"BAN",
"FANTASIA",
"UNBAN",
""
}
},
@@ -83,6 +83,8 @@ static struct XOPAccess
"AUTOVOICE",
"VOICEME",
"ACCESS_LIST",
"FANTASIA",
"NOKICK",
""
}
},
@@ -215,14 +217,23 @@ class XOPBase : public Command
return;
}
XOPChanAccess tmp_access(NULL);
tmp_access.ci = ci;
tmp_access.type = level;
AccessGroup access = ci->AccessFor(u);
const ChanAccess *highest = access.Highest();
int u_level = (highest ? XOPChanAccess::DetermineLevel(highest) : 0);
bool override = false;
if ((!access.Founder && !access.HasPriv("ACCESS_CHANGE") && !u->HasPriv("chanserv/access/modify")) || (level <= u_level && !access.Founder))
if ((!access.Founder && !access.HasPriv("ACCESS_CHANGE")) || ((!highest || *highest <= tmp_access) && !access.Founder))
{
source.Reply(ACCESS_DENIED);
return;
if (u->HasPriv("chanserv/access/modify"))
override = true;
else
{
source.Reply(ACCESS_DENIED);
return;
}
}
if (mask.find_first_of("!*@") == Anope::string::npos && !findnick(mask))
@@ -243,7 +254,7 @@ class XOPBase : public Command
if (a->mask.equals_ci(mask))
{
if (XOPChanAccess::DetermineLevel(a) >= u_level && !access.Founder && !u->HasPriv("chanserv/access/modify"))
if ((!highest || *a >= *highest) && !access.Founder && !u->HasPriv("chanserv/access/modify"))
{
source.Reply(ACCESS_DENIED);
return;
@@ -272,7 +283,6 @@ class XOPBase : public Command
acc->created = Anope::CurTime;
ci->AddAccess(acc);
bool override = (level >= u_level && !access.Founder) || !access.HasPriv("ACCESS_CHANGE");
Log(override ? LOG_OVERRIDE : LOG_COMMAND, u, this, ci) << "to add " << mask;
FOREACH_MOD(I_OnAccessAdd, OnAccessAdd(ci, u, acc));
@@ -303,10 +313,15 @@ class XOPBase : public Command
return;
}
XOPChanAccess tmp_access(NULL);
tmp_access.ci = ci;
tmp_access.type = level;
AccessGroup access = ci->AccessFor(u);
const ChanAccess *highest = access.Highest();
bool override = false;
if ((!mask.equals_ci(u->Account()->display) && !access.HasPriv("ACCESS_CHANGE") && !access.Founder) || ((!highest || level <= XOPChanAccess::DetermineLevel(highest)) && !access.Founder))
if ((!mask.equals_ci(u->Account()->display) && !access.HasPriv("ACCESS_CHANGE") && !access.Founder) || ((!highest || tmp_access >= *highest) && !access.Founder))
{
if (u->HasPriv("chanserv/access/modify"))
override = true;
+3 -10
View File
@@ -895,7 +895,7 @@ static bool DoPrivileges(ServerConfig *config, const Anope::string &, const Anop
{
Anope::string name = values[0].GetValue();
Anope::string desc = values[1].GetValue();
Anope::string rank = values[2].GetValue();
int rank = values[2].GetInteger();
ValueItem vi(name);
if (!ValidateNotEmpty(config, "privilege", "name", vi))
@@ -905,14 +905,7 @@ static bool DoPrivileges(ServerConfig *config, const Anope::string &, const Anop
if (!ValidateNotEmpty(config, "privilege", "desc", vi))
throw ConfigException("One or more values in your configuration file failed to validate. Please see your log for more information.");
int irank = 0;
try
{
irank = convertTo<int>(rank);
}
catch (const ConvertException &) { }
PrivilegeManager::AddPrivilege(Privilege(name, desc, irank));
PrivilegeManager::AddPrivilege(Privilege(name, desc, rank));
return true;
}
@@ -1353,7 +1346,7 @@ ConfigItems::ConfigItems(ServerConfig *conf)
{"privilege",
{"name", "desc", "rank", ""},
{"", "", "", ""},
{DT_STRING, DT_STRING, DT_STRING, DT_STRING},
{DT_STRING, DT_STRING, DT_INTEGER, DT_STRING},
InitPrivileges, DoPrivileges, DonePrivileges},
{"",
{""},