Skip to content

Commit f59d046

Browse files
committed
Making Show() waiting for connection + token
1 parent 6e7b0da commit f59d046

File tree

1 file changed

+54
-22
lines changed

1 file changed

+54
-22
lines changed

src/webui.c

Lines changed: 54 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -400,6 +400,7 @@ typedef struct _webui_core_t {
400400
webui_mutex_t mutex_client;
401401
webui_mutex_t mutex_async_response;
402402
webui_mutex_t mutex_mem;
403+
webui_mutex_t mutex_token;
403404
webui_condition_t condition_wait;
404405
char* default_server_root_path;
405406
bool ui;
@@ -4814,6 +4815,28 @@ static bool _webui_mutex_is_connected(_webui_window_t* win, int update) {
48144815
return status;
48154816
}
48164817

4818+
static bool _webui_mutex_is_single_client_token_valid(_webui_window_t* win, int update) {
4819+
4820+
bool status = false;
4821+
_webui_mutex_lock(&_webui.mutex_token);
4822+
if (update == WEBUI_MUTEX_TRUE) win->single_client_token_check = true;
4823+
else if (update == WEBUI_MUTEX_FALSE) win->single_client_token_check = false;
4824+
status = win->single_client_token_check;
4825+
_webui_mutex_unlock(&_webui.mutex_token);
4826+
return status;
4827+
}
4828+
4829+
static bool _webui_mutex_is_multi_client_token_valid(_webui_window_t* win, int update, int index) {
4830+
4831+
bool status = false;
4832+
_webui_mutex_lock(&_webui.mutex_token);
4833+
if (update == WEBUI_MUTEX_TRUE) _webui.clients_token_check[index] = true;
4834+
else if (update == WEBUI_MUTEX_FALSE) _webui.clients_token_check[index] = false;
4835+
status = _webui.clients_token_check[index];
4836+
_webui_mutex_unlock(&_webui.mutex_token);
4837+
return status;
4838+
}
4839+
48174840
static bool _webui_mutex_is_exit_now(int update) {
48184841

48194842
bool status = false;
@@ -5142,13 +5165,14 @@ static void _webui_send_all(_webui_window_t* win, uint16_t id, unsigned char cmd
51425165
if (_webui.config.multi_client) {
51435166
// Loop trough all connected clients in this window
51445167
for (size_t i = 0; i < WEBUI_MAX_IDS; i++) {
5145-
if ((_webui.clients[i] != NULL) && (_webui.clients_win_num[i] == win->num) && (_webui.clients_token_check[i])) {
5168+
if ((_webui.clients[i] != NULL) && (_webui.clients_win_num[i] == win->num) &&
5169+
(_webui_mutex_is_multi_client_token_valid(win, WEBUI_MUTEX_NONE, i))) {
51465170
_webui_send_client(win, _webui.clients[i], 0, cmd, data, len, false);
51475171
}
51485172
}
51495173
} else {
51505174
// Single client
5151-
if ((win->single_client != NULL) && (win->single_client_token_check)) {
5175+
if ((win->single_client != NULL) && (_webui_mutex_is_single_client_token_valid(win, WEBUI_MUTEX_NONE))) {
51525176
_webui_send_client(win, win->single_client, 0, cmd, data, len, false);
51535177
}
51545178
}
@@ -5171,7 +5195,7 @@ static void _webui_send_client(
51715195

51725196
// Check Token
51735197
if (!token_bypass) {
5174-
if (!_webui.clients_token_check[connection_id])
5198+
if (!_webui_mutex_is_multi_client_token_valid(win, WEBUI_MUTEX_NONE, connection_id))
51755199
return;
51765200
}
51775201

@@ -5980,6 +6004,7 @@ static void _webui_clean(void) {
59806004
_webui_mutex_destroy(&_webui.mutex_client);
59816005
_webui_mutex_destroy(&_webui.mutex_async_response);
59826006
_webui_mutex_destroy(&_webui.mutex_mem);
6007+
_webui_mutex_destroy(&_webui.mutex_token);
59836008
_webui_condition_destroy(&_webui.condition_wait);
59846009

59856010
#ifdef WEBUI_LOG
@@ -7261,11 +7286,11 @@ static bool _webui_show_window(_webui_window_t* win, struct mg_connection* clien
72617286
_webui_free_mem((void*)window_url);
72627287
}
72637288

7264-
// Wait for window connection
7289+
// Wait for window connection & token validation
72657290
if ((browser != NoBrowser) && _webui.config.show_wait_connection) {
72667291

72677292
#ifdef WEBUI_LOG
7268-
printf("[Core]\t\t_webui_show_window() -> Waiting for window connection\n");
7293+
printf("[Core]\t\t_webui_show_window() -> Waiting for window connection & token validation\n");
72697294
#endif
72707295

72717296
size_t timeout = (_webui.startup_timeout > 0 ?
@@ -7274,6 +7299,8 @@ static bool _webui_show_window(_webui_window_t* win, struct mg_connection* clien
72747299

72757300
if (_webui.is_webview) {
72767301

7302+
// WebView
7303+
72777304
_webui_timer_t timer;
72787305
_webui_timer_start(&timer);
72797306
for (;;) {
@@ -7299,8 +7326,8 @@ static bool _webui_show_window(_webui_window_t* win, struct mg_connection* clien
72997326
#endif
73007327
}
73017328

7302-
// Stop if window is connected
7303-
if (_webui_mutex_is_connected(win, WEBUI_MUTEX_NONE))
7329+
// Stop if window is connected & token is valid
7330+
if (_webui_mutex_is_single_client_token_valid(win, WEBUI_MUTEX_NONE))
73047331
break;
73057332

73067333
// Stop if timer is finished
@@ -7309,15 +7336,16 @@ static bool _webui_show_window(_webui_window_t* win, struct mg_connection* clien
73097336
}
73107337
} else {
73117338

7312-
// Wait for server thread to start
7339+
// Web Browser
7340+
73137341
_webui_timer_t timer;
73147342
_webui_timer_start(&timer);
73157343
for (;;) {
73167344

73177345
_webui_sleep(10);
73187346

7319-
// Stop if window is connected
7320-
if (_webui_mutex_is_connected(win, WEBUI_MUTEX_NONE))
7347+
// Stop if window is connected & token is valid
7348+
if (_webui_mutex_is_single_client_token_valid(win, WEBUI_MUTEX_NONE))
73217349
break;
73227350

73237351
// Stop if timer is finished
@@ -7326,7 +7354,7 @@ static bool _webui_show_window(_webui_window_t* win, struct mg_connection* clien
73267354
}
73277355
}
73287356

7329-
// The window is successfully launched and connected.
7357+
// Return status of the window connection (not token validation)
73307358
return _webui_mutex_is_connected(win, WEBUI_MUTEX_NONE);
73317359
}
73327360

@@ -7542,6 +7570,7 @@ static void _webui_init(void) {
75427570
_webui_mutex_init(&_webui.mutex_client);
75437571
_webui_mutex_init(&_webui.mutex_async_response);
75447572
_webui_mutex_init(&_webui.mutex_mem);
7573+
_webui_mutex_init(&_webui.mutex_token);
75457574
_webui_condition_init(&_webui.condition_wait);
75467575

75477576
// Random
@@ -8973,11 +9002,11 @@ static bool _webui_connection_save(_webui_window_t* win, struct mg_connection* c
89739002
// Save
89749003
if (win->single_client == NULL) {
89759004
win->single_client = client;
8976-
win->single_client_token_check = false;
9005+
_webui_mutex_is_single_client_token_valid(win, WEBUI_MUTEX_FALSE);
89779006
}
89789007
_webui.clients[i] = client;
89799008
_webui.clients_win_num[i] = win->num;
8980-
_webui.clients_token_check[i] = false;
9009+
_webui_mutex_is_multi_client_token_valid(win, WEBUI_MUTEX_FALSE, i);
89819010
win->clients_count++;
89829011
_webui_mutex_unlock(&_webui.mutex_client);
89839012
*connection_id = i;
@@ -9008,18 +9037,18 @@ static void _webui_connection_remove(_webui_window_t* win, struct mg_connection*
90089037
#endif
90099038
// Reset Token
90109039
if (!_webui.config.multi_client) {
9011-
if (_webui.clients_token_check[i]) {
9040+
if (_webui_mutex_is_multi_client_token_valid(win, WEBUI_MUTEX_NONE, i)) {
90129041
win->token = 0;
90139042
}
90149043
}
90159044
// Clear
90169045
if (win->single_client == client) {
90179046
win->single_client = NULL;
9018-
win->single_client_token_check = false;
9047+
_webui_mutex_is_single_client_token_valid(win, WEBUI_MUTEX_FALSE);
90199048
}
90209049
_webui.clients[i] = NULL;
90219050
_webui.clients_win_num[i] = 0;
9022-
_webui.clients_token_check[i] = false;
9051+
_webui_mutex_is_multi_client_token_valid(win, WEBUI_MUTEX_FALSE, i);
90239052
if (win->clients_count > 0)
90249053
win->clients_count--;
90259054
// Close
@@ -9485,9 +9514,9 @@ static void _webui_ws_process(
94859514
if (_webui_connection_get_id(win, client, &connection_id)) {
94869515

94879516
if (win->single_client == client) {
9488-
win->single_client_token_check = true;
9517+
_webui_mutex_is_single_client_token_valid(win, WEBUI_MUTEX_TRUE);
94899518
}
9490-
_webui.clients_token_check[connection_id] = true;
9519+
_webui_mutex_is_multi_client_token_valid(win, WEBUI_MUTEX_TRUE, connection_id);
94919520

94929521
#ifdef WEBUI_LOG
94939522
printf(
@@ -9537,7 +9566,7 @@ static void _webui_ws_process(
95379566
);
95389567

95399568
// Free
9540-
_webui_free_mem((void*)csv);
9569+
_webui_free_mem((void*)csv);
95419570

95429571
// New Event
95439572
if (win->has_all_events) {
@@ -11489,7 +11518,8 @@ static WEBUI_THREAD_MONITOR {
1148911518
#endif
1149011519
// Loop trough all connected clients in this window
1149111520
for (size_t i = 0; i < WEBUI_MAX_IDS; i++) {
11492-
if ((_webui.clients[i] != NULL) && (_webui.clients_win_num[i] == win->num) && (_webui.clients_token_check[i])) {
11521+
if ((_webui.clients[i] != NULL) && (_webui.clients_win_num[i] == win->num) &&
11522+
(_webui_mutex_is_multi_client_token_valid(win, WEBUI_MUTEX_NONE, i))) {
1149311523
_webui_send_client(win, _webui.clients[i], 0, WEBUI_CMD_JS_QUICK, js, js_len, false);
1149411524
}
1149511525
}
@@ -11540,7 +11570,8 @@ static WEBUI_THREAD_MONITOR {
1154011570
#endif
1154111571
// Loop trough all connected clients in this window
1154211572
for (size_t i = 0; i < WEBUI_MAX_IDS; i++) {
11543-
if ((_webui.clients[i] != NULL) && (_webui.clients_win_num[i] == win->num) && (_webui.clients_token_check[i])) {
11573+
if ((_webui.clients[i] != NULL) && (_webui.clients_win_num[i] == win->num) &&
11574+
(_webui_mutex_is_multi_client_token_valid(win, WEBUI_MUTEX_NONE, i))) {
1154411575
_webui_send_client(win, _webui.clients[i], 0, WEBUI_CMD_JS_QUICK, js, js_len, false);
1154511576
}
1154611577
}
@@ -11588,7 +11619,8 @@ static WEBUI_THREAD_MONITOR {
1158811619
#endif
1158911620
// Loop trough all connected clients in this window
1159011621
for (size_t i = 0; i < WEBUI_MAX_IDS; i++) {
11591-
if ((_webui.clients[i] != NULL) && (_webui.clients_win_num[i] == win->num) && (_webui.clients_token_check[i])) {
11622+
if ((_webui.clients[i] != NULL) && (_webui.clients_win_num[i] == win->num) &&
11623+
(_webui_mutex_is_multi_client_token_valid(win, WEBUI_MUTEX_NONE, i))) {
1159211624
_webui_send_client(win, _webui.clients[i], 0, WEBUI_CMD_JS_QUICK, js, js_len, false);
1159311625
}
1159411626
}

0 commit comments

Comments
 (0)