intent/templates/orgs/invite.html
Alec Perkins 99f810d043 Harden auth, invites and deployment after security review
- Signed-out visitors get the same login redirect for missing and
  private projects, so the redirect no longer reveals private ones.
- Production refuses the console email backend; sign-in codes must
  never reach the logs.
- Database cache shared by all workers for allauth rate limits; invite
  sending throttled per sender and per recipient.
- Email invite links are claimed on first use and the token rotated,
  so a token copied from request logs is worthless.
- allauth password URLs removed; adding an email requires a fresh code
  and notifies existing addresses.
- Markdown drops remote images until uploads exist.
- Project and org slugs lowercased; only superusers can grant staff
  status or permissions in the admin.
- Container runs as a non-root user; CI actions pinned to commits.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-10-27 08:42:19 -04:00

20 lines
832 B
HTML

{% extends "base.html" %}
{% block title %}Invitation to {{ invite.org.name }} · Intent{% endblock %}
{% block content %}
<h1>Join {{ invite.org.name }}</h1>
{% if invite.is_open %}
<p>
{% if invite.invited_by %}{{ invite.invited_by.username }} invited you{% else %}You're invited{% endif %}
to join as {{ invite.get_role_display|lower }}. You'll join as <strong>{{ user.username }}</strong>.
</p>
<form method="post" action="{% url 'invites:respond' invite_id=invite.pk %}">
{% csrf_token %}
<button type="submit" name="action" value="accept">Accept</button>
<button type="submit" name="action" value="decline">Decline</button>
</form>
{% else %}
<p>This invitation is no longer valid. Ask an owner of {{ invite.org.name }} for a new one.</p>
{% endif %}
{% endblock %}