/*
* InspIRCd -- Internet Relay Chat Daemon
*
- * Copyright (C) 2013-2015 Adam <Adam@anope.org>
- * Copyright (C) 2003-2015 Anope Team <team@anope.org>
+ * Copyright (C) 2020 Joel Sing <joel@sing.id.au>
+ * Copyright (C) 2019 linuxdaemon <linuxdaemon.irc@gmail.com>
+ * Copyright (C) 2016-2020 Sadie Powell <sadie@witchery.services>
+ * Copyright (C) 2014, 2016 Attila Molnar <attilamolnar@hush.com>
+ * Copyright (C) 2013-2016 Adam <Adam@anope.org>
*
* This file is part of InspIRCd. InspIRCd is free software: you can
* redistribute it and/or modify it under the terms of the GNU General Public
/// $LinkerFlags: -llber -lldap_r
+/// $PackageInfo: require_system("arch") libldap
/// $PackageInfo: require_system("centos") openldap-devel
/// $PackageInfo: require_system("debian") libldap2-dev
/// $PackageInfo: require_system("ubuntu") libldap2-dev
// Ignore OpenLDAP deprecation warnings on OS X Yosemite and newer.
#if defined __APPLE__
+# pragma GCC diagnostic push
# pragma GCC diagnostic ignored "-Wdeprecated-declarations"
#endif
#include <ldap.h>
+#ifdef __APPLE__
+# pragma GCC diagnostic pop
+#endif
+
#ifdef _WIN32
# pragma comment(lib, "libldap_r.lib")
# pragma comment(lib, "liblber.lib")
}
virtual int run() = 0;
+ virtual std::string info() = 0;
};
class LDAPBind : public LDAPRequest
}
int run() CXX11_OVERRIDE;
+ std::string info() CXX11_OVERRIDE;
};
class LDAPSearch : public LDAPRequest
}
int run() CXX11_OVERRIDE;
+ std::string info() CXX11_OVERRIDE;
};
class LDAPAdd : public LDAPRequest
}
int run() CXX11_OVERRIDE;
+ std::string info() CXX11_OVERRIDE;
};
class LDAPDel : public LDAPRequest
}
int run() CXX11_OVERRIDE;
+ std::string info() CXX11_OVERRIDE;
};
class LDAPModify : public LDAPRequest
}
int run() CXX11_OVERRIDE;
+ std::string info() CXX11_OVERRIDE;
};
class LDAPCompare : public LDAPRequest
}
int run() CXX11_OVERRIDE;
+ std::string info() CXX11_OVERRIDE;
};
class LDAPService : public LDAPProvider, public SocketThread
Connect();
}
+ int SetOption(int option, const void* value)
+ {
+ int ret = ldap_set_option(this->con, option, value);
+ if (ret != LDAP_OPT_SUCCESS)
+ {
+ ldap_unbind_ext(this->con, NULL, NULL);
+ this->con = NULL;
+ }
+ return ret;
+ }
+
void QueueRequest(LDAPRequest* r)
{
this->LockQueue();
, con(NULL), config(tag), last_connect(0)
{
std::string scope = config->getString("searchscope");
- if (scope == "base")
+ if (stdalgo::string::equalsci(scope, "base"))
searchscope = LDAP_SCOPE_BASE;
- else if (scope == "onelevel")
+ else if (stdalgo::string::equalsci(scope, "onelevel"))
searchscope = LDAP_SCOPE_ONELEVEL;
else
searchscope = LDAP_SCOPE_SUBTREE;
throw LDAPException("Unable to connect to LDAP service " + this->name + ": " + ldap_err2string(i));
const int version = LDAP_VERSION3;
- i = ldap_set_option(this->con, LDAP_OPT_PROTOCOL_VERSION, &version);
+ i = SetOption(LDAP_OPT_PROTOCOL_VERSION, &version);
if (i != LDAP_OPT_SUCCESS)
- {
- ldap_unbind_ext(this->con, NULL, NULL);
- this->con = NULL;
throw LDAPException("Unable to set protocol version for " + this->name + ": " + ldap_err2string(i));
- }
const struct timeval tv = { 0, 0 };
- i = ldap_set_option(this->con, LDAP_OPT_NETWORK_TIMEOUT, &tv);
+ i = SetOption(LDAP_OPT_NETWORK_TIMEOUT, &tv);
if (i != LDAP_OPT_SUCCESS)
- {
- ldap_unbind_ext(this->con, NULL, NULL);
- this->con = NULL;
throw LDAPException("Unable to set timeout for " + this->name + ": " + ldap_err2string(i));
- }
}
void BindAsManager(LDAPInterface* i) CXX11_OVERRIDE
if (res != LDAP_SUCCESS)
{
- ldap_result->error = ldap_err2string(res);
+ ldap_result->error = InspIRCd::Format("%s (%s)", ldap_err2string(res), req->info().c_str());
return;
}
{
const reference<ConfigTag>& tag = i->second;
- if (tag->getString("module") != "ldap")
+ if (!stdalgo::string::equalsci(tag->getString("module"), "ldap"))
continue;
std::string id = tag->getString("id");
Version GetVersion() CXX11_OVERRIDE
{
- return Version("LDAP support", VF_VENDOR);
+ return Version("Provides the ability for LDAP modules to query a LDAP directory.", VF_VENDOR);
}
};
return i;
}
+std::string LDAPBind::info()
+{
+ return "bind dn=" + who;
+}
+
int LDAPSearch::run()
{
return ldap_search_ext_s(service->GetConnection(), base.c_str(), searchscope, filter.c_str(), NULL, 0, NULL, NULL, &tv, 0, &message);
}
+std::string LDAPSearch::info()
+{
+ return "search base=" + base + " filter=" + filter;
+}
+
int LDAPAdd::run()
{
LDAPMod** mods = LDAPService::BuildMods(attributes);
return i;
}
+std::string LDAPAdd::info()
+{
+ return "add dn=" + dn;
+}
+
int LDAPDel::run()
{
return ldap_delete_ext_s(service->GetConnection(), dn.c_str(), NULL, NULL);
}
+std::string LDAPDel::info()
+{
+ return "del dn=" + dn;
+}
+
int LDAPModify::run()
{
LDAPMod** mods = LDAPService::BuildMods(attributes);
return i;
}
+std::string LDAPModify::info()
+{
+ return "modify base=" + base;
+}
+
int LDAPCompare::run()
{
berval cred;
free(cred.bv_val);
return ret;
+}
+std::string LDAPCompare::info()
+{
+ return "compare dn=" + dn + " attr=" + attr;
}
MODULE_INIT(ModuleLDAP)