]> git.netwichtig.de Git - user/henk/code/inspircd.git/blobdiff - src/modules/m_sasl.cpp
Textual improvements and fixes such as typos, casing, etc. (#1612)
[user/henk/code/inspircd.git] / src / modules / m_sasl.cpp
index 2a855c74c83f5d19f21704cef35a7a4102fa3090..54bb8a44a7a1243cc7a2dfcafca1c4d89ddb4126 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
  */
@@ -169,26 +171,28 @@ class SaslAuthenticator
        SaslResult result;
        bool state_announced;
 
-       void SendHostIP()
+       void SendHostIP(UserCertificateAPI& sslapi)
        {
-               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");
+               params.push_back(sslapi && sslapi->GetCertificate(user) ? "S" : "P");
 
                SendSASL(user, "*", 'H', params);
        }
 
  public:
-       SaslAuthenticator(LocalUser* user_, const std::string& method)
-               : user(user_), state(SASL_INIT), state_announced(false)
+       SaslAuthenticator(LocalUser* user_, const std::string& method, UserCertificateAPI& sslapi)
+               : user(user_)
+               , state(SASL_INIT)
+               , state_announced(false)
        {
-               SendHostIP();
+               SendHostIP(sslapi);
 
-               parameterlist params;
+               std::vector<std::string> params;
                params.push_back(method);
 
-               const std::string fp = SSLClientCert::GetFingerprint(&user->eh);
+               const std::string fp = sslapi ? sslapi->GetFingerprint(user) : "";
                if (fp.size())
                        params.push_back(fp);
 
@@ -207,7 +211,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 +227,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;
@@ -295,16 +307,19 @@ class CommandAuthenticate : public SplitCommand
  public:
        SimpleExtItem<SaslAuthenticator>& authExt;
        Cap::Capability& cap;
+       UserCertificateAPI sslapi;
+
        CommandAuthenticate(Module* Creator, SimpleExtItem<SaslAuthenticator>& ext, Cap::Capability& Cap)
                : SplitCommand(Creator, "AUTHENTICATE", 1)
                , authExt(ext)
                , cap(Cap)
+               , sslapi(Creator)
        {
                works_before_reg = true;
                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))
@@ -321,7 +336,7 @@ class CommandAuthenticate : public SplitCommand
 
                        SaslAuthenticator *sasl = authExt.get(user);
                        if (!sasl)
-                               authExt.set(user, new SaslAuthenticator(user, parameters[0]));
+                               authExt.set(user, new SaslAuthenticator(user, parameters[0], sslapi));
                        else if (sasl->SendClientMessage(parameters) == false)  // IAL abort extension --nenolod
                        {
                                sasl->AnnounceState();
@@ -341,7 +356,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 +378,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 +392,7 @@ class ModuleSASL : public Module
        CommandAuthenticate auth;
        CommandSASL sasl;
        Events::ModuleEventProvider sasleventprov;
+       ClientProtocol::EventProvider protoev;
 
  public:
        ModuleSASL()
@@ -386,8 +402,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 +416,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();
        }
 
@@ -410,7 +432,7 @@ class ModuleSASL : public Module
 
        Version GetVersion() CXX11_OVERRIDE
        {
-               return Version("Provides support for IRC Authentication Layer (aka: SASL) via AUTHENTICATE.", VF_VENDOR);
+               return Version("Provides support for IRC Authentication Layer (aka: SASL) via AUTHENTICATE", VF_VENDOR);
        }
 };