feat: udpates
This commit is contained in:
109
encfs/file.go
109
encfs/file.go
@@ -1,28 +1,121 @@
|
||||
package encfs
|
||||
|
||||
import (
|
||||
"crypto/rand"
|
||||
"encoding/json"
|
||||
"errors"
|
||||
"io"
|
||||
"os"
|
||||
"syscall"
|
||||
|
||||
"github.com/spf13/afero"
|
||||
)
|
||||
|
||||
type EncFile struct {
|
||||
isDir bool
|
||||
closed bool
|
||||
file *os.File
|
||||
const EncFileExt = ".__encfile"
|
||||
|
||||
var (
|
||||
ErrFileForbiddenFileExt = errors.New("File ext is forbidden")
|
||||
)
|
||||
|
||||
type EncFileMeta struct {
|
||||
Name string `json:"name"`
|
||||
Iv []byte `json:"iv"`
|
||||
}
|
||||
|
||||
func NewEncFile(file *os.File) (*EncFile, error) {
|
||||
func newEncFileMeta(name string) (*EncFileMeta, error) {
|
||||
iv := make([]byte, 16)
|
||||
_, err := rand.Read(iv)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
encFileMeta := &EncFileMeta{
|
||||
Name: name,
|
||||
Iv: iv,
|
||||
}
|
||||
encFileMetaName := name + EncFileExt
|
||||
encFileMetaFile, err := os.Create(encFileMetaName)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
defer func() {
|
||||
_ = encFileMetaFile.Close()
|
||||
}()
|
||||
encFileMetaBytes, err := marshalEncFileMeta(encFileMeta)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
_, err = encFileMetaFile.Write(encFileMetaBytes)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
return encFileMeta, nil
|
||||
}
|
||||
|
||||
func openEncFileMeta(name string) (*EncFileMeta, error) {
|
||||
encFileMetaName := name + "." + EncFileExt
|
||||
encFileMetaFile, err := os.Open(encFileMetaName)
|
||||
if err != nil {
|
||||
if os.IsNotExist(err) {
|
||||
return nil, nil
|
||||
}
|
||||
return nil, err
|
||||
}
|
||||
defer func() {
|
||||
_ = encFileMetaFile.Close()
|
||||
}()
|
||||
encFileMetaBytes, err := io.ReadAll(encFileMetaFile)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
encFileMeta, err := unmarchalEncFileMeta(encFileMetaBytes)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
return encFileMeta, nil
|
||||
}
|
||||
|
||||
func marshalEncFileMeta(encFileMeata *EncFileMeta) ([]byte, error) {
|
||||
return json.Marshal(encFileMeata)
|
||||
}
|
||||
|
||||
func unmarchalEncFileMeta(data []byte) (*EncFileMeta, error) {
|
||||
var encFileMeta EncFileMeta
|
||||
err := json.Unmarshal(data, &encFileMeta)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
return &encFileMeta, nil
|
||||
}
|
||||
|
||||
type EncFile struct {
|
||||
isDir bool
|
||||
closed bool
|
||||
encFileMeta *EncFileMeta
|
||||
file *os.File
|
||||
}
|
||||
|
||||
func NewEncFile(name string, file *os.File, isCreate bool) (*EncFile, error) {
|
||||
fileInfo, err := file.Stat()
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
isDir := fileInfo.IsDir()
|
||||
var encFileMeta *EncFileMeta = nil
|
||||
if !isDir {
|
||||
if isCreate {
|
||||
encFileMeta, err = newEncFileMeta(name)
|
||||
} else {
|
||||
encFileMeta, err = openEncFileMeta(name)
|
||||
}
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
}
|
||||
return &EncFile{
|
||||
isDir: isDir,
|
||||
closed: false,
|
||||
file: file,
|
||||
isDir: isDir,
|
||||
closed: false,
|
||||
encFileMeta: encFileMeta,
|
||||
file: file,
|
||||
}, nil
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user