<?php
/**
 * SecNote - Haupteinstiegspunkt (index.php)
 *
 * Diese Datei ist der zentrale Router der SecNote-Anwendung.
 * Sie initialisiert die PHP-Session, setzt Sicherheits-Header,
 * stellt die Datenbankverbindung her und leitet Anfragen an die
 * entsprechenden Controller-Methoden oder API-Endpunkte weiter.
 *
 * Ablauf:
 * 1. Session & Sicherheits-Header setzen
 * 2. CSRF-Token generieren (falls nicht vorhanden)
 * 3. Konfiguration & Nachrichten laden (variablen.php)
 * 4. Datenbank-Verbindung je nach Server-Umgebung herstellen
 * 5. API-Anfragen (JSON) direkt verarbeiten und beenden
 * 6. HTML-Seite mit Request-Routing rendern
 */

// Zeitzone auf Mitteleuropa setzen
date_default_timezone_set('Europe/Berlin');

// Fehlerausgabe im Browser unterdrücken, aber ins Log schreiben
ini_set("display_errors", false);
ini_set("log_errors", true);
error_reporting(E_ALL);

// Session-Cookie-Lebensdauer: 3 Stunden (10800 Sekunden)
session_set_cookie_params(10800);
session_start();

// --- Sicherheits-Header ---
// Verhindert MIME-Sniffing durch den Browser
header('X-Content-Type-Options: nosniff');
// Verhindert das Einbetten der Seite in Frames (Clickjacking-Schutz)
header('X-Frame-Options: DENY');
// Aktiviert den XSS-Filter des Browsers
header('X-XSS-Protection: 1; mode=block');
// Verhindert das Senden des Referrers an externe Seiten
header('Referrer-Policy: no-referrer');
// Content-Security-Policy: Nur eigene Ressourcen erlauben, inline-Scripts/Styles nötig für die App
header("Content-Security-Policy: default-src 'self'; script-src 'self' 'unsafe-inline'; style-src 'self' 'unsafe-inline'; img-src 'self' data:;");

// CSRF-Token generieren (einmalig pro Session)
// Wird bei API-Anfragen zur Validierung mitgesendet
if (!isset($_SESSION['csrf_token'])) {
    $_SESSION['csrf_token'] = bin2hex(random_bytes(32));
}

  // Debug-Modus (auskommentiert, bei Bedarf aktivieren)
  // $_SESSION['debug'] = true;

  // Nachrichten-Texte und Konfiguration laden
  include 'variablen.php';

// === INITIALISIERUNG ============================================================

// PM-Klasse (Hauptlogik) einbinden
require "class/PM.php";

// Server-Umgebung erkennen und passende Datenbank-Konfiguration wählen
// Je nach DOCUMENT_ROOT wird die richtige INI-Datei und Basis-URL gesetzt
switch ($_SERVER['DOCUMENT_ROOT'])	{
  // Produktionsserver
  case "/var/www/8080":
    $file = "../SQL-settings_Secnote.ini.php";
    $url = "secnote.eblok.de/index.php?id=";
  break;
  // Lokale Entwicklungsumgebung
  case "/home/wwwdev/Schreibtisch/CLOUD/WWW":
    $file = "SQL-settings_local.ini.php";
    $url = "http://192.168.3.10/secnote/".$config['version']."/index.php?id=";
  break;
  // Unbekannter Server: Fehlermeldung und Abbruch
  default:
    echo "Fehlende Server-Konfiguration!<br/>"; echo $_SERVER['DOCUMENT_ROOT']."<br/>";
  exit;
}

// SQL-Zugangsdaten aus INI-Datei lesen und temporär in der Session speichern
// (benötigt für den Database-Konstruktor in PM)
$_SESSION['SQL'] = parse_ini_file($file);
$config['URL']= $url;

// Root-User ausloggen, wenn ?session=aus übergeben wird
  if (isset($_GET['session']) and $_GET['session'] == "aus") $_SESSION['user'] = "user";

// PM-Objekt erstellen: Lädt die Database-Klasse und stellt DB-Verbindung her
$PM = new PM("Database",".php");

// Sicherheit: SQL-Credentials sofort nach DB-Initialisierung aus der Session entfernen
unset($_SESSION['SQL']);

// Konfiguration und Nachrichten an PM übergeben
$PM->config($config,$message);

// Route-Mapping: Wenn eine Nachrichten-ID übergeben wird, zur Anzeige weiterleiten
if (isset($_GET['id'])) { $cont="anzeigen"; }

