• v2.4.0 342abb0206

    alientim released this 2026-09-10 00:08:49 +02:00 | 51 commits to main since this release

    Eigene Rechtezeile: PDF-Formulare

    Ein ausgefuelltes Formular abzulegen hing bisher am Recht Anlegen -- wie ein
    Upload. Jetzt gibt es dafuer eine eigene Zeile im Bereich Dateifreigaben:

    Bedeutung
    R Ansehen in der Vorschau ausfuellen (ohne Speichern)
    C Anlegen ausgefuellt speichern -- abgeschlossen, Felder gesperrt
    U Bearbeiten ausgefuellt speichern -- weiter ausfuellbar, inklusive Bild

    Damit ist das Formularrecht vom Umbenennen getrennt: wer nur anlegen darf, legt
    nur endgueltige Fassungen ab. Wer bearbeiten darf, hat beide Wege.

    Geprueft wird die Datei, nicht das Auswahlfeld im Browser: traegt das
    hochgeladene PDF noch Formularfelder und das Recht fehlt, wird es abgewiesen.

    Ohne Ausfuellrecht zeigt die Vorschau das Dokument, wie es ist -- mit den Marken
    aus der Datei statt der Bedienelemente des Browsers.

    Herunterladen ist Exportieren

    Dateifreigaben bekommt die Spalte E. Eine Vorschau bleibt im Haus, eine
    heruntergeladene Datei nicht -- genau die Bedeutung aus der Legende der Matrix.

    Migration

    Jede Gruppe behaelt ihre bisherige Reichweite: fileshare.view bringt
    fileshare.export und fileshare_pdf.view, fileshare.create bringt
    fileshare_pdf.create, fileshare.edit bringt fileshare_pdf.edit. Ohne
    diesen Schritt koennte nach dem Update niemand mehr herunterladen oder
    speichern, obwohl sich an den Gruppen nichts geaendert hat.

    Downloads
  • v2.3.3 8dd8df9e9f

    alientim released this 2026-09-09 23:43:51 +02:00 | 52 commits to main since this release

    Zwei Arten zu speichern

    In der Speicherzeile steht jetzt, was aus dem Formular werden soll:

    • Formular -- weiter ausfuellbar (Vorgabe): alle Felder bleiben, und das
      Foto wird das Aussehen des Bildknopfes. Damit ist es sichtbar und laesst
      sich beim naechsten Oeffnen austauschen. Vorher wurde es in die Seite
      gestempelt und der Knopf entfernt -- danach ging kein neues Bild mehr.
    • Abgeschlossen -- Felder gesperrt: alle Felder werden Teil der Seite.
      Heraus kommt ein PDF ohne Formular; nichts laesst sich mehr verstellen, gut
      zum Ablegen und Drucken.

    Ohne Bild und ohne Abschluss bleibt pdf-lib ungeladen -- der haeufige Fall
    kostet nichts.

    Downloads
  • v2.3.2 0de90ab6d4

    alientim released this 2026-09-09 23:36:09 +02:00 | 53 commits to main since this release

    Namen ohne Endung

    Beim Umbenennen und beim Speichern eines ausgefuellten Formulars steht
    nur noch der Name im Feld -- die Endung kommt von der Datei selbst. Eine Datei,
    die auf .pdf.txt oder auf gar nichts endet, oeffnet auf einer Freigabe nichts
    mehr. Wer die Endung mittippt, bekommt sie nicht doppelt; Verzeichnisse behalten
    ihren Namen unveraendert.

    Ankreuzfelder sind wieder lesbar

    pdf.js malt Formularfelder mit Systemfarben und ueberlaesst Ankreuzfelder dem
    Browser. Im dunklen Design heisst CanvasText weiss -- auf weissem Papier
    also unsichtbar. Ein PDF ist immer heller Grund; fuer diesen Ausschnitt gilt
    jetzt das helle Schema.

    Die farbigen Originale (rotes Kreuz, gruener Haken) bleiben, wo sie zaehlen: in
    der Datei. Beim Ausfuellen ersetzt pdf.js die Felder durch Bedienelemente des
    Browsers -- anders liessen sie sich nicht anfassen --, die gespeicherte Datei
    traegt aber weiter die Darstellung aus dem Dokument.

    Hochkant mehr Hoehe

    Die Obergrenze von 760 Pixeln passt zu einem Querformat-Monitor; auf einem
    Tablet oder einem hochkant stehenden Schirm verschenkte sie den halben
    Bildschirm. Dort nimmt die Vorschau jetzt die Hoehe, die da ist -- auf
    820x1180 sind das 926 statt 760 Pixel, auf 1080x1920 sogar 1655. Im Querformat
    bleibt alles wie bisher.

    Downloads
  • v2.3.1 e60a93120c

    alientim released this 2026-09-09 23:11:55 +02:00 | 54 commits to main since this release

    Formularfelder sitzen jetzt an ihren Kaesten

    Die Felder waren nach rechts unten verschoben, immer weiter je weiter unten sie
    lagen. Ursache: die Seite von pdf.js traegt einen 9-Pixel-Rahmen, und das
    globale box-sizing: border-box der Oberflaeche rechnete ihn nach innen -- die
    Leinwand wurde 18 Pixel schmaler als die Ebene mit den Feldern.

    Das Bildfeld ist benutzbar

    Der Kasten fuer das Foto ist in solchen Formularen ein Acrobat-Knopf mit der
    Aktion buttonImportIcon. Kein Browser fuehrt die aus, auch Edge nicht.

    Solche Knoepfe bekommen jetzt eine eigene Schaltflaeche Bild einsetzen -- auf
    einem iPad bietet sie Kamera oder Fotos an. Das Bild erscheint sofort im Kasten
    und wird beim Speichern in die Datei gestempelt; in der ausgefuellten Kopie
    faellt der Knopf weg, damit nichts das Foto verdeckt. Die Vorlage bleibt
    unberuehrt.

    Das Foto geht durch eine Leinwand: daraus wird ein JPEG (auf einem iPad also
    auch aus HEIC), und ein 12-Megapixel-Bild wird auf ein Mass verkleinert, das ein
    Formular nicht sprengt. pdf-lib (MIT) liegt dafuer im Paket und wird erst
    geladen, wenn wirklich ein Bild eingesetzt wird.

    Kleinigkeit

    Ein leeres Ordnerfeld beim Speichern heisst jetzt Wurzelverzeichnis -- so wie es
    daneben steht.

    Downloads
  • v2.3.0 e7ad00a5e5

    alientim released this 2026-09-09 22:41:12 +02:00 | 55 commits to main since this release

    Ausgefuellte Formulare: Ordner und Name waehlen

    Bisher landete das ausgefuellte Formular ohne Rueckfrage neben dem Original. Ein
    ausgefuellter Fehlerbericht gehoert aber eher in den Ordner des Vorgangs als
    neben die leere Vorlage.

    Die Vorschau fragt jetzt nach Ordner und Dateiname und schlaegt beides
    vor: der Ordner, in dem man gerade ist, und der Name der Vorlage mit dem Zusatz
    -ausgefuellt. Die Ordner der Freigabe stehen als Liste bereit; ein Pfad darf
    auch getippt werden. Eine vorhandene Datei wird nur ueberschrieben, wenn
    Vorhandene ersetzen angekreuzt ist.

    Drei Fehler aus der Praxis

    • Nachgeladene Dateien trugen keine Version. nginx liefert /core-assets/
      mit expires 7d -- nach einem Update lief also tagelang der alte Betrachter
      weiter. viewer.js bekommt jetzt die Version von app.js, pdf.js die seiner
      eigenen Adresse.
    • Der PDF-Bereich rechnete mit genau einer Leiste. Die neue Speicherzeile lag
      damit unter dem Dialogrand.
    • Der Aufraeumfaden der Dateifreigaben lief nie: time war nicht importiert,
      der erste sleep warf einen NameError, und weil der vor dem try stand, starb
      der Faden still -- abgelaufene Einbindungen wurden nie geloest.

    Der Hinweis beim Rueckfall nennt jetzt zusaetzlich den Grund, den der Browser
    meldet. Wenn die Formularansicht auf einem Geraet nicht laedt, steht dort, woran
    es liegt.

    Downloads
  • v2.2.1 e70c6e27c1

    alientim released this 2026-09-09 22:06:25 +02:00 | 56 commits to main since this release

    Formularfelder erscheinen jetzt wirklich

    In 2.2.0 blieben sie auf einer echten Installation aus -- in Safari wie in
    Chromium. Der Grund lag nicht in pdf.js: die mime.types von nginx kennen die
    Endung .mjs nicht und liefern application/octet-stream. Ein
    <script type="module"> und ein Modul-Worker lehnen das ab, also wurde pdf.js
    nie geladen und die Vorschau fiel auf den einfachen Rahmen zurueck -- und dort
    gibt es keine Formularfelder.

    Im Test fiel das nicht auf, weil dort Flask die Dateien ausliefert: Python kennt
    .mjs. Erst durch nginx trat es auf.

    Die Dateien heissen deshalb jetzt .js. Am Inhalt aendert das nichts, und ein
    Hygienetest verbietet ab jetzt jede .mjs im Paket.

    Ausserdem: der Hinweis "Formularansicht liess sich nicht laden" landete in
    einer Leiste, die derselbe Aufruf gerade verborgen hatte -- der Fehlschlag war
    unsichtbar. Jetzt steht er da, wo man ihn liest.

    Downloads
  • v2.2.0 e96e4837f1

    alientim released this 2026-09-09 21:48:41 +02:00 | 57 commits to main since this release

    Vorschau: Bilder zoomen, PDF-Formulare ausfuellen

    Bisher lief jede Vorschau durch einen Rahmen, und der Browser entschied selbst.
    Auf einem iPad heisst das: ein Foto ist 4032 Pixel breit und wird 1:1 gezeigt,
    also als Ausschnitt aus der Mitte. Ein PDF ist dort nur ein Standbild der ersten
    Seite -- Formularfelder lassen sich nicht anfassen.

    Jetzt waehlt die Vorschau die Anzeige nach der Art der Datei:

    • Bilder passen sich der Flaeche an und lassen sich zoomen und verschieben:
      zwei Finger, Mausrad, Doppeltippen oder die Knoepfe unten links.
    • PDFs rendert pdf.js mit Formularmodus -- Felder sind echte Eingabefelder,
      auch in Safari. Ausgefuellt speichern legt das ausgefuellte Formular als
      eigene Datei neben das Original (vorlage-ausgefuellt.pdf); die leere
      Vorlage bleibt leer.
    • Alles andere bleibt beim Rahmen. Faellt pdf.js aus, faellt die Anzeige
      ebenfalls dorthin zurueck -- kein weisses Feld.

    HEIC ist neu in der Vorschau: das Format, in dem ein iPad fotografiert.
    Safari zeigt es; andere Browser bekommen den Hinweis, dass sie es nicht koennen.

    pdf.js (4.10.38, Apache-2.0) liegt im Paket -- TESM laeuft in abgeschotteten
    Netzen. Geladen wird es erst beim ersten PDF.

    Herunterladen laedt herunter

    iOS Safari entscheidet nach dem MIME-Typ und oeffnete eine application/pdf im
    Browser, obwohl sie als Anhang ausgeliefert wurde. Ein ausdruecklicher Download
    bekommt jetzt den neutralen Typ; angesehen wird die Datei in der Vorschau.

    Eine Uploadgrenze statt drei

    Wirksam war bisher die kleinste (64 MB aus einer Umgebungsvariablen), sichtbar
    die groesste (512 MB auf der Freigabeseite), und nginx hatte eine dritte. Jetzt
    gilt eine Zahl, einstellbar unter Einstellungen -> Webserver und TLS:

    • die Anwendung liest sie pro Anfrage -- keine Aenderung braucht einen
      Neustart,
    • nginx bekommt beim Uebernehmen 16 MB mehr, damit die Anwendung die
      Fehlermeldung schreiben darf,
    • und die Meldung nennt die Grenze und wo sie steht.
    Downloads
  • v2.1.2 119293e5e3

    alientim released this 2026-09-09 00:27:05 +02:00 | 58 commits to main since this release

    Ein Sub-Paket kommt nicht mehr auf eine Wurzelinstanz

    Die Pruefung sah bisher nur nach, ob im Zielverzeichnis das Teilpaket
    tesm_license/master liegt. Jede Master-Installation, die vor 2.1.0
    eingerichtet wurde, kennt es aber noch nicht -- dort waere ein Paket der
    Sub-Ausgabe anstandslos durchgelaufen, und die Wurzelinstanz haette danach
    keinen Weg mehr zu einer Master-Lizenz.

    Jetzt entscheidet zusaetzlich die Rolle der eingespielten Lizenz. Ist sie
    master und das Paket die Sub-Ausgabe, bricht install.sh vor dem ersten
    Schreibzugriff ab und nennt das passende Repositorium.

    Wer eine Wurzelinstanz betreibt, aktualisiert sie aus tesm-license-master:

    sudo bash /srv/tesm-license/deploy/update.sh tesm-license latest --yes
    

    update.sh erkennt die Ausgabe selbst; den Zugriffstoken fuer das private
    Repositorium erwartet es in TESM_RELEASE_TOKEN oder /etc/tesm-release.token.

    Downloads
  • v2.1.1 36d9cb248e

    alientim released this 2026-09-09 00:20:47 +02:00 | 59 commits to main since this release

    Nachtrag zu 2.1.0 -- eine Zeile, die im Betrieb zaehlt.

    update.sh endet nicht mehr still

    Ohne Terminal las die Rueckfrage EOF, die Antwort blieb leer, und das Skript
    endete mit 0: aus einem anderen Skript oder per SSH aufgerufen sah das nach
    einem erledigten Update aus, obwohl nichts passiert war.

    Jetzt gilt dasselbe wie bei install.sh und upgrade.sh:

    sudo bash /srv/tesm/deploy/update.sh tesm latest --yes
    

    Ohne Terminal und ohne --yes bricht es mit Code 3 ab und sagt, warum.

    Downloads
  • v2.1.0 cb056b4872

    alientim released this 2026-09-09 00:13:11 +02:00 | 60 commits to main since this release

    Rueckweg bei jedem Fehlschlag

    Aktualisierung und Upgrade rollen jetzt bei jedem Fehlschlag zurueck, nicht
    nur bei dem einen, der abgefangen war: Export, Uebersetzen, Einspielen, nginx,
    Systempakete, ein Ctrl-C. Der Rueckweg haengt an einer EXIT-Falle. Eine
    Neuinstallation loescht nichts -- im Zielverzeichnis kann eine Fassung 1.x
    liegen, deren Sicherung upgrade.sh haelt.

    Anlass war ein echter Abbruch: install.sh scheiterte an einer sudoers-Datei,
    die ein neueres visudo ablehnte. Der alte Dienst war zu diesem Zeitpunkt schon
    gestoppt und deaktiviert, der neue existierte nicht.

    Eine Datei genuegt

    install.sh liegt oben im Paket und funktioniert auch allein -- ohne Paket
    drumherum laedt es sich das aktuelle Release selbst:

    curl -fsSLO https://gitea.int.eertmoed.net/alientim/tesm-license/raw/branch/main/install.sh
    sudo bash install.sh --app tesm-license --https
    

    Damit gilt fuer alle drei Wege dasselbe: install.sh, update.sh,
    upgrade.sh -- eine Datei auf das Ziel legen, ausfuehren, fertig.

    Jede Instanz mit eigenem Port

    Bisher bekam jede Instanz denselben internen Port (Basis+100). Die zweite
    startete deshalb nie ("Address already in use") -- und weil die
    Gesundheitspruefung genau diesen Port fragte, antwortete die erste, und die
    Installation meldete "Fertig" ueber einen toten Dienst. Jetzt wird der naechste
    freie Port gesucht, und die Pruefung sieht zusaetzlich den Dienst selbst an.

    Zwei Ausgaben des Lizenzservers

    Die Rolle master entsteht an genau einer Stelle im Code, und die liegt jetzt
    im Teilpaket tesm_license/master. Ueber Tickets ist sie auf jedem Server
    abgewiesen -- eine Vertrauenswurzel laesst sich nicht delegieren.

    Ausgabe Teilpaket master Repository
    Wurzelinstanz ja, stellt beim Installieren die eigene Lizenz aus tesm-license-master (privat)
    Sub-Lizenzserver nein -- kein Code fuer diese Rolle tesm-license

    Der Signaturschluessel ist etwas anderes: mit ihm signiert jeder
    Lizenzserver seine Kundenlizenzen. Er entsteht ab jetzt beim Installieren --
    auch auf einem Sub-Lizenzserver -- und wird bei einer Aktualisierung nie
    angetastet. Sofort sichern.

    Ein Paket der Sub-Ausgabe auf eine Master-Installation weist install.sh ab:
    der Abgleich laeuft mit --delete und wuerde das Teilpaket entfernen. Geprueft
    wird das vor dem ersten Schreibzugriff.

    Downloads