diff options
| author | Jakob Unterwurzacher | 2020-08-15 15:08:28 +0200 | 
|---|---|---|
| committer | Jakob Unterwurzacher | 2020-08-15 15:08:28 +0200 | 
| commit | 35055030a13150eeb5cd2413b4597c56e60c9605 (patch) | |
| tree | 19d55295ceb413166850bbbc846b540c5e4eb2e4 /internal | |
| parent | b6580a87e52babf757c48dd03be21fae04279123 (diff) | |
v2api/reverse: implement ctlsocksrv.Interface
Diffstat (limited to 'internal')
| -rw-r--r-- | internal/fusefrontend_reverse/ctlsock_interface.go | 39 | 
1 files changed, 39 insertions, 0 deletions
| diff --git a/internal/fusefrontend_reverse/ctlsock_interface.go b/internal/fusefrontend_reverse/ctlsock_interface.go new file mode 100644 index 0000000..6bf2e6a --- /dev/null +++ b/internal/fusefrontend_reverse/ctlsock_interface.go @@ -0,0 +1,39 @@ +package fusefrontend_reverse + +import ( +	"path/filepath" +	"strings" + +	"golang.org/x/sys/unix" + +	"github.com/rfjakob/gocryptfs/internal/ctlsocksrv" +	"github.com/rfjakob/gocryptfs/internal/pathiv" +) + +// Verify that the interface is implemented. +var _ ctlsocksrv.Interface = &RootNode{} + +// EncryptPath implements ctlsock.Backend. +// This is used for the control socket and for the "-exclude" logic. +func (rn *RootNode) EncryptPath(plainPath string) (string, error) { +	if rn.args.PlaintextNames || plainPath == "" { +		return plainPath, nil +	} +	cipherPath := "" +	parts := strings.Split(plainPath, "/") +	for _, part := range parts { +		dirIV := pathiv.Derive(cipherPath, pathiv.PurposeDirIV) +		encryptedPart := rn.nameTransform.EncryptName(part, dirIV) +		if rn.args.LongNames && len(encryptedPart) > unix.NAME_MAX { +			encryptedPart = rn.nameTransform.HashLongName(encryptedPart) +		} +		cipherPath = filepath.Join(cipherPath, encryptedPart) +	} +	return cipherPath, nil +} + +// DecryptPath implements ctlsock.Backend +func (rn *RootNode) DecryptPath(cipherPath string) (string, error) { +	p, err := rn.decryptPath(cipherPath) +	return p, err +} | 
