All checks were successful
		
		
	
	Test / Sandbox (race detector) (push) Successful in 4m7s
				
			Test / Hakurei (race detector) (push) Successful in 4m55s
				
			Test / Flake checks (push) Successful in 1m27s
				
			Test / Create distribution (push) Successful in 33s
				
			Test / Sandbox (push) Successful in 2m11s
				
			Test / Hakurei (push) Successful in 3m9s
				
			Test / Hpkg (push) Successful in 4m1s
				
			This is less ambiguous, and more accurately describes the purpose of the package. Signed-off-by: Ophestra <cat@gensokyo.uk>
		
			
				
	
	
		
			57 lines
		
	
	
		
			1.4 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
			
		
		
	
	
			57 lines
		
	
	
		
			1.4 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
| package outcome
 | |
| 
 | |
| import (
 | |
| 	"encoding/gob"
 | |
| 	"fmt"
 | |
| 	"syscall"
 | |
| 
 | |
| 	"hakurei.app/container/fhs"
 | |
| 	"hakurei.app/internal/validate"
 | |
| )
 | |
| 
 | |
| func init() { gob.Register(spAccountOp{}) }
 | |
| 
 | |
| // spAccountOp sets up user account emulation inside the container.
 | |
| type spAccountOp struct{}
 | |
| 
 | |
| func (s spAccountOp) toSystem(state *outcomeStateSys) error {
 | |
| 	// do checks here to fail before fork/exec
 | |
| 	if state.Container == nil || state.Container.Home == nil || state.Container.Shell == nil {
 | |
| 		// unreachable
 | |
| 		return syscall.ENOTRECOVERABLE
 | |
| 	}
 | |
| 
 | |
| 	// default is applied in toContainer
 | |
| 	if state.Container.Username != "" && !validate.IsValidUsername(state.Container.Username) {
 | |
| 		return newWithMessage(fmt.Sprintf("invalid user name %q", state.Container.Username))
 | |
| 	}
 | |
| 	return nil
 | |
| }
 | |
| 
 | |
| func (s spAccountOp) toContainer(state *outcomeStateParams) error {
 | |
| 	const fallbackUsername = "chronos"
 | |
| 
 | |
| 	username := state.Container.Username
 | |
| 	if username == "" {
 | |
| 		username = fallbackUsername
 | |
| 	}
 | |
| 
 | |
| 	state.params.Dir = state.Container.Home
 | |
| 	state.env["HOME"] = state.Container.Home.String()
 | |
| 	state.env["USER"] = username
 | |
| 	state.env["SHELL"] = state.Container.Shell.String()
 | |
| 
 | |
| 	state.params.
 | |
| 		Place(fhs.AbsEtc.Append("passwd"),
 | |
| 			[]byte(username+":x:"+
 | |
| 				state.mapuid.String()+":"+
 | |
| 				state.mapgid.String()+
 | |
| 				":Hakurei:"+
 | |
| 				state.Container.Home.String()+":"+
 | |
| 				state.Container.Shell.String()+"\n")).
 | |
| 		Place(fhs.AbsEtc.Append("group"),
 | |
| 			[]byte("hakurei:x:"+state.mapgid.String()+":\n"))
 | |
| 
 | |
| 	return nil
 | |
| }
 |