Move console payloads to lazy PSRAM storage
This commit is contained in:
+21
-8
@@ -11,6 +11,7 @@
|
||||
#include "admin_ssh_console.h"
|
||||
#include "console_input.h"
|
||||
#include "esp_console.h"
|
||||
#include "esp_heap_caps.h"
|
||||
#include "mbedtls/base64.h"
|
||||
#include "secure_random.h"
|
||||
#include "ssh_transport.h"
|
||||
@@ -19,8 +20,9 @@
|
||||
|
||||
#define USER_CONSOLE_KEY_LINE_CAPACITY 256U
|
||||
|
||||
/* `user` commands are serialized by the administration gate. */
|
||||
static user_database_snapshot_t s_user_snapshot;
|
||||
/* Gate-owned public projection (no verifiers). Lazily retained for firmware
|
||||
* lifetime; allocation failure must not disable mutations or UART0 recovery. */
|
||||
static user_database_snapshot_t *s_user_snapshot;
|
||||
|
||||
static void print_usage(void)
|
||||
{
|
||||
@@ -92,21 +94,30 @@ static void print_user(const user_database_user_snapshot_t *user)
|
||||
|
||||
static int show_users(const char *selected)
|
||||
{
|
||||
esp_err_t error = user_database_get_snapshot(&s_user_snapshot);
|
||||
if (s_user_snapshot == NULL) {
|
||||
s_user_snapshot = heap_caps_malloc(sizeof(*s_user_snapshot),
|
||||
MALLOC_CAP_SPIRAM | MALLOC_CAP_8BIT);
|
||||
if (s_user_snapshot == NULL) {
|
||||
printf("User status unavailable: PSRAM snapshot storage unavailable\n");
|
||||
return 1;
|
||||
}
|
||||
}
|
||||
esp_err_t error = user_database_get_snapshot(s_user_snapshot);
|
||||
if (error != ESP_OK) {
|
||||
printf("User database unavailable: %s\n", esp_err_to_name(error));
|
||||
secure_wipe(s_user_snapshot, sizeof(*s_user_snapshot));
|
||||
return 1;
|
||||
}
|
||||
if (selected == NULL) {
|
||||
printf("User database: generation=%lu users=%u/%u admins=%u\n",
|
||||
(unsigned long)s_user_snapshot.generation,
|
||||
(unsigned int)s_user_snapshot.user_count,
|
||||
(unsigned long)s_user_snapshot->generation,
|
||||
(unsigned int)s_user_snapshot->user_count,
|
||||
USER_DATABASE_MAX_USERS,
|
||||
(unsigned int)s_user_snapshot.admin_count);
|
||||
(unsigned int)s_user_snapshot->admin_count);
|
||||
}
|
||||
bool found = false;
|
||||
for (size_t index = 0U; index < USER_DATABASE_MAX_USERS; ++index) {
|
||||
const user_database_user_snapshot_t *user = &s_user_snapshot.users[index];
|
||||
const user_database_user_snapshot_t *user = &s_user_snapshot->users[index];
|
||||
if (!user->active ||
|
||||
(selected != NULL &&
|
||||
(strlen(selected) != user->username_length ||
|
||||
@@ -118,11 +129,13 @@ static int show_users(const char *selected)
|
||||
}
|
||||
if (selected != NULL && !found) {
|
||||
printf("User '%s' not found.\n", selected);
|
||||
secure_wipe(s_user_snapshot, sizeof(*s_user_snapshot));
|
||||
return 1;
|
||||
}
|
||||
if (s_user_snapshot.admin_count == 0U) {
|
||||
if (s_user_snapshot->admin_count == 0U) {
|
||||
printf("No administrators; use 'user add <username> admin' on UART0.\n");
|
||||
}
|
||||
secure_wipe(s_user_snapshot, sizeof(*s_user_snapshot));
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user