func ensureGPGHomeDirectory() (string, error) { real, err := osutil.RealUser() if err != nil { return "", err } uid, err := strconv.Atoi(real.Uid) if err != nil { return "", err } gid, err := strconv.Atoi(real.Gid) if err != nil { return "", err } homedir := os.Getenv("SNAP_GNUPG_HOME") if homedir == "" { homedir = filepath.Join(real.HomeDir, ".snap", "gnupg") } if err := osutil.MkdirAllChown(homedir, 0700, uid, gid); err != nil { return "", err } return homedir, nil }
// writeAuthData saves authentication details for later reuse through ReadAuthData func writeAuthData(user User) error { real, err := osutil.RealUser() if err != nil { return err } uid, err := strconv.Atoi(real.Uid) if err != nil { return err } gid, err := strconv.Atoi(real.Gid) if err != nil { return err } targetFile := storeAuthDataFilename(real.HomeDir) if err := osutil.MkdirAllChown(filepath.Dir(targetFile), 0700, uid, gid); err != nil { return err } outStr, err := json.Marshal(user) if err != nil { return nil } return osutil.AtomicWriteFileChown(targetFile, []byte(outStr), 0600, 0, uid, gid) }
func (s *createUserSuite) TestRealUser(c *check.C) { oldUser := os.Getenv("SUDO_USER") defer func() { os.Setenv("SUDO_USER", oldUser) }() for _, t := range []struct { SudoUsername string CurrentUsername string CurrentUid int }{ // simulate regular "root", no SUDO_USER set {"", os.Getenv("USER"), 0}, // simulate a normal sudo invocation {"guy", "guy", 0}, // simulate running "sudo -u some-user -i" as root // (LP: #1638656) {"root", os.Getenv("USER"), 1000}, } { restore := osutil.MockUserCurrent(func() (*user.User, error) { return &user.User{ Username: t.CurrentUsername, Uid: strconv.Itoa(t.CurrentUid), }, nil }) defer restore() os.Setenv("SUDO_USER", t.SudoUsername) cur, err := osutil.RealUser() c.Assert(err, check.IsNil) c.Check(cur.Username, check.Equals, t.CurrentUsername) } }
func storeAuthDataFilename(homeDir string) string { if fn := os.Getenv(authFileEnvKey); fn != "" { return fn } if homeDir == "" { real, err := osutil.RealUser() if err != nil { panic(err) } homeDir = real.HomeDir } return filepath.Join(homeDir, ".snap", "auth.json") }