fix(nodes): не давать пустым полям учётных данных затирать токен/пароль сервера
При редактировании ноды (например, при смене имени) форма отправляла пустые api_token_name/api_token_value, т.к. секреты не возвращаются с бэкенда. Бэкенд принимал их как явно заданные и затирал реальные credentials, из-за чего немедленная проверка подключения падала и сервер помечался offline. Теперь пустые значения при редактировании трактуются как «не менять» — и на фронтенде, и на бэкенде. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
This commit is contained in:
@@ -260,6 +260,14 @@ def update_proxmox_server(
|
||||
|
||||
# Если изменились учётные данные - очищаем кеш
|
||||
update_data = server_data.model_dump(exclude_unset=True)
|
||||
|
||||
# Пустая строка в полях учётных данных означает "не менять" (клиент
|
||||
# присылает их пустыми, т.к. секреты не возвращаются с бэкенда) —
|
||||
# иначе она затирает реальный токен/пароль и сервер уходит в offline.
|
||||
for cred_field in ('api_token_name', 'api_token_value', 'password'):
|
||||
if update_data.get(cred_field) == '':
|
||||
update_data.pop(cred_field)
|
||||
|
||||
if any(key in update_data for key in ['password', 'api_token_name', 'api_token_value', 'api_user']):
|
||||
clear_server_cache(server.ip_address)
|
||||
logger.info(f"Cleared cache for server {server.ip_address} due to credential update")
|
||||
|
||||
@@ -118,6 +118,7 @@ function ServerFormDialog({
|
||||
initialData,
|
||||
onSubmit,
|
||||
isPending,
|
||||
serverId,
|
||||
}: {
|
||||
open: boolean;
|
||||
onOpenChange: (v: boolean) => void;
|
||||
@@ -148,10 +149,17 @@ function ServerFormDialog({
|
||||
verify_ssl: form.verify_ssl,
|
||||
description: form.description || undefined,
|
||||
};
|
||||
// При редактировании поля учётных данных приходят в форму пустыми
|
||||
// (бэкенд не возвращает секреты), поэтому пустое значение здесь значит
|
||||
// "не менять" — отправлять его нельзя, иначе бэкенд затрёт реальный
|
||||
// токен/пароль пустой строкой и сервер уйдёт в offline.
|
||||
const isEdit = serverId != null;
|
||||
if (form.use_password) {
|
||||
payload.use_password = true;
|
||||
payload.password = form.password;
|
||||
} else {
|
||||
if (!isEdit || form.password) {
|
||||
payload.use_password = true;
|
||||
payload.password = form.password;
|
||||
}
|
||||
} else if (!isEdit || form.api_token_name || form.api_token_value) {
|
||||
payload.api_token_name = form.api_token_name;
|
||||
payload.api_token_value = form.api_token_value;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user