Compare commits
2 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
a97e1f50bf | ||
|
|
ba95b78adb |
@ -1,5 +1,8 @@
|
||||
# Changelog
|
||||
|
||||
## v1.5.2 (2026-06-08)
|
||||
- **JS 对齐**: 将所有注册到 `jsmod` 的导出方法名统一为 PascalCase(如 `Read`, `Write`, `GetFileInfo`),消除 JS 环境下的调用摩擦。
|
||||
|
||||
## [1.3.3] - 2026-05-30
|
||||
- **新增**: 注册到 `jsmod`,将所有文件操作方法(Read/Write/Archive 等)注册为高危方法(unsafeList),确保安全沙箱隔离。
|
||||
|
||||
|
||||
4
file.go
4
file.go
@ -308,9 +308,9 @@ func VerifyPathForSafeMode(ctx context.Context, path string) (string, error) {
|
||||
return RealPath(path), nil
|
||||
}
|
||||
|
||||
// 1. 获取白名单 (约定从 ctx 获取 "AllowedDirs")
|
||||
// 1. 获取白名单
|
||||
var allowedDirs []string
|
||||
cast.Convert(&allowedDirs, ctx.Value("AllowedDirs"))
|
||||
cast.Convert(&allowedDirs, jsmod.Get(ctx, "AllowedDirs"))
|
||||
if len(allowedDirs) == 0 {
|
||||
return "", fmt.Errorf("file: access denied, AllowedDirs not found in context")
|
||||
}
|
||||
|
||||
40
js_export.go
40
js_export.go
@ -9,42 +9,42 @@ import (
|
||||
func init() {
|
||||
jsmod.Register("file", map[string]any{
|
||||
// 读操作 (映射到私有包装器)
|
||||
"exists": func(ctx context.Context, path string) bool {
|
||||
"Exists": func(ctx context.Context, path string) bool {
|
||||
p, err := VerifyPathForSafeMode(ctx, path)
|
||||
if err != nil {
|
||||
return false
|
||||
}
|
||||
return Exists(p)
|
||||
},
|
||||
"read": func(ctx context.Context, path string) (string, error) {
|
||||
"Read": func(ctx context.Context, path string) (string, error) {
|
||||
p, err := VerifyPathForSafeMode(ctx, path)
|
||||
if err != nil {
|
||||
return "", err
|
||||
}
|
||||
return Read(p)
|
||||
},
|
||||
"readBytes": func(ctx context.Context, path string) ([]byte, error) {
|
||||
"ReadBytes": func(ctx context.Context, path string) ([]byte, error) {
|
||||
p, err := VerifyPathForSafeMode(ctx, path)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
return ReadBytes(p)
|
||||
},
|
||||
"readLines": func(ctx context.Context, path string) ([]string, error) {
|
||||
"ReadLines": func(ctx context.Context, path string) ([]string, error) {
|
||||
p, err := VerifyPathForSafeMode(ctx, path)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
return ReadLines(p)
|
||||
},
|
||||
"readDir": func(ctx context.Context, path string) ([]FileInfo, error) {
|
||||
"ReadDir": func(ctx context.Context, path string) ([]FileInfo, error) {
|
||||
p, err := VerifyPathForSafeMode(ctx, path)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
return ReadDir(p)
|
||||
},
|
||||
"getFileInfo": func(ctx context.Context, path string) *FileInfo {
|
||||
"GetFileInfo": func(ctx context.Context, path string) *FileInfo {
|
||||
p, err := VerifyPathForSafeMode(ctx, path)
|
||||
if err != nil {
|
||||
return nil
|
||||
@ -53,35 +53,35 @@ func init() {
|
||||
},
|
||||
|
||||
// 写操作
|
||||
"write": func(ctx context.Context, path string, content string) error {
|
||||
"Write": func(ctx context.Context, path string, content string) error {
|
||||
p, err := VerifyPathForSafeMode(ctx, path)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
return Write(p, content)
|
||||
},
|
||||
"writeBytes": func(ctx context.Context, path string, content []byte) error {
|
||||
"WriteBytes": func(ctx context.Context, path string, content []byte) error {
|
||||
p, err := VerifyPathForSafeMode(ctx, path)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
return WriteBytes(p, content)
|
||||
},
|
||||
"remove": func(ctx context.Context, path string) error {
|
||||
"Remove": func(ctx context.Context, path string) error {
|
||||
p, err := VerifyPathForSafeMode(ctx, path)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
return Remove(p)
|
||||
},
|
||||
"mkdir": func(ctx context.Context, path string) error {
|
||||
"Mkdir": func(ctx context.Context, path string) error {
|
||||
p, err := VerifyPathForSafeMode(ctx, path)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
return Mkdir(p)
|
||||
},
|
||||
"copy": func(ctx context.Context, from, to string) error {
|
||||
"Copy": func(ctx context.Context, from, to string) error {
|
||||
pFrom, err := VerifyPathForSafeMode(ctx, from)
|
||||
if err != nil {
|
||||
return err
|
||||
@ -92,7 +92,7 @@ func init() {
|
||||
}
|
||||
return Copy(pFrom, pTo)
|
||||
},
|
||||
"move": func(ctx context.Context, from, to string) error {
|
||||
"Move": func(ctx context.Context, from, to string) error {
|
||||
pFrom, err := VerifyPathForSafeMode(ctx, from)
|
||||
if err != nil {
|
||||
return err
|
||||
@ -103,7 +103,7 @@ func init() {
|
||||
}
|
||||
return Move(pFrom, pTo)
|
||||
},
|
||||
"replace": func(ctx context.Context, path, old, new string) error {
|
||||
"Replace": func(ctx context.Context, path, old, new string) error {
|
||||
p, err := VerifyPathForSafeMode(ctx, path)
|
||||
if err != nil {
|
||||
return err
|
||||
@ -112,21 +112,21 @@ func init() {
|
||||
},
|
||||
|
||||
// 序列化
|
||||
"unmarshalFile": func(ctx context.Context, path string, to any) error {
|
||||
"UnmarshalFile": func(ctx context.Context, path string, to any) error {
|
||||
p, err := VerifyPathForSafeMode(ctx, path)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
return UnmarshalFile(p, to)
|
||||
},
|
||||
"marshalFile": func(ctx context.Context, path string, data any) error {
|
||||
"MarshalFile": func(ctx context.Context, path string, data any) error {
|
||||
p, err := VerifyPathForSafeMode(ctx, path)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
return MarshalFile(p, data)
|
||||
},
|
||||
"marshalFilePretty": func(ctx context.Context, path string, data any) error {
|
||||
"MarshalFilePretty": func(ctx context.Context, path string, data any) error {
|
||||
p, err := VerifyPathForSafeMode(ctx, path)
|
||||
if err != nil {
|
||||
return err
|
||||
@ -135,7 +135,7 @@ func init() {
|
||||
},
|
||||
|
||||
// 归档
|
||||
"archive": func(ctx context.Context, src, dest string) error {
|
||||
"Archive": func(ctx context.Context, src, dest string) error {
|
||||
pSrc, err := VerifyPathForSafeMode(ctx, src)
|
||||
if err != nil {
|
||||
return err
|
||||
@ -146,7 +146,7 @@ func init() {
|
||||
}
|
||||
return Archive(pSrc, pDest)
|
||||
},
|
||||
"extract": func(ctx context.Context, src, dest string, strip bool) error {
|
||||
"Extract": func(ctx context.Context, src, dest string, strip bool) error {
|
||||
pSrc, err := VerifyPathForSafeMode(ctx, src)
|
||||
if err != nil {
|
||||
return err
|
||||
@ -159,7 +159,7 @@ func init() {
|
||||
},
|
||||
|
||||
// 压缩工具 (无路径,不校验)
|
||||
"compress": Compress,
|
||||
"decompress": Decompress,
|
||||
"Compress": Compress,
|
||||
"Decompress": Decompress,
|
||||
})
|
||||
}
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user