runv-server

server tooling for runv.club
Log | Files | Refs | README

commit 24940a9067b50a902a2dc01be800ed03cb1a7f49
parent 13bf4a571d44d726b23d9c5379fc3e2fbed4258a
Author: Pablo Murad <pablo@pablomurad.com>
Date:   Sun, 22 Mar 2026 22:40:07 -0300

closed app - small patch

Diffstat:
Memail/configure_mailgun.py | 15++++++---------
Memail/configure_msmtp_legacy.py | 6+++---
Memail/lib/mailer.py | 4++--
Memail/lib/mailgun_client.py | 12++++++------
Memail/tests/test_mailgun_client.py | 2+-
5 files changed, 18 insertions(+), 21 deletions(-)

diff --git a/email/configure_mailgun.py b/email/configure_mailgun.py @@ -1,3 +1,4 @@ + #!/usr/bin/env python3 """ Configurador de email runv — Mailgun HTTP API (predefinido). @@ -25,12 +26,7 @@ SECRETS_PATH = Path("/etc/runv-email.secrets.json") MAILGUN_API_REGION = "us" sys.path.insert(0, str(MODULE_ROOT)) -from lib.mailgun_client import ( # noqa: E402 - build_mailgun_messages_url, - mailgun_base_url, - mask_secret, - validate_mailgun_inputs, -) +from lib.mailgun_client import build_mailgun_messages_url, mailgun_base_url, mask_secret, validate_mailgun_inputs # noqa: E402, type: ignore def setup_logging(verbose: bool) -> None: @@ -78,6 +74,7 @@ def prompt_api_key_twice() -> str: print("As duas entradas não coincidem — tente de novo.") continue return key + raise RuntimeError("Unreachable") def print_mailgun_operator_hints() -> None: @@ -181,7 +178,7 @@ def run_test_send(*, dry_run: bool) -> None: if not admin or not from_addr: raise ValueError("admin_email ou default_from em falta no estado") - from lib.mailer import render_template, send_mail + from lib.mailer import render_template, send_mail # type: ignore body = render_template( "system_test", @@ -242,9 +239,9 @@ def main() -> int: args = parser.parse_args() if args.legacy_smtp: - import configure_msmtp_legacy as leg + import configure_msmtp_legacy as leg # type: ignore - argv = [sys.argv[0]] + [a for a in sys.argv[1:] if a != "--legacy-smtp"] + argv = [sys.argv[0]] + [sys.argv[i] for i in range(1, len(sys.argv)) if sys.argv[i] != "--legacy-smtp"] sys.argv = argv return leg.main() diff --git a/email/configure_msmtp_legacy.py b/email/configure_msmtp_legacy.py @@ -56,7 +56,7 @@ def require_root() -> None: def run_cmd( - cmd: list[str], + cmd: list, *, dry_run: bool, timeout: int = 600, @@ -111,7 +111,7 @@ def _remove_netrc_machine_block(text: str, host: str) -> str: host_line = re.compile(rf"^machine\s+{re.escape(host)}\s*$", re.MULTILINE) next_machine = re.compile(r"^machine\s+", re.MULTILINE) lines = text.splitlines() - out: list[str] = [] + out = [] i = 0 while i < len(lines): if host_line.match(lines[i]): @@ -287,7 +287,7 @@ def run_test_send(*, dry_run: bool) -> None: raise ValueError("admin_email ou default_from em falta no estado") sys.path.insert(0, str(MODULE_ROOT)) - from lib.mailer import render_template, send_mail + from lib.mailer import render_template, send_mail # type: ignore body = render_template( "system_test", diff --git a/email/lib/mailer.py b/email/lib/mailer.py @@ -16,7 +16,7 @@ from email.utils import formataddr from pathlib import Path from typing import Mapping, Sequence -from .mailgun_client import ( +from .mailgun_client import ( # type: ignore MailgunHTTPError, build_mailgun_runtime_config, format_mailgun_failure, @@ -134,7 +134,7 @@ def send_mail( ) if isinstance(to_addrs, str): - recipients: list[str] = [to_addrs.strip()] + recipients = [to_addrs.strip()] else: recipients = [a.strip() for a in to_addrs if a and str(a).strip()] diff --git a/email/lib/mailgun_client.py b/email/lib/mailgun_client.py @@ -77,7 +77,7 @@ def mask_secret(value: str | None, *, visible_tail: int = 4) -> str: return "(vazio)" if len(s) <= visible_tail + 3: return "***" - return s[:3] + "…" + s[-visible_tail:] + return s[:3] + "…" + s[-visible_tail:] # type: ignore def validate_mailgun_inputs( @@ -260,7 +260,7 @@ def send_via_mailgun_api( return resp.getcode() or 200, raw except urllib.error.HTTPError as e: err_body = e.read().decode("utf-8", errors="replace") if e.fp else "" - snippet = err_body[:500].strip() + snippet = err_body[:500].strip() # type: ignore raise MailgunHTTPError( f"Mailgun HTTP {e.code}", status=e.code, @@ -283,9 +283,9 @@ def format_mailgun_failure(status: int, body_snippet: str) -> str: f"domínio na URL, e em Security/API a lista de IPs permitidos." ) if status == 400: - return f"{base}: pedido inválido — verifique domínio, From autorizado e campos obrigatórios. Resposta: {body_snippet[:200]}" + return f"{base}: pedido inválido — verifique domínio, From autorizado e campos obrigatórios. Resposta: {body_snippet[:200]}" # type: ignore if status == 404: - return f"{base}: domínio ou URL/região incorretos (confirme US vs EU e o domínio no painel Mailgun). Resposta: {body_snippet[:200]}" + return f"{base}: domínio ou URL/região incorretos (confirme US vs EU e o domínio no painel Mailgun). Resposta: {body_snippet[:200]}" # type: ignore if status >= 500: - return f"{base}: erro no serviço Mailgun. Tente mais tarde. Resposta: {body_snippet[:200]}" - return f"{base}: {body_snippet[:300]}" + return f"{base}: erro no serviço Mailgun. Tente mais tarde. Resposta: {body_snippet[:200]}" # type: ignore + return f"{base}: {body_snippet[:300]}" # type: ignore diff --git a/email/tests/test_mailgun_client.py b/email/tests/test_mailgun_client.py @@ -5,7 +5,7 @@ from __future__ import annotations import unittest -from lib.mailgun_client import ( +from lib.mailgun_client import ( # type: ignore MailgunConfigError, build_mailgun_messages_url, mailgun_base_url,