static admin_ssh_console_token_t token = { .slot_index=0, .session_id=7, .slot_generation=1, .transport=ADMIN_CONSOLE_TRANSPORT_WEB, }; static user_principal_t admin = {.role=USER_ROLE_ADMIN}; static bool live=true; static unsigned scenario; static bool is_current(const admin_ssh_console_token_t *t, const user_principal_t *p) { assert(!lock_depth && t->transport==ADMIN_CONSOLE_TRANSPORT_WEB && p->role==USER_ROLE_ADMIN); return live; } static bool drained(const admin_ssh_console_token_t *t) { (void)t; return true; } static esp_err_t perform(const admin_ssh_console_token_t *t, admin_ssh_deferred_action_type_t action, uint32_t arg) { (void)t; (void)action; (void)arg; assert(false); return ESP_FAIL; } static const admin_console_owner_t owner = { .is_current=is_current, .drained=drained, .perform=perform, }; static void reply(void) { const char *text=scenario==1 ? "wifi-secret\x03" : scenario==5 ? "short\r" : "wifi-secret\t\r"; size_t used=0; assert(s_sessions[0].prompt_hidden); assert(admin_ssh_console_feed_input(&token,(const uint8_t *)text,strlen(text),&used)); assert(used==strlen(text)); if (scenario==2) live=false; if (scenario==3) principal_current=false; if (scenario==4) admin_ssh_console_close(&token); } static void run_secret(void) { assert(admin_ssh_console_dispatch_is_web()); uint8_t greeting[4096]; size_t greeting_length; assert(admin_ssh_console_read_output(&token,greeting,sizeof(greeting),&greeting_length)==ESP_OK); unsigned before=applies, wiped=wipes; uint8_t history[sizeof(s_sessions[0].history)]; memcpy(history,s_sessions[0].history,sizeof(history)); int result=(scenario%2 || scenario==6) ? set_ap_secret() : set_profile_secret("0"); bool success=scenario==0 || scenario==6; assert(result==(success ? 0 : 1)); assert(applies==before+success); assert(wipes>=wiped+2); /* Hidden local input and PSK-bearing candidate. */ for (size_t i=0;i=5) assert(!memcmp(history,s_sessions[0].history,sizeof(history))); uint8_t output[4097]={0}; size_t n=0; if (s_sessions[0].active) { assert(admin_ssh_console_read_output(&token,output,sizeof(output)-1,&n)==ESP_OK); assert(!strstr((char *)output,"wifi-secret")); assert(!strstr((char *)output,"short")); assert(!strstr((char *)output,"help")); /* Tab never invokes completion in a prompt. */ } } int main(void) { assert(admin_ssh_console_init()==ESP_OK); assert(admin_ssh_console_start_uart_frontend()==ESP_OK); user_principal_t ordinary={.role=USER_ROLE_USER}; assert(admin_ssh_console_open_owned(&token,&ordinary,&owner)!=ESP_OK); working.profiles[0].ssid_len=1; working.profiles[0].ssid[0]='x'; for (scenario=0;scenario<7;++scenario) { live=true; principal_current=true; ++token.slot_generation; assert(admin_ssh_console_open_owned(&token,&admin,&owner)==ESP_OK); const char *line=(scenario%2 || scenario==6) ? "wifi ap secret\r" : "wifi profile secret 0\r"; size_t used=0; assert(admin_ssh_console_feed_input(&token,(const uint8_t *)line,strlen(line),&used)); unsigned before=runs; prompt_hook=reply; command_hook=run_secret; if (!setjmp(loop_done)) worker_task(NULL); assert(runs==before+1); admin_ssh_console_close(&token); admin_session_t empty={0}; assert(!memcmp(&empty,&s_sessions[0],sizeof(empty))); } assert(applies==2 && working.profiles[0].psk_len==11); assert(working.ap_psk_len==11 && !memcmp(working.ap_psk,"wifi-secret",11)); assert(!memcmp(working.profiles[0].psk,"wifi-secret",11)); puts("PASS: browser Wi-Fi policy-to-dispatch, actual profile/AP secret handlers and shared IO; hidden input/history/Tab, cancel, owner/account revocation, close, short input and wiping; ordinary role denied"); }