* @param encap This is a list of string parameters, the first of which must be a server ID or glob matching servernames.
* The second must be a subcommand. All subsequent parameters are dependant on the subcommand.
* ENCAP (should) be used instead of creating new protocol messages for easier third party application support.
+ * @return True if the message was sent out (target exists)
*/
- virtual void SendEncapsulatedData(parameterlist &encap) { }
+ virtual bool SendEncapsulatedData(const parameterlist &encap) { return false; }
/** Send metadata for an object to other linked servers.
* @param target The object to send metadata for.
#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
*/
: 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_)
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);
params.insert(params.end(), parameters.begin(), parameters.end());
- ServerInstance->PI->SendEncapsulatedData(params);
+ SendSASL(params);
if (parameters[0][0] == '*')
{
ModuleSASL()
: authExt("sasl_auth", this), cap(this, "sasl"), auth(this, authExt, cap), sasl(this, authExt)
{
- Implementation eventlist[] = { I_OnEvent, I_OnUserRegister };
- ServerInstance->Modules->Attach(eventlist, this, 2);
+ }
+
+ void init()
+ {
+ OnRehash(NULL);
+ Implementation eventlist[] = { I_OnEvent, I_OnUserRegister, I_OnRehash };
+ ServerInstance->Modules->Attach(eventlist, this, 3);
ServiceProvider* providelist[] = { &auth, &sasl, &authExt };
ServerInstance->Modules->AddServices(providelist, 3);
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);
}
}
-void SpanningTreeProtocolInterface::SendEncapsulatedData(parameterlist &encap)
+bool SpanningTreeProtocolInterface::SendEncapsulatedData(const parameterlist &encap)
{
- Utils->DoOneToMany(ServerInstance->Config->GetSID(), "ENCAP", encap);
+ if (encap[0].find('*') != std::string::npos)
+ {
+ Utils->DoOneToMany(ServerInstance->Config->GetSID(), "ENCAP", encap);
+ return true;
+ }
+ return Utils->DoOneToOne(ServerInstance->Config->GetSID(), "ENCAP", encap, encap[0]);
}
void SpanningTreeProtocolInterface::SendMetaData(Extensible* target, const std::string &key, const std::string &data)
SpanningTreeProtocolInterface(ModuleSpanningTree* mod, SpanningTreeUtilities* util) : Utils(util), Module(mod) { }
virtual ~SpanningTreeProtocolInterface() { }
- virtual void SendEncapsulatedData(parameterlist &encap);
+ virtual bool SendEncapsulatedData(const parameterlist &encap);
virtual void SendMetaData(Extensible* target, const std::string &key, const std::string &data);
virtual void SendTopic(Channel* channel, std::string &topic);
virtual void SendMode(const std::string &target, const parameterlist &modedata, const std::vector<TranslateType> &types);
return;
}
-bool SpanningTreeUtilities::DoOneToAllButSenderRaw(const std::string &data, const std::string &omit, const std::string &prefix, const irc::string &command, parameterlist ¶ms)
+bool SpanningTreeUtilities::DoOneToAllButSenderRaw(const std::string &data, const std::string &omit, const std::string &prefix, const irc::string &command, const parameterlist ¶ms)
{
TreeServer* omitroute = this->BestRouteTo(omit);
unsigned int items =this->TreeRoot->ChildCount();
return true;
}
-bool SpanningTreeUtilities::DoOneToAllButSender(const std::string &prefix, const std::string &command, parameterlist ¶ms, std::string omit)
+bool SpanningTreeUtilities::DoOneToAllButSender(const std::string &prefix, const std::string &command, const parameterlist ¶ms, std::string omit)
{
TreeServer* omitroute = this->BestRouteTo(omit);
std::string FullLine = ":" + prefix + " " + command;
return true;
}
-bool SpanningTreeUtilities::DoOneToMany(const std::string &prefix, const std::string &command, parameterlist ¶ms)
+bool SpanningTreeUtilities::DoOneToMany(const std::string &prefix, const std::string &command, const parameterlist ¶ms)
{
std::string FullLine = ":" + prefix + " " + command;
unsigned int words = params.size();
return true;
}
-bool SpanningTreeUtilities::DoOneToMany(const char* prefix, const char* command, parameterlist ¶ms)
+bool SpanningTreeUtilities::DoOneToMany(const char* prefix, const char* command, const parameterlist ¶ms)
{
std::string spfx = prefix;
std::string scmd = command;
return this->DoOneToMany(spfx, scmd, params);
}
-bool SpanningTreeUtilities::DoOneToAllButSender(const char* prefix, const char* command, parameterlist ¶ms, std::string omit)
+bool SpanningTreeUtilities::DoOneToAllButSender(const char* prefix, const char* command, const parameterlist ¶ms, std::string omit)
{
std::string spfx = prefix;
std::string scmd = command;
return this->DoOneToAllButSender(spfx, scmd, params, omit);
}
-bool SpanningTreeUtilities::DoOneToOne(const std::string &prefix, const std::string &command, parameterlist ¶ms, std::string target)
+bool SpanningTreeUtilities::DoOneToOne(const std::string &prefix, const std::string &command, const parameterlist ¶ms, std::string target)
{
TreeServer* Route = this->BestRouteTo(target);
if (Route)
/** Send a message from this server to one other local or remote
*/
- bool DoOneToOne(const std::string &prefix, const std::string &command, parameterlist ¶ms, std::string target);
+ bool DoOneToOne(const std::string &prefix, const std::string &command, const parameterlist ¶ms, std::string target);
/** Send a message from this server to all but one other, local or remote
*/
- bool DoOneToAllButSender(const std::string &prefix, const std::string &command, parameterlist ¶ms, std::string omit);
+ bool DoOneToAllButSender(const std::string &prefix, const std::string &command, const parameterlist ¶ms, std::string omit);
/** Send a message from this server to all but one other, local or remote
*/
- bool DoOneToAllButSender(const char* prefix, const char* command, parameterlist ¶ms, std::string omit);
+ bool DoOneToAllButSender(const char* prefix, const char* command, const parameterlist ¶ms, std::string omit);
/** Send a message from this server to all others
*/
- bool DoOneToMany(const std::string &prefix, const std::string &command, parameterlist ¶ms);
+ bool DoOneToMany(const std::string &prefix, const std::string &command, const parameterlist ¶ms);
/** Send a message from this server to all others
*/
- bool DoOneToMany(const char* prefix, const char* command, parameterlist ¶ms);
+ bool DoOneToMany(const char* prefix, const char* command, const parameterlist ¶ms);
/** Send a message from this server to all others, without doing any processing on the command (e.g. send it as-is with colons and all)
*/
- bool DoOneToAllButSenderRaw(const std::string &data, const std::string &omit, const std::string &prefix, const irc::string &command, parameterlist ¶ms);
+ bool DoOneToAllButSenderRaw(const std::string &data, const std::string &omit, const std::string &prefix, const irc::string &command, const parameterlist ¶ms);
/** Read the spanningtree module's tags from the config file
*/
--- /dev/null
+/* +------------------------------------+
+ * | Inspire Internet Relay Chat Daemon |
+ * +------------------------------------+
+ *
+ * InspIRCd: (C) 2002-2010 InspIRCd Development Team
+ * See: http://wiki.inspircd.org/Credits
+ *
+ * This program is free but copyrighted software; see
+ * the file COPYING for details.
+ *
+ * ---------------------------------------------------
+ */
+
+#ifndef __SASL_H__
+#define __SASL_H__
+
+class SASLFallback : public Event
+{
+ public:
+ const parameterlist& params;
+ SASLFallback(Module* me, const parameterlist& p)
+ : Event(me, "sasl_fallback"), params(p)
+ {
+ Send();
+ }
+};
+
+#endif