Commit e7df6a3d authored by Arnolds's avatar Arnolds
Browse files

Introduced meta.php: implemented metadata retrieval and status display logic for secrets.

parent 23a1e8c6
Loading
Loading
Loading
Loading

meta.php

0 → 100644
+210 −0
Original line number Diff line number Diff line
<?php
header('X-Robots-Tag: noindex, nofollow');

error_reporting(E_ALL);
ini_set('display_errors', 1);

require 'vendor/autoload.php';

use Dotenv\Dotenv;
use MongoDB\Client;
use MongoDB\BSON\UTCDateTime;

$dotenv = Dotenv::createImmutable(__DIR__);
$dotenv->load();

$mongoUser   = $_ENV['MONGO_USER'];
$mongoPass   = $_ENV['MONGO_PASS'];
$mongoAuthDb = $_ENV['MONGO_AUTHDB'];
$mongoHost   = $_ENV['MONGO_HOST'];
$mongoPort   = $_ENV['MONGO_PORT'];

$dsn = "mongodb://$mongoUser:$mongoPass@$mongoHost:$mongoPort/?authSource=$mongoAuthDb";
$mongo = new Client($dsn);

$db = $mongo->secretdb;
$collection = $db->secrets;

function utcToIso(?UTCDateTime $dt): ?string {
    if (!$dt) return null;
    // Mongo UTCDateTime -> DateTimeImmutable
    $d = $dt->toDateTime();
    $d = DateTimeImmutable::createFromMutable($d)->setTimezone(new DateTimeZone('UTC'));
    return $d->format('Y-m-d H:i:s') . ' UTC';
}

function nowUtc(): DateTimeImmutable {
    return new DateTimeImmutable('now', new DateTimeZone('UTC'));
}

$metaId = $_GET['id'] ?? '';
$metaId = is_string($metaId) ? trim($metaId) : '';
$doc = null;

if ($metaId !== '') {
    $doc = $collection->findOne(
        ['metaDataId' => $metaId],
        [
            'projection' => [
                '_id' => 1,
                'createdAt' => 1,
                'expiresAt' => 1,
                'deleted' => 1,
                'displayedAt' => 1,
                'firstRetrievedAt' => 1,
                'lastRetrievedAt' => 1,
                'retrievedCount' => 1,
                // apzināti NEliekam: secret, displayToken, encrypted
            ]
        ]
    );
}

$found = (bool)$doc;

$statusTitle = 'Nav datu';
$statusBadge = 'secondary';
$statusText  = 'Šāds meta ID netika atrasts (vai ieraksts jau sen ir prom).';

$now = nowUtc();
$expiresAtIso = $found ? utcToIso($doc['expiresAt'] ?? null) : null;

$expired = false;
if ($found && isset($doc['expiresAt']) && $doc['expiresAt'] instanceof UTCDateTime) {
    $exp = DateTimeImmutable::createFromMutable($doc['expiresAt']->toDateTime())->setTimezone(new DateTimeZone('UTC'));
    $expired = $exp < $now;
}

$deleted = $found ? !empty($doc['deleted']) : false;

if ($found) {
    if ($deleted) {
        $statusTitle = 'Noslēpums izdzēsts';
        $statusBadge = 'success';
        $statusText  = 'Noslēpums ir ticis parādīts (vai citādi atzīmēts kā izdzēsts) un serverī vairs neglabājas.';
    } else if ($expired) {
        $statusTitle = 'Termiņš beidzies';
        $statusBadge = 'warning';
        $statusText  = 'Noslēpuma glabāšanas termiņš ir beidzies (TTL).';
    } else {
        $statusTitle = 'Aktīvs';
        $statusBadge = 'primary';
        $statusText  = 'Noslēpums vēl ir derīgs un nav atzīmēts kā izdzēsts.';
    }
}

$createdAtIso       = $found ? utcToIso($doc['createdAt'] ?? null) : null;
$displayedAtIso     = $found ? utcToIso($doc['displayedAt'] ?? null) : null;
$firstRetrievedAtIso= $found ? utcToIso($doc['firstRetrievedAt'] ?? null) : null;
$lastRetrievedAtIso = $found ? utcToIso($doc['lastRetrievedAt'] ?? null) : null;
$retrievedCount     = $found ? (int)($doc['retrievedCount'] ?? 0) : 0;

