diff --git a/cmd/packets/main.go b/cmd/packets/main.go index ceae186..d09c752 100644 --- a/cmd/packets/main.go +++ b/cmd/packets/main.go @@ -531,21 +531,28 @@ func Install(packagepath string, serial uint) error { } } - bar.Finish() - // TODO LUA SCRIPT L := lua.NewState() defer L.Close() + osObject := L.GetGlobal("os").(*lua.LTable) + L.SetGlobal("packets_package_dir", lua.LString(cfg.Config.DataDir)) L.SetGlobal("packets_bin_dir", lua.LString(cfg.Config.BinDir)) - L.SetField(L.GetGlobal("os"), "remove", L.NewFunction(internal.SafeRemove)) + osObject.RawSetString("execute", lua.LNil) + osObject.RawSetString("exit", lua.LNil) + osObject.RawSetString("getenv", lua.LNil) + + osObject.RawSetString("remove", L.NewFunction(internal.SafeRemove)) + osObject.RawSetString("rename", L.NewFunction(internal.SafeRename)) + osObject.RawSetString("copy", L.NewFunction(internal.SafeCopy)) if err := L.DoFile(manifest.Hooks.Install); err != nil { log.Panic(err) } + bar.Finish() fmt.Printf("Package %s fully installed\n", name) var insert = Installed{ @@ -1408,8 +1415,6 @@ func Upgrade(packagepath string, og_realname string, serial uint) error { os.Rename(destDir, filepath.Join(cfg.Config.DataDir, name)) - destDir = filepath.Join(cfg.Config.DataDir, name) - //TODO manifest.toml things fmt.Printf("Package %s fully installed", name) diff --git a/internal/internal.go b/internal/internal.go index c88b3a2..6517a26 100644 --- a/internal/internal.go +++ b/internal/internal.go @@ -189,16 +189,83 @@ func IsSafe(str string) bool { } func SafeRemove(L *lua.LState) int { - path := L.CheckString(1) - if !IsSafe(path) { + filename := L.CheckString(1) + if !IsSafe(filename) { L.Push(lua.LFalse) - return 1 + L.Push(lua.LString("[packets] unsafe filepath")) + return 2 } - err := os.Remove(path) + err := os.Remove(filename) if err != nil { L.Push(lua.LFalse) + L.Push(lua.LString("[packets] remove failed\n" + err.Error())) return 1 } L.Push(lua.LTrue) return 1 } + +func SafeRename(L *lua.LState) int { + oldname := L.CheckString(1) + newname := L.CheckString(2) + + if !IsSafe(oldname) || !IsSafe(newname) { + L.Push(lua.LFalse) + L.Push(lua.LString("[packets] unsafe filepath")) + return 2 + } + + if err := os.Rename(oldname, newname); err != nil { + L.Push(lua.LFalse) + L.Push(lua.LString("[packets] rename failed\n" + err.Error())) + return 2 + } + + L.Push(lua.LTrue) + return 1 +} +func SafeCopy(L *lua.LState) int { + oldname := L.CheckString(1) + newname := L.CheckString(2) + + if !IsSafe(oldname) || !IsSafe(newname) { + L.Push(lua.LFalse) + L.Push(lua.LString("[packets] unsafe filepath")) + return 2 + } + + src, err := os.Open(oldname) + if err != nil { + L.Push(lua.LFalse) + L.Push(lua.LString("[packets] copy failed\n" + err.Error())) + return 2 + + } + defer src.Close() + + err = os.MkdirAll(filepath.Dir(newname), 0755) + if err != nil { + L.Push(lua.LFalse) + L.Push(lua.LString("[packets] copy failed\n" + err.Error())) + return 2 + } + + dst, err := os.Create(newname) + if err != nil { + L.Push(lua.LFalse) + L.Push(lua.LString("[packets] copy failed\n" + err.Error())) + return 2 + } + defer dst.Close() + + _, err = io.Copy(dst, src) + if err != nil { + L.Push(lua.LFalse) + L.Push(lua.LString("[packets] copy failed\n" + err.Error())) + return 2 + } + + L.Push(lua.LTrue) + L.Push(lua.LNil) + return 2 +}