diff --git a/apps/tesm-license/pyproject.toml b/apps/tesm-license/pyproject.toml index 8a85b5f..e53d38f 100644 --- a/apps/tesm-license/pyproject.toml +++ b/apps/tesm-license/pyproject.toml @@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta" [project] name = "tesm-license" -version = "2.7.2" +version = "2.7.3" description = "TESM-Lizenzserver -- Kunden, Tickets, Lizenzen, Aktivierung" requires-python = ">=3.11" dependencies = [ diff --git a/packages/tesm-core/pyproject.toml b/packages/tesm-core/pyproject.toml index ff78d42..8c9888f 100644 --- a/packages/tesm-core/pyproject.toml +++ b/packages/tesm-core/pyproject.toml @@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta" [project] name = "tesm-core" -version = "2.7.2" +version = "2.7.3" description = "Gemeinsames Anwendungsgeruest (Auth, RBAC, Navigation, Design-System, Migrationen) fuer TESM und TESM-Lizenzserver" requires-python = ">=3.11" dependencies = [ diff --git a/packages/tesm-core/src/tesm_core/app_factory.py b/packages/tesm-core/src/tesm_core/app_factory.py index c884e33..32aae1c 100644 --- a/packages/tesm-core/src/tesm_core/app_factory.py +++ b/packages/tesm-core/src/tesm_core/app_factory.py @@ -148,7 +148,7 @@ def create_base_app( #: Wortmarke, ohne Zeile darunter; die Marke selbst zeigen beide #: Anwendungen. auth_tagline: str = "", - app_version: str = "2.7.2", + app_version: str = "2.7.3", built_in_trusted_keys: tuple[str, ...] = (), enable_license: bool = True, template_folder: str | None = None, diff --git a/packages/tesm-core/src/tesm_core/static/tesm_core/js/viewer.js b/packages/tesm-core/src/tesm_core/static/tesm_core/js/viewer.js index cd40a37..748832b 100644 --- a/packages/tesm-core/src/tesm_core/static/tesm_core/js/viewer.js +++ b/packages/tesm-core/src/tesm_core/static/tesm_core/js/viewer.js @@ -280,7 +280,13 @@ async function nachbearbeiten( const hoehe = (png.height / png.width) * breite; seite.drawImage(png, { x: eintrag.x, y: eintrag.y, width: breite, height: hoehe }); const zeilen = [`${eintrag.name} | ${eintrag.zeit}`]; - if (zeuge) zeilen.push(`In TESM abgelegt durch ${zeuge}`); + // Der Zeugenvermerk gehoert zum Dokument, nicht zu jeder Unterschrift: + // unter drei Unterschriften stand dreimal derselbe Satz. Sichtbar + // erscheint er deshalb nur unter der ersten -- fest steht er ohnehin in + // den Dokumenteigenschaften und im Aenderungsprotokoll. + if (zeuge && eintrag === unterschriften[0]) { + zeilen.push(`In TESM abgelegt durch ${zeuge}`); + } // Die Schrift waechst mit der Unterschrift: wer sie kleiner zieht, will // den ganzen Block kleiner haben, nicht eine Zeichnung mit einer // Bildunterschrift in Originalgroesse daneben. @@ -311,6 +317,20 @@ async function nachbearbeiten( } } + if (unterschriften.length) { + // In den Dokumenteigenschaften -- dort sucht man so etwas, und dort steht + // es einmal statt unter jeder Unterschrift. Jeder Betrachter zeigt das + // an, auch ausserhalb von TESM. + const namen = unterschriften.map((eintrag) => eintrag.name); + const wann = unterschriften[unterschriften.length - 1].zeit; + dokument.setAuthor(namen.join(", ")); + dokument.setSubject( + `Unterschrieben am ${wann}` + (zeuge ? ` | in TESM abgelegt durch ${zeuge}` : "") + ); + dokument.setProducer("TESM"); + dokument.setModificationDate(new Date()); + } + if (abschliessen) { // Alle Felder werden Teil der Seite. Danach gibt es kein Formular mehr -- // gewollt: so kann niemand mehr etwas verstellen. @@ -664,7 +684,9 @@ async function pdfBetrachter(behaelter, seiten, url, basis, { formulare = true } const text = document.createElement("div"); text.className = "viewer__unterschrifttext"; text.textContent = `${eintrag.name} | ${eintrag.zeit}`; - if (zeuge) text.textContent += ` / In TESM abgelegt durch ${zeuge}`; + if (zeuge && eintrag === unterschriften[0]) { + text.textContent += ` / In TESM abgelegt durch ${zeuge}`; + } const griff = document.createElement("button"); griff.type = "button"; griff.className = "viewer__unterschriftgriff"; @@ -834,6 +856,8 @@ export function initFilePreview(wurzel = document) { const padAbbrechen = stueck("signabbrechen"); const padHinweis = stueck("signhinweis"); const basis = rumpf.dataset.viewerPdfjs || ""; + // Der Anmeldename, nicht der volle Name: er ist eindeutig, und genau das + // soll die Zeile belegen. const konto = rumpf.dataset.viewerKonto || ""; const bezeugen = rumpf.dataset.viewerZeuge === "1"; // Die Uhr des Servers, nicht die des Tablets: eine verstellte Uhr am Geraet diff --git a/packages/tesm-licensing-server/pyproject.toml b/packages/tesm-licensing-server/pyproject.toml index bd9d152..9a63a35 100644 --- a/packages/tesm-licensing-server/pyproject.toml +++ b/packages/tesm-licensing-server/pyproject.toml @@ -4,10 +4,10 @@ build-backend = "setuptools.build_meta" [project] name = "tesm-licensing-server" -version = "2.7.2" +version = "2.7.3" description = "Serverhaelfte des TESM-Lizenzprotokolls: ausstellen, erneuern, antworten" requires-python = ">=3.11" -dependencies = ["tesm-licensing==2.7.2", "cryptography>=41"] +dependencies = ["tesm-licensing==2.7.3", "cryptography>=41"] [tool.setuptools.packages.find] where = ["src"] diff --git a/packages/tesm-licensing/pyproject.toml b/packages/tesm-licensing/pyproject.toml index 4db17e5..523725c 100644 --- a/packages/tesm-licensing/pyproject.toml +++ b/packages/tesm-licensing/pyproject.toml @@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta" [project] name = "tesm-licensing" -version = "2.7.2" +version = "2.7.3" description = "Ed25519-basiertes Lizenz- und Aktivierungsprotokoll fuer TESM und TESM-Lizenzserver" requires-python = ">=3.11" dependencies = ["cryptography>=42"]