91 lines
2.6 KiB
Python
91 lines
2.6 KiB
Python
"""SMTP runtime: публичный payload и запись в .env из админки."""
|
|
|
|
from __future__ import annotations
|
|
|
|
from typing import Any
|
|
|
|
from config import Settings, get_settings
|
|
from services.env_file import (
|
|
BOOL_ENV_KEYS,
|
|
SECRET_ENV_KEYS,
|
|
env_file_path,
|
|
env_writable,
|
|
mask_secret,
|
|
upsert_env_keys,
|
|
)
|
|
from services.mailer import smtp_configured
|
|
|
|
SMTP_ENV_KEYS: tuple[str, ...] = (
|
|
"SMTP_HOST",
|
|
"SMTP_PORT",
|
|
"SMTP_USER",
|
|
"SMTP_PASSWORD",
|
|
"SMTP_FROM",
|
|
"SMTP_TLS",
|
|
"SMTP_SSL",
|
|
)
|
|
|
|
|
|
def smtp_public_dict(settings: Settings) -> dict[str, Any]:
|
|
path = env_file_path()
|
|
return {
|
|
"env_path": str(path),
|
|
"env_writable": env_writable(path),
|
|
"configured": smtp_configured(settings),
|
|
"host": settings.smtp_host,
|
|
"port": settings.smtp_port,
|
|
"user": settings.smtp_user,
|
|
"password_set": bool(settings.smtp_password),
|
|
"password_hint": mask_secret(settings.smtp_password),
|
|
"from_email": settings.smtp_from,
|
|
"tls": bool(settings.smtp_tls),
|
|
"ssl": bool(settings.smtp_ssl),
|
|
}
|
|
|
|
|
|
def _is_masked_placeholder(value: str) -> bool:
|
|
v = (value or "").strip()
|
|
if not v:
|
|
return True
|
|
return "…" in v or "•" in v or "..." in v
|
|
|
|
|
|
def apply_smtp_body(body: dict[str, Any]) -> Settings:
|
|
updates: dict[str, str | None] = {}
|
|
mapping = {
|
|
"SMTP_HOST": body.get("smtp_host"),
|
|
"SMTP_PORT": body.get("smtp_port"),
|
|
"SMTP_USER": body.get("smtp_user"),
|
|
"SMTP_PASSWORD": body.get("smtp_password"),
|
|
"SMTP_FROM": body.get("smtp_from"),
|
|
"SMTP_TLS": body.get("smtp_tls"),
|
|
"SMTP_SSL": body.get("smtp_ssl"),
|
|
}
|
|
for env_key, raw in mapping.items():
|
|
if raw is None:
|
|
continue
|
|
if env_key in BOOL_ENV_KEYS:
|
|
if isinstance(raw, bool):
|
|
updates[env_key] = "true" if raw else "false"
|
|
else:
|
|
updates[env_key] = (
|
|
"true"
|
|
if str(raw).strip().lower() in {"1", "true", "yes", "on"}
|
|
else "false"
|
|
)
|
|
continue
|
|
text = str(raw).strip()
|
|
if env_key in SECRET_ENV_KEYS:
|
|
if text == "__clear__":
|
|
updates[env_key] = None
|
|
elif _is_masked_placeholder(text):
|
|
continue
|
|
else:
|
|
updates[env_key] = text
|
|
continue
|
|
updates[env_key] = text if text else None
|
|
|
|
if updates:
|
|
upsert_env_keys(updates, allowlist=SMTP_ENV_KEYS)
|
|
return get_settings(require_bot_token=False)
|