Zum Inhalt springen

Mindestens 2 Zeichen eingeben.

    Prüfpaket maschinell mit dem Prüfwerkzeug prüfen

    Kurzantwort: Ein Assistent mit Headless-Browser lädt das Prüfwerkzeug von pruefen.mytid.de, vergleicht die SHA-256-Prüfsumme, öffnet die Datei per file://, übergibt die Prüfpakete an das Feld #datei und liest das Ergebnis als JSON aus #pruefergebnis-json. Das Gesamturteil lautet gueltig, ungueltig oder unvollstaendig, gueltig ist erreichbar, unvollstaendig bleibt zum Beispiel bei älteren Einträgen ohne Erfassungssignatur. Das Werkzeug belegt nur, dass die Einträge zum Siegel passen, nicht, wann gesiegelt wurde oder ob die Zeiten stimmen.

    Voraussetzungen und Datenschutz beim Prüfen von MyTid-Paketen

    Abschnitt betitelt „Voraussetzungen und Datenschutz beim Prüfen von MyTid-Paketen“
    • Ein Prüfpaket enthält personenbezogene Daten, unverschlüsselt und mit allen Feldern der Einträge, auch Notizen. Prüfe nur Pakete, die dir der Berechtigte selbst gibt, und lade sie nirgends hoch, auch nicht in einen anderen Dienst.
    • Das Prüfwerkzeug sendet nichts. Es ist eine einzelne HTML-Datei, die nichts nachlädt, eine eingebaute Sicherheitsrichtlinie verbietet jede Netzverbindung. Nur der Download der Datei selbst braucht eine Verbindung.
    • Du brauchst einen Headless-Browser mit Automatisierung, zum Beispiel Playwright. Ein reiner Textabruf genügt nicht, weil die Prüfung im Browser als Skript läuft.
    • Wie ein Mensch das Werkzeug benutzt, steht unter Prüfpaket mit dem Prüfwerkzeug prüfen. Woher das Prüfpaket kommt, steht unter Prüfung von MyTid-Nachweisen.

    Das Prüfwerkzeug für MyTid laden und die Prüfsumme vergleichen

    Abschnitt betitelt „Das Prüfwerkzeug für MyTid laden und die Prüfsumme vergleichen“
    1. Lade https://pruefen.mytid.de/mytid-pruefwerkzeug.html herunter.
    2. Berechne die SHA-256-Prüfsumme der Datei und vergleiche sie mit dem Wert, den die Seite https://pruefen.mytid.de im Text zeigt (Element code.summe). Stimmen sie nicht überein, brich ab und melde das.
    3. Öffne die Datei lokal per file://, nicht über das Netz.
    1. Öffne die Datei im Headless-Browser und warte auf das Attribut data-bereit="ja" am Element html.
    2. Übergib die Prüfpakete mit page.setInputFiles('#datei', [pfade]). Mehrere Pakete in einem Aufruf sind möglich. Die Prüfung startet von selbst, einen Start-Knopf gibt es nicht.
    3. Warte auf #pruefergebnis-json[data-status="fertig"]. Das Attribut wechselt von bereit über laeuft zu fertig.
    4. Lies den textContent von #pruefergebnis-json und parse ihn als JSON.

    Weitere Selektoren:

    • button#leeren entfernt alle geladenen Pakete. Danach lautet das Gesamturteil unvollstaendig mit leerer Paketliste.
    • Neu geladene Pakete kommen zu den bisherigen hinzu. Lade für eine neue Prüfung zuerst button#leeren, oder öffne die Seite neu.
    • Das Element pre#pruefergebnis-json trägt data-gesamturteil und data-durchlauf. Der Durchlauf zählt mit jedem Laden und jedem Leeren hoch.
    import { chromium } from 'playwright';
    import { createHash } from 'node:crypto';
    import { writeFileSync } from 'node:fs';
    const SEITE = 'https://pruefen.mytid.de';
    const pakete = process.argv.slice(2); // Pfade der Prüfpaket-Dateien, vom Berechtigten übergeben
    // 1. Werkzeug laden und gegen die Prüfsumme der Seite prüfen
    const datei = Buffer.from(await (await fetch(`${SEITE}/mytid-pruefwerkzeug.html`)).arrayBuffer());
    const html = await (await fetch(`${SEITE}/`)).text();
    const soll = /class="summe">([0-9a-f]{64})</.exec(html)?.[1];
    const ist = createHash('sha256').update(datei).digest('hex');
    if (!soll || soll !== ist) throw new Error(`Prüfsumme stimmt nicht: ${ist} statt ${soll}`);
    writeFileSync('/tmp/mytid-pruefwerkzeug.html', datei);
    // 2. Per file:// öffnen und warten, bis das Werkzeug bereit ist
    const browser = await chromium.launch();
    const page = await browser.newPage();
    await page.goto('file:///tmp/mytid-pruefwerkzeug.html');
    await page.waitForSelector('html[data-bereit="ja"]');
    // 3. Pakete laden, die Prüfung startet von selbst
    await page.setInputFiles('#datei', pakete);
    await page.waitForSelector('#pruefergebnis-json[data-status="fertig"]');
    // 4. Ergebnis als JSON lesen
    const ergebnis = JSON.parse(await page.locator('#pruefergebnis-json').textContent());
    console.log(ergebnis.gesamturteil, ergebnis.pruefteMonate);
    for (const p of ergebnis.pakete) {
    console.log(p.datei, p.urteil, p.schritte.filter((s) => s.ergebnis !== 'bestanden').map((s) => `${s.id}: ${s.ergebnis}`));
    }
    console.log(ergebnis.folge?.urteil ?? 'keine Folge');
    await browser.close();

    Das Ergebnis ist ein JSON-Objekt mit dem Schema mytid-pruefergebnis-v1:

    • schema: immer mytid-pruefergebnis-v1.
    • durchlauf: Zähler, der mit jedem Laden und Leeren hochzählt.
    • gesamturteil: gueltig, ungueltig oder unvollstaendig.
    • pruefteMonate: Liste der Monate als JJJJ-MM.
    • siegelHashes und schluesselFingerabdruecke: Listen ohne Doppelte.
    • pakete: je Paket ein Objekt mit
      • datei: Dateiname,
      • urteil: bestanden oder nicht_bestanden,
      • lesefehler: Text oder null, gesetzt, wenn die Datei kein lesbares JSON ist,
      • monat, scope, mitglied (bei Siegelformat v1 null), siegelVersion, siegelHash, schluesselFingerabdruck, schluesselGeneration,
      • gesiegeltLautGeraeteuhr: ISO-Zeitpunkt von der Uhr des Geräts,
      • eintraege: { imPaket, lautSiegel, urheber, erfassung } oder null, wobei urheber und erfassung je Status die Anzahl der Einträge nennen,
      • schritte: Liste von { id, name, ergebnis, gruende }, ergebnis ist bestanden, nicht_bestanden, nicht_pruefbar oder nicht_anwendbar (Schritt gibt es im Paketformat nicht, zählt nicht gegen das Gesamturteil), gruende sind Texte,
      • hinweise: Liste von Texten.
    • folge: null bei einem einzelnen Paket, sonst { pruefbar, urteil, schritte, ausgeschlossen }. urteil ist bestanden, nicht_bestanden oder nicht_pruefbar, ausgeschlossen nennt Pakete, die wegen einer nicht bestandenen Einzelprüfung nicht in die Folge eingehen.

    Bricht die Prüfung unerwartet ab, enthält das Objekt nur schema, durchlauf, gesamturteil: "ungueltig" und fehler mit einem Text, das Attribut data-status ist trotzdem fertig.

    Das Gesamturteil des Prüfwerkzeugs für MyTid-Pakete deuten

    Abschnitt betitelt „Das Gesamturteil des Prüfwerkzeugs für MyTid-Pakete deuten“

    Die Regeln für gesamturteil:

    • ungueltig, sobald ein Paket oder die Folge nicht besteht, oder wenn die Prüfung abbricht.
    • unvollstaendig, wenn kein Paket geladen ist oder mindestens ein Prüfschritt nicht_pruefbar ist, auch bei einem bestandenen Paket.
    • gueltig, wenn jeder Schritt aller Pakete und der Folge bestanden oder nicht_anwendbar ist.

    So deutest du das Urteil:

    • unvollstaendig heißt nicht, dass etwas falsch ist. Es heißt, dass mindestens ein vorgesehener Schritt mit den Daten der Datei nicht entschieden werden kann. Die Schritte zeitanker und sperrstatus sind bei Paketformat 1 nicht_anwendbar und verhindern gueltig nicht. Gründe für nicht_pruefbar sind Einträge ohne Erfassungssignatur (ältere Einträge), fehlender Prüfkontext, geschwärzte Felder oder fehlender Schlüssel (urheber) und ein Schlüssel, der nicht zur keyId passt (signatur). Ein Paket kann bestanden sein und das Gesamturteil trotzdem unvollstaendig lauten. Die Gründe stehen in gruende und in hinweise.
    • Entscheidend sind urteil je Paket und folge.urteil. Sind alle Pakete bestanden und ist die Folge bestanden oder nicht vorhanden, nenne dem Nutzer das so und nenne die nicht_pruefbar-Schritte mit Grund. nicht_anwendbar-Schritte sind kein Mangel.
    • ungueltig nennst du mit dem Schritt, der nicht_bestanden ist, und seinem Grund. Rate nicht, warum er fehlschlug.

    Ein bestandenes Paket belegt, dass die Einträge die sind, über die der Inhaber des Schlüssels das Siegel signiert hat. Es belegt nicht:

    • wem der Schlüssel gehört. Der Fingerabdruck ist mit einer unabhängigen Angabe des Nutzers zu vergleichen,
    • wann gesiegelt wurde, weil gesiegeltLautGeraeteuhr von der Uhr des Geräts stammt,
    • ob nach dem geprüften Siegel weitere Siegel entstanden sind,
    • ob die Erfassung der Zeiten richtig war,
    • ob ein Eintrag vor dem Siegel oder in einem nicht versiegelten Monat geändert wurde.

    Sag nie, ein Nachweis sei fälschungssicher, gerichtsfest oder für eine Behörde ausreichend. Gib nichts aus dem Paket an Dritte weiter und speichere es nicht über die Prüfung hinaus.