mirror of
https://github.com/crowdsecurity/crowdsec.git
synced 2025-05-12 04:45:52 +02:00
fix: deny copy folder to itself or subpath (#1299)
This commit is contained in:
parent
c3dbe0080c
commit
c5dda0ffba
2 changed files with 48 additions and 3 deletions
|
@ -4,6 +4,7 @@ import (
|
||||||
"fmt"
|
"fmt"
|
||||||
"io/ioutil"
|
"io/ioutil"
|
||||||
"os"
|
"os"
|
||||||
|
"path/filepath"
|
||||||
"testing"
|
"testing"
|
||||||
|
|
||||||
"github.com/stretchr/testify/assert"
|
"github.com/stretchr/testify/assert"
|
||||||
|
@ -22,10 +23,36 @@ func Copy(sourceFile string, destinationFile string) error {
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func CopyDir(src string, dest string) error {
|
// checkPathNotContained returns an error if 'subpath' is inside 'path'
|
||||||
|
func checkPathNotContained(path string, subpath string) error {
|
||||||
|
absPath, err := filepath.Abs(path)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
if dest[:len(src)] == src {
|
absSubPath, err := filepath.Abs(subpath)
|
||||||
return fmt.Errorf("Cannot copy a folder into the folder itself!")
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
current := absSubPath
|
||||||
|
for {
|
||||||
|
if current == absPath {
|
||||||
|
return fmt.Errorf("cannot copy a folder onto itself")
|
||||||
|
}
|
||||||
|
up := filepath.Dir(current)
|
||||||
|
if current == up {
|
||||||
|
break
|
||||||
|
}
|
||||||
|
current = up
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func CopyDir(src string, dest string) error {
|
||||||
|
err := checkPathNotContained(src, dest)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
f, err := os.Open(src)
|
f, err := os.Open(src)
|
||||||
|
|
18
pkg/cstest/utils_test.go
Normal file
18
pkg/cstest/utils_test.go
Normal file
|
@ -0,0 +1,18 @@
|
||||||
|
package cstest
|
||||||
|
|
||||||
|
import (
|
||||||
|
"testing"
|
||||||
|
|
||||||
|
"github.com/stretchr/testify/assert"
|
||||||
|
)
|
||||||
|
|
||||||
|
func TestCheckPathNotContained(t *testing.T) {
|
||||||
|
assert.Nil(t, checkPathNotContained("/foo", "/bar"))
|
||||||
|
assert.Nil(t, checkPathNotContained("/foo/bar", "/foo"))
|
||||||
|
assert.Nil(t, checkPathNotContained("/foo/bar", "/"))
|
||||||
|
assert.Nil(t, checkPathNotContained("/path/to/somewhere", "/path/to/somewhere-else"))
|
||||||
|
assert.Nil(t, checkPathNotContained("~/.local/path/to/somewhere", "~/.local/path/to/somewhere-else"))
|
||||||
|
assert.NotNil(t, checkPathNotContained("/foo", "/foo/bar"))
|
||||||
|
assert.NotNil(t, checkPathNotContained("/", "/foo"))
|
||||||
|
assert.NotNil(t, checkPathNotContained("/", "/foo/bar/baz"))
|
||||||
|
}
|
Loading…
Add table
Add a link
Reference in a new issue