Сделал пароль qBittorrent опциональным (config)
qBittorrent может работать без аутентификации (обход авторизации для доверенной подсети) — пустой пароль валиден. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
@@ -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))
|
errs = append(errs, fmt.Errorf("worker.source_missing_threshold %d must be >= 1", c.Worker.SourceMissingThreshold))
|
||||||
}
|
}
|
||||||
|
|
||||||
// Обязательные секреты включённых секций (ловит криво отрендеренный деплоем
|
// qbittorrent.password намеренно не обязателен: qBittorrent может работать без
|
||||||
// файл). qBittorrent — ядро, пароль нужен всегда.
|
// аутентификации (например, обход авторизации для клиентов из доверенной
|
||||||
if c.QBittorrent.Password == "" {
|
// подсети) — пустой пароль валиден.
|
||||||
errs = append(errs, errors.New("qbittorrent.password is empty (required secret)"))
|
|
||||||
}
|
|
||||||
// llm.api_key намеренно не обязателен: keyless-local LLM (LM Studio с
|
// llm.api_key намеренно не обязателен: keyless-local LLM (LM Studio с
|
||||||
// заданным base_url, но без ключа) — валидный документированный дефолт.
|
// заданным base_url, но без ключа) — валидный документированный дефолт.
|
||||||
|
|
||||||
|
|||||||
@@ -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, пустой
|
// TestValidate_KeylessLocalLLM — keyless-local LLM (задан base_url, пустой
|
||||||
// api_key, напр. LM Studio) — валиден: ключ не обязателен.
|
// api_key, напр. LM Studio) — валиден: ключ не обязателен.
|
||||||
func TestValidate_KeylessLocalLLM(t *testing.T) {
|
func TestValidate_KeylessLocalLLM(t *testing.T) {
|
||||||
@@ -51,7 +62,6 @@ func TestValidate_Errors(t *testing.T) {
|
|||||||
want string
|
want string
|
||||||
}{
|
}{
|
||||||
{"empty qbittorrent.url", func(c *Config) { c.QBittorrent.URL = "" }, "qbittorrent.url"},
|
{"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"},
|
{"empty db_path", func(c *Config) { c.Storage.DBPath = "" }, "storage.db_path"},
|
||||||
{"bad llm.type", func(c *Config) { c.LLM.Type = "anthropic" }, "llm.type"},
|
{"bad llm.type", func(c *Config) { c.LLM.Type = "anthropic" }, "llm.type"},
|
||||||
{"relative movies", func(c *Config) { c.Paths.Movies = "movies" }, "absolute"},
|
{"relative movies", func(c *Config) { c.Paths.Movies = "movies" }, "absolute"},
|
||||||
|
|||||||
Reference in New Issue
Block a user