summaryrefslogtreecommitdiff
path: root/client/SslClient.h
blob: 77af07032d53cd6bb94c82b70dc82a2fe4d7b777 (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
133
134
135
136
137
138
139
140
141
142
143
144

#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
 * 			- 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)<br/>
 * 			  Entire data file is split into 4k parts and this parts are transferred<br/>
 *			  as [data] payload in reply packet. If file size is split into integer number of parts<br/>
 * 			  then client is sent all parts + empty packet (no data):  [0x13 0x13 rcode 0x14 0x14]
 * 				-# 0x11 - request client binary file
 * 				-# 0x12 - request reqular file<br/>
 * 						  request:	[0x13 0x13 rcode [path] 0x14 0x14]<br/>
 * 						  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	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<br/>
		 * 			Reply data is split into 4k parts and sent one by one
		 */
		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