{% extends "tesm_core/base.html" %}
{% from "tesm_core/macros.html" import field, checkbox, alert, pill %}

{% block page_title %}Webserver und TLS{% endblock %}
{% block page_sub %}
  {{ config.domain or 'ohne Domain' }} &middot;
  {% if config.https_enabled %}HTTPS aktiv{% else %}nur HTTP{% endif %}
{% endblock %}

{% block content %}
{% if license_hint %}{{ alert(license_hint, 'warning') }}{% endif %}
{% if not sysops_available %}
  {{ alert('Systemhelfer nicht verfuegbar -- die Konfiguration kann hier erzeugt und angesehen,
  aber nicht angewandt werden.', 'info') }}
{% endif %}

{{ alert('Die Site-Datei wird bei jeder Uebernahme vollstaendig neu geschrieben.
Alles, was ein Administrator sonst per Hand hineinschreiben wuerde, ist hier Einstellung. Der
Vorgaenger schrieb die Datei nur, wenn sie noch nicht existierte -- ein einmal falscher Pfad
blieb dadurch ueber Jahre bestehen und lieferte alle statischen Dateien als 404.', 'info',
'Warum die Datei immer neu geschrieben wird') }}

<div class="grid grid--split">
  <div class="stack">
    <section class="card">
      <div class="card__header">
        <div class="flex-1"><div class="card__title">{{ icon('server', size=17) }} Einstellungen</div></div>
      </div>
      <form method="post" action="{{ url_for('hostsettings.web_save') }}">
        <input type="hidden" name="{{ csrf_field_name }}" value="{{ csrf_token() }}">
        <div class="card__body stack">
          <div class="form-grid">
            {{ field('web_domain', 'Domain', value=config.domain,
                     placeholder='tesm.firma.de', disabled=bool(license_hint),
                     hint_text='Leer = Zugriff ueber IP-Adresse.') }}
            {{ field('web_acme_email', 'E-Mail fuer Let\'s Encrypt', value=acme_email, type='email',
                     disabled=bool(license_hint)) }}
            {{ field('web_cert_path', 'Zertifikat (Pfad)', value=config.cert_path,
                     disabled=bool(license_hint), extra_class='field--full') }}
            {{ field('web_key_path', 'Privater Schluessel (Pfad)', value=config.key_path,
                     disabled=bool(license_hint), extra_class='field--full') }}
            {{ field('web_acme_webroot', 'ACME-Webroot', value=config.acme_webroot,
                     disabled=bool(license_hint), extra_class='field--full') }}
          </div>
          <div class="stack stack--tight">
            {{ checkbox('web_https_enabled', 'HTTPS auf Port 443 anbieten',
                        checked=config.https_enabled, disabled=bool(license_hint)) }}
            {{ checkbox('web_redirect_http', 'HTTP (Port 80) auf HTTPS umleiten',
                        checked=config.redirect_http, disabled=bool(license_hint),
                        hint_text='Der ACME-Pfad bleibt dabei erreichbar -- sonst koennte Let\'s
                        Encrypt nie erneuern.') }}
            {{ checkbox('web_hsts_enabled', 'HSTS-Header senden',
                        checked=config.hsts_enabled, disabled=bool(license_hint),
                        hint_text='Nur mit funktionierendem HTTPS aktivieren: Browser merken sich
                        die Vorgabe und verweigern danach jeden HTTP-Zugriff.') }}
          </div>
        </div>
        <div class="card__footer">
          <button class="btn btn--primary" type="submit" {% if license_hint %}disabled{% endif %}>
            Speichern
          </button>
        </div>
      </form>
    </section>

    <details class="card" data-persist="nginx-preview">
      <summary class="card__header" style="cursor:pointer">
        <div class="flex-1">
          <div class="card__title">{{ icon('file-text', size=17) }} Erzeugte nginx-Konfiguration</div>
          <div class="card__sub">Vorschau der Datei, die geschrieben wuerde</div>
        </div>
        {{ icon('chevron-down', size=16) }}
      </summary>
      <pre class="log-view">{{ preview }}</pre>
    </details>
  </div>

  <div class="stack">
    <section class="card">
      <div class="card__header">
        <div class="flex-1">
          <div class="card__title">{{ icon('shield', size=17) }} Zertifikat</div>
          <div class="card__sub">
            {% if certificate.present %}vorhanden{% else %}nicht vorhanden{% endif %}
          </div>
        </div>
      </div>
      <div class="card__body stack">
        {% if certificate.present and not certificate.get('error') %}
          <dl class="kv fs-sm">
            <dt>Inhaber</dt><dd class="break-all">{{ certificate.subject }}</dd>
            <dt>Aussteller</dt><dd class="break-all">{{ certificate.issuer }}</dd>
            <dt>Gueltig bis</dt><dd>{{ certificate.not_valid_after | dt }}</dd>
            <dt>Seriennummer</dt><dd class="mono fs-xs break-all">{{ certificate.serial }}</dd>
          </dl>
        {% elif certificate.get('error') %}
          {{ alert('Zertifikat nicht lesbar: ' ~ certificate.error, 'danger') }}
        {% else %}
          <p class="muted fs-sm">
            Fordern Sie ein Zertifikat per Let's Encrypt an oder hinterlegen Sie eigene Pfade.
          </p>
        {% endif %}

        {% if current_user.has('settings_web.execute') %}
          <form method="post" action="{{ url_for('hostsettings.web_certificate') }}" data-no-guard>
            <input type="hidden" name="{{ csrf_field_name }}" value="{{ csrf_token() }}">
            <button class="btn btn--sm" type="submit"
                    {% if license_hint or not certbot_available or not config.domain %}disabled{% endif %}
                    data-busy-label="Fordere an ..."
                    data-confirm="Zertifikat fuer {{ config.domain }} per Let's Encrypt anfordern? Die Domain muss oeffentlich auf diesen Host zeigen."
                    data-confirm-title="Zertifikat anfordern" data-confirm-ok="Anfordern"
                    data-confirm-style="primary">
              {{ icon('lock', size=14) }} Let's-Encrypt-Zertifikat anfordern
            </button>
          </form>
          {% if not certbot_available %}
            <p class="fs-xs faint">certbot ist auf diesem Host nicht installiert.</p>
          {% elif not config.domain %}
            <p class="fs-xs faint">
              Fuer Let's Encrypt wird oben eine Domain gebraucht, die oeffentlich auf
              diesen Host zeigt.
            </p>
          {% endif %}

          <hr>
          <p class="muted fs-sm">
            Kein oeffentlicher Name? Dann ein eigenes Zertifikat erzeugen. Browser
            zeigen dafuer eine Warnung, die Verbindung ist aber verschluesselt --
            und das Sitzungscookie darf endlich <span class="mono">Secure</span> tragen.
          </p>
          {% if local_names %}
            <p class="fs-xs faint">
              Wird ausgestellt auf:
              <span class="mono">{{ (config.domain or local_names[0]) }}</span>
              {% if local_names|length > 1 %}
                (zusaetzlich {{ local_names[1:] | join(', ') }})
              {% endif %}
            </p>
          {% endif %}
          <form method="post" action="{{ url_for('hostsettings.web_self_signed') }}" data-no-guard>
            <input type="hidden" name="{{ csrf_field_name }}" value="{{ csrf_token() }}">
            <button class="btn btn--sm" type="submit"
                    {% if license_hint or not sysops_available %}disabled{% endif %}
                    data-busy-label="Erzeuge ..."
                    data-confirm="Ein selbstsigniertes Zertifikat erzeugen und HTTPS aktivieren? Ein bereits vorhandenes selbstsigniertes Zertifikat dieser Installation wird ersetzt."
                    data-confirm-title="Selbstsigniertes Zertifikat"
                    data-confirm-ok="Erzeugen" data-confirm-style="primary">
              {{ icon('shield', size=14) }} Selbstsigniertes Zertifikat erzeugen
            </button>
          </form>
        {% endif %}
      </div>
    </section>

    {% if current_user.has('settings_web.execute') %}
      <section class="card card--accent">
        <div class="card__header">
          <div class="flex-1">
            <div class="card__title">{{ icon('upload', size=17) }} Uebernehmen</div>
            <div class="card__sub">Schreiben, <span class="mono">nginx -t</span>, dann neu laden</div>
          </div>
        </div>
        <div class="card__body">
          <form method="post" action="{{ url_for('hostsettings.web_apply') }}" data-no-guard>
            <input type="hidden" name="{{ csrf_field_name }}" value="{{ csrf_token() }}">
            <button class="btn btn--primary btn--block" type="submit"
                    {% if license_hint or not sysops_available %}disabled{% endif %}
                    data-busy-label="Uebernehme ..."
                    data-confirm="Konfiguration schreiben, pruefen und nginx neu laden? Eine fehlerhafte Konfiguration wird vorher abgewiesen."
                    data-confirm-title="nginx uebernehmen" data-confirm-ok="Uebernehmen"
                    data-confirm-style="primary">
              Konfiguration uebernehmen
            </button>
          </form>
        </div>
      </section>
    {% endif %}
  </div>
</div>
{% endblock %}
