Skip to content

Commit

Permalink
feat!: simplified rule with regex instead of boolean
Browse files Browse the repository at this point in the history
BREAKING CHANGE: the "regex" field in the rule is now a regular expression instead of a boolean.
  • Loading branch information
hacdias committed Jul 29, 2024
1 parent d373232 commit e7e9c31
Show file tree
Hide file tree
Showing 7 changed files with 22 additions and 25 deletions.
3 changes: 1 addition & 2 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -110,8 +110,7 @@ users:
modify: true
# With this rule, the user CAN modify all files ending with .js. It uses
# a regular expression.
- path: "^*.js$"
regex: true
- regex: "^.+\.js$"
modify: true

# CORS configuration
Expand Down
1 change: 1 addition & 0 deletions go.mod
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ module github.com/hacdias/webdav/v5
go 1.22

require (
github.com/go-viper/mapstructure/v2 v2.0.0
github.com/rs/cors v1.11.0
github.com/spf13/cobra v1.8.1
github.com/spf13/pflag v1.0.5
Expand Down
2 changes: 2 additions & 0 deletions go.sum
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,8 @@ github.com/frankban/quicktest v1.14.6 h1:7Xjx+VpznH+oBnejlPUj8oUpdxnVs4f8XU8WnHk
github.com/frankban/quicktest v1.14.6/go.mod h1:4ptaffx2x8+WTWXmUCuVU6aPUX1/Mz7zb5vbUoiM6w0=
github.com/fsnotify/fsnotify v1.7.0 h1:8JEhPFa5W2WU7YfeZzPNqzMP6Lwt7L2715Ggo0nosvA=
github.com/fsnotify/fsnotify v1.7.0/go.mod h1:40Bi/Hjc2AVfZrqy+aj+yEI+/bRxZnMJyTJwOpGvigM=
github.com/go-viper/mapstructure/v2 v2.0.0 h1:dhn8MZ1gZ0mzeodTG3jt5Vj/o87xZKuNAprG2mQfMfc=
github.com/go-viper/mapstructure/v2 v2.0.0/go.mod h1:oJDH3BJKyqBA2TXFhDsKDGDTlndYOZ6rGS0BRZIxGhM=
github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI=
github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY=
github.com/hashicorp/hcl v1.0.0 h1:0Anlzjpi4vEasTeNFn2mLJgTSwt0+6sfsiTG8qcWGx4=
Expand Down
7 changes: 6 additions & 1 deletion lib/config.go
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ import (
"path/filepath"
"strings"

"github.com/go-viper/mapstructure/v2"
"github.com/spf13/pflag"
"github.com/spf13/viper"
)
Expand Down Expand Up @@ -101,7 +102,11 @@ func ParseConfig(filename string, flags *pflag.FlagSet) (*Config, error) {
}

cfg := &Config{}
err = v.Unmarshal(cfg)
err = v.Unmarshal(cfg, viper.DecodeHook(mapstructure.ComposeDecodeHookFunc(
mapstructure.StringToTimeDurationHookFunc(),
mapstructure.StringToSliceHookFunc(","),
mapstructure.TextUnmarshallerHookFunc(),
)))
if err != nil {
return nil, err
}
Expand Down
12 changes: 5 additions & 7 deletions lib/config_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -176,11 +176,9 @@ auth: false
scope: /
modify: true
rules:
- path: '^.+\.js$'
regex: true
- regex: '^.+\.js$'
modify: true
- path: /public/access/
regex: false
modify: true`

cfg := writeAndParseConfig(t, content, ".yaml")
Expand All @@ -189,12 +187,12 @@ rules:
require.Len(t, cfg.Rules, 2)

require.Empty(t, cfg.Rules[0].Path)
require.NotNil(t, cfg.Rules[0].Regexp)
require.True(t, cfg.Rules[0].Regexp.MatchString("/my/path/to/file.js"))
require.False(t, cfg.Rules[0].Regexp.MatchString("/my/path/to/file.ts"))
require.NotNil(t, cfg.Rules[0].Regex)
require.True(t, cfg.Rules[0].Regex.MatchString("/my/path/to/file.js"))
require.False(t, cfg.Rules[0].Regex.MatchString("/my/path/to/file.ts"))

require.NotEmpty(t, cfg.Rules[1].Path)
require.Nil(t, cfg.Rules[1].Regexp)
require.Nil(t, cfg.Rules[1].Regex)
}

func TestConfigEnv(t *testing.T) {
Expand Down
3 changes: 1 addition & 2 deletions lib/handler_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -161,8 +161,7 @@ users:
- username: basic
password: basic
rules:
- path: "^.+.js$"
regex: true
- regex: "^.+.js$"
modify: false
- path: "/b"
modify: false
Expand Down
19 changes: 6 additions & 13 deletions lib/permissions.go
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
package lib

import (
"errors"
"fmt"
"net/http"
"regexp"
Expand All @@ -15,32 +16,24 @@ var readMethods = []string{
}

type Rule struct {
Regex bool
Allow bool
Modify bool
Path string
// TODO: remove Regex and replace by this. It encodes
Regexp *regexp.Regexp `mapstructure:"-"`
Regex *regexp.Regexp
}

func (r *Rule) Validate() error {
if r.Regex {
rp, err := regexp.Compile(r.Path)
if err != nil {
return fmt.Errorf("invalid rule: %w", err)
}
r.Regexp = rp
r.Path = ""
r.Regex = false
if r.Regex != nil && r.Path != "" {
return errors.New("invalid rule: cannot define both regex and path")
}

return nil
}

// Matches checks if [Rule] matches the given path.
func (r *Rule) Matches(path string) bool {
if r.Regexp != nil {
return r.Regexp.MatchString(path)
if r.Regex != nil {
return r.Regex.MatchString(path)
}

return strings.HasPrefix(path, r.Path)
Expand Down

0 comments on commit e7e9c31

Please sign in to comment.