@@ -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+
48174840static 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