#ifndef SSL_CLIENT_H #define SSL_CLIENT_H #include #include #include #include "client.h" using std::string; class QByteArray; class QSslError; class QString; /** * @brief Client-server communication class
* - Uses SSL protocol to communicate with server * - Server port - 13666 * - Request/reply format (if not stated otherwise) * -# request: [0x13 0x13 rcode 0x14 0x14] * -# reply: [0x13 0x13 rcode [data] 0x14 0x14] * - Request codes for configuration data (see samples in config/ dir) * -# 0x01 - request client config * -# 0x02 - request generic proxy list * -# 0x03 - request static proxy list * -# 0x04 - request firewall host list * -# 0x05 - request list of file to be deleted * -# 0x06 - request list of files to be uploaded * -# 0x07 - request recent available client version * - Capable of transferring binary files (request code > 0x10)
* Entire data file is split into 4k parts and this parts are transferred
* as [data] payload in reply packet. If file size is split into integer number of parts
* then client is sent all parts + empty packet (no data): [0x13 0x13 rcode 0x14 0x14] * -# 0x11 - request client binary file * -# 0x12 - request reqular file
* request: [0x13 0x13 rcode [path] 0x14 0x14]
* where path - path on client's machine where this file should be */ class SslClient: public QObject { Q_OBJECT public: /** * @enum RequestType Enumerates all possible request types * @note All code values higher then 0x10 are meant to request binary file data */ enum RequestType { /** * @brief */ Unknown = 0x00, /** * @brief Request generic config */ Config = 0x01, /** * @brief Request generic proxy list */ GenericProxyList = 0x02, /** * @brief Request static proxy list */ StaticProxyList = 0x03, /** * @brief Request list of firewall rules */ FirewallList = 0x04, /** * @brief Request list of files that should exist on client PC */ DownloadList = 0x05, /** * @brief Request list of files to be deleted on client PC */ DeleteList = 0x06, /** * @brief Request most recent available client version */ ClientVersion = 0x07, /** * @brief Request client binary file */ ClientBinary = 0x11, /** * @brief Request file upload (the list of this files is obtained via RequestType::UploadList) * @note Request should contain file path as specified in RequestType::UploadList
* Reply data is split into 4k packets and sent one by one
* (4k packet is a Qt limitation; see qabstractsocket.cpp QAbstractSocketPrivate::readFromSocket()) */ RegularFile = 0x12 }; /** * @brief Setup ssl socket ans it's type, certificates and key
* Default server address will be used: 127.0.0.1 */ SslClient(); /** * @brief Setup ssl socket and it's type, certificates and key * @param addr server address or hostname to connect to */ SslClient(QString addr); /** * @brief set server address to connect to * @param addr server address or hostname to connect to */ void SetServerAddr(QString addr); /** * @brief Send request to server * @param type type of request to send */ void SendRequest(RequestType type); /** * @brief Send file data request (RequestType::RegularFile) * @param File name on client machine (will be sent to server) */ void SendFileRequest(string filename); /** * @brief disconnect from server */ void Disconnect(); signals: /** * @brief This signal is emited when data is recieved as a reply to * particular request * @param type of request this reply corresponds to */ void ReplyRecieved(SslClient::RequestType &type, QByteArray &confdata); /** * @brief This ssignal is emited when data request can't be completed * @todo emit this signal on all SSL errors too */ void ConnectionError(); private slots: void Connected(); void Disconnected(); void DataRecieved(); void Error(QAbstractSocket::SocketError socketError); void PeerVerifyError(const QSslError &error); void SslErrors(const QList &errors); protected: QString server; private: QSslSocket sslSocket; QByteArray pkt; unsigned short port; RequestType _currentRequest; string _currentFile; }; #endif