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

{% block page_title %}Host-Schluessel{% endblock %}
{% block page_sub %}
  {{ targets | length }} Ziele mit SSH-Zugang
  {%- if open_count %} &middot; {{ open_count }} ohne Freigabe{% endif %}
{% endblock %}

{% block topbar_extra %}{{ search_box('hostkey-table', 'Geraet, IP, Fingerprint ...') }}{% endblock %}

{% block content %}
{% if open_count %}
  {{ alert('Fuer ' ~ open_count ~ ' Ziel(e) ist noch kein Schluessel freigegeben. Wartung,
  Konsole und PoE-Neustart brechen dort mit "Schluessel unbekannt" ab -- absichtlich: ein
  Hintergrundauftrag darf keinen fremden Schluessel annehmen.', 'warning',
  'Freigaben offen') }}
{% else %}
  {{ alert('Fuer jedes Ziel mit SSH-Zugang liegt ein freigegebener Schluessel vor.',
  'success', 'Vollstaendig') }}
{% endif %}

{{ alert('Ein Schluessel wird in zwei Schritten uebernommen: erst auslesen, dann -- nach
Vergleich mit einer unabhaengigen Quelle -- freigeben. Gespeichert wird nach IP und Port;
aendert sich die Adresse eines Geraets, ist erneut freizugeben. Ein *geaenderter* Schluessel
wird nie stillschweigend uebernommen: das ist der Fall, der bei einem Angriff auftritt.',
'info', 'So funktioniert die Freigabe') }}

{% if probed_fingerprint %}
  <div class="alert alert--warning">
    {{ icon('alert', size=18) }}
    <div class="alert__body">
      <div class="alert__title">Gelesener Schluessel von {{ probed_host }}:{{ probed_port }}</div>
      <div class="mono fs-sm break-all">{{ probed_type }} {{ probed_fingerprint }}</div>
      <p class="fs-sm mt-2">
        Vergleichen Sie den Fingerprint mit einer unabhaengigen Quelle -- Konsolenzugang am
        Geraet, Inventardokumentation --, bevor Sie ihn unten freigeben.
      </p>
    </div>
  </div>
{% endif %}

