OpenNIT

Quelltext des aktuellen Standes

Fassung 1.1.1

show.php

10 KB
<?php $this->layout('layouts/admin', [
    'page_title' => 'Audit-Eintrag #' . $entry['id'],
    'current_admin_page' => 'audit',
    'hide_page_title' => true,
]);

$hashFork   = $hash_fork ?? false;
$hashPreKey = $hash_pre_key ?? false;
$hashFormat = $hash_storage_format ?? false;
$recoveredCategory = $recovered_category ?? null;

// Anzeige-Label für Schweregrad (Spalte risk_level)
$riskLabels = ['low' => 'Niedrig', 'medium' => 'Mittel', 'high' => 'Hoch', 'critical' => 'Kritisch'];
$risk = (string)($entry['risk_level'] ?? 'low');

// JSON-Felder des Eintrags, sofern befüllt
$jsonSections = [
    'Details'    => $entry['details_json']   ?? null,
    'Vorher'     => $entry['old_value_json'] ?? null,
    'Nachher'    => $entry['new_value_json'] ?? null,
];
?>

<div class="audit-detail">
    <header class="detail-header">
        <div class="header-nav">
            <?php if ($prev_id): ?>
                <a href="/admin/audit/<?= (int)$prev_id ?>" class="btn btn-sm btn-secondary"><?= $this->te('&larr; Vorheriger') ?></a>
            <?php endif; ?>
            <a href="/admin/audit" class="btn btn-sm btn-secondary"><?= $this->te('Zur&uuml;ck zur &Uuml;bersicht') ?></a>
            <?php if ($next_id): ?>
                <a href="/admin/audit/<?= (int)$next_id ?>" class="btn btn-sm btn-secondary"><?= $this->te('N&auml;chster &rarr;') ?></a>
            <?php endif; ?>
        </div>

        <h1>
            <?= $this->t('Audit-Eintrag #') ?><?= (int)$entry['id'] ?>
            <?php if ($hashPreKey): ?>
                <span class="badge badge-secondary" title="<?= $this->te('Vor Einrichtung des Anwendungsschl&uuml;ssels geschrieben') ?>"><?= $this->te('Vor Schl&uuml;ssel-Einrichtung') ?></span>
            <?php elseif ($hashFormat): ?>
                <span class="badge badge-secondary" title="<?= $this->te('Detailfelder werden von der Datenbank umformatiert zur&uuml;ckgegeben') ?>"><?= $this->te('Speicherformat abweichend') ?></span>
            <?php elseif ($hashFork): ?>
                <span class="badge badge-warning" title="<?= $this->te('G&uuml;ltige Signatur, parallel geschriebener Eintrag') ?>"><?= $this->te('&#10003; Verifiziert (parallel geschrieben)') ?></span>
            <?php elseif ($hash_valid): ?>
                <span class="badge badge-success" title="<?= $this->te('Hash verifiziert') ?>"><?= $this->te('&#10003; Verifiziert') ?></span>
            <?php else: ?>
                <span class="badge badge-danger" title="<?= $this->te('Hash-Kette unterbrochen') ?>"><?= $this->te('&#9888; Integrit&auml;tsfehler') ?></span>
            <?php endif; ?>
        </h1>
    </header>

    <div class="detail-content">
        <div class="detail-grid">
            <section class="detail-section">
                <h2><?= $this->te('Allgemein') ?></h2>
                <dl class="detail-list">
                    <dt><?= $this->te('Zeitstempel') ?></dt>
                    <dd><?= $this->e(date('d.m.Y H:i:s', strtotime((string)$entry['event_timestamp']))) ?></dd>

                    <dt><?= $this->te('Ereignis-ID') ?></dt>
                    <dd><code class="hash"><?= $this->e($entry['event_id'] ?? '-') ?></code></dd>

                    <dt><?= $this->te('Benutzer') ?></dt>
                    <dd>
                        <?php if ($entry['user_id']): ?>
                            <a href="/admin/users/<?= (int)$entry['user_id'] ?>">
                                <?= $this->e($entry['display_name'] ?? 'Unbekannt') ?>
                            </a>
                            (<?= $this->e($entry['email'] ?? '') ?>)
                        <?php else: ?>
                            <span class="text-muted"><?= $this->te('System') ?></span>
                        <?php endif; ?>
                    </dd>

                    <dt><?= $this->te('Kategorie') ?></dt>
                    <dd>
                        <?php if ((string)$entry['action_category'] === '' && $recoveredCategory !== null): ?>
                            <span class="action-badge category-<?= $this->e($recoveredCategory) ?>">
                                <?= $this->e(ucfirst($recoveredCategory)) ?>
                            </span>
                            <span class="badge badge-secondary"
                                  title="<?= $this->te('Die Spalte ist leer gespeichert; der Wert wurde &uuml;ber die Signatur des Eintrags bestimmt') ?>"><?= $this->te('aus der Signatur bestimmt') ?></span>
                        <?php else: ?>
                            <span class="action-badge category-<?= $this->e($entry['action_category']) ?>">
                                <?= $this->e(ucfirst((string)$entry['action_category'])) ?>
                            </span>
                        <?php endif; ?>
                    </dd>

                    <dt><?= $this->te('Aktion') ?></dt>
                    <dd><?= $this->e($entry['action_type']) ?></dd>

                    <dt><?= $this->te('Status') ?></dt>
                    <dd>
                        <?php if (($entry['result'] ?? '') === 'success'): ?>
                            <span class="badge badge-success"><?= $this->te('Erfolgreich') ?></span>
                        <?php else: ?>
                            <span class="badge badge-danger"><?= $this->e(ucfirst((string)($entry['result'] ?? 'unbekannt'))) ?></span>
                        <?php endif; ?>
                    </dd>

                    <dt><?= $this->te('Schweregrad') ?></dt>
                    <dd>
                        <span class="severity-badge severity-<?= $this->e($risk) ?>">
                            <?= $this->e($riskLabels[$risk] ?? ucfirst($risk)) ?>
                        </span>
                    </dd>
                </dl>
            </section>

            <section class="detail-section">
                <h2><?= $this->te('Objekt') ?></h2>
                <dl class="detail-list">
                    <dt><?= $this->te('Typ') ?></dt>
                    <dd><?= $this->e($entry['object_type'] ?? '-') ?></dd>

                    <dt>ID</dt>
                    <dd><?= $this->e((string)($entry['object_id'] ?? '-')) ?></dd>

                    <dt><?= $this->te('Name') ?></dt>
                    <dd><?= $this->e($entry['object_name'] ?? '-') ?></dd>
                </dl>
            </section>

            <section class="detail-section">
                <h2><?= $this->te('Kontext') ?></h2>
                <dl class="detail-list">
                    <dt><?= $this->te('IP-Adresse') ?></dt>
                    <dd>
                        <code><?= $this->e($entry['ip_address'] ?? '-') ?></code>
                    </dd>

                    <dt><?= $this->te('User-Agent') ?></dt>
                    <dd class="user-agent">
                        <?= $this->e($entry['user_agent'] ?? '-') ?>
                    </dd>
                </dl>
            </section>
        </div>

        <?php foreach ($jsonSections as $label => $json): ?>
            <?php if (!empty($json)): ?>
                <section class="detail-section full-width">
                    <h2><?= $this->e($label) ?></h2>
                    <pre class="details-json"><?php
                        $decoded = json_decode((string)$json, true);
                        echo $this->e($decoded !== null
                            ? json_encode($decoded, JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES)
                            : (string)$json);
                    ?></pre>
                </section>
            <?php endif; ?>
        <?php endforeach; ?>

        <section class="detail-section full-width">
            <h2><?= $this->te('Integrit&auml;t') ?></h2>
            <dl class="detail-list">
                <dt><?= $this->te('Pr&uuml;fsumme (HMAC-SHA-256)') ?></dt>
                <dd>
                    <code class="hash"><?= $this->e($entry['checksum'] ?? '-') ?></code>
                    <?php if ($hashPreKey): ?>
                        <span class="badge badge-secondary"><?= $this->te('ohne Anwendungsschl&uuml;ssel signiert') ?></span>
                    <?php elseif ($hashFormat): ?>
                        <span class="badge badge-secondary"><?= $this->te('nicht nachrechenbar (Speicherformat)') ?></span>
                    <?php elseif ($hashFork): ?>
                        <span class="badge badge-warning"><?= $this->te('&#10003; G&uuml;ltig (parallel geschrieben)') ?></span>
                    <?php elseif ($hash_valid): ?>
                        <span class="badge badge-success"><?= $this->te('&#10003; Verifiziert') ?></span>
                    <?php else: ?>
                        <span class="badge badge-danger"><?= $this->te('&#9888; Ung&uuml;ltig') ?></span>
                    <?php endif; ?>
                </dd>
            </dl>
            <p class="hint">
                <?= $this->te('Die Pr&uuml;fsumme wird mit dem Anwendungsschl&uuml;ssel aus allen Feldern dieses Eintrags und der Pr&uuml;fsumme des Vorg&auml;ngers berechnet und bildet eine manipulationssichere Kette.') ?>
                <?php if ($hashPreKey): ?>
                    <?= $this->te('Dieser Eintrag entstand, bevor der Anwendungsschl&uuml;ssel auf dieser Installation eingerichtet wurde: Er ist ohne Schl&uuml;ssel signiert und mit dem heutigen Schl&uuml;ssel nicht mehr nachrechenbar &ndash; kein Manipulationsverdacht.') ?>
                <?php elseif ($hashFormat): ?>
                    <?= $this->te('Dieser Eintrag entstand, bevor die Pr&uuml;fsumme unabh&auml;ngig von der Speicher-Schreibweise gebildet wurde. Seine Detailfelder gibt die Datenbank umformatiert zur&uuml;ck &ndash; etwa mit anders sortierten Schl&uuml;sseln &ndash;, sodass der urspr&uuml;nglich signierte Text nicht mehr vorliegt. Der Inhalt ist unver&auml;ndert, ein Manipulationsverdacht besteht nicht.') ?>
                <?php elseif ($hashFork): ?>
                    <?= $this->te('Dieser Eintrag verweist auf einen wenige Positionen &auml;lteren Vorg&auml;nger &ndash; das entsteht, wenn zwei Vorg&auml;nge gleichzeitig protokollieren, und ist keine Ver&auml;nderung der Inhalte.') ?>
                <?php endif; ?>
            </p>
        </section>
    </div>
</div>