aboutsummaryrefslogtreecommitdiffhomepage
path: root/internal/app/spaccount.go
diff options
context:
space:
mode:
Diffstat (limited to 'internal/app/spaccount.go')
-rw-r--r--internal/app/spaccount.go55
1 files changed, 55 insertions, 0 deletions
diff --git a/internal/app/spaccount.go b/internal/app/spaccount.go
new file mode 100644
index 00000000..dbe3b03c
--- /dev/null
+++ b/internal/app/spaccount.go
@@ -0,0 +1,55 @@
+package app
+
+import (
+ "fmt"
+ "syscall"
+
+ "hakurei.app/container"
+ "hakurei.app/hst"
+)
+
+// spAccountOp sets up user account emulation inside the container.
+type spAccountOp struct {
+ // Inner directory to use as the home directory of the emulated user.
+ Home *container.Absolute
+ // String matching the default NAME_REGEX value from adduser to use as the username of the emulated user.
+ Username string
+ // Pathname of shell to use for the emulated user.
+ Shell *container.Absolute
+}
+
+func (s *spAccountOp) toSystem(*outcomeStateSys, *hst.Config) error {
+ const fallbackUsername = "chronos"
+
+ // do checks here to fail before fork/exec
+ if s.Home == nil || s.Shell == nil {
+ // unreachable
+ return syscall.ENOTRECOVERABLE
+ }
+ if s.Username == "" {
+ s.Username = fallbackUsername
+ } else if !isValidUsername(s.Username) {
+ return newWithMessage(fmt.Sprintf("invalid user name %q", s.Username))
+ }
+ return nil
+}
+
+func (s *spAccountOp) toContainer(state *outcomeStateParams) error {
+ state.params.Dir = s.Home
+ state.env["HOME"] = s.Home.String()
+ state.env["USER"] = s.Username
+ state.env["SHELL"] = s.Shell.String()
+
+ state.params.
+ Place(container.AbsFHSEtc.Append("passwd"),
+ []byte(s.Username+":x:"+
+ state.mapuid.String()+":"+
+ state.mapgid.String()+
+ ":Hakurei:"+
+ s.Home.String()+":"+
+ s.Shell.String()+"\n")).
+ Place(container.AbsFHSEtc.Append("group"),
+ []byte("hakurei:x:"+state.mapgid.String()+":\n"))
+
+ return nil
+}