From 783664622c87792805b4ea3d5312b1232bdead7a Mon Sep 17 00:00:00 2001 From: Anton Vakhrushev Date: Mon, 29 Jun 2026 12:25:14 +0300 Subject: [PATCH] =?UTF-8?q?=D0=A1=D0=B4=D0=B5=D0=BB=D0=B0=D0=BB=20=D0=BF?= =?UTF-8?q?=D0=B0=D1=80=D0=BE=D0=BB=D1=8C=20qBittorrent=20=D0=BE=D0=BF?= =?UTF-8?q?=D1=86=D0=B8=D0=BE=D0=BD=D0=B0=D0=BB=D1=8C=D0=BD=D1=8B=D0=BC=20?= =?UTF-8?q?(config)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit qBittorrent может работать без аутентификации (обход авторизации для доверенной подсети) — пустой пароль валиден. Co-Authored-By: Claude Opus 4.8 --- internal/config/config.go | 8 +++----- internal/config/config_test.go | 12 +++++++++++- 2 files changed, 14 insertions(+), 6 deletions(-) diff --git a/internal/config/config.go b/internal/config/config.go index d0bb092..a3f3f6b 100644 --- a/internal/config/config.go +++ b/internal/config/config.go @@ -252,11 +252,9 @@ func (c *Config) validate() error { errs = append(errs, fmt.Errorf("worker.source_missing_threshold %d must be >= 1", c.Worker.SourceMissingThreshold)) } - // Обязательные секреты включённых секций (ловит криво отрендеренный деплоем - // файл). qBittorrent — ядро, пароль нужен всегда. - if c.QBittorrent.Password == "" { - errs = append(errs, errors.New("qbittorrent.password is empty (required secret)")) - } + // qbittorrent.password намеренно не обязателен: qBittorrent может работать без + // аутентификации (например, обход авторизации для клиентов из доверенной + // подсети) — пустой пароль валиден. // llm.api_key намеренно не обязателен: keyless-local LLM (LM Studio с // заданным base_url, но без ключа) — валидный документированный дефолт. diff --git a/internal/config/config_test.go b/internal/config/config_test.go index 4660f4e..6288407 100644 --- a/internal/config/config_test.go +++ b/internal/config/config_test.go @@ -33,6 +33,17 @@ func TestValidate_OK(t *testing.T) { } } +// TestValidate_NoQBittorrentPassword — пустой пароль qBittorrent валиден: +// клиент может работать без аутентификации (обход авторизации для доверенной +// подсети). +func TestValidate_NoQBittorrentPassword(t *testing.T) { + c := validCfg(t) + c.QBittorrent.Password = "" + if err := c.validate(); err != nil { + t.Fatalf("пустой пароль qBittorrent должен быть валиден, got %v", err) + } +} + // TestValidate_KeylessLocalLLM — keyless-local LLM (задан base_url, пустой // api_key, напр. LM Studio) — валиден: ключ не обязателен. func TestValidate_KeylessLocalLLM(t *testing.T) { @@ -51,7 +62,6 @@ func TestValidate_Errors(t *testing.T) { want string }{ {"empty qbittorrent.url", func(c *Config) { c.QBittorrent.URL = "" }, "qbittorrent.url"}, - {"empty qbittorrent.password", func(c *Config) { c.QBittorrent.Password = "" }, "qbittorrent.password"}, {"empty db_path", func(c *Config) { c.Storage.DBPath = "" }, "storage.db_path"}, {"bad llm.type", func(c *Config) { c.LLM.Type = "anthropic" }, "llm.type"}, {"relative movies", func(c *Config) { c.Paths.Movies = "movies" }, "absolute"},