summaryrefslogtreecommitdiff
path: root/modules/commands/cs_xop.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'modules/commands/cs_xop.cpp')
-rw-r--r--modules/commands/cs_xop.cpp39
1 files changed, 27 insertions, 12 deletions
diff --git a/modules/commands/cs_xop.cpp b/modules/commands/cs_xop.cpp
index 18adeadb0..a2f97675c 100644
--- a/modules/commands/cs_xop.cpp
+++ b/modules/commands/cs_xop.cpp
@@ -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;