Pin only-office's secure-link secret, so its document service and nginx sign and check Editor.bin links with one value across restarts (issue 1837)
mesh/merge-gate head 35e4764d354a merged into trunk 7bf63b0ac597 — pass: builds only-office → novox; no bus step; every machine composes with the change as…
mesh/repo-check head 35e4764d354a merged into trunk 7bf63b0ac597 — pass: its merge-check.sh passed, each part in its toolchain: merge-check.sh (go), merge-…
mesh/delivery delivered
mesh/check failed: unit: modules/gitea.test: [gitea] where the poll of merges last looked from could not be read, so none is kept — no runtime | 35e47…

This commit is contained in:
jochen
2026-10-22 13:40:42 +02:00
parent b7b9f2a3da
commit 35e4764d35
3 changed files with 38 additions and 1 deletions
+1
View File
@@ -2,4 +2,5 @@ JWT_ENABLED=true
JWT_SECRET=${secret:jwt} JWT_SECRET=${secret:jwt}
JWT_HEADER=Authorization JWT_HEADER=Authorization
JWT_IN_BODY=true JWT_IN_BODY=true
SECURE_LINK_SECRET=${secret:secure-link}
ALLOW_PRIVATE_IP_ADDRESS=true ALLOW_PRIVATE_IP_ADDRESS=true
+32
View File
@@ -2,6 +2,7 @@ package office
import ( import (
"os" "os"
"strings"
"testing" "testing"
"git.novox.be/novox/mesh-sdk/go/catalogue" "git.novox.be/novox/mesh-sdk/go/catalogue"
@@ -61,3 +62,34 @@ func TestManifestOffersDocumentServer(t *testing.T) {
t.Errorf("serves.document-server.public-root = %q, want https://${bound:route:name}/", root) t.Errorf("serves.document-server.public-root = %q, want https://${bound:route:name}/", root)
} }
} }
// 1837/AC1 (unit: manifest check)
// Given the catalogue, when only-office's manifest and its server.env template are read, then the
// document server's secure-link secret is an own secret taken at start, and server.env hands it to
// the container as SECURE_LINK_SECRET, so its document service and its nginx sign and check
// Editor.bin links with one value across every restart.
func TestSecureLinkSecretIsPinned(t *testing.T) {
raw, err := os.ReadFile("module.json")
if err != nil {
t.Fatalf("reading module.json: %v", err)
}
m, err := catalogue.ParseManifest(raw)
if err != nil {
t.Fatalf("parsing module.json: %v", err)
}
own, ok := m.OwnSecrets["secure-link"]
if !ok {
t.Fatal("manifest declares no own-secret secure-link")
}
if own.Taken != catalogue.TakenAtStart {
t.Errorf("own-secrets.secure-link.taken = %q, want %q", own.Taken, catalogue.TakenAtStart)
}
env, err := os.ReadFile("files/server.env")
if err != nil {
t.Fatalf("reading files/server.env: %v", err)
}
if !strings.Contains(string(env), "\nSECURE_LINK_SECRET=${secret:secure-link}\n") {
t.Errorf("files/server.env does not set SECURE_LINK_SECRET=${secret:secure-link}:\n%s", env)
}
}
+5 -1
View File
@@ -76,6 +76,10 @@
"owner": "only-office-converter", "owner": "only-office-converter",
"taken": "at-start" "taken": "at-start"
}, },
"secure-link": {
"path": "${dir:state}/secure-link.secret",
"taken": "at-start"
},
"broker-converter": { "broker-converter": {
"path": "${dir:state}/broker-converter.secret", "path": "${dir:state}/broker-converter.secret",
"owner": "only-office-converter" "owner": "only-office-converter"
@@ -225,7 +229,7 @@
"${dir:redis}:/var/lib/redis", "${dir:redis}:/var/lib/redis",
"${dir:fonts}:/usr/share/fonts/truetype/custom" "${dir:fonts}:/usr/share/fonts/truetype/custom"
], ],
"secrets-in-environment": "run-document-server.sh regenerates JWT_SECRET from the environment on every start and overwrites local.json; not convertible" "secrets-in-environment": "run-document-server.sh regenerates JWT_SECRET and SECURE_LINK_SECRET from the environment on every start and overwrites local.json and nginx's ds.conf; not convertible"
}, },
{ {
"id": "converter", "id": "converter",