Skip to content

Commit cc5ca55

Browse files
committed
feat(param): normalize file system path from arguments
1 parent d98add1 commit cc5ca55

File tree

4 files changed

+62
-33
lines changed

4 files changed

+62
-33
lines changed

src/param/cli.go

Lines changed: 16 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,6 @@ import (
77
"../version"
88
"fmt"
99
"os"
10-
"path/filepath"
1110
"strings"
1211
)
1312

@@ -267,6 +266,8 @@ func doParseCli() []*Param {
267266
}
268267

269268
// init param data
269+
var err error
270+
var errs []error
270271
for _, result := range results {
271272
param := &Param{}
272273

@@ -289,7 +290,8 @@ func doParseCli() []*Param {
289290

290291
// root
291292
root, _ := result.GetString("root")
292-
root, _ = util.NormalizeFsPath(root)
293+
root, err = util.NormalizeFsPath(root)
294+
serverErrHandler.CheckFatal(err)
293295
param.Root = root
294296

295297
// normalize url prefixes
@@ -314,37 +316,39 @@ func doParseCli() []*Param {
314316

315317
// restrict access urls
316318
restrictAccessUrls, _ := result.GetStrings("restrictaccessurls")
317-
param.RestrictAccessUrls = normalizePathRestrictAccesses(restrictAccessUrls, util.CleanUrlPath)
319+
param.RestrictAccessUrls, errs = normalizePathRestrictAccesses(restrictAccessUrls, util.NormalizeUrlPath)
320+
serverErrHandler.CheckFatal(errs...)
318321

319322
// restrict access dirs
320323
restrictAccessDirs, _ := result.GetStrings("restrictaccessdirs")
321-
param.RestrictAccessDirs = normalizePathRestrictAccesses(restrictAccessDirs, filepath.Clean)
324+
param.RestrictAccessDirs, errs = normalizePathRestrictAccesses(restrictAccessDirs, util.NormalizeFsPath)
325+
serverErrHandler.CheckFatal(errs...)
322326

323327
// global headers
324328
globalHeaders, _ := result.GetStrings("globalheaders")
325329
param.GlobalHeaders = entriesToHeaders(globalHeaders)
326330

327331
// headers urls
328332
arrHeadersUrls, _ := result.GetStrings("headersurls")
329-
param.HeadersUrls = normalizePathHeadersMap(arrHeadersUrls, util.CleanUrlPath)
333+
param.HeadersUrls, errs = normalizePathHeadersMap(arrHeadersUrls, util.NormalizeUrlPath)
334+
serverErrHandler.CheckFatal(errs...)
330335

331336
// headers dirs
332337
arrHeadersDirs, _ := result.GetStrings("headersdirs")
333-
param.HeadersDirs = normalizePathHeadersMap(arrHeadersDirs, filepath.Clean)
338+
param.HeadersDirs, errs = normalizePathHeadersMap(arrHeadersDirs, util.NormalizeFsPath)
339+
serverErrHandler.CheckFatal(errs...)
334340

335341
// certificate
336342
certFiles, _ := result.GetStrings("certs")
337343
keyFiles, _ := result.GetStrings("keys")
338344
certs, errs := LoadCertificates(certFiles, keyFiles)
339-
if len(errs) > 0 {
340-
serverErrHandler.CheckFatal(errs...)
341-
} else {
342-
param.Certificates = certs
343-
}
345+
serverErrHandler.CheckFatal(errs...)
346+
param.Certificates = certs
344347

345348
// normalize aliases
346349
arrAlias, _ := result.GetStrings("aliases")
347-
param.Aliases = normalizePathMaps(arrAlias)
350+
param.Aliases, errs = normalizePathMaps(arrAlias)
351+
serverErrHandler.CheckFatal(errs...)
348352

349353
// normalize upload urls
350354
arrUploadUrls, _ := result.GetStrings("uploadurls")

src/param/strUtil.go

Lines changed: 28 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -53,16 +53,22 @@ func splitKeyValue(input string) (sep rune, sepLen int, k, v string, ok bool) {
5353
return sep, sepLen, k, v, true
5454
}
5555

56-
func normalizePathRestrictAccesses(inputs []string, normalizePath func(string) string) map[string][]string {
57-
maps := make(map[string][]string, len(inputs))
56+
func normalizePathRestrictAccesses(
57+
inputs []string,
58+
normalizePath func(string) (string, error),
59+
) (maps map[string][]string, errs []error) {
60+
maps = make(map[string][]string, len(inputs))
5861

5962
for i := range inputs {
6063
reqPath, hosts, ok := splitKeyValues(inputs[i])
6164
if !ok {
6265
continue
6366
}
6467

65-
normalizedPath := normalizePath(reqPath)
68+
normalizedPath, err := normalizePath(reqPath)
69+
if err != nil {
70+
errs = append(errs, err)
71+
}
6672
normalizedHosts := util.ExtractHostsFromUrls(hosts)
6773

6874
for existingPath := range maps {
@@ -75,11 +81,14 @@ func normalizePathRestrictAccesses(inputs []string, normalizePath func(string) s
7581
maps[normalizedPath] = append(maps[normalizedPath], normalizedHosts...)
7682
}
7783

78-
return maps
84+
return
7985
}
8086

81-
func normalizePathHeadersMap(inputs []string, normalizePath func(string) string) map[string][][2]string {
82-
maps := make(map[string][][2]string, len(inputs))
87+
func normalizePathHeadersMap(
88+
inputs []string,
89+
normalizePath func(string) (string, error),
90+
) (maps map[string][][2]string, errs []error) {
91+
maps = make(map[string][][2]string, len(inputs))
8392

8493
for _, input := range inputs {
8594
sep, sepLen, reqPath, header, ok := splitKeyValue(input)
@@ -91,7 +100,10 @@ func normalizePathHeadersMap(inputs []string, normalizePath func(string) string)
91100
continue
92101
}
93102

94-
normalizedPath := normalizePath(reqPath)
103+
normalizedPath, err := normalizePath(reqPath)
104+
if err != nil {
105+
errs = append(errs, err)
106+
}
95107
headerName := header[:sepIndex]
96108
headerValue := header[sepIndex+1:]
97109

@@ -105,11 +117,12 @@ func normalizePathHeadersMap(inputs []string, normalizePath func(string) string)
105117
maps[normalizedPath] = append(maps[normalizedPath], [2]string{headerName, headerValue})
106118
}
107119

108-
return maps
120+
return
109121
}
110122

111-
func normalizePathMaps(inputs []string) map[string]string {
112-
maps := make(map[string]string, len(inputs))
123+
func normalizePathMaps(inputs []string) (maps map[string]string, errs []error) {
124+
maps = make(map[string]string, len(inputs))
125+
var err error
113126

114127
for _, input := range inputs {
115128
_, _, urlPath, fsPath, ok := splitKeyValue(input)
@@ -118,7 +131,10 @@ func normalizePathMaps(inputs []string) map[string]string {
118131
}
119132

120133
urlPath = util.CleanUrlPath(urlPath)
121-
fsPath = filepath.Clean(fsPath)
134+
fsPath, err = util.NormalizeFsPath(fsPath)
135+
if err != nil {
136+
errs = append(errs, err)
137+
}
122138

123139
for existingUrl := range maps {
124140
if util.IsPathEqual(existingUrl, urlPath) {
@@ -130,7 +146,7 @@ func normalizePathMaps(inputs []string) map[string]string {
130146
maps[urlPath] = fsPath
131147
}
132148

133-
return maps
149+
return
134150
}
135151

136152
func normalizeUrlPaths(inputs []string) []string {

src/param/strUtil_test.go

Lines changed: 13 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,8 @@
11
package param
22

33
import (
4-
"path"
4+
"../util"
5+
"path/filepath"
56
"testing"
67
)
78

@@ -116,11 +117,11 @@ func TestSplitKeyValue(t *testing.T) {
116117
}
117118

118119
func TestNormalizePathRestrictAccesses(t *testing.T) {
119-
results := normalizePathRestrictAccesses([]string{
120+
results, _ := normalizePathRestrictAccesses([]string{
120121
":/foo:host1:host2",
121122
":/foo/:host3:host4",
122123
":/bar",
123-
}, path.Clean)
124+
}, util.NormalizeUrlPath)
124125

125126
if len(results) != 2 {
126127
t.Error()
@@ -136,15 +137,15 @@ func TestNormalizePathRestrictAccesses(t *testing.T) {
136137
func TestNormalizePathHeadersMap(t *testing.T) {
137138
var result map[string][][2]string
138139

139-
result = normalizePathHeadersMap([]string{
140+
result, _ = normalizePathHeadersMap([]string{
140141
":/foo:X-header1:X-Value1",
141142
":/foo/:X-header2:X-Value2",
142143
":/bar:X-header3:X-Value3",
143144
":baz",
144145
":baz:",
145146
":baz:X-Not-Valid",
146147
":baz:X-Not-Valid:",
147-
}, path.Clean)
148+
}, util.NormalizeUrlPath)
148149

149150
if len(result) != 2 {
150151
t.Error(result)
@@ -170,20 +171,23 @@ func TestNormalizePathHeadersMap(t *testing.T) {
170171

171172
func TestNormalizePathMaps(t *testing.T) {
172173
var maps map[string]string
174+
var fsPath string
173175

174-
maps = normalizePathMaps([]string{":/data/lib://usr/lib"})
175-
if maps["/data/lib"] != "/usr/lib" {
176+
maps, _ = normalizePathMaps([]string{":/data/lib://usr/lib"})
177+
fsPath, _ = filepath.Abs("/usr/lib")
178+
if maps["/data/lib"] != fsPath {
176179
t.Error(maps)
177180
}
178181

179-
maps = normalizePathMaps([]string{":/data/lib://usr/lib", "@foo@bar/baz"})
182+
maps, _ = normalizePathMaps([]string{":/data/lib://usr/lib", "@foo@bar/baz"})
180183
if len(maps) != 2 {
181184
t.Error(maps)
182185
}
183186
if maps["/data/lib"] != "/usr/lib" {
184187
t.Error(maps)
185188
}
186-
if maps["/foo"] != "bar/baz" {
189+
fsPath, _ = filepath.Abs("bar/baz")
190+
if maps["/foo"] != fsPath {
187191
t.Error(maps)
188192
}
189193
}

src/util/path.go

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -92,3 +92,8 @@ func hasPrefixDirNoCase(absPath, prefix string, separator byte) bool {
9292

9393
return false
9494
}
95+
96+
func NormalizeUrlPath(input string) (string, error) { // keep same func signature as `NormalizeFsPath`
97+
result := CleanUrlPath(input)
98+
return result, nil
99+
}

0 commit comments

Comments
 (0)