Add HTTPS identity rotation support
This commit is contained in:
+53
-5
@@ -796,7 +796,7 @@ esp_err_t web_server_start(void)
|
||||
return error == ESP_OK ? start_server(false) : error;
|
||||
}
|
||||
|
||||
static esp_err_t stop_server(uint32_t expected_generation, bool restart)
|
||||
static esp_err_t stop_server(uint32_t expected_generation, bool restart, bool reserved)
|
||||
{
|
||||
if (s_server_mutex == NULL) {
|
||||
return ESP_ERR_INVALID_STATE;
|
||||
@@ -804,7 +804,7 @@ static esp_err_t stop_server(uint32_t expected_generation, bool restart)
|
||||
|
||||
if (xSemaphoreTake(s_server_mutex, expected_generation ? 0U : portMAX_DELAY) != pdTRUE)
|
||||
return ESP_ERR_TIMEOUT;
|
||||
if (s_server == NULL || s_transitioning ||
|
||||
if (s_server == NULL || s_transitioning != reserved ||
|
||||
(expected_generation && (expected_generation != s_generation ||
|
||||
s_generation == UINT32_MAX || s_last_error != ESP_OK))) {
|
||||
xSemaphoreGive(s_server_mutex);
|
||||
@@ -879,21 +879,69 @@ static esp_err_t stop_server(uint32_t expected_generation, bool restart)
|
||||
return error == ESP_OK && restart ? start_server(true) : error;
|
||||
}
|
||||
|
||||
esp_err_t web_server_replace_identity(uint32_t expected_service_generation,
|
||||
uint32_t expected_identity_generation, bool reset, bool *committed)
|
||||
{
|
||||
if (!committed || (!!expected_service_generation != !!expected_identity_generation) ||
|
||||
(reset && expected_service_generation)) return ESP_ERR_INVALID_ARG;
|
||||
*committed = false;
|
||||
/* Conditional dispatcher admission must not wait in the legacy initializer. */
|
||||
esp_err_t error = expected_service_generation
|
||||
? (s_server_mutex ? ESP_OK : ESP_ERR_INVALID_STATE) : web_server_init();
|
||||
if (error != ESP_OK) return error;
|
||||
if (xSemaphoreTake(s_server_mutex, 0U) != pdTRUE) return ESP_ERR_TIMEOUT;
|
||||
if (s_transitioning || (expected_service_generation &&
|
||||
(!s_server || s_last_error != ESP_OK || s_generation == UINT32_MAX ||
|
||||
expected_service_generation != s_generation))) {
|
||||
xSemaphoreGive(s_server_mutex);
|
||||
return ESP_ERR_INVALID_STATE;
|
||||
}
|
||||
bool running = s_server != NULL;
|
||||
s_transitioning = true;
|
||||
xSemaphoreGive(s_server_mutex);
|
||||
|
||||
uint32_t token = 0;
|
||||
error = web_security_reserve_identity(expected_identity_generation, reset, &token);
|
||||
if (error == ESP_OK) {
|
||||
xSemaphoreTake(s_server_mutex, portMAX_DELAY);
|
||||
if (s_generation != UINT32_MAX) ++s_generation;
|
||||
xSemaphoreGive(s_server_mutex);
|
||||
error = web_security_replace_reserved(token);
|
||||
}
|
||||
if (error == ESP_OK) {
|
||||
*committed = true;
|
||||
if (running) error = stop_server(0, true, true);
|
||||
else if (reset) error = start_server(true);
|
||||
else {
|
||||
xSemaphoreTake(s_server_mutex, portMAX_DELAY);
|
||||
s_transitioning = false;
|
||||
xSemaphoreGive(s_server_mutex);
|
||||
}
|
||||
} else {
|
||||
/* No identity publication: leave HTTPD and its logins untouched. */
|
||||
xSemaphoreTake(s_server_mutex, portMAX_DELAY);
|
||||
s_transitioning = false;
|
||||
xSemaphoreGive(s_server_mutex);
|
||||
}
|
||||
web_security_release_identity(token);
|
||||
return error;
|
||||
}
|
||||
|
||||
esp_err_t web_server_stop(void)
|
||||
{
|
||||
return stop_server(0U, false);
|
||||
return stop_server(0U, false, false);
|
||||
}
|
||||
|
||||
esp_err_t web_server_stop_current(uint32_t expected_generation)
|
||||
{
|
||||
if (!expected_generation) return ESP_ERR_INVALID_ARG;
|
||||
return stop_server(expected_generation, false);
|
||||
return stop_server(expected_generation, false, false);
|
||||
}
|
||||
|
||||
esp_err_t web_server_restart_current(uint32_t expected_generation)
|
||||
{
|
||||
if (!expected_generation) return ESP_ERR_INVALID_ARG;
|
||||
return stop_server(expected_generation, true);
|
||||
return stop_server(expected_generation, true, false);
|
||||
}
|
||||
|
||||
esp_err_t web_server_reboot_current(uint32_t expected_generation)
|
||||
|
||||
Reference in New Issue
Block a user