<section class="card">
  <div class="card__header">
    <div class="flex-1">
      <div class="card__title">{{ icon('shield', size=17) }} Ziele</div>
      <div class="card__sub">Ohne Freigabe zuerst</div>
    </div>
  </div>
  <div class="table-wrap">
    <table class="table" id="hostkey-table" data-behavior="sortable">
      <thead>
        <tr>
          <th class="sortable">Ziel</th>
          <th class="sortable">Art</th>
          <th class="sortable">Adresse</th>
          <th class="sortable">Zustand</th>
          <th>Fingerprint</th>
          <th></th>
        </tr>
      </thead>
      <tbody>
        {% for row in targets %}
          {% set may_edit = current_user.has(edit_right[row.kind]) %}
          <tr data-filter-text="{{ row.label }} {{ row.host }} {{ row.kind }}
              {% for key in row.host_keys %}{{ key.fingerprint }} {{ key.key_type }}{% endfor %}">
            <td class="fw-600">
              <a href="{{ url_for(row.detail_endpoint, device_id=row.id) if row.kind == 'client'
                        else url_for(row.detail_endpoint, switch_id=row.id) }}">{{ row.label }}</a>
            </td>
            <td class="fs-sm">
              {% if row.kind == 'switch' %}{{ pill('Switch', 'info') }}
              {% else %}{{ pill('Client', '') }}{% endif %}
            </td>
            <td class="mono fs-sm nowrap">{{ row.host }}:{{ row.port }}</td>
            <td data-sort-value="{{ '1' if row.trusted else '0' }}">
              {% if row.trusted %}{{ pill('freigegeben', 'online') }}
              {% else %}{{ pill('offen', 'danger') }}{% endif %}
            </td>
            <td class="fs-xs mono break-all" style="max-width:420px">
              {% for key in row.host_keys %}
                <div>{{ key.key_type }} {{ key.fingerprint }}</div>
              {% else %}
                <span class="faint">&ndash;</span>
              {% endfor %}
            </td>
            <td class="nowrap">
              {% if may_edit %}
                <div class="row row--tight">
                  <form method="post" data-no-guard
                        action="{{ url_for('hostkeys.probe', kind=row.kind, target_id=row.id) }}">
                    <input type="hidden" name="{{ csrf_field_name }}" value="{{ csrf_token() }}">
                    <button class="btn btn--sm" type="submit" data-busy-label="Lese ...">
                      {{ icon('refresh', size=14) }} Auslesen
                    </button>
                  </form>
                  {% if probed_fingerprint and probed_host == row.host
                        and probed_port == row.port | string %}
                    <form method="post"
                          action="{{ url_for('hostkeys.trust', kind=row.kind, target_id=row.id) }}">
                      <input type="hidden" name="{{ csrf_field_name }}" value="{{ csrf_token() }}">
                      <input type="hidden" name="key_type" value="{{ probed_type }}">
                      <input type="hidden" name="fingerprint" value="{{ probed_fingerprint }}">
                      <button class="btn btn--sm btn--primary" type="submit"
                              data-confirm="Fingerprint {{ probed_fingerprint }} fuer {{ row.label }} dauerhaft als vertrauenswuerdig hinterlegen?"
                              data-confirm-title="Host-Schluessel freigeben"
                              data-confirm-ok="Freigeben" data-confirm-style="primary">
                        {{ icon('check', size=14) }} Freigeben
                      </button>
                    </form>
                  {% endif %}
                  {% if row.trusted %}
                    <form method="post" data-no-guard
                          action="{{ url_for('hostkeys.forget', kind=row.kind, target_id=row.id) }}">
                      <input type="hidden" name="{{ csrf_field_name }}" value="{{ csrf_token() }}">
                      <button class="btn btn--sm btn--ghost" type="submit"
                              data-confirm="Freigabe fuer {{ row.label }} entfernen? Wartung und Konsole verweigern danach die Verbindung, bis erneut freigegeben wurde."
                              data-confirm-title="Freigabe verwerfen" data-confirm-ok="Verwerfen">
                        Verwerfen
                      </button>
                    </form>
                  {% endif %}
                </div>
              {% else %}
                <span class="faint fs-xs">keine Berechtigung</span>
              {% endif %}
            </td>
          </tr>
        {% endfor %}
      </tbody>
    </table>
  </div>
  {% if not targets %}
    {{ empty_state('Keine Ziele', 'Legen Sie zuerst Clients oder Switche an.', 'shield') }}
  {% endif %}
</section>

{% if orphans %}
  <section class="card card--danger">
    <div class="card__header">
      <div class="flex-1">
        <div class="card__title">{{ icon('alert', size=17) }} Verwaiste Freigaben</div>
        <div class="card__sub">
          Zu diesen Eintraegen gibt es kein Ziel mehr -- geloescht oder mit neuer IP.
        </div>
      </div>
    </div>
    <div class="table-wrap">
      <table class="table table--compact">
        <thead><tr><th>Adresse</th><th>Typ</th><th>Fingerprint</th><th>Freigegeben</th><th></th></tr></thead>
        <tbody>
          {% for row in orphans %}
            <tr>
              <td class="mono fs-sm nowrap">{{ row.host }}:{{ row.port }}</td>
              <td class="fs-sm">{{ row.key_type }}</td>
              <td class="mono fs-xs break-all">{{ row.fingerprint }}</td>
              <td class="fs-sm">{{ row.added_at | dt }} <span class="faint">von {{ row.added_by }}</span></td>
              <td>
                {% if current_user.has('devices.edit') or current_user.has('switches.edit') %}
                  <form method="post" action="{{ url_for('hostkeys.forget_orphan') }}" data-no-guard>
                    <input type="hidden" name="{{ csrf_field_name }}" value="{{ csrf_token() }}">
                    <input type="hidden" name="host" value="{{ row.host }}">
                    <input type="hidden" name="port" value="{{ row.port }}">
                    <button class="btn btn--sm btn--ghost" type="submit"
                            data-confirm="Verwaiste Freigabe fuer {{ row.host }}:{{ row.port }} entfernen?"
                            data-confirm-title="Eintrag entfernen" data-confirm-ok="Entfernen">
                      Entfernen
                    </button>
                  </form>
                {% endif %}
              </td>
            </tr>
          {% endfor %}
        </tbody>
      </table>
    </div>
  </section>
{% endif %}
{% endblock %}
