std::string ModuleList; /* Module list of other server from CAPAB */
std::map<std::string,std::string> CapKeys; /* CAPAB keys from other server */
Module* Hook; /* I/O hooking module that we're attached to for this socket */
-
+ std::string ourchallenge; /* Challenge sent for challenge/response */
+ std::string theirchallenge; /* Challenge recv for challenge/response */
+ std::string OutboundPass; /* Outbound password */
+ bool sentcapab; /* Have sent CAPAB already */
public:
/** Because most of the I/O gubbins are encapsulated within
*/
ServerState GetLinkState();
+ /** Get challenge set in our CAPAB for challenge/response
+ */
+ const std::string& GetOurChallenge();
+
+ /** Get challenge set in our CAPAB for challenge/response
+ */
+ void SetOurChallenge(const std::string &c);
+
+ /** Get challenge set in their CAPAB for challenge/response
+ */
+ const std::string& GetTheirChallenge();
+
+ /** Get challenge set in their CAPAB for challenge/response
+ */
+ void SetTheirChallenge(const std::string &c);
+
+ /** Compare two passwords based on authentication scheme
+ */
+ bool ComparePass(const std::string &ours, const std::string &theirs);
+
/** Return the module which we are hooking to for I/O encapsulation
*/
Module* GetHook();
*/
~TreeSocket();
+ /** Generate random string used for challenge-response auth
+ */
+ std::string RandString(unsigned int length);
+
+ /** Construct a password, optionally hashed with the other side's
+ * challenge string
+ */
+ std::string MakePass(const std::string &password, const std::string &challenge);
+
/** When an outbound connection finishes connecting, we receive
* this event, and must send our SERVER string to the other
* side. If the other side is happy, as outlined in the server
*/
virtual void OnError(InspSocketError e);
+ /** Sends an error to the remote server, and displays it locally to show
+ * that it was sent.
+ */
+ void SendError(const std::string &errormessage);
+
/** Handle socket disconnect event
*/
virtual int OnDisconnect();
bool OperQuit(const std::string &prefix, std::deque<std::string> ¶ms);
- /** Remote SQUIT (RSQUIT). Routing works similar to SVSNICK: Route it to the server that the target is connected to locally,
- * then let that server do the dirty work (squit it!). Example:
- * A -> B -> C -> D: oper on A squits D, A routes to B, B routes to C, C notices D connected locally, kills it. -- w00t
- */
- bool RemoteSquit(const std::string &prefix, std::deque<std::string> ¶ms);
-
/** SVSJOIN
*/
bool ServiceJoin(const std::string &prefix, std::deque<std::string> ¶ms);
virtual int OnIncomingConnection(int newsock, char* ip);
};
+/* Used to validate the value lengths of multiple parameters for a command */
+struct cmd_validation
+{
+ const char* item;
+ size_t param;
+ size_t length;
+};
+
+/* Used to validate the length values in CAPAB CAPABILITIES */
+struct cap_validation
+{
+ const char* reason;
+ const char* key;
+ size_t size;
+};
+
#endif