diff options
author | Sadie Powell <sadie@witchery.services> | 2024-03-07 23:18:08 +0000 |
---|---|---|
committer | Sadie Powell <sadie@witchery.services> | 2024-03-07 23:18:08 +0000 |
commit | bb8df01e254f7bdb5f518d2714d3e820c2207c62 (patch) | |
tree | 3e67e220bfc6f9e6f0484126c87787f04aeab48e /modules/ldap_oper.cpp | |
parent | 16700b0e308b001e6fa3418f67cda8293257ec24 (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.cpp | 140 |
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) |