summaryrefslogtreecommitdiff
path: root/modules/ldap_oper.cpp
diff options
context:
space:
mode:
authorSadie Powell <sadie@witchery.services>2024-03-07 23:18:08 +0000
committerSadie Powell <sadie@witchery.services>2024-03-07 23:18:08 +0000
commitbb8df01e254f7bdb5f518d2714d3e820c2207c62 (patch)
tree3e67e220bfc6f9e6f0484126c87787f04aeab48e /modules/ldap_oper.cpp
parent16700b0e308b001e6fa3418f67cda8293257ec24 (diff)
Move some modules which can be built by default out of extra.
Diffstat (limited to 'modules/ldap_oper.cpp')
-rw-r--r--modules/ldap_oper.cpp140
1 files changed, 140 insertions, 0 deletions
diff --git a/modules/ldap_oper.cpp b/modules/ldap_oper.cpp
new file mode 100644
index 000000000..62749f957
--- /dev/null
+++ b/modules/ldap_oper.cpp
@@ -0,0 +1,140 @@
+/*
+ *
+ * (C) 2011-2024 Anope Team
+ * Contact us at team@anope.org
+ *
+ * Please read COPYING and README for further details.
+ */
+
+#include "module.h"
+#include "modules/ldap.h"
+
+static std::set<Oper *> my_opers;
+static Anope::string opertype_attribute;
+
+class IdentifyInterface final
+ : public LDAPInterface
+{
+ Reference<User> u;
+
+public:
+ IdentifyInterface(Module *m, User *user) : LDAPInterface(m), u(user)
+ {
+ }
+
+ void OnResult(const LDAPResult &r) override
+ {
+ if (!u || !u->Account())
+ return;
+
+ NickCore *nc = u->Account();
+
+ try
+ {
+ const LDAPAttributes &attr = r.get(0);
+
+ const Anope::string &opertype = attr.get(opertype_attribute);
+
+ OperType *ot = OperType::Find(opertype);
+ if (ot != NULL && (nc->o == NULL || ot != nc->o->ot))
+ {
+ Oper *o = nc->o;
+ if (o != NULL && my_opers.count(o) > 0)
+ {
+ my_opers.erase(o);
+ delete o;
+ }
+ o = new Oper(u->nick, ot);
+ my_opers.insert(o);
+ nc->o = o;
+ Log(this->owner) << "Tied " << u->nick << " (" << nc->display << ") to opertype " << ot->GetName();
+ }
+ }
+ catch (const LDAPException &ex)
+ {
+ if (nc->o != NULL)
+ {
+ if (my_opers.count(nc->o) > 0)
+ {
+ my_opers.erase(nc->o);
+ delete nc->o;
+ }
+ nc->o = NULL;
+
+ Log(this->owner) << "Removed services operator from " << u->nick << " (" << nc->display << ")";
+ }
+ }
+ }
+
+ void OnError(const LDAPResult &r) override
+ {
+ }
+
+ void OnDelete() override
+ {
+ delete this;
+ }
+};
+
+class LDAPOper final
+ : public Module
+{
+ ServiceReference<LDAPProvider> ldap;
+
+ Anope::string binddn;
+ Anope::string password;
+ Anope::string basedn;
+ Anope::string filter;
+public:
+ LDAPOper(const Anope::string &modname, const Anope::string &creator) :
+ Module(modname, creator, EXTRA | VENDOR), ldap("LDAPProvider", "ldap/main")
+ {
+
+ }
+
+ void OnReload(Configuration::Conf *conf) override
+ {
+ Configuration::Block *config = Config->GetModule(this);
+
+ this->binddn = config->Get<const Anope::string>("binddn");
+ this->password = config->Get<const Anope::string>("password");
+ this->basedn = config->Get<const Anope::string>("basedn");
+ this->filter = config->Get<const Anope::string>("filter");
+ opertype_attribute = config->Get<const Anope::string>("opertype_attribute");
+
+ for (const auto *oper : my_opers)
+ delete oper;
+ my_opers.clear();
+ }
+
+ void OnNickIdentify(User *u) override
+ {
+ try
+ {
+ if (!this->ldap)
+ throw LDAPException("No LDAP interface. Is ldap loaded and configured correctly?");
+ else if (this->basedn.empty() || this->filter.empty() || opertype_attribute.empty())
+ throw LDAPException("Could not search LDAP for opertype settings, invalid configuration.");
+
+ if (!this->binddn.empty())
+ this->ldap->Bind(NULL, this->binddn.replace_all_cs("%a", u->Account()->display), this->password.c_str());
+ this->ldap->Search(new IdentifyInterface(this, u), this->basedn, this->filter.replace_all_cs("%a", u->Account()->display));
+ }
+ catch (const LDAPException &ex)
+ {
+ Log() << ex.GetReason();
+ }
+ }
+
+ void OnDelCore(NickCore *nc) override
+ {
+ if (nc->o != NULL && my_opers.count(nc->o) > 0)
+ {
+ my_opers.erase(nc->o);
+ delete nc->o;
+ nc->o = NULL;
+ }
+ }
+};
+
+MODULE_INIT(LDAPOper)