From 4e1d5b36b2ad545bf30a86263ae4b9e0a1c7822c Mon Sep 17 00:00:00 2001 From: ston1th Date: Wed, 6 Apr 2022 01:50:28 +0200 Subject: [PATCH] fixed directory decryption --- pkg/provider/crypto/file.go | 20 ++++++++++++++++++-- pkg/provider/crypto/fs.go | 23 +++++++++++++++-------- 2 files changed, 33 insertions(+), 10 deletions(-) diff --git a/pkg/provider/crypto/file.go b/pkg/provider/crypto/file.go index d37ce51..4bb3254 100644 --- a/pkg/provider/crypto/file.go +++ b/pkg/provider/crypto/file.go @@ -16,9 +16,18 @@ type file struct { nonce [NonceSize]byte offset int64 name string + dir bool } -func newFile(key []byte, name string, fs *FS, f provider.File) (ef provider.File, err error) { +func newFile(key []byte, name string, fs *FS, f provider.File, dir bool) (ef provider.File, err error) { + if dir { + return &file{ + File: f, + fs: fs, + name: name, + dir: dir, + }, nil + } nonce, err := initNonce(f) if err != nil { return @@ -68,6 +77,9 @@ func (s stat) Name() string { } func (f *file) Close() error { + if f.dir { + return f.File.Close() + } e1 := f.w.Close() e2 := f.File.Close() if e1 != nil { @@ -155,7 +167,11 @@ func (f *file) Readdir(n int) ([]fs.FileInfo, error) { } fio := make([]fs.FileInfo, len(fis)) for i, fi := range fis { - fio[i] = dir{FileInfo: fi, name: f.fs.decPath(fi.Name())} + name, err := f.fs.decPath(fi.Name()) + if err != nil { + return nil, err + } + fio[i] = dir{FileInfo: fi, name: name} } return fio, nil } diff --git a/pkg/provider/crypto/fs.go b/pkg/provider/crypto/fs.go index f11839f..6f25890 100644 --- a/pkg/provider/crypto/fs.go +++ b/pkg/provider/crypto/fs.go @@ -47,15 +47,17 @@ func (fs *FS) encPath(path string) string { return filepath.Join(cparts...) } -func (fs *FS) decPath(path string) string { +func (fs *FS) decPath(path string) (string, error) { parts := strings.Split(path, "/") pparts := make([]string, len(parts)) for i, p := range parts { - pparts[i] = base64.RawURLEncoding.EncodeToString( - fs.cbc.decrypt([]byte(p)), - ) + b, err := base64.RawURLEncoding.DecodeString(p) + if err != nil { + return "", err + } + pparts[i] = string(fs.cbc.decrypt(b)) } - return filepath.Join(pparts...) + return filepath.Join(pparts...), nil } func (fs *FS) name(p string) string { @@ -72,11 +74,16 @@ func (fs *FS) Remove(p string) error { } func (fs *FS) Open(p string) (provider.File, error) { - f, err := fs.fs.Open(fs.encPath(p)) + c := fs.encPath(p) + fi, err := fs.fs.Stat(c) if err != nil { return nil, err } - return newFile(fs.key, p, fs, f) + f, err := fs.fs.Open(c) + if err != nil { + return nil, err + } + return newFile(fs.key, p, fs, f, fi.IsDir()) } func (fs *FS) OpenFile(p string, flags int, mode os.FileMode) (provider.File, error) { @@ -84,7 +91,7 @@ func (fs *FS) OpenFile(p string, flags int, mode os.FileMode) (provider.File, er if err != nil { return nil, err } - return newFile(fs.key, p, fs, f) + return newFile(fs.key, p, fs, f, false) } func (fs *FS) MkdirAll(p string, mode os.FileMode) error {