]> git.netwichtig.de Git - user/henk/code/inspircd.git/blobdiff - src/modules/m_spanningtree/treesocket.h
Improve X-line text consistency.
[user/henk/code/inspircd.git] / src / modules / m_spanningtree / treesocket.h
index 13dfad3f10dba57897462011d1077eab94ebe94a..6206448c159472014d20f920caedcacdcd288e33 100644 (file)
  */
 
 
-#ifndef M_SPANNINGTREE_TREESOCKET_H
-#define M_SPANNINGTREE_TREESOCKET_H
+#pragma once
 
-#include "socket.h"
 #include "inspircd.h"
-#include "xline.h"
 
 #include "utils.h"
 
@@ -76,8 +73,14 @@ struct CapabData
        std::string ourchallenge;               /* Challenge sent for challenge/response */
        std::string theirchallenge;             /* Challenge recv for challenge/response */
        int capab_phase;                        /* Have sent CAPAB already */
-       bool auth_fingerprint;                  /* Did we auth using SSL fingerprint */
+       bool auth_fingerprint;                  /* Did we auth using SSL certificate fingerprint */
        bool auth_challenge;                    /* Did we auth using challenge/response */
+
+       // Data saved from incoming SERVER command, for later use when our credentials have been accepted by the other party
+       std::string description;
+       std::string sid;
+       std::string name;
+       bool hidden;
 };
 
 /** Every SERVER connection inbound or outbound is represented by an object of
@@ -86,33 +89,92 @@ struct CapabData
  */
 class TreeSocket : public BufferedSocket
 {
-       SpanningTreeUtilities* Utils;           /* Utility class */
+       struct BurstState;
+
        std::string linkID;                     /* Description for this link */
        ServerState LinkState;                  /* Link state */
        CapabData* capab;                       /* Link setup data (held until burst is sent) */
        TreeServer* MyRoot;                     /* The server we are talking to */
-       time_t NextPing;                        /* Time when we are due to ping this server */
-       bool LastPingWasGood;                   /* Responded to last ping we sent? */
-       int proto_version;                      /* Remote protocol version */
+       unsigned int proto_version;                     /* Remote protocol version */
+
+       /** True if we've sent our burst.
+        * This only changes the behavior of message translation for 1202 protocol servers and it can be
+        * removed once 1202 support is dropped.
+        */
+       bool burstsent;
+
+       /** Checks if the given servername and sid are both free
+        */
+       bool CheckDuplicate(const std::string& servername, const std::string& sid);
+
+       /** Send all ListModeBase modes set on the channel
+        */
+       void SendListModes(Channel* chan);
+
+       /** Send all known information about a channel */
+       void SyncChannel(Channel* chan, BurstState& bs);
+
+       /** Send all users and their oper state, away state and metadata */
+       void SendUsers(BurstState& bs);
+
+       /** Send all additional info about the given server to this server */
+       void SendServerInfo(TreeServer* from);
+
+       /** Find the User source of a command given a prefix and a command string.
+        * This connection must be fully up when calling this function.
+        * @param prefix Prefix string to find the source User object for. Can be a sid, a uuid or a server name.
+        * @param command The command whose source to find. This is required because certain commands (like mode
+        * changes and kills) must be processed even if their claimed source doesn't exist. If the given command is
+        * such a command and the source does not exist, the function returns a valid FakeUser that can be used to
+        * to process the command with.
+        * @return The command source to use when processing the command or NULL if the source wasn't found.
+        * Note that the direction of the returned source is not verified.
+        */
+       User* FindSource(const std::string& prefix, const std::string& command);
+
+       /** Finish the authentication phase of this connection.
+        * Change the state of the connection to CONNECTED, create a TreeServer object for the server on the
+        * other end of the connection using the details provided in the parameters, and finally send a burst.
+        * @param remotename Name of the remote server
+        * @param remotesid SID of the remote server
+        * @param remotedesc Description of the remote server
+        * @param hidden True if the remote server is hidden according to the configuration
+        */
+       void FinishAuth(const std::string& remotename, const std::string& remotesid, const std::string& remotedesc, bool hidden);
+
+       /** Authenticate the remote server.
+        * Validate the parameters and find the link block that matches the remote server. In case of an error,
+        * an appropriate snotice is generated, an ERROR message is sent and the connection is closed.
+        * Failing to find a matching link block counts as an error.
+        * @param params Parameters they sent in the SERVER command
+        * @return Link block for the remote server, or NULL if an error occurred
+        */
+       Link* AuthRemote(const CommandBase::Params& params);
+
+       /** Write a line on this socket with a new line character appended, skipping all translation for old protocols
+        * @param line Line to write without a new line character at the end
+        */
+       void WriteLineNoCompat(const std::string& line);
+
  public:
-       time_t age;
+       const time_t age;
 
        /** Because most of the I/O gubbins are encapsulated within
         * BufferedSocket, we just call the superclass constructor for
         * most of the action, and append a few of our own values
         * to it.
         */
-       TreeSocket(SpanningTreeUtilities* Util, Link* link, Autoconnect* myac, const std::string& ipaddr);
+       TreeSocket(Link* link, Autoconnect* myac, const std::string& ipaddr);
 
        /** When a listening socket gives us a new file descriptor,
         * we must associate it with a socket without creating a new
         * connection. This constructor is used for this purpose.
         */
-       TreeSocket(SpanningTreeUtilities* Util, int newfd, ListenSocket* via, irc::sockets::sockaddrs* client, irc::sockets::sockaddrs* server);
+       TreeSocket(int newfd, ListenSocket* via, irc::sockets::sockaddrs* client, irc::sockets::sockaddrs* server);
 
        /** Get link state
         */
-       ServerState GetLinkState();
+       ServerState GetLinkState() const { return LinkState; }
 
        /** Get challenge set in our CAPAB for challenge/response
         */
@@ -138,7 +200,7 @@ class TreeSocket : public BufferedSocket
         */
        void CleanNegotiationInfo();
 
-       CullResult cull();
+       CullResult cull() CXX11_OVERRIDE;
        /** Destructor
         */
        ~TreeSocket();
@@ -154,11 +216,11 @@ class TreeSocket : public BufferedSocket
         * to server docs on the inspircd.org site, the other side
         * will then send back its own server string.
         */
-       virtual void OnConnected();
+       void OnConnected() CXX11_OVERRIDE;
 
        /** Handle socket error event
         */
-       virtual void OnError(BufferedSocketError e);
+       void OnError(BufferedSocketError e) CXX11_OVERRIDE;
 
        /** Sends an error to the remote server, and displays it locally to show
         * that it was sent.
@@ -168,63 +230,40 @@ class TreeSocket : public BufferedSocket
        /** Recursively send the server tree with distances as hops.
         * This is used during network burst to inform the other server
         * (and any of ITS servers too) of what servers we know about.
-        * If at any point any of these servers already exist on the other
-        * end, our connection may be terminated. The hopcounts given
-        * by this function are relative, this doesn't matter so long as
-        * they are all >1, as all the remote servers re-calculate them
-        * to be relative too, with themselves as hop 0.
         */
-       void SendServers(TreeServer* Current, TreeServer* s, int hops);
+       void SendServers(TreeServer* Current, TreeServer* s);
 
        /** Returns module list as a string, filtered by filter
         * @param filter a module version bitmask, such as VF_COMMON or VF_OPTCOMMON
         */
        std::string MyModules(int filter);
 
+       /** Returns mode list as a string, filtered by type.
+        * @param type The type of modes to return.
+        */
+       std::string BuildModeList(ModeType type);
+
        /** Send my capabilities to the remote side
         */
        void SendCapabilities(int phase);
 
-       /** Add modules to VF_COMMON list for backwards compatability */
-       void CompatAddModules(std::vector<std::string>& modlist);
-
        /* Isolate and return the elements that are different between two lists */
        void ListDifference(const std::string &one, const std::string &two, char sep,
                std::string& mleft, std::string& mright);
 
-       bool Capab(const parameterlist &params);
-
-       /** This function forces this server to quit, removing this server
-        * and any users on it (and servers and users below that, etc etc).
-        * It's very slow and pretty clunky, but luckily unless your network
-        * is having a REAL bad hair day, this function shouldnt be called
-        * too many times a month ;-)
-        */
-       void SquitServer(std::string &from, TreeServer* Current, int& num_lost_servers, int& num_lost_users);
-
-       /** This is a wrapper function for SquitServer above, which
-        * does some validation first and passes on the SQUIT to all
-        * other remaining servers.
-        */
-       void Squit(TreeServer* Current, const std::string &reason);
-
-       /* Used on nick collision ... XXX ugly function HACK */
-       int DoCollision(User *u, time_t remotets, const std::string &remoteident, const std::string &remoteip, const std::string &remoteuid);
+       bool Capab(const CommandBase::Params& params);
 
        /** Send one or more FJOINs for a channel of users.
         * If the length of a single line is more than 480-NICKMAX
         * in length, it is split over multiple lines.
         */
-       void SendFJoins(TreeServer* Current, Channel* c);
-
-       /** Send G, Q, Z and E lines */
-       void SendXLines(TreeServer* Current);
+       void SendFJoins(Channel* c);
 
-       /** Send channel modes and topics */
-       void SendChannelModes(TreeServer* Current);
+       /** Send G-, Q-, Z- and E-lines */
+       void SendXLines();
 
-       /** send all users and their oper state/modes */
-       void SendUsers(TreeServer* Current);
+       /** Send all known information about a channel */
+       void SyncChannel(Channel* chan);
 
        /** This function is called when we want to send a netburst to a local
         * server. There is a set order we must do this, because for example
@@ -236,90 +275,45 @@ class TreeSocket : public BufferedSocket
        /** This function is called when we receive data from a remote
         * server.
         */
-       void OnDataReady();
+       void OnDataReady() CXX11_OVERRIDE;
 
        /** Send one or more complete lines down the socket
         */
-       void WriteLine(std::string line);
+       void WriteLine(const std::string& line);
 
        /** Handle ERROR command */
-       void Error(parameterlist &params);
-
-       /** Remote AWAY */
-       bool Away(const std::string &prefix, parameterlist &params);
-
-       /** SAVE to resolve nick collisions without killing */
-       bool ForceNick(const std::string &prefix, parameterlist &params);
-
-       /** ENCAP command
-        */
-       void Encap(User* who, parameterlist &params);
-
-       /** OPERQUIT command
-        */
-       bool OperQuit(const std::string &prefix, parameterlist &params);
-
-       /** PONG
-        */
-       bool LocalPong(const std::string &prefix, parameterlist &params);
-
-       /** VERSION
-        */
-       bool ServerVersion(const std::string &prefix, parameterlist &params);
-
-       /** ADDLINE
-        */
-       bool AddLine(const std::string &prefix, parameterlist &params);
-
-       /** DELLINE
-        */
-       bool DelLine(const std::string &prefix, parameterlist &params);
-
-       /** WHOIS
-        */
-       bool Whois(const std::string &prefix, parameterlist &params);
-
-       /** PUSH
-        */
-       bool Push(const std::string &prefix, parameterlist &params);
-
-       /** PING
-        */
-       bool LocalPing(const std::string &prefix, parameterlist &params);
-
-       /** <- (remote) <- SERVER
-        */
-       bool RemoteServer(const std::string &prefix, parameterlist &params);
+       void Error(CommandBase::Params& params);
 
        /** (local) -> SERVER
         */
-       bool Outbound_Reply_Server(parameterlist &params);
+       bool Outbound_Reply_Server(CommandBase::Params& params);
 
        /** (local) <- SERVER
         */
-       bool Inbound_Server(parameterlist &params);
+       bool Inbound_Server(CommandBase::Params& params);
 
        /** Handle IRC line split
         */
-       void Split(const std::string &line, std::string& prefix, std::string& command, parameterlist &params);
+       void Split(const std::string& line, std::string& tags, std::string& prefix, std::string& command, CommandBase::Params& params);
 
        /** Process complete line from buffer
         */
        void ProcessLine(std::string &line);
 
-       void ProcessConnectedLine(std::string& prefix, std::string& command, parameterlist& params);
+       /** Process message tags received from a remote server. */
+       void ProcessTag(User* source, const std::string& tag, ClientProtocol::TagMap& tags);
+
+       /** Process a message for a fully connected server. */
+       void ProcessConnectedLine(std::string& tags, std::string& prefix, std::string& command, CommandBase::Params& params);
 
        /** Handle socket timeout from connect()
         */
-       virtual void OnTimeout();
+       void OnTimeout() CXX11_OVERRIDE;
        /** Handle server quit on close
         */
-       virtual void Close();
+       void Close() CXX11_OVERRIDE;
 
-       /** Returns true if this server was introduced to the rest of the network
+       /** Fixes messages coming from old servers so the new command handlers understand them
         */
-       bool Introduced();
+       bool PreProcessOldProtocolMessage(User*& who, std::string& cmd, CommandBase::Params& params);
 };
-
-#endif
-