forked from Plemya-x/ALR
		
	feat: migrate to system cache with changing core logic
This commit is contained in:
		| @@ -25,11 +25,11 @@ import ( | ||||
| 	"os" | ||||
| 	"os/exec" | ||||
| 	"runtime" | ||||
| 	"slices" | ||||
| 	"strings" | ||||
| 	"syscall" | ||||
| 	"time" | ||||
|  | ||||
| 	"gitea.plemya-x.ru/Plemya-x/fakeroot" | ||||
| 	"mvdan.cc/sh/v3/expand" | ||||
| 	"mvdan.cc/sh/v3/interp" | ||||
| ) | ||||
| @@ -54,7 +54,7 @@ func FakerootExecHandler(killTimeout time.Duration) interp.ExecHandlerFunc { | ||||
| 			Stderr: hc.Stderr, | ||||
| 		} | ||||
|  | ||||
| 		err = fakeroot.Apply(cmd) | ||||
| 		err = Apply(cmd) | ||||
| 		if err != nil { | ||||
| 			return err | ||||
| 		} | ||||
| @@ -108,6 +108,52 @@ func FakerootExecHandler(killTimeout time.Duration) interp.ExecHandlerFunc { | ||||
| 	} | ||||
| } | ||||
|  | ||||
| func rootMap(m syscall.SysProcIDMap) bool { | ||||
| 	return m.ContainerID == 0 | ||||
| } | ||||
|  | ||||
| func Apply(cmd *exec.Cmd) error { | ||||
| 	uid := os.Getuid() | ||||
| 	gid := os.Getgid() | ||||
|  | ||||
| 	// If the user is already root, there's no need for fakeroot | ||||
| 	if uid == 0 { | ||||
| 		return nil | ||||
| 	} | ||||
|  | ||||
| 	// Ensure SysProcAttr isn't nil | ||||
| 	if cmd.SysProcAttr == nil { | ||||
| 		cmd.SysProcAttr = &syscall.SysProcAttr{} | ||||
| 	} | ||||
|  | ||||
| 	// Create a new user namespace | ||||
| 	cmd.SysProcAttr.Cloneflags |= syscall.CLONE_NEWUSER | ||||
|  | ||||
| 	// If the command already contains a mapping for the root user, return an error | ||||
| 	if slices.ContainsFunc(cmd.SysProcAttr.UidMappings, rootMap) { | ||||
| 		return nil | ||||
| 	} | ||||
|  | ||||
| 	// If the command already contains a mapping for the root group, return an error | ||||
| 	if slices.ContainsFunc(cmd.SysProcAttr.GidMappings, rootMap) { | ||||
| 		return nil | ||||
| 	} | ||||
|  | ||||
| 	cmd.SysProcAttr.UidMappings = append(cmd.SysProcAttr.UidMappings, syscall.SysProcIDMap{ | ||||
| 		ContainerID: 0, | ||||
| 		HostID:      uid, | ||||
| 		Size:        1, | ||||
| 	}) | ||||
|  | ||||
| 	cmd.SysProcAttr.GidMappings = append(cmd.SysProcAttr.GidMappings, syscall.SysProcIDMap{ | ||||
| 		ContainerID: 0, | ||||
| 		HostID:      gid, | ||||
| 		Size:        1, | ||||
| 	}) | ||||
|  | ||||
| 	return nil | ||||
| } | ||||
|  | ||||
| // execEnv was extracted from github.com/mvdan/sh/interp/vars.go | ||||
| func execEnv(env expand.Environ) []string { | ||||
| 	list := make([]string, 0, 64) | ||||
|   | ||||
		Reference in New Issue
	
	Block a user