// (Optional) remaining time
$remainingText = null;
if ($found && !$deleted && !$expired && isset($doc['expiresAt']) && $doc['expiresAt'] instanceof UTCDateTime) {
    $exp = DateTimeImmutable::createFromMutable($doc['expiresAt']->toDateTime())->setTimezone(new DateTimeZone('UTC'));
    $diff = $now->diff($exp);
    $parts = [];
    if ($diff->days) $parts[] = $diff->days . 'd';
    if ($diff->h)    $parts[] = $diff->h . 'h';
    if ($diff->i)    $parts[] = $diff->i . 'm';
    if (!$parts)     $parts[] = $diff->s . 's';
    $remainingText = implode(' ', $parts);
}

?>
<!DOCTYPE html>
<html lang="lv">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1">
    <link rel="icon" type="image/svg+xml" href="/favicon.svg"/>
    <title>Noslēpuma statuss</title>
    <link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.3/dist/css/bootstrap.min.css" rel="stylesheet">
    <style>
        html { height: 100%; }
        body { min-height: 100%; display:flex; flex-direction:column; }
        .footer { margin-top:auto; }
        .mono { font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace; }
    </style>
</head>
<body class="bg-light">
<div class="container py-5">
    <h2 class="mb-4 text-center">📎 Noslēpuma statuss</h2>

    <div class="card shadow-sm">
        <div class="card-body">
            <div class="d-flex align-items-center justify-content-between flex-wrap gap-2">
                <div>
                    <span class="badge text-bg-<?= htmlspecialchars($statusBadge) ?>"><?= htmlspecialchars($statusTitle) ?></span>
                    <div class="mt-2 text-secondary"><?= $statusText ?></div>
                </div>

                <?php if ($found): ?>
                    <div class="text-end">
                        <div class="text-secondary small">Meta ID</div>
                        <div class="mono"><?= htmlspecialchars($metaId) ?></div>
                    </div>
                <?php endif; ?>
            </div>

            <hr class="my-4">

            <?php if (!$found): ?>
                <div class="alert alert-secondary mb-0">
                    Ja tu tikko izveidoji noslēpumu, pārliecinies, ka atveri pareizo meta saiti.
                </div>
            <?php else: ?>
                <div class="row g-3">
                    <div class="col-12 col-md-6">
                        <div class="text-secondary small">Izveidots</div>
                        <div><?= htmlspecialchars($createdAtIso ?? '-') ?></div>
                    </div>
                    <div class="col-12 col-md-6">
                        <div class="text-secondary small">Derīgs līdz</div>
                        <div>
                            <?= htmlspecialchars($expiresAtIso ?? '-') ?>
                            <?php if ($remainingText): ?>
                                <span class="text-secondary small">(aptuveni <?= htmlspecialchars($remainingText) ?> atlicis)</span>
                            <?php endif; ?>
                        </div>
                    </div>

                    <div class="col-12 col-md-6">
                        <div class="text-secondary small">Izsniegts pirmo reizi</div>
                        <div><?= htmlspecialchars($firstRetrievedAtIso ?? '-') ?></div>
                    </div>
                    <div class="col-12 col-md-6">
                        <div class="text-secondary small">Izsniegts pēdējo reizi</div>
                        <div><?= htmlspecialchars($lastRetrievedAtIso ?? '-') ?></div>
                    </div>

                    <div class="col-12 col-md-6">
                        <div class="text-secondary small">Izsniegšanas skaits</div>
                        <div><?= htmlspecialchars((string)$retrievedCount) ?></div>
                    </div>
                    <div class="col-12 col-md-6">
                        <div class="text-secondary small">Parādīts / izdzēsts</div>
                        <div><?= htmlspecialchars($displayedAtIso ?? '-') ?></div>
                    </div>
                </div>

                <div class="mt-4 alert alert-info mb-0">
                    Šeit netiek rādīts noslēpuma saturs. Tikai statuss un laiki.
                </div>
            <?php endif; ?>
        </div>
    </div>

    <div class="mt-4">
        <a class="btn btn-outline-secondary" href="/">← Atpakaļ uz glabātuvi</a>
    </div>
</div>

<div class="footer py-3">
    <div class="container text-secondary small">
        Visi laiki ir UTC.
    </div>
</div>
</body>
</html>