]> git.netwichtig.de Git - user/henk/code/inspircd.git/commitdiff
ProtocolInterface::SendEncapsulatedData() changes
authorAttila Molnar <attilamolnar@hush.com>
Sun, 26 Jan 2014 12:05:09 +0000 (13:05 +0100)
committerAttila Molnar <attilamolnar@hush.com>
Sun, 26 Jan 2014 12:05:09 +0000 (13:05 +0100)
- 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

include/protocol.h
src/modules/m_sasl.cpp
src/modules/m_showwhois.cpp
src/modules/m_spanningtree/protocolinterface.cpp
src/modules/m_spanningtree/protocolinterface.h

index 4afb0bf59165cb86890330bdaa1edf62db543c8c..4c58c78ba379ca5c0ea9e8aaf79237a02e3b01e2 100644 (file)
@@ -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
index 796d343ea6fa9fe1b5e69adff540e6d18c142a4d..074362651925cc1b5fb8737ec3086bb68b3196dc 100644 (file)
@@ -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");
index 332752f934488a2f7eff671dfebba0303cc6b0b6..ba17942cbbc32eb52871c4fe15b5e9c5fe437682 100644 (file)
@@ -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);
                }
        }
 };
index 7a2b033d93c03875d709ff2cd0f0410c93b1506c..ee5e319844591cbafbf017096030cd0b67594265 100644 (file)
@@ -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)
index 745a0c3cc2c3ff5cf2831f48eee7747e7350e175..04b56c1816dbb8c192e11e8e9c4b24781962838b 100644 (file)
@@ -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;