feat: udpates

This commit is contained in:
2024-09-01 15:13:18 +08:00
parent 1971f37a9d
commit 84c0e2e872
4 changed files with 130 additions and 12 deletions

View File

@@ -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
}