Skip to content

Commit 33e06c7

Browse files
authored
Merge pull request #270 from crazy-max/regexp-opt
Option to escape all regular expression metacharacters
2 parents 186025b + 4287322 commit 33e06c7

File tree

4 files changed

+31
-2
lines changed

4 files changed

+31
-2
lines changed

docs/config/server/ftp.md

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717
disableUTF8: false
1818
disableEPSV: false
1919
disableMLSD: false
20+
escapeRegexpMeta: false
2021
tls: false
2122
insecureSkipVerify: false
2223
logTrace: false
@@ -182,6 +183,25 @@ properly. (default `false`)
182183
!!! abstract "Environment variables"
183184
* `FTPGRAB_SERVER_FTP_DISABLEMLSD`
184185

186+
### `escapeRegexpMeta`
187+
188+
Escapes all regular expression metacharacters in the source path. (default `false`)
189+
190+
!!! warning
191+
This setting is only useful for FTP servers that enforce global matching or
192+
if you don't want to use regular expressions when listing files.
193+
More info: https://github.com/crazy-max/ftpgrab/issues/49#issuecomment-489137115
194+
195+
!!! example "Config file"
196+
```yaml
197+
server:
198+
ftp:
199+
escapeRegexpMeta: false
200+
```
201+
202+
!!! abstract "Environment variables"
203+
* `FTPGRAB_SERVER_FTP_ESCAPEREGEXPMETA`
204+
185205
### `tls`
186206

187207
Use implicit FTP over TLS. (default `false`)

internal/config/config_test.go

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,7 @@ func TestLoadFile(t *testing.T) {
5454
DisableUTF8: utl.NewFalse(),
5555
DisableEPSV: utl.NewFalse(),
5656
DisableMLSD: utl.NewFalse(),
57+
EscapeRegexpMeta: utl.NewFalse(),
5758
TLS: utl.NewFalse(),
5859
InsecureSkipVerify: utl.NewFalse(),
5960
LogTrace: utl.NewFalse(),
@@ -159,6 +160,7 @@ func TestLoadEnv(t *testing.T) {
159160
DisableUTF8: utl.NewFalse(),
160161
DisableEPSV: utl.NewFalse(),
161162
DisableMLSD: utl.NewFalse(),
163+
EscapeRegexpMeta: utl.NewFalse(),
162164
TLS: utl.NewFalse(),
163165
InsecureSkipVerify: utl.NewFalse(),
164166
LogTrace: utl.NewFalse(),
@@ -315,6 +317,7 @@ func TestLoadMixed(t *testing.T) {
315317
DisableUTF8: utl.NewFalse(),
316318
DisableEPSV: utl.NewFalse(),
317319
DisableMLSD: utl.NewFalse(),
320+
EscapeRegexpMeta: utl.NewFalse(),
318321
TLS: utl.NewFalse(),
319322
InsecureSkipVerify: utl.NewFalse(),
320323
LogTrace: utl.NewFalse(),

internal/config/server_ftp.go

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ type ServerFTP struct {
1919
DisableUTF8 *bool `yaml:"disableUTF8,omitempty" json:"disableUTF8,omitempty"`
2020
DisableEPSV *bool `yaml:"disableEPSV,omitempty" json:"disableEPSV,omitempty"`
2121
DisableMLSD *bool `yaml:"disableMLSD,omitempty" json:"disableMLSD,omitempty"`
22+
EscapeRegexpMeta *bool `yaml:"escapeRegexpMeta,omitempty" json:"escapeRegexpMeta,omitempty"`
2223
TLS *bool `yaml:"tls,omitempty" json:"tls,omitempty"`
2324
InsecureSkipVerify *bool `yaml:"insecureSkipVerify,omitempty" json:"insecureSkipVerify,omitempty"`
2425
LogTrace *bool `yaml:"logTrace,omitempty" json:"logTrace,omitempty"`
@@ -39,6 +40,7 @@ func (s *ServerFTP) SetDefaults() {
3940
s.DisableUTF8 = utl.NewFalse()
4041
s.DisableEPSV = utl.NewFalse()
4142
s.DisableMLSD = utl.NewFalse()
43+
s.EscapeRegexpMeta = utl.NewFalse()
4244
s.TLS = utl.NewFalse()
4345
s.InsecureSkipVerify = utl.NewFalse()
4446
s.LogTrace = utl.NewFalse()

internal/server/ftp/client.go

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -76,9 +76,13 @@ func (c *Client) Common() config.ServerCommon {
7676
}
7777

7878
// ReadDir fetches the contents of a directory, returning a list of os.FileInfo's
79-
func (c *Client) ReadDir(path string) ([]os.FileInfo, error) {
79+
func (c *Client) ReadDir(dir string) ([]os.FileInfo, error) {
8080
var files []*ftp.Entry
81-
files, err := c.ftp.List(regexp.QuoteMeta(path))
81+
82+
if *c.cfg.EscapeRegexpMeta {
83+
dir = regexp.QuoteMeta(dir)
84+
}
85+
files, err := c.ftp.List(dir)
8286
if err != nil {
8387
return nil, err
8488
}

0 commit comments

Comments
 (0)