Pending invite tokens are valid indefinitely (src/Auth/InviteRepository.php); there is no expiry. Token entropy is fine (wp_generate_password(32)), so this is about limiting the window of a leaked/forwarded link.
Fix
Add a TTL (e.g. 7–14 days): store/compare against created_at when resolving a token in findByToken/registration, and treat expired pending invites as invalid. Surface expiry state on the admin invites page.
**Severity: Low** — hardening.
## Problem
Pending invite tokens are valid indefinitely ([src/Auth/InviteRepository.php](src/Auth/InviteRepository.php)); there is no expiry. Token entropy is fine (`wp_generate_password(32)`), so this is about limiting the window of a leaked/forwarded link.
## Fix
Add a TTL (e.g. 7–14 days): store/compare against `created_at` when resolving a token in `findByToken`/registration, and treat expired pending invites as invalid. Surface expiry state on the admin invites page.
Verified resolved on main (061d09e, PR #38): Invite::EXPIRY_DAYS = 14 — isAcceptable() (pending + not expired) is enforced both when rendering the registration form and again on submit, and the admin Invites page badges expired invites. Further hardened by #41 / PR #43, which stores only the SHA-256 hash of the token at rest. Re-confirmed during the 2026-06-10 security review pass.
Verified resolved on main (061d09e, PR #38): Invite::EXPIRY_DAYS = 14 — isAcceptable() (pending + not expired) is enforced both when rendering the registration form and again on submit, and the admin Invites page badges expired invites. Further hardened by #41 / PR #43, which stores only the SHA-256 hash of the token at rest. Re-confirmed during the 2026-06-10 security review pass.
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.
Severity: Low — hardening.
Problem
Pending invite tokens are valid indefinitely (src/Auth/InviteRepository.php); there is no expiry. Token entropy is fine (
wp_generate_password(32)), so this is about limiting the window of a leaked/forwarded link.Fix
Add a TTL (e.g. 7–14 days): store/compare against
created_atwhen resolving a token infindByToken/registration, and treat expired pending invites as invalid. Surface expiry state on the admin invites page.Verified resolved on main (
061d09e, PR #38): Invite::EXPIRY_DAYS = 14 — isAcceptable() (pending + not expired) is enforced both when rendering the registration form and again on submit, and the admin Invites page badges expired invites. Further hardened by #41 / PR #43, which stores only the SHA-256 hash of the token at rest. Re-confirmed during the 2026-06-10 security review pass.