]> git.netwichtig.de Git - user/henk/code/inspircd.git/blobdiff - src/modules/m_sasl.cpp
Change lockserv emergency unlock procedure, and add one for jumpserver [jackmcbarn]
[user/henk/code/inspircd.git] / src / modules / m_sasl.cpp
index 3c3b1d2a00112dbd7f780bfb5e375953f0348f2c..72d547c7c2b2a79f3d3a62c4f9adc416a88c6441 100644 (file)
 #include "inspircd.h"
 #include "m_cap.h"
 #include "account.h"
+#include "sasl.h"
 
 /* $ModDesc: Provides support for IRC Authentication Layer (aka: atheme SASL) via AUTHENTICATE. */
 
 enum SaslState { SASL_INIT, SASL_COMM, SASL_DONE };
 enum SaslResult { SASL_OK, SASL_FAIL, SASL_ABORT };
 
+static std::string sasl_target = "*";
+
+static void SendSASL(const parameterlist& params)
+{
+       if (!ServerInstance->PI->SendEncapsulatedData(params))
+       {
+               SASLFallback(NULL, params);
+       }
+}
+
 /**
  * Tracks SASL authentication state like charybdis does. --nenolod
  */
 class SaslAuthenticator
 {
  private:
-       InspIRCd *ServerInstance;
        std::string agent;
        User *user;
        SaslState state;
@@ -38,14 +48,14 @@ class SaslAuthenticator
                : user(user_), state(SASL_INIT), state_announced(false)
        {
                parameterlist params;
-               params.push_back("*");
+               params.push_back(sasl_target);
                params.push_back("SASL");
                params.push_back(user->uuid);
                params.push_back("*");
                params.push_back("S");
                params.push_back(method);
 
-               ServerInstance->PI->SendEncapsulatedData(params);
+               SendSASL(params);
        }
 
        SaslResult GetSaslResult(const std::string &result_)
@@ -104,7 +114,7 @@ class SaslAuthenticator
                        return true;
 
                parameterlist params;
-               params.push_back("*");
+               params.push_back(sasl_target);
                params.push_back("SASL");
                params.push_back(this->user->uuid);
                params.push_back(this->agent);
@@ -112,7 +122,7 @@ class SaslAuthenticator
 
                params.insert(params.end(), parameters.begin(), parameters.end());
 
-               ServerInstance->PI->SendEncapsulatedData(params);
+               SendSASL(params);
 
                if (parameters[0][0] == '*')
                {
@@ -226,7 +236,12 @@ class ModuleSASL : public Module
        ModuleSASL()
                : authExt("sasl_auth", this), cap(this, "sasl"), auth(this, authExt, cap), sasl(this, authExt)
        {
-               Implementation eventlist[] = { I_OnEvent, I_OnUserRegister, I_OnSetConnectClass };
+       }
+
+       void init()
+       {
+               OnRehash(NULL);
+               Implementation eventlist[] = { I_OnEvent, I_OnUserRegister, I_OnRehash };
                ServerInstance->Modules->Attach(eventlist, this, 3);
 
                ServiceProvider* providelist[] = { &auth, &sasl, &authExt };
@@ -236,6 +251,11 @@ class ModuleSASL : public Module
                        ServerInstance->Logs->Log("m_sasl", DEFAULT, "WARNING: m_services_account.so and m_cap.so are not loaded! m_sasl.so will NOT function correctly until these two modules are loaded!");
        }
 
+       void OnRehash(User*)
+       {
+               sasl_target = ServerInstance->Config->ConfValue("sasl")->getString("target", "*");
+       }
+
        ModResult OnUserRegister(LocalUser *user)
        {
                SaslAuthenticator *sasl_ = authExt.get(user);
@@ -248,21 +268,6 @@ class ModuleSASL : public Module
                return MOD_RES_PASSTHRU;
        }
 
-       ModResult OnSetConnectClass(LocalUser* user, ConnectClass* myclass)
-       {
-               if (myclass->config->getBool("requiresasl"))
-               {
-                       const AccountExtItem* ext = GetAccountExtItem();
-                       if (ext && !ext->get(user))
-                               return MOD_RES_DENY;
-               }
-               return MOD_RES_PASSTHRU;
-       }
-
-       ~ModuleSASL()
-       {
-       }
-
        Version GetVersion()
        {
                return Version("Provides support for IRC Authentication Layer (aka: atheme SASL) via AUTHENTICATE.",VF_VENDOR);