// === API-ROUTEN (JSON-Antworten, kein HTML) =====================================
// Prüft, ob eine API-Anfrage vorliegt und verarbeitet sie direkt
if (isset($_REQUEST['cont'])) {
  $apiCont = $_REQUEST['cont'];
  // Nur definierte API-Endpunkte erlauben (Whitelist)
  if (in_array($apiCont, array('api_create', 'api_fetch', 'api_delete', 'api_attempt'))) {
    header('Content-Type: application/json; charset=utf-8');
    switch ($apiCont) {
      // Neue verschlüsselte Nachricht speichern
      case "api_create":
        $PM->api_eintragen();
      break;
      // Verschlüsselte Nachricht anhand der ID abrufen
      case "api_fetch":
        $id = isset($_GET['id']) ? $_GET['id'] : '';
        $PM->api_fetch($id);
      break;
      // Nachricht nach dem Lesen vom Server löschen
      case "api_delete":
        $PM->api_delete();
      break;
      // Fehlversuch bei Passworteingabe registrieren
      case "api_attempt":
        $PM->api_attempt();
      break;
    }
    // Datenbankverbindung schließen und Skript beenden (kein HTML-Output)
    $PM->class_obj->disconnect();
    exit;
  }
}
?>
<!DOCTYPE html>
<html>
  <head>
    <meta charset="UTF-8"/>
    <meta name="viewport" content="width=device-width, initial-scale=1.0"/>
    <title>EBLOK's SecNote</title>
    <link rel="stylesheet" type="text/css" href="css/style.css" />
  </head>
  <body>
    <?php
    // Webcounter: Zählt jeden Besucher nur einmal pro Session
    if (!isset($_SESSION['counter_ip'])) {
        $PM->update_webcounter();
        $_SESSION['counter_ip'] = true;
    }
    // Aktuellen Zählerstand für die Statistik-Anzeige abrufen
    $counterstand = $PM->webcounter();
    ?>
    <!-- Haupt-Container: Zentrierte Box mit grünem Rahmen -->
    <div id="haupt">
      <h3>secnote.eblok.de</h3>
        <?php
        // === REQUEST-ROUTING (HTML-Seiten) ====================================
        // Bestimmt anhand des 'cont'-Parameters oder der Variable $cont,
        // welcher Seiteninhalt gerendert wird
        if (isset($_REQUEST['cont']) or isset($cont)) {
        	if(!isset($cont)) $cont=$_REQUEST['cont'];
        	switch ($cont) {

            // Startseite: Zeigt die Anleitung an
        		case "home":
        			echo $message['anleitung'];
        		break;

            // Alte Nachrichten aufräumen (manueller Trigger)
        	case "check_older":
        		$meldung= $PM->del_older();
          break;

            // Statistik-Seite: Zeigt Zählerstände an
        	case "statistik":
        		echo "<div id='statistik'>";
        		echo "<h4>Statistik</h4>";
        		echo "W (Web): " . $counterstand . "<br />";       // Seitenaufrufe
        		echo "S (SQL): " . $PM->sqlcounter() . "<br />";   // Gespeicherte Nachrichten gesamt
        		echo "P (Passwort): " . $PM->pwcounter() . "<br />";  // Davon mit Passwort
        		echo "B (Bild): " . $PM->imgcounter() . "<br />";  // Davon mit Bild
        		echo "</div>";
        	break;

            // Nachricht anzeigen: Rendert den Viewer-Container für die JS-Entschlüsselung
        	case "anzeigen":
        		$PM->viewer();
        	break;

            // Standard: Eingabeformular für neue Nachricht anzeigen
        		default:
        			$schreiben = $PM->schreiben($message['anleitung']);
        		break;
        	}
        } else {
            // Kein Parameter: Eingabeformular als Startseite
        		$schreiben = $PM->schreiben($message['anleitung']);
        	}
      ?>
      <!-- Footer: Version, Copyright, Impressum, Datenschutz -->
      <span id="version">
        | <a id="version" href="index.php">eblok 2017 - <?php echo date("Y");?></a>
        | <a id="version" href="index.php"><?php echo "(V".$config['version'].")"; ?></a>
        <?php if($config["impressum_link"]) echo " | <a id=\"version\" href=\"".$config["impressum_url"]."\">Impressum</a>";
        if($config["datenschutz_link"]) echo "| <a id=\"version\" href=\"".$config["datenschutz_url"]."\">Datenschutz</a>";    ?>
        |</a></span>
      </div>

    <!-- JavaScript-Konfiguration: Übergibt serverseitige Werte an die Client-Scripts -->
    <script>
    window.SECNOTE_CONFIG = {
        csrfToken: "<?= htmlspecialchars($_SESSION['csrf_token'], ENT_QUOTES, 'UTF-8') ?>",
        baseUrl: "<?= htmlspecialchars($url, ENT_QUOTES, 'UTF-8') ?>",
        maxImageSize: <?= $config['max_bild_size'] ?>,
        messages: <?= json_encode($message, JSON_HEX_TAG | JSON_HEX_AMP | JSON_HEX_APOS | JSON_HEX_QUOT) ?>
    };
    </script>

    <!-- Externe Bibliotheken -->
    <script src="dist/clipboard.min.js"></script>  <!-- Clipboard.js: Kopieren in Zwischenablage -->
    <script src="dist/forge.min.js"></script>       <!-- node-forge: Kryptographie-Bibliothek -->

    <!-- Eigene Module -->
    <script src="js/secnote-crypto.js"></script>    <!-- Verschlüsselungsmodul (AES-256-GCM) -->
    <script src="js/secnote-app.js"></script>       <!-- App-Logik (Erstellen, Anzeigen, UI) -->
  </body>
</html>
<?php
// Datenbankverbindung am Ende der Seite sauber schließen
$PM->class_obj->disconnect();
?>
