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

{% block page_title %}Verzeichnisdienst{% endblock %}
{% block page_sub %}
  LDAP / Active Directory &middot;
  {% if values.ldap_enabled %}aktiv{% else %}nicht aktiv{% endif %}
{% endblock %}

{% block content %}
{% if license_hint %}{{ alert(license_hint, 'warning') }}{% endif %}

{{ alert('Same Sign-On, nicht Single Sign-On: der Benutzer tippt sein Verzeichnispasswort auf der
normalen Anmeldeseite ein. Es wird bei jeder Anmeldung live gegen das Verzeichnis geprueft und
niemals hier gespeichert.', 'info') }}

{% if values.ldap_security == 'none' %}
  {{ alert('Die Verbindung ist unverschluesselt. Das Passwort geht dabei im Klartext ueber das
  Netz -- nur fuer Testumgebungen vertretbar.', 'danger', 'Unverschluesselt') }}
{% elif not values.ldap_verify_cert %}
  {{ alert('Das Serverzertifikat wird nicht geprueft. Damit schuetzt die Verschluesselung nur
  gegen passives Mitlesen, nicht gegen einen Man-in-the-Middle.', 'warning',
  'Zertifikat ungeprueft') }}
{% endif %}

<div class="grid grid--split">
  <section class="card">
    <div class="card__header">
      <div class="flex-1"><div class="card__title">{{ icon('users', size=17) }} Verbindung</div></div>
      {% if current_user.has('settings_directory.execute') %}
        <form method="post" action="{{ url_for('hostsettings.directory_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=14) }} Verbindung testen
          </button>
        </form>
      {% endif %}
    </div>
    <form method="post" action="{{ url_for('hostsettings.directory_save') }}">
      <input type="hidden" name="{{ csrf_field_name }}" value="{{ csrf_token() }}">
      <div class="card__body stack">
        {{ checkbox('ldap_enabled', 'Verzeichnisanmeldung aktiv', checked=values.ldap_enabled,
                    disabled=bool(license_hint)) }}
        <div class="form-grid">
          {{ field('ldap_host', 'Server', value=values.ldap_host, disabled=bool(license_hint),
                   placeholder='dc01.firma.local') }}
          {{ field('ldap_port', 'Port', value=values.ldap_port, type='number',
                   disabled=bool(license_hint), attrs='id="ldap-port"') }}
          {# Der Transport setzt den Port mit. Wer umstellt und den Port stehen
             laesst, bekommt eine Verbindung, die auf gut Glueck scheitert --
             und die Meldung ("Zeitlimit") sagt nichts ueber die Ursache. Ein
             absichtlich abweichender Port bleibt erhalten. #}
          {{ select_field('ldap_security', 'Transport', specs['ldap_security'].choices,
                          selected=values.ldap_security, disabled=bool(license_hint),
                          attrs='data-behavior="transport-port" data-port-target="#ldap-port"') }}
          {{ field('ldap_timeout', 'Zeitlimit (s)', value=values.ldap_timeout, type='number',
                   disabled=bool(license_hint)) }}
          {{ field('ldap_ca_file', 'CA-Zertifikat (Pfad)', value=values.ldap_ca_file,
                   disabled=bool(license_hint), extra_class='field--full',
                   hint_text='Leer = Systemvertrauensspeicher.') }}
          {{ field('ldap_base_dn', 'Basis-DN', value=values.ldap_base_dn,
                   disabled=bool(license_hint), extra_class='field--full',
                   hint_text='Leer = automatisch per RootDSE ermitteln.') }}
          {{ field('ldap_user_attribute', 'Anmeldeattribut', value=values.ldap_user_attribute,
                   disabled=bool(license_hint)) }}
          {{ field('ldap_email_attribute', 'E-Mail-Attribut', value=values.ldap_email_attribute,
                   disabled=bool(license_hint)) }}
        </div>
        <div class="stack stack--tight">
          {{ checkbox('ldap_verify_cert', 'Serverzertifikat pruefen', checked=values.ldap_verify_cert,
                      disabled=bool(license_hint)) }}
          {{ checkbox('ldap_group_sync', 'Gruppen aus dem Verzeichnis uebernehmen',
                      checked=values.ldap_group_sync, disabled=bool(license_hint)) }}
          {{ checkbox('ldap_allow_insecure', 'Unverschluesselte Verbindung ausdruecklich erlauben',
                      checked=values.ldap_allow_insecure, disabled=bool(license_hint),
                      hint_text=specs['ldap_allow_insecure'].hint) }}
        </div>

        <fieldset class="fieldset">
          <legend>Dienstkonto fuer die Suche (nur Lesezugriff noetig)</legend>
          <div class="form-grid">
            {{ field('bind_username', 'Benutzer', value=bind_username, autocomplete='off',
                     disabled=not current_user.has('settings_directory.secrets')) }}
            {{ field('bind_password', 'Passwort (leer = unveraendert)', type='password',
                     autocomplete='new-password',
                     disabled=not current_user.has('settings_directory.secrets')) }}
          </div>
          {% if not current_user.has('settings_directory.secrets') %}
            <p class="fs-xs faint mt-2">
              Zum Setzen des Bind-Passworts fehlt Ihnen das Recht &bdquo;Geheimnisse&ldquo;.
            </p>
          {% endif %}
        </fieldset>
      </div>
      <div class="card__footer">
        <button class="btn btn--primary" type="submit" {% if license_hint %}disabled{% endif %}>
          Speichern
        </button>
      </div>
    </form>
  </section>

  <section class="card">
    <div class="card__header">
      <div class="flex-1">
        <div class="card__title">{{ icon('shield-users', size=17) }} Gruppen-Zuordnung</div>
        <div class="card__sub">
          Verzeichnisgruppe &rarr; Gruppe in dieser Anwendung, bei jeder Anmeldung neu ausgewertet
        </div>
      </div>
    </div>
    {% if mappings %}
      <div class="table-wrap">
        <table class="table table--compact">
          <thead><tr><th>Verzeichnisgruppe</th><th>Gruppe hier</th><th class="actions"></th></tr></thead>
          <tbody>
            {% for entry in mappings %}
              <tr>
                <td class="fs-sm">{{ entry.ad_group_name }}
                  <div class="fs-xs faint break-all">{{ entry.ad_group_dn }}</div></td>
                <td>{{ pill(entry.group_name or 'unbekannt', 'accent') }}</td>
                <td class="actions">
                  <form method="post" data-no-guard
                        action="{{ url_for('hostsettings.directory_mapping_delete', mapping_id=entry.id) }}">
                    <input type="hidden" name="{{ csrf_field_name }}" value="{{ csrf_token() }}">
                    <button class="btn btn--sm btn--ghost danger-text" type="submit"
                            data-confirm="Zuordnung entfernen? Betroffene Benutzer verlieren die Gruppe bei der naechsten Anmeldung."
                            data-confirm-title="Zuordnung entfernen" data-confirm-ok="Entfernen">
                      {{ icon('trash', size=14) }}</button>
                  </form>
                </td>
              </tr>
            {% endfor %}
          </tbody>
        </table>
      </div>
    {% else %}
      {{ empty_state('Keine Zuordnungen',
         'Ohne Zuordnung erhalten Verzeichniskonten nur die Standardgruppe.', 'shield-users') }}
    {% endif %}

    {% if current_user.has('settings_directory.edit') %}
      <form method="post" action="{{ url_for('hostsettings.directory_mapping_add') }}">
        <input type="hidden" name="{{ csrf_field_name }}" value="{{ csrf_token() }}">
        <div class="card__body">
          <div class="form-grid">
            {{ group_picker('ad_group_name', 'ad_group_dn', 'mapping', required=True) }}
            {# Ohne Ziel ist die Zuordnung sinnlos -- deshalb Pflichtfeld. #}
            <label class="field">
              <span class="field__label">
                Gruppe in dieser Anwendung<span class="req" aria-hidden="true">*</span>
              </span>
              <select class="select" name="app_group_id" required>
                {% for group in groups %}
                  <option value="{{ group.id }}">{{ group.name }}</option>
                {% endfor %}
              </select>
            </label>
          </div>
        </div>
        <div class="card__footer"><button class="btn" type="submit">Zuordnung speichern</button></div>
      </form>
    {% endif %}
  </section>
</div>
{% endblock %}
