summaryrefslogtreecommitdiff
path: root/client/SslClient.h
blob: 24ccc94244482733ac38f6dd39e74222ea904b2a (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132

#ifndef SSL_CLIENT_H
#define SSL_CLIENT_H

#include <QAbstractSocket>
#include <QObject>
#include <QSslSocket>
#include "client.h"

using std::string;

class QByteArray;
class QSslError;
class QString;

/**
 * @brief	Client-server communication class<br/>
 * 			- Uses SSL protocol to communicate with server
 * 			- Requests config/static or generic proxy lists/firewall list
 * 			- Server port - 13666
 * 			- Request format: [0x13 0x13 rcode 0x14 0x14]
 * 			- Reply format: [0x13 0x13 rcode [data] 0x14 0x14]
 * 			- Request codes:
 * 				-# 0x01 - request client config
 *				-# 0x02 - request generic proxy list
 * 				-# 0x04 - request static proxy list
 * 				-# 0x08 - request firewall host list
 */
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	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
		 */
		UploadList = 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
		 */
		RegularFile = 0x12
	};
	
	/**
	 * @brief	setup ssl socket ans it's type, certificates and key<br/>
	 * 			Default server address will be used: 127.0.0.1
	 */
	SslClient();
	
	/**
	 * @brief 	setup ssl socket ans 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	Request generic proxy list
	 * @param	type	type of request to send
	 */
	void SendRequest(RequestType type);
	
	/**
	 * @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<QSslError> &errors);
private:
	QSslSocket sslSocket;
	QString server;
	unsigned short port;
};

#endif