Skip to content

Commit 8321a99

Browse files
committed
Allow signurl default bucket path without server
1 parent 7acdcdb commit 8321a99

2 files changed

Lines changed: 32 additions & 14 deletions

File tree

cmd/signurl/main.go

Lines changed: 5 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -34,11 +34,6 @@ func run(args []string, stdout, stderr io.Writer, now func() time.Time) int {
3434
if err := fs.Parse(args); err != nil {
3535
return 2
3636
}
37-
if *defaultBucketPath && *server == "" {
38-
fmt.Fprintln(stderr, "default-bucket-path requires -server")
39-
fs.Usage()
40-
return 2
41-
}
4237
if *bucket == "" || *key == "" || *secret == "" {
4338
fmt.Fprintln(stderr, "bucket, key, and secret are required")
4439
fs.Usage()
@@ -65,7 +60,11 @@ func run(args []string, stdout, stderr io.Writer, now func() time.Time) int {
6560
var raw string
6661
var err error
6762
if *server == "" {
68-
raw, err = signing.SignURL(input)
63+
if *defaultBucketPath {
64+
raw, err = signing.SignURLForModeWithOptions(input, publicpath.ModeSingle, signing.SignOptions{DefaultBucketPath: true})
65+
} else {
66+
raw, err = signing.SignURL(input)
67+
}
6968
} else {
7069
raw, err = signing.SignURLForModeWithOptions(input, publicpath.ModeMulti, signing.SignOptions{DefaultBucketPath: *defaultBucketPath})
7170
}

cmd/signurl/main_test.go

Lines changed: 27 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ package main
22

33
import (
44
"bytes"
5+
"net/url"
56
"strings"
67
"testing"
78
"time"
@@ -97,23 +98,41 @@ func TestRunPrintsDefaultBucketPathURLAcceptedByValidator(t *testing.T) {
9798
}
9899
}
99100

100-
func TestRunRejectsDefaultBucketPathWithoutServer(t *testing.T) {
101+
func TestRunPrintsSingleServerDefaultBucketPathURLAcceptedByValidator(t *testing.T) {
102+
now := time.Date(2026, 6, 8, 12, 0, 0, 0, time.UTC)
101103
var stdout, stderr bytes.Buffer
102104
code := run([]string{
105+
"-method", "GET",
103106
"-base-url", "https://files.example.com",
104107
"-default-bucket-path",
105108
"-bucket", "demo",
106109
"-key", "file.txt",
107110
"-secret", "secret",
108-
}, &stdout, &stderr, time.Now)
109-
if code != 2 {
110-
t.Fatalf("run() code = %d, want 2", code)
111+
"-expiration", "1m",
112+
}, &stdout, &stderr, func() time.Time { return now })
113+
if code != 0 {
114+
t.Fatalf("run() code = %d, stderr = %s", code, stderr.String())
111115
}
112-
if stdout.Len() != 0 {
113-
t.Fatalf("stdout = %q, want empty", stdout.String())
116+
raw := strings.TrimSpace(stdout.String())
117+
u, err := url.Parse(raw)
118+
if err != nil {
119+
t.Fatalf("url.Parse() error = %v for %s", err, raw)
114120
}
115-
if !strings.Contains(stderr.String(), "default-bucket-path requires -server") {
116-
t.Fatalf("stderr = %q", stderr.String())
121+
if got, want := u.EscapedPath(), "/file.txt"; got != want {
122+
t.Fatalf("path = %q, want %q", got, want)
123+
}
124+
resolver := func(server string) (string, bool) {
125+
if server == "" {
126+
return "demo", true
127+
}
128+
return "", false
129+
}
130+
claims, err := signing.ValidateURLForModeWithOptions("GET", raw, signing.ValidationConfig{Secret: "secret"}, now, publicpath.ModeSingle, signing.ValidationOptions{DefaultBucket: resolver})
131+
if err != nil {
132+
t.Fatalf("ValidateURLForModeWithOptions() error = %v for %s", err, raw)
133+
}
134+
if claims.Server != "" || claims.Bucket != "demo" || claims.Key != "file.txt" {
135+
t.Fatalf("claims = %#v", claims)
117136
}
118137
}
119138

0 commit comments

Comments
 (0)