aboutsummaryrefslogtreecommitdiffstats
path: root/packages/meshbay-hub/src/meshbay_hub/config.py
diff options
context:
space:
mode:
authorChristophe Besson <cbesson@gmail.com>2026-09-23 17:46:48 +0200
committerChristophe Besson <cbesson@gmail.com>2026-09-23 17:46:48 +0200
commit998f9c69308ee88fac36cfb77dfb6d07c6fa926a (patch)
tree445ba68e566e6672f8334103488d32ba2b52c5c5 /packages/meshbay-hub/src/meshbay_hub/config.py
parent5bce0acad6d10f9b952874f1359406b4eae3a8f9 (diff)
downloadmeshbay-998f9c69308ee88fac36cfb77dfb6d07c6fa926a.tar.gz
feat(hub): invitation-link tickets bound to a verified address
group_invite_links holds sha256(ticket) and the invitee's address blind index; redeeming grants membership to that account only. Owner-only create/list/cancel (a node token may create, never mail), 20 outstanding per group, optional mail written by the hub itself and capped at 10 per sender per day (mail.invite_link_daily_cap). MESHBAY_DESIGN.md §3.4 now carries the whole link design. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Diffstat (limited to 'packages/meshbay-hub/src/meshbay_hub/config.py')
-rw-r--r--packages/meshbay-hub/src/meshbay_hub/config.py7
1 files changed, 6 insertions, 1 deletions
diff --git a/packages/meshbay-hub/src/meshbay_hub/config.py b/packages/meshbay-hub/src/meshbay_hub/config.py
index f2212de..e618510 100644
--- a/packages/meshbay-hub/src/meshbay_hub/config.py
+++ b/packages/meshbay-hub/src/meshbay_hub/config.py
@@ -130,6 +130,11 @@ class MailConfig:
# recipient, and without the exemption a typo locks the account out for the
# whole window.
email_change_cooldown: int = 172800 # 48 hours
+ # Invitation-link mails one account may have the hub send per day. The only
+ # per-account bound here, because a link reaches addresses with no account,
+ # and the per-recipient cap alone would let one account mail ten strangers
+ # each, without end.
+ invite_link_daily_cap: int = 10
@dataclass
@@ -174,7 +179,7 @@ def load_config(path: Path | None = None) -> HubConfig:
"destination_cooldown_seconds", "destination_daily_cap",
"hourly_budget", "hourly_reserved_for_recovery",
"verification_resend_cooldown", "reset_cooldown",
- "email_change_cooldown",
+ "email_change_cooldown", "invite_link_daily_cap",
):
setattr(cfg.mail, name, ml.get(name, getattr(cfg.mail, name)))
if cap := raw.get("captcha", {}):