-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathmainwindow.h
332 lines (305 loc) · 35.3 KB
/
mainwindow.h
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
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
/*
* MainWindow является центральной частью программы.
* Все остальные окна общаются межд у собой путем проброса сигналов через MainWindow
* Существует два варианта работы MainWindow: для root и для player
* В начале комментария к любым атрибутам, методам, сигналам и слотам MainWindow
* указано, к какому режиму относится данный объект
*
* П.С. поскольку у нас говнокод, а кодить меня никто не учил, часть вещей, которые для рута - скрыты
*/
/* Протокол работы с сетью.
* Любое сообщение представляет собой следующий вид:
* |-----------------------------------
* |char who | char action | data ...
* |-----------------------------------
* | 1 byte | 1 byte | ...
* |-----------------------------------
*
* I (поле who)
* 1) who = 0 - любой игрок, в дальнейшем player
* 2) who = 1 - штаб, в дальнейшем root
* В данный момент поле who содержит избыточность, которая внесена для возможного добавления других действующих лиц (не баг, а фича)
*
* II (поле action)
* 1) action = r - регистрация игроков
* data = QString login (в случае если who = 0, т.е. отправляет пользователь)
* data = QString verdict (в случае, если who = 1, т.е. отправляет root)
*
* 2) action = n
* data = QString new_player_login
*
* 3) action = S (S заглавная)
* data = n, m записанные через пробел в string, после чего n*m слов, записанных через пробел
* через пробел далее идут коды изображений. Код имеет вид i_j,
* где i - номер руны
* j - номер цвета
*
*
* action = g - root завершил передачу исходных данных всем пользователям, game_must_go_on!
* запускает старт игры
*
* 4) action = i - intercept (перехват)
* data = yes/no + QString login (в случае если who = 0, т.е. отправляет пользователь)
* data = yes/no + QString intercept_addr (в случае, если who = 1, т.е. отправляет root)
*
* action = I - уже перехваченное сообщение
* data = QString messege + QImage = concat(p_key || p_key_size || s_key || s_key_size || i || j) + QImage
*
* 5) action = a - add users
* Посылает вновь прибывшему пользователю информацию о всех игроках в сети
* data = Qstring "..." через пробел логины пользователей: for example ("1auser1 user2 user3")
*
* 6) action = l - указывает уровень (возможности пользователя)\
* data = 1 - только P
* = 2 - PS
* = 3 - (PS)^n, ключи перехватываются
* = 4 - ассиметричная криптография
* Согобщение, согласно протоколу имеет вид: "1l 2"
*
* III (примечания)
* Задействован QUdpSocket, следовательно, общаются UDP пакетами
* При получении сигнала "readyRead" сокет вызывает слот void NET_datagramm_analysis(), который анализирует полученный пакет
* Все, что связано с сетью имеет префикс NET_
*/
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QMainWindow>
#include <QGridLayout>
#include <QUdpSocket>
#include <QMap>
#include <QTime>
#include <QBuffer>
#include <QVector>
#include <QIcon>
#include <vector>
#include "home_window.h"
#include "send_messege.h"
#include "choose_button.h"
#include "root_window.h"
#include "make_img_window.h"
#include "interception.h"
#include "asimetry.h"
#include "fun.h"
namespace Ui {
class MainWindow;
}
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
explicit MainWindow(QWidget *parent = 0);
~MainWindow();
/**********************************************************************************************/
void rootwindow(); /* Mode = root; //
* Функция, формирующая окно root и connect для него //
*/ //
//
void playerwindow(); /* Mode = player; //
* Функция, формирующая окно player и connect для него //
*/ //
//
/**********************************************************************************************/
private slots:
/************************* Слоты для анализа введенного в окне регистрации (mainwindow) ***************************************/
void ok_enabled(); /* Mode = any; //
* Слот, который проверяет, ввёл ли пользователь верное значение в поле "логин" //
*/ //
//
void on_Login_button_clicked(); /* Mode = any; //
* Слот, анализирующий "логин" и выполняющий дальнейшие действия //
*/ //
//
void on_edit_ip_root_editingFinished(); /* Mode = player; //
* Смена IP root с локального на сетевой //
*/ //
//
/**************************************************************************************************************************** */
/****************************************************** Cлоты для переключения между окнами *********************************************** */
void home_wnd__sendmess_wnd(); /* Mode = player; //
* Слот, позволяющий переключиться между окном home_window и send_messege //
*/ //
//
void sendmess_wnd__home_wnd();/* Mode = player; //
* Слот, позволяющий переключиться между окном send_messege и home_window //
*/ //
//
void show_ch_wnd();/* Mode = player; //
* Слот, замораживающий окно send_messege и открывающий окно choose_button //
*/ //
//
void if_close_wnd(); /* Mode = player; //
* Слот срабатывает при закрытии окна choose_button //
* Активирует окно send_messege */ //
//
void show_make_wnd();/* Mode = player; //
* Слот, замораживающий окно send_messege и открывающий окно make_image_window //
*/ //
//
void show_intercept_window(); // mode = player Открытие окна intercept //
//
void back__homecoming(); // mode = player Из окна перехвата обратно в домашнее //
//
void show_make_wnd_to_root(QImage img, int i, int j, QString str); /* mode = root //
* Вызывает для root make_img_window.set_rune(img, i, j, str); //
* Данный метод ставит активным изображение, //
* которое выбрал root + указывает позицию изображения //
*/ //
//
void if_close_wnd_fo_root(); /* Защита от неожиданного и от санкционированного закрытия окна */
void show_rsa_wnd();
void back_from_rsa_wnd();//
void use_assimetry_crypto(int n,int e,int d);
//
/****************************************************************************************************************************************** */
/****************************************************** Служебные слоты, для работы программы ********************************************************* */
//
void create_pb(int i, int j);/* Mode = player; //
* Реагирует на сигнал от home_window::do_it(int, int) //
* Слот, который создает в окне choose_button кнопку в соответствующей позиции i, j //
* Для кнопки задается connect: //
* в случае, если кнопка открыта - вызывает сигнал choose_button::i_choose_img(...) //
* иначе вызывает QMessegeBox с информацией об ошибке //
* Вызывает метод choose_button::set_image(QPB_modify *pb, int i, int j), //
* который ставит кнопку в соответствующую позицию //
*/ //
//
//
void then_opend_img(QImage img, int i, int j, QString code); /* Mode = player; //
* Слот срабатывает на сигнал home_window::i_opend(QImage, int, int) //
* Слот, который вызывает метод choose_button::open_button(QImage img, int i, int j) //
* Данный метод создает новую кнопку, устанавливает на неё икноку (reverse), делает кнопку активной //
*/ //
//
void then_choosen_img(QImage img, int i, int j, QString code); /* Mode = player //
* Ловит сигнал choose_buttons::i_choose_img(QImage) //
* Данный слот устанавливает в send_messege то изображение, которое выбрал пользователь в качестве рабочкго //
*/ //
//
//
void set_rune(int rune, int color); /* Получают значение i, задают значения temp_... i%data.size() Внимание, внимание, костыль! //
* Это связано с тем, что все возможные руны и цвета хранятся в make_wnd //
* Выковыривает от туда руну и цвет и устанавливает в temp_rune в root (необходимо для default) //
*/ //
//
void then_made_img(QImage img, QString code); /* mode = player //
* слот, который ловит сигнал от make_img_window, после того, как пользователь создал изображения для brute_forse //
*/ //
//
void new_rune_created_root(QImage img ,int i, int j, QString str, QString img_code); /* mode = root //
* в случае, если преподаватель хочет создать свою руну, //
* то он жмет на изображение, открывается make_img_window //
* После этого, преподаватель создает руну, жмет "ок". "ок" возвращает руну, //
* строчку, которая закодированна таким способом + позицию в сетке рун //
*/ //
//
void test_player_image(QString code , // mode = player //
QString p_key, int p_key_size, // отсылает изображение (код), ключи P //
QString s_key, int s_key_size, // S (для перехвата) //
int i, int j, // позицию в сетке изображений //
QString algoritm); // алгоритм шифрования //
// Проверят соотвествует ли присланное изображение родному //
// Если пользователя перехватывают, то отсылает информацию //
//
void send_messege_wnd_on_intercept_value(QImage img, QString code, int i, int j);
void solo();
void set_flag_assimetry(bool t){flag_assimetry_done = t;}
//
/************************************************************************************************************************************************** */
/****************************************************** Cлоты для работы с сетью ***************************************************************************** */
//
// Самый главный слот для работы с сетью! //
// //
// //
void NET_datagramm_analysis(); /* mode = all //
* Данный слот анализирует датаграмму из сокета. Подробнее см. протокол + "внутренности" метода //
// */ //
// //
// //
//
//
//
void NET_send_players_inercept_login(QString login); // mode = player отсылает руту логин того, кого хочет перехватывать //
//
void NET_registration_for_root(QString login, QHostAddress sender); /* mode = root //
* проверка уникальности имени пользователя //
* занесение в БД пользователей в случае успеха //
* генерация ответа (verdict) //
*/ //
void NET_registration_for_player(QString verdict); /* mode = player //
* пользователь анализирует ответ рута (уникальный логин или очередной плагиат) //
* П.С. socket отправляется при нажатии кноппки ok, SLOT on_Login_button_clicked() //
*/ //
//
void NET_a_new_player_come(QString new_player_login, QString sender); /* mode = root //
* оповещение других пользователей о том, что появился новый игрок //
*/ //
//
void NET_add_new_player (QString login); /* mode = player //
* В случае появления нового пользователя, root шлет всем пользователям сообщение, //
* которое содержит action = n, data = login //
* Данный метод добавляет нового пользователя //
*/ //
//
void NET_send_info_for_start(); /* mode = root //
* Шлет всем пользователям информацию о старте //
* Переделать чтобы для одного пользователя!!!! //
*/ //
//
void NET_start_messeges_phase_1(QString messeges); /* mode = player //
* Первая фаза передачи информации необходимой для старта //
* Анализирует все слова и составляет массив vector<vector> messeges из строки //
* делает resize source_img!!! !!! //
*/ //
//
//
//
void NET_players_intercept_for_root(QString data, QHostAddress sender); //
void NET_players_intercept_for_player(QString data); //
void NET_send_intercepted_messege_for_player (QString addres, QString code, // адресс, изображение //
QString p_key, int p_key_size, // ключи P //
QString s_key, int s_key_size, // S (для перехвата) //
int i, int j, QString algoritm); //
//
void NET_no_overhere_for_root (QString login); /* В случае, если пользователь не хочет больше подслушивать этого человека //
* шлет root информацию ою этом //
*/ //
//
void NET_list_of_user_in_game(QString data); //
void NET_send_info_for_player(QString address, QString &messeges, QString &codes); //
void NET_add_intercepted_messege(QString data); //
void NET_send_rsa_img(QString code, int e, int n, int i, int j);
void NET_set_rsa_intercept_mess(QString data);
void NET_send_lvl();
void create_source_images();
void NET_add_player (QString login, QHostAddress sender);
/************************************************************************************************************************************************************* */ //
private:
Ui::MainWindow *ui;
QUdpSocket *socket;
QString root_address = "127.0.0.1"; // Меняется в зависиости от сети! Менять ручками в исходном коде
QMap<QString, QString> user_list; // Список пользователей. Ключ - адресс (IPv4), value - логин
vector<vector<QString>> code_messege; // Строки, которые кодируются рунами
vector<vector<QString>> runes_code; // Коды source image
int img_count_n; // Дефолтное значение
int img_count_m; // Дефолтное значение
QVector <QString> me_overhere_addres_list;// Список людей, которые меня прослушивают
QString i_overhear_login = ""; // Логин того, кого я подслушиваю
// root тоже имеет право на свои переменные в mainwindow
QString messeges; // Строка из закодированных рунами строк (через пробел)
QString img_code; // Строка с закодированными изображениями (номер руны_номерцвета)
//
home_window *home_wnd;
send_messege *send_messege_wnd;
choose_button *choose_button_wnd;
make_img_window *make_wnd;
root_window *root_wnd;
interception *intercept_wnd;
asimetry *rsa_wnd;
bool flag_is_it_root = false;
bool flag_assimetry_done = false;
QIcon icon_test = QIcon(":/images/question.png");
};
int count_simbols_befor(QString data, char befor); /* Находит количество символов до определенного */
QString cut_string_befor_simbol(QString &str, char befor); /* Вырезает из строки кусок, который идет до символа befor. Символ befor удаляет */
QString simbols_in_str_at_positions(QString data, int position, int count);
#endif // MAINWINDOW_H