commit e2e74bc0461b9fcaf1b180a0c5eba1d35d0c288d
parent da0def46b10009a8d228a45a413285026ffbbe96
Author: Pablo Murad <pablo@pablomurad.com>
Date: Sat, 21 Mar 2026 20:45:24 -0300
fixed a lot of stuff
Diffstat:
8 files changed, 35 insertions(+), 27 deletions(-)
diff --git a/email/docs/ADMIN.md b/email/docs/ADMIN.md
@@ -13,7 +13,7 @@
## Mailgun — alterar email do administrador
1. Edite `admin_email` em `/etc/runv-email.json`.
-2. Actualize também `admin_email` em `/opt/runv/terminal/config.toml` se usar o fluxo **entre**.
+2. Fluxo **entre:** com `admin_email` vazio no `/opt/runv/terminal/config.toml`, o `entre_app` usa o mesmo `admin_email` do JSON — não precisa duplicar. Os avisos do entre usam *From* **`noreply@runv.club`** por omissão (ou `mail_from` no TOML).
## Mailgun — rodar API key ou região
diff --git a/email/docs/INTEGRATION.md b/email/docs/INTEGRATION.md
@@ -65,9 +65,9 @@ Com **Mailgun**, `sendmail` é ignorado para o transporte (usa API). Com **legad
| Ficheiro | Campos |
|----------|--------|
| `/etc/runv-email.json` | `backend`, `admin_email`, `default_from`, Mailgun (`mailgun_domain`, …) ou SMTP (`smtp_host`, …), `email_package_root`. |
-| `/opt/runv/terminal/config.toml` | `admin_email`, `mail_from`, `sendmail_path` — fluxo entre. |
+| `/opt/runv/terminal/config.toml` | `admin_email` (opcional se o JSON já tiver), `mail_from` (omissão **noreply@runv.club**), `sendmail_path`. |
-Recomenda-se o **mesmo** `admin_email` e remetente coerente com o Mailgun/domínio verificado.
+O destinatário dos avisos do **entre** pode vir só do JSON (`admin_email` vazio no TOML). O *From* dos mesmos avisos é **noreply@runv.club** por omissão (não `entre@runv.club`). Garanta esse endereço autorizado no Mailgun se usar API.
## `create_runv_user.py` / `del-user.py`
diff --git a/terminal/config.example.toml b/terminal/config.example.toml
@@ -5,9 +5,9 @@ queue_dir = "/var/lib/runv/entre-queue"
log_file = "/var/log/runv/entre.log"
templates_dir = "/opt/runv/terminal/templates"
-# Email do administrador (opcional). Se vazio aqui, o entre_app tenta admin_email
-# em /etc/runv-email.json (ex.: após configure_mailgun.py). Se ambos vazios: só fila + log.
+# Email do administrador (opcional). Deixe vazio para usar só admin_email em
+# /etc/runv-email.json (configure_mailgun.py / msmtp). Se ambos vazios: só fila + log.
admin_email = ""
-# Remetente do aviso ao admin (From). Por omissão runv.club; se vazio no TOML, o código usa o mesmo.
-mail_from = "entre@runv.club"
+# Remetente From dos avisos do fluxo entre (não use entre@ — é a conta SSH).
+mail_from = "noreply@runv.club"
sendmail_path = "/usr/sbin/sendmail"
diff --git a/terminal/docs/ADMIN.md b/terminal/docs/ADMIN.md
@@ -73,7 +73,7 @@ Sugestão mínima: manter o ficheiro no sítio e só alterar `status` para audit
- **Prioridade:** `admin_email` em `config.toml`.
- **Fallback:** se `admin_email` no TOML estiver vazio, usa `admin_email` de `/etc/runv-email.json` (o mesmo ficheiro do Mailgun / `configure_mailgun.py`).
- **Transporte:** [`entre_core.sendmail_notify`](../entre_core.py) tenta **primeiro** a API **Mailgun** via `lib.mailer.send_mail` quando o JSON global indica Mailgun; caso contrário usa `sendmail_path` (por omissão `/usr/sbin/sendmail`). Requisitos Mailgun: `email_package_root` ou variável `RUNV_EMAIL_ROOT` a apontar para a pasta `email/` do repositório.
- - **Remetente:** se `mail_from` no TOML for o default `entre@runv.club` e o JSON tiver `default_from`, o *From* alinha-se a `default_from` (útil com domínio verificado no Mailgun).
+ - **Remetente:** por omissão **`noreply@runv.club`** (`mail_from` no TOML ou constante no código). Não usar `entre@runv.club` no *From* (conta SSH). Outro endereço: defina `mail_from` no `config.toml`.
### Reenviar notificação
diff --git a/terminal/docs/INSTALL.md b/terminal/docs/INSTALL.md
@@ -66,7 +66,7 @@ Opções úteis:
Edite **`/opt/runv/terminal/config.toml`**:
- **`admin_email`** — endereço para notificações. Pode ficar vazio no TOML se **`admin_email`** estiver definido em **`/etc/runv-email.json`** (fallback usado pelo `entre_app.py`). Se ambos estiverem vazios, só fila + log.
-- **`mail_from`** — remetente do email (cabeçalho `From`); por omissão **`entre@runv.club`**. Se a chave existir mas estiver vazia, o programa usa o mesmo endereço. Com Mailgun, se o remetente continuar no default e o JSON tiver `default_from`, o código alinha o *From* a `default_from`.
+- **`mail_from`** — remetente do email (cabeçalho `From`); por omissão **`noreply@runv.club`** (não use **`entre@runv.club`**: essa conta é só SSH). Valores antigos `entre@runv.club` no TOML são normalizados para noreply. Para outro remetente verificado no Mailgun, defina explicitamente no TOML.
- **`sendmail_path`** — normalmente `/usr/sbin/sendmail` (ramo legado; com Mailgun configurado, o envio pode ser pela API sem precisar de MTA).
## 5. Autenticação SSH para o utilizador `entre`
diff --git a/terminal/entre_core.py b/terminal/entre_core.py
@@ -94,7 +94,9 @@ MAX_ONLINE_PRESENCE_LEN: Final[int] = 4000
APP_VERSION: Final[str] = "0.02"
SOURCE_TAG: Final[str] = "entre-ssh"
# Remetente por omissão das notificações sendmail do fluxo «entre» (cabeçalho From).
-DEFAULT_MAIL_FROM: Final[str] = "entre@runv.club"
+DEFAULT_MAIL_FROM: Final[str] = "noreply@runv.club"
+# Antigo default em config.toml antigo — normalizado para noreply@runv.club
+LEGACY_MAIL_FROM_ENTRE: Final[str] = "entre@runv.club"
class ValidationError(ValueError):
@@ -321,14 +323,26 @@ def resolve_entre_notify_recipients(
"""
Destinatário e remetente para o email de novo pedido (fluxo entre).
- Ordem: ``admin_email`` / ``mail_from`` no TOML; se ``admin_email`` vazio,
- usa ``admin_email`` de :file:`/etc/runv-email.json`. Se o remetente efectivo
- ainda for o default ``entre@runv.club`` e o JSON tiver ``default_from``,
- alinha o *From* ao domínio Mailgun.
+ ``admin_email``: primeiro ``config.toml``; se vazio, ``admin_email`` em
+ :file:`/etc/runv-email.json` (setup Mailgun/msmtp). Assim não é obrigatório
+ repetir o admin no TOML.
+
+ ``mail_from``: TOML ou constante ``DEFAULT_MAIL_FROM`` (``noreply@runv.club``).
+ Valores antigos ``entre@runv.club`` no TOML são normalizados para noreply.
+ Para outro remetente (ex.: domínio Mailgun alternativo), defina ``mail_from``
+ explicitamente no TOML.
"""
admin = str(cfg.get("admin_email", "")).strip()
mail_raw = str(cfg.get("mail_from", DEFAULT_MAIL_FROM)).strip()
mail_from = mail_raw or DEFAULT_MAIL_FROM
+ if mail_from.strip().lower() == LEGACY_MAIL_FROM_ENTRE.lower():
+ mail_from = DEFAULT_MAIL_FROM
+ if logger is not None:
+ logger.info(
+ "notificação: mail_from legado %s substituído por %s",
+ LEGACY_MAIL_FROM_ENTRE,
+ DEFAULT_MAIL_FROM,
+ )
data: dict[str, Any] | None = None
if RUNV_EMAIL_STATE_PATH.is_file():
@@ -349,16 +363,6 @@ def resolve_entre_notify_recipients(
RUNV_EMAIL_STATE_PATH,
)
- if data is not None:
- df = str(data.get("default_from", "")).strip()
- if df and mail_from == DEFAULT_MAIL_FROM:
- mail_from = df
- if logger is not None:
- logger.info(
- "notificação: mail_from alinhado a default_from em %s",
- RUNV_EMAIL_STATE_PATH,
- )
-
return admin, mail_from
diff --git a/terminal/scripts/test_mail.sh b/terminal/scripts/test_mail.sh
@@ -6,7 +6,7 @@ set -e
ROOT="$(cd "$(dirname "$0")/.." && pwd)"
REQUEST_ID="00000000-0000-0000-0000-000000000001"
export REQUEST_ID
-printf '%s\n' "From: entre@runv.club
+printf '%s\n' "From: noreply@runv.club
To: admin@example.com
Subject: [runv] teste de notificação
diff --git a/terminal/setup_entre.py b/terminal/setup_entre.py
@@ -541,7 +541,11 @@ def apply_sshd_configuration(
if skip_sshd:
print()
print("== Modo --skip-sshd: configure o SSH manualmente ==")
- print("1. Editar", install_root / "config.toml", "— especialmente admin_email.")
+ print(
+ "1. Opcional: editar",
+ install_root / "config.toml",
+ "— admin_email pode ficar vazio se /etc/runv-email.json já tiver admin_email; From padrão noreply@runv.club.",
+ )
print("2. Criar /etc/ssh/sshd_config.d/… com o bloco abaixo.")
print("3. sshd -t && systemctl reload ssh")
print("4. empty-password: regra PAM por omissão (ou --skip-pam-empty-password-rule).")
@@ -860,7 +864,7 @@ def main() -> int:
):
if prompt_yes(
f"Manter {cfg_path} com as suas definições (recomendado) ou substituir "
- f"por config.example.toml (perde admin_email e outros valores)? Substituir? ",
+ f"por config.example.toml (repor mail_from noreply@runv.club, etc.)? Substituir? ",
default=False,
):
force_cfg = True