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