Files
tesm-license/apps/tesm-license/src/tesm_license/templates/license/settings_mail.html
T
alientimandClaude Opus 5 ab5fda658e Umlaute in der Oberflaeche, Sitzungskopplung, Statusanzeigen
Echte Umlaute in allen Texten der Oberflaeche und in den Markdown-Dateien.
Die Einbindung von Dateifreigaben haengt jetzt an der Sitzung: wird sie
widerrufen oder laeuft sie ab, verschwinden die Freigaben mit ihr. Neu
einstellbar ist die automatische Abmeldung bei Leerlauf (Vorgabe 30 Minuten).
Ein Geraet, das nicht antwortet, bietet nur noch "Einschalten (PoE)" an --
Neustart ueber SSH oder RPC braucht ein erreichbares Geraet. Der Zeitgeber der
naechsten Pruefung und die Restlaufzeit der Lizenz stehen jetzt oben in der
Kopfzeile; der doppelte Knopf darunter ist weg. Millisekunden werden ab einer
Sekunde als Sekunden und ab einer Minute als m:ss dargestellt.

Ausserdem: Release-Tarball nicht mehr im Repository -- er haengt am Release.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-02 23:54:35 +02:00

82 lines
3.7 KiB
HTML

{% extends "tesm_core/base.html" %}
{% from "tesm_core/macros.html" import field, checkbox, alert, pill %}
{% block page_title %}E-Mail-Versand{% endblock %}
{% block page_sub %}
Microsoft Graph (App-only) &middot;
{% if ready %}einsatzbereit{% else %}nicht vollständig konfiguriert{% endif %}
{% endblock %}
{% block topbar_extra %}
{% if current_user.has('settings_mail.execute') %}
<form method="post" action="{{ url_for('settings.mail_test') }}" data-no-guard>
<input type="hidden" name="{{ csrf_field_name }}" value="{{ csrf_token() }}">
<button class="btn btn--sm" type="submit" data-busy-label="Teste ...">
{{ icon('activity', size=15) }} Verbindung testen
</button>
</form>
{% endif %}
{% endblock %}
{% block content %}
{{ alert('Der Versand läuft über den Client-Credentials-Flow von Microsoft Graph -- kein SMTP,
kein zusätzliches Paket. Die Anwendung braucht in Azure die Anwendungsberechtigung
Mail.Send. Der Verbindungstest holt nur ein Token und verschickt
bewusst keine echte Nachricht.', 'info') }}
<div class="grid grid--split">
<section class="card">
<div class="card__header">
<div class="flex-1"><div class="card__title">{{ icon('mail', size=17) }} Zugang</div></div>
</div>
<form method="post" action="{{ url_for('settings.mail_save') }}">
<input type="hidden" name="{{ csrf_field_name }}" value="{{ csrf_token() }}">
<div class="card__body stack">
{{ checkbox('graph_enabled', 'E-Mail-Versand aktiv', checked=values.graph_enabled,
disabled=not current_user.has('settings_mail.edit')) }}
<div class="form-grid">
{{ field('graph_tenant_id', 'Verzeichnis-ID (Tenant)', value=values.graph_tenant_id,
disabled=not current_user.has('settings_mail.edit')) }}
{{ field('graph_client_id', 'Anwendungs-ID (Client)', value=values.graph_client_id,
disabled=not current_user.has('settings_mail.edit')) }}
{{ field('graph_sender', 'Absender-Postfach', value=values.graph_sender, type='email',
disabled=not current_user.has('settings_mail.edit')) }}
{{ field('graph_reply_to', 'Antwortadresse', value=values.graph_reply_to, type='email',
disabled=not current_user.has('settings_mail.edit')) }}
</div>
<fieldset class="fieldset">
<legend>Client-Secret {% if has_secret %}{{ pill('gesetzt', 'online') }}{% else %}{{ pill('fehlt', 'warning') }}{% endif %}</legend>
{{ field('client_secret', 'Neues Secret (leer = unverändert)', type='password',
autocomplete='new-password', disabled=not can_secrets) }}
{% if not can_secrets %}
<p class="fs-xs faint mt-2">
Zum Setzen des Secrets fehlt Ihnen das Recht &bdquo;Geheimnisse&ldquo;.
</p>
{% endif %}
</fieldset>
</div>
{% if current_user.has('settings_mail.edit') %}
<div class="card__footer"><button class="btn btn--primary" type="submit">Speichern</button></div>
{% endif %}
</form>
</section>
<section class="card">
<div class="card__header">
<div class="flex-1"><div class="card__title">{{ icon('info', size=17) }} Wofür der Versand genutzt wird</div></div>
</div>
<div class="card__body">
<ul class="stack stack--tight fs-sm muted">
<li>Lizenzdatei an den Kunden senden (mit Anhang).</li>
<li>Zugangslink für das Kundenportal.</li>
</ul>
<div class="divider"></div>
<p class="fs-sm muted">
Das Secret liegt AES-256-GCM-verschlüsselt in der Datenbank, gebunden an seinen
Verwendungszweck. Ohne die Schlüsseldatei dieser Installation ist es nicht lesbar.
</p>
</div>
</section>
</div>
{% endblock %}