fix(nodes): не давать пустым полям учётных данных затирать токен/пароль сервера
Some checks failed
Backend Tests / pytest (Python 3.12) (push) Has been cancelled
Deploy to Production / Trigger production update (push) Has been cancelled

При редактировании ноды (например, при смене имени) форма отправляла
пустые api_token_name/api_token_value, т.к. секреты не возвращаются
с бэкенда. Бэкенд принимал их как явно заданные и затирал реальные
credentials, из-за чего немедленная проверка подключения падала и
сервер помечался offline. Теперь пустые значения при редактировании
трактуются как «не менять» — и на фронтенде, и на бэкенде.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
This commit is contained in:
markmorado
2026-07-23 21:57:27 +05:00
parent d3b834cbe1
commit ef5b40b2f7
2 changed files with 19 additions and 3 deletions

View File

@@ -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")

View File

@@ -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;
}