From 7c063833e01930b4b298a59363b783ab32cc0e41 Mon Sep 17 00:00:00 2001
From: Ophestra <cat@gensokyo.uk>
Date: Mon, 17 Mar 2025 17:10:03 +0900
Subject: [PATCH] internal/sys: wrap getuid/getgid

Signed-off-by: Ophestra <cat@gensokyo.uk>
---
 fst/sandbox.go                | 4 ++--
 internal/app/app_stub_test.go | 3 ++-
 internal/sys/interface.go     | 8 +++++---
 internal/sys/std.go           | 3 ++-
 4 files changed, 11 insertions(+), 7 deletions(-)

diff --git a/fst/sandbox.go b/fst/sandbox.go
index aaa018b..fc12da4 100644
--- a/fst/sandbox.go
+++ b/fst/sandbox.go
@@ -47,7 +47,7 @@ type SandboxConfig struct {
 
 // SandboxSys encapsulates system functions used during the creation of [bwrap.Config].
 type SandboxSys interface {
-	Geteuid() int
+	Getuid() int
 	Paths() Paths
 	ReadDir(name string) ([]fs.DirEntry, error)
 	EvalSymlinks(path string) (string, error)
@@ -73,7 +73,7 @@ func (s *SandboxConfig) Bwrap(sys SandboxSys, uid *int) (*bwrap.Config, error) {
 	} else {
 		// some programs fail to connect to dbus session running as a different uid, so a separate workaround
 		// is introduced to map priv-side caller uid in namespace
-		*uid = sys.Geteuid()
+		*uid = sys.Getuid()
 	}
 
 	conf := (&bwrap.Config{
diff --git a/internal/app/app_stub_test.go b/internal/app/app_stub_test.go
index 262055f..be49617 100644
--- a/internal/app/app_stub_test.go
+++ b/internal/app/app_stub_test.go
@@ -17,7 +17,8 @@ type stubNixOS struct {
 	usernameErr map[string]error
 }
 
-func (s *stubNixOS) Geteuid() int                             { return 1971 }
+func (s *stubNixOS) Getuid() int                              { return 1971 }
+func (s *stubNixOS) Getgid() int                              { return 100 }
 func (s *stubNixOS) TempDir() string                          { return "/tmp" }
 func (s *stubNixOS) MustExecutable() string                   { return "/run/wrappers/bin/fortify" }
 func (s *stubNixOS) Exit(code int)                            { panic("called exit on stub with code " + strconv.Itoa(code)) }
diff --git a/internal/sys/interface.go b/internal/sys/interface.go
index 0d2ebaf..935cee5 100644
--- a/internal/sys/interface.go
+++ b/internal/sys/interface.go
@@ -12,8 +12,10 @@ import (
 
 // State provides safe interaction with operating system state.
 type State interface {
-	// Geteuid provides [os.Geteuid].
-	Geteuid() int
+	// Getuid provides [os.Getuid].
+	Getuid() int
+	// Getgid provides [os.Getgid].
+	Getgid() int
 	// LookupEnv provides [os.LookupEnv].
 	LookupEnv(key string) (string, bool)
 	// TempDir provides [os.TempDir].
@@ -47,7 +49,7 @@ type State interface {
 
 // CopyPaths is a generic implementation of [System.Paths].
 func CopyPaths(os State, v *fst.Paths) {
-	v.SharePath = path.Join(os.TempDir(), "fortify."+strconv.Itoa(os.Geteuid()))
+	v.SharePath = path.Join(os.TempDir(), "fortify."+strconv.Itoa(os.Getuid()))
 
 	fmsg.Verbosef("process share directory at %q", v.SharePath)
 
diff --git a/internal/sys/std.go b/internal/sys/std.go
index 132f4c1..5e63396 100644
--- a/internal/sys/std.go
+++ b/internal/sys/std.go
@@ -31,7 +31,8 @@ type Std struct {
 	uidMu sync.RWMutex
 }
 
-func (s *Std) Geteuid() int                                 { return os.Geteuid() }
+func (s *Std) Getuid() int                                  { return os.Getuid() }
+func (s *Std) Getgid() int                                  { return os.Getgid() }
 func (s *Std) LookupEnv(key string) (string, bool)          { return os.LookupEnv(key) }
 func (s *Std) TempDir() string                              { return os.TempDir() }
 func (s *Std) LookPath(file string) (string, error)         { return exec.LookPath(file) }