summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--include/modules/os_oper.h46
-rw-r--r--modules/database/db_atheme.cpp40
-rw-r--r--modules/operserv/os_oper.cpp38
3 files changed, 86 insertions, 38 deletions
diff --git a/include/modules/os_oper.h b/include/modules/os_oper.h
new file mode 100644
index 000000000..8a92efe45
--- /dev/null
+++ b/include/modules/os_oper.h
@@ -0,0 +1,46 @@
+/*
+ *
+ * (C) 2011-2024 Anope Team
+ * Contact us at team@anope.org
+ *
+ * Please read COPYING and README for further details.
+ */
+
+#pragma once
+
+struct MyOper final
+ : Oper
+ , Serializable
+{
+ MyOper(const Anope::string &n, OperType *o) : Oper(n, o), Serializable("Oper") { }
+
+ void Serialize(Serialize::Data &data) const override
+ {
+ data["name"] << this->name;
+ data["type"] << this->ot->GetName();
+ }
+
+ static Serializable *Unserialize(Serializable *obj, Serialize::Data &data)
+ {
+ Anope::string stype, sname;
+
+ data["type"] >> stype;
+ data["name"] >> sname;
+
+ OperType *ot = OperType::Find(stype);
+ if (ot == NULL)
+ return NULL;
+ NickCore *nc = NickCore::Find(sname);
+ if (nc == NULL)
+ return NULL;
+
+ MyOper *myo;
+ if (obj)
+ myo = anope_dynamic_static_cast<MyOper *>(obj);
+ else
+ myo = new MyOper(nc->display, ot);
+ nc->o = myo;
+ Log(LOG_NORMAL, "operserv/oper") << "Tied oper " << nc->display << " to type " << ot->GetName();
+ return myo;
+ }
+};
diff --git a/modules/database/db_atheme.cpp b/modules/database/db_atheme.cpp
index 8ccef0e20..16a8595d0 100644
--- a/modules/database/db_atheme.cpp
+++ b/modules/database/db_atheme.cpp
@@ -20,6 +20,7 @@
#include "modules/info.h"
#include "modules/ns_cert.h"
#include "modules/os_forbid.h"
+#include "modules/os_oper.h"
#include "modules/os_session.h"
#include "modules/suspend.h"
@@ -202,7 +203,7 @@ private:
{ "RR", &DBAtheme::HandleIgnore },
{ "RW", &DBAtheme::HandleIgnore },
{ "SI", &DBAtheme::HandleIgnore },
- { "SO", &DBAtheme::HandleIgnore },
+ { "SO", &DBAtheme::HandleSO },
{ "TS", &DBAtheme::HandleIgnore },
{ "XID", &DBAtheme::HandleIgnore },
{ "XL", &DBAtheme::HandleXL },
@@ -1328,6 +1329,43 @@ private:
return true;
}
+ bool HandleSO(AthemeRow &row)
+ {
+ // SO <display> <type> <flags>
+ auto display = row.Get();
+ auto type = row.Get();
+ auto flags = row.Get();
+
+ if (!row)
+ return row.LogError(this);
+
+ auto *nc = NickCore::Find(display);
+ if (!nc)
+ {
+ Log(this) << "Missing NickCore for SO: " << display;
+ return false;
+ }
+
+ auto ot = OperType::Find(type);
+ if (!ot)
+ {
+ // Attempt to convert oper types.
+ if (type == "sra")
+ ot = OperType::Find("Services Root");
+ else if (type == "ircop")
+ ot = OperType::Find("Services Operator");
+ }
+
+ if (!ot)
+ {
+ Log(this) << "Unable to convert operator status for " << nc->display << " as there is no equivalent oper type: " << type;
+ return true;
+ }
+
+ nc->o = new MyOper(nc->display, ot);
+ return true;
+ }
+
bool HandleXL(AthemeRow &row)
{
// XL <id> <real> <duration> <settime> <setby> <reason>
diff --git a/modules/operserv/os_oper.cpp b/modules/operserv/os_oper.cpp
index d05650d7c..dd9557a41 100644
--- a/modules/operserv/os_oper.cpp
+++ b/modules/operserv/os_oper.cpp
@@ -10,43 +10,7 @@
*/
#include "module.h"
-
-struct MyOper final
- : Oper
- , Serializable
-{
- MyOper(const Anope::string &n, OperType *o) : Oper(n, o), Serializable("Oper") { }
-
- void Serialize(Serialize::Data &data) const override
- {
- data["name"] << this->name;
- data["type"] << this->ot->GetName();
- }
-
- static Serializable *Unserialize(Serializable *obj, Serialize::Data &data)
- {
- Anope::string stype, sname;
-
- data["type"] >> stype;
- data["name"] >> sname;
-
- OperType *ot = OperType::Find(stype);
- if (ot == NULL)
- return NULL;
- NickCore *nc = NickCore::Find(sname);
- if (nc == NULL)
- return NULL;
-
- MyOper *myo;
- if (obj)
- myo = anope_dynamic_static_cast<MyOper *>(obj);
- else
- myo = new MyOper(nc->display, ot);
- nc->o = myo;
- Log(LOG_NORMAL, "operserv/oper") << "Tied oper " << nc->display << " to type " << ot->GetName();
- return myo;
- }
-};
+#include "modules/os_oper.h"
class CommandOSOper final
: public Command