fec7d62acb
LibreSign had been silently broken since it was first deployed in January. Every step of the old before-starting hook ended in `|| echo`, so six months of failures logged nothing. LibreSign repair - Root cause was a stale config_path: a valid OpenSSL root CA existed at generation 1, a failed CFSSL attempt left an empty generation 2, and config_path was left pointing at the empty one. Regenerated as "Skudak LLP" (was the pre-rename "Skudak Rennsport LLP"). - Deleted the hook. Java/PDFtk/jSignPdf live under data/appdata_*, a persisted volume, so they only ever needed installing once. Install and verification are now explicit tasks that actually fail. - PHP_MEMORY_LIMIT 1024M -- the 512M image default fails opaquely mid-signature. LC_ALL/LANG so the JVM is not ANSI_X3.4-1968. - signature_render_mode=GRAPHIC_ONLY. Any other mode halves the stamp width and overlays a name/date block that collides with the drawn mark and duplicates what our documents already typeset. The value must be exactly GRAPHIC_ONLY; a bare "GRAPHIC" is accepted by occ, matches no radio in the UI, and silently reverts to default. - write_qrcode_on_footer=false, written with --type=boolean because FooterHandler reads it via getValueBool and the typed appconfig API does not coerce a string "0". The validation URL text is kept. - identification_documents=0 -- the default gates signing behind an ID upload plus admin approval, so signers saw no way to sign. - shareapi_restrict_user_enumeration_full_match=no, so an email owned by an existing account can be added as a signer. Root cause is in core (MailPlugin.php:163), not LibreSign. Do NOT set full_match_email=no -- that disables email signer search entirely. Mail branding (skudakmail app) - Two supported extension points, no core patch and no LibreSign fork: mail_template_class for layout, subjects, button labels and the footer LibreSign never adds; and a BeforeMessageSent listener to embed the wordmark as a cid: part so it survives remote-image blocking. - A third listener adds scoped CSS fixing the signing page being clipped on iOS Safari (100vh -> 100dvh). Patched upstream too. - skudakmail-verify.php.j2 asserts all of the above through the real useTemplate() path and fails the play on drift. Every assertion was proven to fail when deliberately regressed. Redis - memcache.locking was unset, so Nextcloud used DBLockingProvider and every file lock became a MariaDB write -- the contention behind the intermittent multi-second stalls. Verified after: db locks static, redis keys growing. - requirepass lives in a mounted 0640 conf, not --requirepass, which would leak it into podman inspect, the systemd unit and ps. The file is chowned to uid 999 because redis-server does not run as root and the :ro mount stops the image fixing it itself. - No maxmemory: cache is evictable, locks are NOT, and evicting a held lock permits concurrent writers to one file. No persistence either -- a restored RDB could reinstate locks whose owner is long dead. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
41 lines
1.7 KiB
CSS
41 lines
1.7 KiB
CSS
/*
|
|
* Mobile fix for the LibreSign public signing page.
|
|
*
|
|
* PROBLEM: src/ExternalApp.vue sets `height: 100vh` on `html body #content`
|
|
* and again on `#app-sidebar` under `@media (max-width: 512px)`. iOS Safari
|
|
* resolves 100vh against the LARGE viewport -- as though the browser chrome
|
|
* were hidden -- so the element extends behind the bottom toolbar and the
|
|
* signing action bar is clipped off-screen. The built `external` chunk uses
|
|
* 100vh seven times and dvh/svh/safe-area zero times.
|
|
*
|
|
* WHY NOT safe-area-inset: the page's viewport meta is
|
|
* `width=device-width, initial-scale=1.0, minimum-scale=1.0` with no
|
|
* `viewport-fit=cover`, so env(safe-area-inset-bottom) resolves to 0 here.
|
|
*
|
|
* WHY dvh: the dynamic viewport unit tracks the chrome as it shows and hides,
|
|
* which is exactly the behaviour wanted. Browsers without dvh support drop the
|
|
* declaration entirely and keep LibreSign's own 100vh -- so this degrades to
|
|
* today's behaviour rather than to something broken. No @supports needed.
|
|
*
|
|
* SCOPING IS LOad-BEARING. `#content` and `#app-sidebar` are Nextcloud-wide
|
|
* IDs used throughout the authenticated UI. Every rule below is scoped to
|
|
* `#body-public` + `.app-public`, which the public signing page sets:
|
|
* <body id="body-public" class="layout-base">
|
|
* <div id="content" class="app-public" role="main">
|
|
* Widening these selectors would restyle the whole instance.
|
|
*
|
|
* UPSTREAM: patched at source in src/ExternalApp.vue (lines 34 and 46) and
|
|
* submitted to LibreSign. Once that lands and this instance runs a release
|
|
* containing it, this file can be deleted.
|
|
*/
|
|
|
|
#body-public #content.app-public {
|
|
height: 100dvh;
|
|
}
|
|
|
|
@media (max-width: 512px) {
|
|
#body-public #app-sidebar {
|
|
height: 100dvh;
|
|
}
|
|
}
|