From 94864473ce9b067039ce53968e9065b6dd106b4c Mon Sep 17 00:00:00 2001 From: Lemon-miaow Date: Tue, 29 Sep 2026 01:45:43 +0800 Subject: [PATCH] =?UTF-8?q?fix(files):=20=E6=9C=8D=E5=8A=A1=E5=99=A8?= =?UTF-8?q?=E8=BF=90=E8=A1=8C=E6=97=B6=E4=B8=8B=E8=BD=BD=E6=96=87=E4=BB=B6?= =?UTF-8?q?=E7=9A=84=E6=8B=92=E7=BB=9D=E8=AF=B4=E6=98=8E=E6=94=B9=E4=B8=BA?= =?UTF-8?q?=E5=85=88=E5=81=9C=E6=9C=8D=E5=86=8D=E6=93=8D=E4=BD=9C=E6=96=87?= =?UTF-8?q?=E4=BB=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- internal/api/exports.go | 2 +- internal/api/exports_test.go | 7 ++++++- internal/api/handlers_files.go | 2 +- 3 files changed, 8 insertions(+), 3 deletions(-) diff --git a/internal/api/exports.go b/internal/api/exports.go index f8e74db..93ee2ec 100644 --- a/internal/api/exports.go +++ b/internal/api/exports.go @@ -582,7 +582,7 @@ func (a *API) handleDownloadFile(w http.ResponseWriter, r *http.Request) { writeError(w, r, err) return } - release, ok := a.acquireWorld(w, r, name, maintenance.KindExport, "stop the server before editing its files") + release, ok := a.acquireWorld(w, r, name, maintenance.KindExport, "stop the server before downloading its files") if !ok { reg.drop(e) return diff --git a/internal/api/exports_test.go b/internal/api/exports_test.go index 47c3809..de716a0 100644 --- a/internal/api/exports_test.go +++ b/internal/api/exports_test.go @@ -938,11 +938,13 @@ func TestFileDownloadGate(t *testing.T) { edit func(*API, *fakeCluster) code int errCode string + // msg, when set, is what the refusal must say. + msg string }{ {name: "stranger", user: "stranger", query: "a.yml", code: http.StatusForbidden, errCode: "forbidden"}, {name: "principal without an account", user: "nouser", query: "a.yml", code: http.StatusForbidden, errCode: "forbidden"}, {name: "running", user: "owner1", query: "a.yml", edit: func(_ *API, c *fakeCluster) { c.byName["survival"].Ready = true }, - code: http.StatusConflict, errCode: "not_stopped"}, + code: http.StatusConflict, errCode: "not_stopped", msg: "stop the server before working with its files"}, {name: "no world volume", user: "owner1", query: "a.yml", edit: func(_ *API, c *fakeCluster) { c.noWorld["survival"] = true }, code: http.StatusConflict, errCode: "no_world_volume"}, {name: "no file editor", user: "owner1", query: "a.yml", edit: func(a *API, _ *fakeCluster) { a.Files = nil }, @@ -970,6 +972,9 @@ func TestFileDownloadGate(t *testing.T) { if got := decodeErr(t, w); got != tc.errCode { t.Errorf("error code = %q, want %q", got, tc.errCode) } + if tc.msg != "" && !strings.Contains(w.Body.String(), tc.msg) { + t.Errorf("body %s does not say %q", w.Body.String(), tc.msg) + } // Nothing is left behind: no Job, no audit, no ticket, no start // counted against the hour. reg := a.exportTickets() diff --git a/internal/api/handlers_files.go b/internal/api/handlers_files.go index 517e773..9396520 100644 --- a/internal/api/handlers_files.go +++ b/internal/api/handlers_files.go @@ -608,7 +608,7 @@ func (a *API) authorizeFileOp(w http.ResponseWriter, r *http.Request) (string, b } if info.Ready || info.DesiredState != string(v1alpha1.DesiredStopped) { writeError(w, r, newError(http.StatusConflict, "not_stopped", - "stop the server before editing its files")) + "stop the server before working with its files")) return "", false }