summary |
shortlog |
log |
commit | commitdiff |
tree
raw |
patch |
inline | side by side (from parent 1:
1db0e98)
- 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
virtual ~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.
* 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.
* 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
/** Send metadata for a channel to other linked servers.
* @param chan The channel to send metadata for
static void SendSASL(const parameterlist& params)
{
static void SendSASL(const parameterlist& params)
{
- if (!ServerInstance->PI->SendEncapsulatedData(params))
+ if (!ServerInstance->PI->SendEncapsulatedData(sasl_target, "SASL", params))
{
SASLFallback(NULL, params);
}
{
SASLFallback(NULL, params);
}
: user(user_), state(SASL_INIT), state_announced(false)
{
parameterlist params;
: 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");
params.push_back(user->uuid);
params.push_back("*");
params.push_back("S");
return true;
parameterlist params;
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");
params.push_back(this->user->uuid);
params.push_back(this->agent);
params.push_back("C");
else
{
std::vector<std::string> params;
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);
params.push_back(dest->uuid);
params.push_back(source->uuid);
- ServerInstance->PI->SendEncapsulatedData(params);
+ ServerInstance->PI->SendEncapsulatedData(dest->server->GetName(), cmd.name, params);
-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]);
}
void SpanningTreeProtocolInterface::SendMetaData(User* u, const std::string& key, const std::string& data)
}
void SpanningTreeProtocolInterface::SendMetaData(User* u, const std::string& key, const std::string& data)
void SendMetaData(const std::string& key, const std::string& data) CXX11_OVERRIDE;
};
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;
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;