]> git.netwichtig.de Git - user/henk/code/inspircd.git/blobdiff - src/modules/extra/m_ldap.cpp
Allow 'tls' to be used in /REHASH.
[user/henk/code/inspircd.git] / src / modules / extra / m_ldap.cpp
index 37a19fb21b8a09c062410cc4307afb80636afd71..80a055f199c08b3739c5ba778c86b367142de988 100644 (file)
@@ -1,8 +1,11 @@
 /*
  * InspIRCd -- Internet Relay Chat Daemon
  *
- *   Copyright (C) 2013-2015 Adam <Adam@anope.org>
- *   Copyright (C) 2003-2015 Anope Team <team@anope.org>
+ *   Copyright (C) 2019 linuxdaemon <linuxdaemon.irc@gmail.com>
+ *   Copyright (C) 2019 Robby <robby@chatbelgie.be>
+ *   Copyright (C) 2016-2019 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
@@ -75,6 +78,7 @@ class LDAPRequest
        }
 
        virtual int run() = 0;
+       virtual std::string info() = 0;
 };
 
 class LDAPBind : public LDAPRequest
@@ -91,6 +95,7 @@ class LDAPBind : public LDAPRequest
        }
 
        int run() CXX11_OVERRIDE;
+       std::string info() CXX11_OVERRIDE;
 };
 
 class LDAPSearch : public LDAPRequest
@@ -110,6 +115,7 @@ class LDAPSearch : public LDAPRequest
        }
 
        int run() CXX11_OVERRIDE;
+       std::string info() CXX11_OVERRIDE;
 };
 
 class LDAPAdd : public LDAPRequest
@@ -127,6 +133,7 @@ class LDAPAdd : public LDAPRequest
        }
 
        int run() CXX11_OVERRIDE;
+       std::string info() CXX11_OVERRIDE;
 };
 
 class LDAPDel : public LDAPRequest
@@ -142,6 +149,7 @@ class LDAPDel : public LDAPRequest
        }
 
        int run() CXX11_OVERRIDE;
+       std::string info() CXX11_OVERRIDE;
 };
 
 class LDAPModify : public LDAPRequest
@@ -159,6 +167,7 @@ class LDAPModify : public LDAPRequest
        }
 
        int run() CXX11_OVERRIDE;
+       std::string info() CXX11_OVERRIDE;
 };
 
 class LDAPCompare : public LDAPRequest
@@ -176,6 +185,7 @@ class LDAPCompare : public LDAPRequest
        }
 
        int run() CXX11_OVERRIDE;
+       std::string info() CXX11_OVERRIDE;
 };
 
 class LDAPService : public LDAPProvider, public SocketThread
@@ -247,6 +257,17 @@ 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();
@@ -318,22 +339,14 @@ class LDAPService : public LDAPProvider, public SocketThread
                        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
@@ -390,7 +403,7 @@ class LDAPService : public LDAPProvider, public SocketThread
 
                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;
                }
 
@@ -623,7 +636,7 @@ class ModuleLDAP : public Module
 
        Version GetVersion() CXX11_OVERRIDE
        {
-               return Version("Provides LDAP support", VF_VENDOR);
+               return Version("Provides the ability for LDAP modules to query a LDAP directory.", VF_VENDOR);
        }
 };
 
@@ -640,11 +653,21 @@ int LDAPBind::run()
        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);
@@ -653,11 +676,21 @@ int LDAPAdd::run()
        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);
@@ -666,6 +699,11 @@ int LDAPModify::run()
        return i;
 }
 
+std::string LDAPModify::info()
+{
+       return "modify base=" + base;
+}
+
 int LDAPCompare::run()
 {
        berval cred;
@@ -677,7 +715,11 @@ int LDAPCompare::run()
        free(cred.bv_val);
 
        return ret;
+}
 
+std::string LDAPCompare::info()
+{
+       return "compare dn=" + dn + " attr=" + attr;
 }
 
 MODULE_INIT(ModuleLDAP)