You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
feat(external-sources): auto-pin SHA-256 on external install (TOFU) (#95)
Records the observed SHA-256 of every externally-installed artifact in the
app's source binding on first successful install, and enforces it on any
later download of the same app+version from the same source. A rewritten
GitHub/Codeberg release (including a co-published, rewritten .sha256
sibling) now fails the install closed instead of being silently absorbed.
- SourceBinding gains a capped (200-entry, oldest-evicted) sha256 map with
typed accessors, round-tripping through toArray()/fromArray()
- ExternalReleaseInstallerService enforces the recorded digest before
extraction/backup (no filesystem change on mismatch), records on success
only, and supports a single-request acceptNewSha override that is
warning-logged and folded into the existing install audit entry
- SourceBindingStore preserves recorded digests on a same-source rebind and
discards them on a different-source rebind (single write path for both
the bind endpoint and the implicit install-time bind)
- API: binding read + version list expose recorded digests; install
responses carry a sha_mismatch machine-readable code (422) with expected/
actual digests, and a recordedShaMatched flag on success
- Frontend: version picker badges versions with a recorded digest; a new
ShaMismatchDialog offers the explicit "Accept new checksum and install"
escape hatch through the normal password-confirmed install flow
Co-authored-by: Conduction Release Bot <release-bot@conduction.nl>
Copy file name to clipboardExpand all lines: appinfo/info.xml
+1-1Lines changed: 1 addition & 1 deletion
Original file line number
Diff line number
Diff line change
@@ -7,7 +7,7 @@
7
7
<description>> ⚠️ **Active development — not for production use yet.** This app is under active development. Although it may carry a stable release status, **please do not use it in production environments before 12 June 2026.** See [conduction.nl/apps](https://conduction.nl/apps) for release planning and what this app does.
8
8
9
9
App Versions gives Nextcloud administrators the ability to roll back apps to previous versions or install specific newer versions. Essential for debugging, testing compatibility, and recovering from broken updates.</description>
Copy file name to clipboardExpand all lines: l10n/nl.json
+9-1Lines changed: 9 additions & 1 deletion
Original file line number
Diff line number
Diff line change
@@ -18,7 +18,15 @@
18
18
"{appId} is pinned to {pinnedVersion} but is now running {observedVersion} — something other than App Versions changed it.": "{appId} is vastgezet op {pinnedVersion}, maar draait nu {observedVersion} — iets anders dan App Versions heeft dit gewijzigd.",
19
19
"Re-pin {version}": "Opnieuw vastzetten op {version}",
20
20
"Accept: move pin to {version}": "Accepteren: vastzetting verplaatsen naar {version}",
"Checksum does not match first install": "Checksum komt niet overeen met de eerste installatie",
23
+
"Accept new checksum and install": "Nieuwe checksum accepteren en installeren",
24
+
"{appId} {version} was previously installed with a different SHA-256 checksum. The upstream release may have been rewritten since — App Versions blocks the install to protect you from a silently altered artifact.": "{appId} {version} is eerder geïnstalleerd met een andere SHA-256-checksum. De release bij de bron is mogelijk sindsdien herschreven — App Versions blokkeert de installatie om je te beschermen tegen een stilzwijgend gewijzigd bestand.",
25
+
"Recorded at first install": "Vastgelegd bij eerste installatie",
26
+
"Just downloaded": "Zojuist gedownload",
27
+
"Only accept if you are certain this change is legitimate — for example the maintainer re-tagged the release to fix a packaging error.": "Accepteer dit alleen als je zeker weet dat deze wijziging legitiem is — bijvoorbeeld wanneer de maintainer de release opnieuw heeft getagd om een verpakkingsfout te herstellen.",
28
+
"Matches first-install checksum": "Komt overeen met checksum van eerste installatie",
@@ -152,6 +160,7 @@ public function hintFor(string $category): string {
152
160
self::CATEGORY_PREFLIGHT_PERMISSION => $l->t('The app folder is not writable by the web-server user. If this is a bind-mounted dev checkout, fix the folder ownership/permissions (or install the app into a writable apps directory).'),
153
161
self::CATEGORY_DOWNLOAD => $l->t('The release could not be downloaded from its source. Check connectivity to the source and that the release asset still exists.'),
154
162
self::CATEGORY_CHECKSUM_MISMATCH => $l->t('The downloaded archive failed its integrity check. The release may be corrupted or tampered with; do not install it.'),
163
+
self::CATEGORY_SHA_MISMATCH => $l->t('The downloaded artifact does not match the SHA-256 recorded the first time this version was installed. The upstream release may have been rewritten. Only proceed if you are certain the new artifact is legitimate, then explicitly accept the new checksum to install it.'),
155
164
self::CATEGORY_EXTRACT => $l->t('The release archive could not be extracted. The downloaded file may be incomplete or not a valid app archive.'),
156
165
self::CATEGORY_APPID_MISMATCH => $l->t('The downloaded archive is for a different app than requested. Verify the source binding points at the correct repository.'),
157
166
self::CATEGORY_VERSION_MISMATCH => $l->t('The downloaded archive declares a different version than requested. The source metadata and asset may be out of sync.'),
0 commit comments