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
145
146
147
148
149
150
151
|
/**
* This file is part of GPGFrontend.
*
* GPGFrontend is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* Foobar is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with Foobar. If not, see <https://www.gnu.org/licenses/>.
*
* The initial version of the source code is inherited from gpg4usb-team.
* Their source code version also complies with GNU General Public License.
*
* The source code version of this software was modified and released
* by Saturneric<[email protected]> starting on May 12, 2021.
*
*/
#include "server/ComUtils.h"
/**
* check server reply if it can parse into a json object
* @param reply reply data in byte array
* @return if successful
*/
bool ComUtils::checkServerReply(const QByteArray &reply) {
if(reply.isEmpty()) {
QMessageBox::critical(this, tr("Error"), tr("Nothing Reply. Please check the Internet connection."));
return false;
}
qDebug() << "Reply" << reply;
/**
* Server Reply Format(Except Timeout)
* {
* "status": 200,
* "msg": "OK",
* "timestamp": 1628652783895
* "data" : {
* ...
* }
* }
*/
// check if reply is a json object
if (replyDoc.Parse(reply).HasParseError() || !replyDoc.IsObject()) {
QMessageBox::critical(this, tr("Error"), tr("Unknown Error"));
return false;
}
// check status(int) and message(string)
if (replyDoc.HasMember("status") && replyDoc.HasMember("msg") && replyDoc.HasMember("timestamp") &&
replyDoc.HasMember("data")
&& replyDoc["status"].IsNumber() && replyDoc["msg"].IsString() && replyDoc["timestamp"].IsNumber() &&
replyDoc["data"].IsObject()) {
int status = replyDoc["status"].GetInt();
QDateTime time;
time.setMSecsSinceEpoch(replyDoc["timestamp"].GetInt64());
auto message = replyDoc["msg"].GetString();
dataVal = replyDoc["data"].GetObject();
qDebug() << "Reply Date & Time" << time;
// check reply timestamp
if (time < QDateTime::currentDateTime().addSecs(-10)) {
QMessageBox::critical(this, tr("Network Error"), tr("Outdated Reply"));
return false;
}
// check status code if successful (200-299)
// check data object
if (status / 100 == 2) {
is_good = true;
return true;
} else {
if (dataVal.HasMember("exceptionMessage") && dataVal["exceptionMessage"].IsString())
QMessageBox::critical(this, message, dataVal["exceptionMessage"].GetString());
else QMessageBox::critical(this, message, tr("Unknown Reason"));
}
} else QMessageBox::critical(this, tr("Network Error"), tr("Unknown Reply Format"));
return false;
}
/**
* get value in data
* @param key key of value
* @return value in string format
*/
QString ComUtils::getDataValue(const QString &key) {
if (is_good) {
auto k_byte_array = key.toUtf8();
if (dataVal.HasMember(k_byte_array.data())) {
return dataVal[k_byte_array.data()].GetString();
} else return {};
} else return {};
}
/**
* Get eventually url by service type
* @param type service which server provides
* @return url
*/
QString ComUtils::getUrl(ComUtils::ServiceType type) {
auto host = settings.value("general/currentGpgfrontendServer",
"service.gpgfrontend.pub").toString();
auto protocol = QString();
// Debug Server
if (host == "localhost") protocol = "http://";
else protocol = "https://";
auto url = protocol + host + ":9049/";
switch (type) {
case GetServiceToken:
url += "/user";
break;
case ShortenCryptText:
url += "/text/new";
break;
case GetFullCryptText:
url += "/text/get";
break;
}
qDebug() << "ComUtils getUrl" << url;
return url;
}
bool ComUtils::checkDataValue(const QString &key) {
auto key_byte_array_data = key.toUtf8().constData();
if (is_good) {
return dataVal.HasMember(key_byte_array_data) && dataVal[key_byte_array_data].IsString();
} else return false;
}
bool ComUtils::checkServiceTokenFormat(const QString &uuid) {
return re_uuid.match(uuid).hasMatch();
}
|