All checks were successful
		
		
	
	Test / Create distribution (push) Successful in 35s
				
			Test / Sandbox (push) Successful in 2m19s
				
			Test / Hpkg (push) Successful in 4m6s
				
			Test / Hakurei (race detector) (push) Successful in 5m20s
				
			Test / Sandbox (race detector) (push) Successful in 2m10s
				
			Test / Hakurei (push) Successful in 2m13s
				
			Test / Flake checks (push) Successful in 1m37s
				
			The original code clobbers hst.Config, and was not changed when being ported over. Signed-off-by: Ophestra <cat@gensokyo.uk>
		
			
				
	
	
		
			56 lines
		
	
	
		
			1.4 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
			
		
		
	
	
			56 lines
		
	
	
		
			1.4 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
| package app
 | |
| 
 | |
| import (
 | |
| 	"encoding/gob"
 | |
| 	"fmt"
 | |
| 	"syscall"
 | |
| 
 | |
| 	"hakurei.app/container/fhs"
 | |
| )
 | |
| 
 | |
| 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 != "" && !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
 | |
| }
 |