summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAttila Molnar <attilamolnar@hush.com>2014-01-26 13:05:09 +0100
committerAttila Molnar <attilamolnar@hush.com>2014-01-26 13:05:09 +0100
commit92cc388aebd55245b24aef5950afe845feffe9e2 (patch)
treea0d38cacd6589b88a274ced74e7e054a8cf73c78
parent1db0e984be491125d8f954aa22f17cad1d4c453f (diff)
ProtocolInterface::SendEncapsulatedData() changes
- Pass command name and destination as real parameters - Allow callers to specify the command source - Send a SID instead of a server name if the target is a single server
-rw-r--r--include/protocol.h13
-rw-r--r--src/modules/m_sasl.cpp6
-rw-r--r--src/modules/m_showwhois.cpp4
-rw-r--r--src/modules/m_spanningtree/protocolinterface.cpp29
-rw-r--r--src/modules/m_spanningtree/protocolinterface.h2
5 files changed, 33 insertions, 21 deletions
diff --git a/include/protocol.h b/include/protocol.h
index 4afb0bf59..4c58c78ba 100644
--- a/include/protocol.h
+++ b/include/protocol.h
@@ -56,14 +56,17 @@ class CoreExport ProtocolInterface
virtual ~ProtocolInterface() { }
- /** Send an ENCAP message to one or more linked servers.
+ /** Send an ENCAP message to all servers matching a wildcard string.
* See the protocol documentation for the purpose of ENCAP.
- * @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.
+ * @param targetmask The target server mask (can contain wildcards)
+ * @param cmd The ENCAP subcommand
+ * @param params List of string parameters which are dependant on the subcommand
+ * @param source The source of the message (prefix), must be a local user or NULL which means use local server
+ * @return Always true if the target mask contains wildcards; otherwise true if the server name was found,
+ * and the message was sent, false if it was not found.
* 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 bool SendEncapsulatedData(const parameterlist &encap) { return false; }
+ virtual bool SendEncapsulatedData(const std::string& targetmask, const std::string& cmd, const parameterlist& params, User* source = NULL) { return false; }
/** Send metadata for a channel to other linked servers.
* @param chan The channel to send metadata for
diff --git a/src/modules/m_sasl.cpp b/src/modules/m_sasl.cpp
index 796d343ea..074362651 100644
--- a/src/modules/m_sasl.cpp
+++ b/src/modules/m_sasl.cpp
@@ -31,7 +31,7 @@ static std::string sasl_target = "*";
static void SendSASL(const parameterlist& params)
{
- if (!ServerInstance->PI->SendEncapsulatedData(params))
+ if (!ServerInstance->PI->SendEncapsulatedData(sasl_target, "SASL", params))
{
SASLFallback(NULL, params);
}
@@ -54,8 +54,6 @@ class SaslAuthenticator
: user(user_), state(SASL_INIT), state_announced(false)
{
parameterlist params;
- params.push_back(sasl_target);
- params.push_back("SASL");
params.push_back(user->uuid);
params.push_back("*");
params.push_back("S");
@@ -132,8 +130,6 @@ class SaslAuthenticator
return true;
parameterlist params;
- params.push_back(sasl_target);
- params.push_back("SASL");
params.push_back(this->user->uuid);
params.push_back(this->agent);
params.push_back("C");
diff --git a/src/modules/m_showwhois.cpp b/src/modules/m_showwhois.cpp
index 332752f93..ba17942cb 100644
--- a/src/modules/m_showwhois.cpp
+++ b/src/modules/m_showwhois.cpp
@@ -110,11 +110,9 @@ class ModuleShowwhois : public Module
else
{
std::vector<std::string> params;
- params.push_back(dest->server->GetName());
- params.push_back("WHOISNOTICE");
params.push_back(dest->uuid);
params.push_back(source->uuid);
- ServerInstance->PI->SendEncapsulatedData(params);
+ ServerInstance->PI->SendEncapsulatedData(dest->server->GetName(), cmd.name, params);
}
}
};
diff --git a/src/modules/m_spanningtree/protocolinterface.cpp b/src/modules/m_spanningtree/protocolinterface.cpp
index 7a2b033d9..ee5e31984 100644
--- a/src/modules/m_spanningtree/protocolinterface.cpp
+++ b/src/modules/m_spanningtree/protocolinterface.cpp
@@ -44,16 +44,31 @@ void SpanningTreeProtocolInterface::GetServerList(ServerList& sl)
}
}
-bool SpanningTreeProtocolInterface::SendEncapsulatedData(const parameterlist &encap)
+bool SpanningTreeProtocolInterface::SendEncapsulatedData(const std::string& targetmask, const std::string& cmd, const parameterlist& params, User* source)
{
- CmdBuilder params("ENCAP");
- params.insert(encap);
- if (encap[0].find_first_of("*?") != std::string::npos)
+ if (!source)
+ source = ServerInstance->FakeClient;
+
+ CmdBuilder encap(source, "ENCAP");
+
+ // Are there any wildcards in the target string?
+ if (targetmask.find_first_of("*?") != std::string::npos)
{
- params.Broadcast();
- return true;
+ // Yes, send the target string as-is; servers will decide whether or not it matches them
+ encap.push(targetmask).push(cmd).insert(params).Broadcast();
+ }
+ else
+ {
+ // No wildcards which means the target string has to be the name of a known server
+ TreeServer* server = Utils->FindServer(targetmask);
+ if (!server)
+ return false;
+
+ // Use the SID of the target in the message instead of the server name
+ encap.push(server->GetID()).push(cmd).insert(params).Unicast(server->ServerUser);
}
- return params.Unicast(encap[0]);
+
+ return true;
}
void SpanningTreeProtocolInterface::SendMetaData(User* u, const std::string& key, const std::string& data)
diff --git a/src/modules/m_spanningtree/protocolinterface.h b/src/modules/m_spanningtree/protocolinterface.h
index 745a0c3cc..04b56c181 100644
--- a/src/modules/m_spanningtree/protocolinterface.h
+++ b/src/modules/m_spanningtree/protocolinterface.h
@@ -31,7 +31,7 @@ class SpanningTreeProtocolInterface : public ProtocolInterface
void SendMetaData(const std::string& key, const std::string& data) CXX11_OVERRIDE;
};
- bool SendEncapsulatedData(const parameterlist &encap);
+ bool SendEncapsulatedData(const std::string& targetmask, const std::string& cmd, const parameterlist& params, User* source) CXX11_OVERRIDE;
void SendMetaData(User* user, const std::string& key, const std::string& data) CXX11_OVERRIDE;
void SendMetaData(Channel* chan, const std::string& key, const std::string& data) CXX11_OVERRIDE;
void SendMetaData(const std::string& key, const std::string& data) CXX11_OVERRIDE;