Move OpenDir to fs_dir.go
This commit is contained in:
parent
3a4922b5d7
commit
6b5d977cce
@ -72,72 +72,6 @@ func (fs *FS) GetAttr(name string, context *fuse.Context) (*fuse.Attr, fuse.Stat
|
|||||||
return a, status
|
return a, status
|
||||||
}
|
}
|
||||||
|
|
||||||
func (fs *FS) OpenDir(dirName string, context *fuse.Context) ([]fuse.DirEntry, fuse.Status) {
|
|
||||||
toggledlog.Debug.Printf("OpenDir(%s)", dirName)
|
|
||||||
cDirName, err := fs.encryptPath(dirName)
|
|
||||||
if err != nil {
|
|
||||||
return nil, fuse.ToStatus(err)
|
|
||||||
}
|
|
||||||
// Read ciphertext directory
|
|
||||||
cipherEntries, status := fs.FileSystem.OpenDir(cDirName, context)
|
|
||||||
if cipherEntries == nil {
|
|
||||||
return nil, status
|
|
||||||
}
|
|
||||||
// Get DirIV (stays nil if DirIV if off)
|
|
||||||
var cachedIV []byte
|
|
||||||
var cDirAbsPath string
|
|
||||||
if fs.args.DirIV {
|
|
||||||
// Read the DirIV once and use it for all later name decryptions
|
|
||||||
cDirAbsPath = filepath.Join(fs.args.Cipherdir, cDirName)
|
|
||||||
cachedIV, err = nametransform.ReadDirIV(cDirAbsPath)
|
|
||||||
if err != nil {
|
|
||||||
return nil, fuse.ToStatus(err)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
// Filter and decrypt filenames
|
|
||||||
var plain []fuse.DirEntry
|
|
||||||
for i := range cipherEntries {
|
|
||||||
cName := cipherEntries[i].Name
|
|
||||||
if dirName == "" && cName == configfile.ConfDefaultName {
|
|
||||||
// silently ignore "gocryptfs.conf" in the top level dir
|
|
||||||
continue
|
|
||||||
}
|
|
||||||
if fs.args.DirIV && cName == nametransform.DirIVFilename {
|
|
||||||
// silently ignore "gocryptfs.diriv" everywhere if dirIV is enabled
|
|
||||||
continue
|
|
||||||
}
|
|
||||||
|
|
||||||
if fs.args.PlaintextNames {
|
|
||||||
plain = append(plain, cipherEntries[i])
|
|
||||||
continue
|
|
||||||
}
|
|
||||||
|
|
||||||
if fs.args.LongNames {
|
|
||||||
isLong := nametransform.IsLongName(cName)
|
|
||||||
if isLong == 1 {
|
|
||||||
cNameLong, err := nametransform.ReadLongName(filepath.Join(cDirAbsPath, cName))
|
|
||||||
if err != nil {
|
|
||||||
toggledlog.Warn.Printf("Could not read long name for file %s, skipping file", cName)
|
|
||||||
continue
|
|
||||||
}
|
|
||||||
cName = cNameLong
|
|
||||||
} else if isLong == 2 {
|
|
||||||
// ignore "gocryptfs.longname.*.name"
|
|
||||||
continue
|
|
||||||
}
|
|
||||||
}
|
|
||||||
name, err := fs.nameTransform.DecryptName(cName, cachedIV)
|
|
||||||
if err != nil {
|
|
||||||
toggledlog.Warn.Printf("Skipping invalid name '%s' in dir '%s': %s", cName, cDirName, err)
|
|
||||||
continue
|
|
||||||
}
|
|
||||||
|
|
||||||
cipherEntries[i].Name = name
|
|
||||||
plain = append(plain, cipherEntries[i])
|
|
||||||
}
|
|
||||||
return plain, status
|
|
||||||
}
|
|
||||||
|
|
||||||
// We always need read access to do read-modify-write cycles
|
// We always need read access to do read-modify-write cycles
|
||||||
func (fs *FS) mangleOpenFlags(flags uint32) (newFlags int, writeOnly bool) {
|
func (fs *FS) mangleOpenFlags(flags uint32) (newFlags int, writeOnly bool) {
|
||||||
newFlags = int(flags)
|
newFlags = int(flags)
|
||||||
@ -181,6 +115,7 @@ func (fs *FS) Create(path string, flags uint32, mode uint32, context *fuse.Conte
|
|||||||
}
|
}
|
||||||
cBaseName := filepath.Base(cPath)
|
cBaseName := filepath.Base(cPath)
|
||||||
if fs.args.LongNames && nametransform.IsLongName(cBaseName) == 1 {
|
if fs.args.LongNames && nametransform.IsLongName(cBaseName) == 1 {
|
||||||
|
// Create the ".name" file before creating the content
|
||||||
err = fs.nameTransform.WriteLongName(filepath.Dir(cPath), cBaseName, filepath.Base(path))
|
err = fs.nameTransform.WriteLongName(filepath.Dir(cPath), cBaseName, filepath.Base(path))
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, fuse.ToStatus(err)
|
return nil, fuse.ToStatus(err)
|
||||||
|
@ -155,3 +155,69 @@ func (fs *FS) Rmdir(name string, context *fuse.Context) (code fuse.Status) {
|
|||||||
fs.nameTransform.DirIVCache.Clear()
|
fs.nameTransform.DirIVCache.Clear()
|
||||||
return fuse.OK
|
return fuse.OK
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (fs *FS) OpenDir(dirName string, context *fuse.Context) ([]fuse.DirEntry, fuse.Status) {
|
||||||
|
toggledlog.Debug.Printf("OpenDir(%s)", dirName)
|
||||||
|
cDirName, err := fs.encryptPath(dirName)
|
||||||
|
if err != nil {
|
||||||
|
return nil, fuse.ToStatus(err)
|
||||||
|
}
|
||||||
|
// Read ciphertext directory
|
||||||
|
cipherEntries, status := fs.FileSystem.OpenDir(cDirName, context)
|
||||||
|
if cipherEntries == nil {
|
||||||
|
return nil, status
|
||||||
|
}
|
||||||
|
// Get DirIV (stays nil if DirIV if off)
|
||||||
|
var cachedIV []byte
|
||||||
|
var cDirAbsPath string
|
||||||
|
if fs.args.DirIV {
|
||||||
|
// Read the DirIV once and use it for all later name decryptions
|
||||||
|
cDirAbsPath = filepath.Join(fs.args.Cipherdir, cDirName)
|
||||||
|
cachedIV, err = nametransform.ReadDirIV(cDirAbsPath)
|
||||||
|
if err != nil {
|
||||||
|
return nil, fuse.ToStatus(err)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// Filter and decrypt filenames
|
||||||
|
var plain []fuse.DirEntry
|
||||||
|
for i := range cipherEntries {
|
||||||
|
cName := cipherEntries[i].Name
|
||||||
|
if dirName == "" && cName == configfile.ConfDefaultName {
|
||||||
|
// silently ignore "gocryptfs.conf" in the top level dir
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
if fs.args.DirIV && cName == nametransform.DirIVFilename {
|
||||||
|
// silently ignore "gocryptfs.diriv" everywhere if dirIV is enabled
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
|
||||||
|
if fs.args.PlaintextNames {
|
||||||
|
plain = append(plain, cipherEntries[i])
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
|
||||||
|
if fs.args.LongNames {
|
||||||
|
isLong := nametransform.IsLongName(cName)
|
||||||
|
if isLong == 1 {
|
||||||
|
cNameLong, err := nametransform.ReadLongName(filepath.Join(cDirAbsPath, cName))
|
||||||
|
if err != nil {
|
||||||
|
toggledlog.Warn.Printf("Could not read long name for file %s, skipping file", cName)
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
cName = cNameLong
|
||||||
|
} else if isLong == 2 {
|
||||||
|
// ignore "gocryptfs.longname.*.name"
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
}
|
||||||
|
name, err := fs.nameTransform.DecryptName(cName, cachedIV)
|
||||||
|
if err != nil {
|
||||||
|
toggledlog.Warn.Printf("Skipping invalid name '%s' in dir '%s': %s", cName, cDirName, err)
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
|
||||||
|
cipherEntries[i].Name = name
|
||||||
|
plain = append(plain, cipherEntries[i])
|
||||||
|
}
|
||||||
|
return plain, status
|
||||||
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user