- parameterlist params;
- params.push_back(sasl_target);
- params.push_back("SASL");
- params.push_back(user->uuid);
- params.push_back("*");
- params.push_back("H");
- params.push_back(host);
- params.push_back(ip);
-
- LocalUser* lu = IS_LOCAL(user);
- if (lu)
- {
- // NOTE: SaslAuthenticator instances are only created for local
- // users so this parameter will always be appended.
- SocketCertificateRequest req(&lu->eh, ServerInstance->Modules->Find("m_sasl.so"));
- params.push_back(req.cert ? "S" : "P");
- }
+ mechlist = newmechlist;
+ NotifyValueChange();
+ }
+};
+
+enum SaslState { SASL_INIT, SASL_COMM, SASL_DONE };
+enum SaslResult { SASL_OK, SASL_FAIL, SASL_ABORT };
+
+static Events::ModuleEventProvider* saslevprov;
+
+static void SendSASL(LocalUser* user, const std::string& agent, char mode, const std::vector<std::string>& parameters)
+{
+ CommandBase::Params params;
+ params.push_back(user->uuid);
+ params.push_back(agent);
+ params.push_back(ConvToStr(mode));
+ params.insert(params.end(), parameters.begin(), parameters.end());
+
+ if (!ServerInstance->PI->SendEncapsulatedData(sasl_target, "SASL", params))
+ {
+ FOREACH_MOD_CUSTOM(*saslevprov, SASLEventListener, OnSASLAuth, (params));
+ }
+}
+
+static ClientProtocol::EventProvider* g_protoev;
+
+/**
+ * Tracks SASL authentication state like charybdis does. --nenolod
+ */
+class SaslAuthenticator
+{
+ private:
+ std::string agent;
+ LocalUser* user;
+ SaslState state;
+ SaslResult result;
+ bool state_announced;