]> git.netwichtig.de Git - user/henk/code/inspircd.git/blobdiff - src/modules/m_sasl.cpp
Convert m_sha256 to use a vendored library instead of bundling.
[user/henk/code/inspircd.git] / src / modules / m_sasl.cpp
index 2a855c74c83f5d19f21704cef35a7a4102fa3090..480f8f6db0d0ebc2ee559a80b705ae77417e6f8c 100644 (file)
@@ -143,9 +143,9 @@ enum SaslResult { SASL_OK, SASL_FAIL, SASL_ABORT };
 
 static Events::ModuleEventProvider* saslevprov;
 
-static void SendSASL(LocalUser* user, const std::string& agent, char mode, const parameterlist& parameters)
+static void SendSASL(LocalUser* user, const std::string& agent, char mode, const std::vector<std::string>& parameters)
 {
-       parameterlist params(parameters.size() + 3);
+       CommandBase::Params params;
        params.push_back(user->uuid);
        params.push_back(agent);
        params.push_back(ConvToStr(mode));
@@ -157,6 +157,8 @@ static void SendSASL(LocalUser* user, const std::string& agent, char mode, const
        }
 }
 
+static ClientProtocol::EventProvider* g_protoev;
+
 /**
  * Tracks SASL authentication state like charybdis does. --nenolod
  */
@@ -171,7 +173,7 @@ class SaslAuthenticator
 
        void SendHostIP()
        {
-               parameterlist params;
+               std::vector<std::string> params;
                params.push_back(user->GetRealHost());
                params.push_back(user->GetIPString());
                params.push_back(SSLIOHook::IsSSL(&user->eh) ? "S" : "P");
@@ -185,7 +187,7 @@ class SaslAuthenticator
        {
                SendHostIP();
 
-               parameterlist params;
+               std::vector<std::string> params;
                params.push_back(method);
 
                const std::string fp = SSLClientCert::GetFingerprint(&user->eh);
@@ -207,7 +209,7 @@ class SaslAuthenticator
        }
 
        /* checks for and deals with a state change. */
-       SaslState ProcessInboundMessage(const std::vector<std::string> &msg)
+       SaslState ProcessInboundMessage(const CommandBase::Params& msg)
        {
                switch (this->state)
                {
@@ -223,7 +225,15 @@ class SaslAuthenticator
                                return this->state;
 
                        if (msg[2] == "C")
-                               this->user->Write("AUTHENTICATE %s", msg[3].c_str());
+                       {
+                               ClientProtocol::Message authmsg("AUTHENTICATE");
+                               authmsg.PushParamRef(msg[3]);
+
+                               ClientProtocol::Event authevent(*g_protoev, authmsg);
+                               LocalUser* const localuser = IS_LOCAL(user);
+                               if (localuser)
+                                       localuser->Send(authevent);
+                       }
                        else if (msg[2] == "D")
                        {
                                this->state = SASL_DONE;
@@ -304,7 +314,7 @@ class CommandAuthenticate : public SplitCommand
                allow_empty_last_param = false;
        }
 
-       CmdResult HandleLocal(const std::vector<std::string>& parameters, LocalUser* user) CXX11_OVERRIDE
+       CmdResult HandleLocal(LocalUser* user, const Params& parameters) CXX11_OVERRIDE
        {
                {
                        if (!cap.get(user))
@@ -341,7 +351,7 @@ class CommandSASL : public Command
                this->flags_needed = FLAG_SERVERONLY; // should not be called by users
        }
 
-       CmdResult Handle(const std::vector<std::string>& parameters, User* user) CXX11_OVERRIDE
+       CmdResult Handle(User* user, const Params& parameters) CXX11_OVERRIDE
        {
                User* target = ServerInstance->FindUUID(parameters[1]);
                if (!target)
@@ -363,7 +373,7 @@ class CommandSASL : public Command
                return CMD_SUCCESS;
        }
 
-       RouteDescriptor GetRouting(User* user, const std::vector<std::string>& parameters) CXX11_OVERRIDE
+       RouteDescriptor GetRouting(User* user, const Params& parameters) CXX11_OVERRIDE
        {
                return ROUTE_BROADCAST;
        }
@@ -377,6 +387,7 @@ class ModuleSASL : public Module
        CommandAuthenticate auth;
        CommandSASL sasl;
        Events::ModuleEventProvider sasleventprov;
+       ClientProtocol::EventProvider protoev;
 
  public:
        ModuleSASL()
@@ -386,8 +397,10 @@ class ModuleSASL : public Module
                , auth(this, authExt, cap)
                , sasl(this, authExt)
                , sasleventprov(this, "event/sasl")
+               , protoev(this, auth.name)
        {
                saslevprov = &sasleventprov;
+               g_protoev = &protoev;
        }
 
        void init() CXX11_OVERRIDE
@@ -398,7 +411,11 @@ class ModuleSASL : public Module
 
        void ReadConfig(ConfigStatus& status) CXX11_OVERRIDE
        {
-               sasl_target = ServerInstance->Config->ConfValue("sasl")->getString("target", "*");
+               std::string target = ServerInstance->Config->ConfValue("sasl")->getString("target");
+               if (target.empty())
+                       throw ModuleException("<sasl:target> must be set to the name of your services server!");
+
+               sasl_target = target;
                servertracker.Reset();
        }