Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -157,7 +157,7 @@ esptool.py --chip esp32s3 -p /dev/ttyACM0 write_flash \

## 当前状态

**版本**: 0.4.0
**版本**: 0.4.4
**阶段**: Phase 38 完成 - WebUI 多语言支持

### 已完成功能
Expand Down
31 changes: 29 additions & 2 deletions components/ts_security/src/ts_security.c
Original file line number Diff line number Diff line change
Expand Up @@ -166,6 +166,22 @@ esp_err_t ts_security_store_cert(const char *name, ts_cert_type_t type,
return ret;
}

/**
* @brief 驱逐指定 client_id 的所有会话(释放槽位)
* @note 仅内部使用,在 create_session 槽位满时按同用户驱逐
*/
static void destroy_sessions_by_client(const char *client_id)
{
if (!client_id || client_id[0] == '\0') return;
for (int i = 0; i < MAX_SESSIONS; i++) {
if (s_sessions[i].active &&
strcmp(s_sessions[i].session.client_id, client_id) == 0) {
s_sessions[i].active = false;
TS_LOGI(TAG, "Evicted session for client: %s", client_id);
}
}
}

esp_err_t ts_security_create_session(const char *client_id, ts_perm_level_t level,
uint32_t *session_id)
{
Expand All @@ -181,8 +197,19 @@ esp_err_t ts_security_create_session(const char *client_id, ts_perm_level_t leve
}

if (slot < 0) {
TS_LOGW(TAG, "No free session slots");
return ESP_ERR_NO_MEM;
if (client_id && client_id[0] != '\0') {
destroy_sessions_by_client(client_id);
for (int i = 0; i < MAX_SESSIONS; i++) {
if (!s_sessions[i].active) {
slot = i;
break;
}
}
}
if (slot < 0) {
TS_LOGW(TAG, "No free session slots");
return ESP_ERR_NO_MEM;
}
}

// Generate session ID
Expand Down
2 changes: 1 addition & 1 deletion version.txt
Original file line number Diff line number Diff line change
@@ -1 +1 @@
0.4.3
0.4.4