v0.331.0: OnlyOffice opens and saves from FileBrowser and Nextcloud; FileBrowser back at once after a restart (R-1018)
gates / gates (push) Successful in 48s

FileBrowser config carries server.internalUrl http://filebrowser:80 (OnlyOffice fetched the public files address and got 403);
Nextcloud's DocumentServerInternalUrl gets its trailing slash (every save was lost: http://onlyoffice:80cache/...);
RestartStack("filebrowser") runs the R-1126 gate at once (files.<domain> was 502 for up to 5 min after the link switched).
Each red-proofed. MinAgent 0.158.1.
This commit is contained in:
2026-10-18 21:05:04 +02:00
parent 615940de35
commit 772ef36f5f
10 changed files with 317 additions and 44 deletions
@@ -0,0 +1,44 @@
package integrations
import (
"net/url"
"strings"
"testing"
)
// R-1018: Nextcloud's OnlyOffice connector builds its server-to-server requests by APPENDING a path to the two inside
// addresses the apply sets. The consequence pinned: the address the apply really sends, plus such a path, is a request
// to the right container. Measured on demo-hp 2026-10-18: without the slash Nextcloud asked
// http://onlyoffice:80cache/files/… and every save was lost. RED-PROOF: drop the slash from ncDocServerInternalURL →
// the cache URL no longer parses (port "80cache") and this fails.
func TestNextcloudApply_R1018_InternalAddressesTakeAPath(t *testing.T) {
values := map[string]string{}
for _, c := range nextcloudApplyCommands("https://office.example.hu", "secret") {
if len(c.args) >= 11 && c.args[7] == "config:app:set" {
values[c.args[9]] = strings.TrimPrefix(c.args[10], "--value=")
}
}
for _, tc := range []struct {
key, path, host string
}{
{"DocumentServerInternalUrl", "cache/files/data/2153553391_5872/output.docx/output.docx", "onlyoffice:80"},
{"DocumentServerInternalUrl", "converter?shardkey=thumb_1", "onlyoffice:80"},
{"StorageUrl", "apps/onlyoffice/track?doc=x", "nextcloud"},
} {
base, ok := values[tc.key]
if !ok {
t.Fatalf("the apply does not set %s (set: %v)", tc.key, values)
}
u, err := url.Parse(base + tc.path)
if err != nil {
t.Errorf("%s %q + %q is not a URL: %v", tc.key, base, tc.path, err)
continue
}
if u.Host != tc.host || !strings.HasPrefix(u.Path, "/"+strings.SplitN(tc.path, "?", 2)[0][:4]) {
t.Errorf("%s %q + %q reaches host %q path %q, want host %q", tc.key, base, tc.path, u.Host, u.Path, tc.host)
}
}
if values["DocumentServerUrl"] != "https://office.example.hu" {
t.Errorf("DocumentServerUrl = %q, want the public office address", values["DocumentServerUrl"])
}
}