{% extends "base.html" %} {% import "assistants_panel.html" as ai %} {% import "variables_panel.html" as va %} {% import "secrets_panel.html" as se %} {% block title %}Administration{% endblock %} {% block content %}

Administration {{ accounts.len() }} accounts · {{ orgs.len() }} organisations · {{ repos }} repositories

{% if let Some(n) = notice %}

{{ n }}

{% endif %}

Accounts

{% for a in accounts %} {% endfor %}
UsernameEmailFlagsLast seen
{{ a.username }}{{ a.email }}{% if !a.email.is_empty() %} {% if a.email_verified %}✔{% else %}○{% endif %}{% endif %}{% if a.is_admin %}admin{% endif %}{% if a.banned %} banned{% endif %}{% if a.disabled %} disabled{% endif %}{% if a.totp_enabled() %} 2fa{% endif %} {% if a.last_seen_ms > 0 %}{% else %}never{% endif %}
{% if a.banned %}{% else %}{% endif %} {% if a.is_admin %}{% else %}{% endif %} {% if a.disabled %}{% else %}{% endif %} {% if !a.blocked() %}{% endif %}

Registration and invitations

{% if !invitations.is_empty() %}
    {% for (code, used, at) in invitations %}
  • {{ code }} {% if used.is_some() %}used{% else %}link{% endif %} · {{ at|ago_i }}
  • {% endfor %}
{% endif %}

Organisations

{% if orgs.is_empty() %}

None yet.

{% else %}{% endif %}

Sign in with

A first sign-in links the account with the same verified email, or makes an account when registration is open. Secrets are kept sealed.

{% for p in providers %}

{{ p.name }} {% if p.enabled && p.has_secret && !p.client_id.is_empty() %}on{% else %}off{% endif %}

{% if let Some(d) = p.default_base %}

Empty for {{ d }}; or a self-managed {{ p.name }}, like https://gitlab.example.org. Register the hub there as an application with the scopes openid profile email.

{% endif %}

Callback URL to register with {{ p.name }}: {{ p.callback }}

{% endfor %}

Mail

Resend sends through smtp.resend.com; the login is resend and the password your API key. Verify your domain in Resend first.

Amazon SES: the region your identity is verified in, and the SMTP credentials from SES › SMTP settings (not an AWS access key).

Mailgun: us or eu, and the domain's SMTP login and password.

{% 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: smtps://USER:PASSWORD@HOST:465 for TLS from the start, or smtp://USER:PASSWORD@HOST:587, which the hub sends with STARTTLS required (add ?tls=opportunistic or ?tls=none to say otherwise; a relay on this machine needs none).

Security contact

{% if security_contact.is_empty() %}No contact yet, so there is no security.txt.{% else %}Published at /.well-known/security.txt.{% endif %} Researchers look there (RFC 9116) for where to report a vulnerability in this hub. Its expiry date renews itself.

{% call va::panel("/admin", variables, shell.csrf, "Every repository's jobs get these, unless an organisation or repository sets the same name.") %} {% call se::panel("/admin", secrets, shell.csrf, "Every repository's jobs may use these, unless an organisation or repository sets the same name.") %} {% call ai::panel("/admin", assistants, shell.csrf, "Every repository on the site may ask these, unless an organisation or repository turns one off.") %}

Audit log

{% for r in audit %}{% endfor %}
WhenWhoActionTargetDetail
{{ r.actor }}{{ r.action }}{{ r.target }}{{ r.detail }}

newest{% if let Some(o) = audit_older %} older{% endif %}

{% endblock %}