package encfs import ( "os" "strings" "time" "github.com/spf13/afero" ) // copied from afero/os.go type EncFs struct{} func NewEncFs() afero.Fs { return &EncFs{} } func (EncFs) Name() string { return "EncFs" } func (EncFs) Create(name string) (afero.File, error) { if err := checkFileExt(name); err != nil { return nil, err } f, e := os.Create(name) if f == nil { // while this looks strange, we need to return a bare nil (of type nil) not // a nil value of type *os.File or nil won't be nil return nil, e } return convertOsFileToEncFile(name, f, e, true) } func (EncFs) Mkdir(name string, perm os.FileMode) error { return os.Mkdir(name, perm) } func (EncFs) MkdirAll(path string, perm os.FileMode) error { return os.MkdirAll(path, perm) } func (EncFs) Open(name string) (afero.File, error) { if err := checkFileExt(name); err != nil { return nil, err } f, e := os.Open(name) if f == nil { // while this looks strange, we need to return a bare nil (of type nil) not // a nil value of type *os.File or nil won't be nil return nil, e } return convertOsFileToEncFile(name, f, e, false) } func (EncFs) OpenFile(name string, flag int, perm os.FileMode) (afero.File, error) { f, e := os.OpenFile(name, flag, perm) if f == nil { // while this looks strange, we need to return a bare nil (of type nil) not // a nil value of type *os.File or nil won't be nil return nil, e } return f, e } func (EncFs) Remove(name string) error { // TODO remove enc file meta return os.Remove(name) } func (EncFs) RemoveAll(path string) error { // TODO remove enc file meta return os.RemoveAll(path) } func (EncFs) Rename(oldname, newname string) error { // TODO rename enc file meta return os.Rename(oldname, newname) } func (EncFs) Stat(name string) (os.FileInfo, error) { return os.Stat(name) } func (EncFs) Chmod(name string, mode os.FileMode) error { return os.Chmod(name, mode) } func (EncFs) Chown(name string, uid, gid int) error { return os.Chown(name, uid, gid) } func (EncFs) Chtimes(name string, atime time.Time, mtime time.Time) error { return os.Chtimes(name, atime, mtime) } func (EncFs) LstatIfPossible(name string) (os.FileInfo, bool, error) { fi, err := os.Lstat(name) return fi, true, err } func (EncFs) SymlinkIfPossible(oldname, newname string) error { return os.Symlink(oldname, newname) } func (EncFs) ReadlinkIfPossible(name string) (string, error) { return os.Readlink(name) } func checkFileExt(name string) error { if strings.HasSuffix(name, EncFileExt) { return ErrFileForbiddenFileExt } return nil } func convertOsFileToEncFile(name string, file *os.File, e error, isCreate bool) (afero.File, error) { if e != nil { return nil, e } // TODO add password, and IV etc ... encFile, err := NewEncFile(name, file, isCreate) if err != nil { return nil, err } return encFile, nil }