<labelclass="small">Deleting removes the account, its tokens, keys and memberships for good; what it wrote stays under its name, which stays retired. Type <strong>{{ a.username }}</strong> to confirm:
<selectid="regmode"name="mode">{% for m in ["open", "invite", "closed"] %}<optionvalue="{{ m }}"{% ifmode.as_str() == *m %} selected{% endif %}>{{ m }}</option>{% endfor %}</select>
{% if !invitations.is_empty() %}<ulclass="plain small">{% for (code, used, at) in invitations %}<li><code>{{ code }}</code> {% if used.is_some() %}<spanclass="mute">used</span>{% else %}<ahref="/register?invite={{ code }}">link</a>{% endif %} · {{ at|ago_i }}</li>{% endfor %}</ul>{% endif %}
55
</section>
56
<sectionclass="panel"id="organisations">
57
<h2>Organisations</h2>
58
{% if orgs.is_empty() %}<pclass="mute small">None yet.</p>{% else %}<ulclass="plain">{% for o in orgs %}<li><imgclass="avatar xs"src="/avatar/{{ o.name }}"alt=""><ahref="/{{ o.name }}">{{ o.name }}</a> · <aclass="small"href="/orgs/{{ o.name }}/settings">settings</a></li>{% endfor %}</ul>{% endif %}
59
</section>
60
<sectionclass="panel"id="signin">
61
<h2>Sign in with</h2>
62
<pclass="small mute">A first sign-in links the account with the same verified email, or makes an account when registration is open. Secrets are kept sealed.</p>
{% if let Some(d) = p.default_base %}<labelfor="base-{{ p.id }}">{{ p.name }} address</label><inputtype="url"id="base-{{ p.id }}"name="base"value="{{ p.base }}"placeholder="{{ d }}"autocomplete="off">
70
<pclass="small mute">Empty for {{ d }}; or a self-managed {{ p.name }}, like https://gitlab.example.org. Register the hub there as an application with the scopes <code>openid profile email</code>.</p>{% endif %}
<selectid="mailservice"name="service"data-mail-service>{% for (v, label) in mail_services() %}<optionvalue="{{ v }}"{% ifmail.service== *v %} selected{% endif %}>{{ label }}</option>{% endfor %}</select>
83
<pclass="small mute"data-for="resend">Resend sends through <code>smtp.resend.com</code>; the login is <code>resend</code> and the password your API key. Verify your domain in Resend first.</p>
84
<pclass="small mute"data-for="ses">Amazon SES: the region your identity is verified in, and the SMTP credentials from SES › SMTP settings (not an AWS access key).</p>
85
<pclass="small mute"data-for="mailgun">Mailgun: <code>us</code> or <code>eu</code>, and the domain's SMTP login and password.</p>
86
<divdata-for="ses mailgun"><labelfor="mailregion">Region</label><inputtype="text"id="mailregion"name="region"value="{{ mail.region }}"placeholder="eu-west-2 for SES; us or eu for Mailgun"></div>
<labelfor="mailsecurity">Security</label><selectid="mailsecurity"name="security"><optionvalue="starttls"{% ifmail.security== "starttls" %} selected{% endif %}>STARTTLS (usually port 587)</option><optionvalue="tls"{% ifmail.security== "tls" %} selected{% endif %}>TLS from the start (usually port 465)</option><optionvalue="none"{% ifmail.security== "none" %} selected{% endif %}>None (a relay on this machine)</option></select></div>
<divdata-for="resend ses mailgun smtp"><labelfor="mailsecret">{% if mail.service == "resend" %}API key{% else %}Password or API key{% endif %}</label><inputtype="password"id="mailsecret"name="secret"value=""autocomplete="new-password"placeholder="{% if mail.has_secret %}saved: leave empty to keep it{% else %}{% endif %}"></div>
<pclass="small mute">{% if mail_enabled %}Mail is on: verification and reset links go by email.{% else %}Mail is off: verification and reset links are issued by hand.{% endif %} Off turns it off. Passwords and keys stay on the server and are never shown again. Every service is SMTP underneath, so any provider works: <code>smtps://USER:PASSWORD@HOST:465</code> for TLS from the start, or <code>smtp://USER:PASSWORD@HOST:587</code>, which the hub sends with STARTTLS required (add <code>?tls=opportunistic</code> or <code>?tls=none</code> to say otherwise; a relay on this machine needs none).</p>
<labelfor="secemail">Reporting address, shown on <ahref="/security-contact">/security-contact</a></label><inputtype="email"id="secemail"name="email"value="{{ security_email }}"placeholder="[email protected]"autocomplete="off">
106
<labelfor="secpage">That page's text (Markdown; empty for the text below)</label><textareaid="secpage"name="page"rows="8"placeholder="{{ security_default }}">{{ security_page }}</textarea>
<pclass="small mute">{% if security_contact.is_empty() %}No contact yet, so there is no <code>security.txt</code>.{% else %}Published at <ahref="/.well-known/security.txt">/.well-known/security.txt</a>.{% endif %} Researchers look there (RFC 9116) for where to report a vulnerability in this hub. Its expiry date renews itself.</p>
{% call ai::panel("/admin", assistants, shell.csrf, "Every repository on the site may ask these, unless an organisation or repository turns one off.") %}
{% for r in audit %}<tr><td><timetitle="{{ r.at_ms|when_i }}">{{ r.at_ms|ago_i }}</time></td><td>{{ r.actor }}</td><td><code>{{ r.action }}</code></td><td>{{ r.target }}</td><tdclass="mute">{{ r.detail }}</td></tr>{% endfor %}
118
</table></div>
119
<pclass="pager small"><ahref="/admin#audit">newest</a>{% if let Some(o) = audit_older %} <aclass="go small"href="/admin?audit_before={{ o }}#audit">older</a>{% endif %}</p>