aboutsummaryrefslogtreecommitdiffhomepage
path: root/internal/app
diff options
context:
space:
mode:
authorOphestra Umiker <cat@ophivana.moe>2024-11-02 03:03:44 +0900
committerOphestra Umiker <cat@ophivana.moe>2024-11-02 03:13:57 +0900
commit584732f80ab91afb349720cfb8e9979ed2ba173e (patch)
tree8ef6ab9f8c9d3b8197682a53fb2c4a7b2ce8da55 /internal/app
parent4b7b899bb35fb4ea218dabe49a674f4d2f80e7f8 (diff)
cmd: shim and init into separate binaries
This change also fixes a deadlock when shim fails to connect and complete the setup. Signed-off-by: Ophestra Umiker <cat@ophivana.moe>
Diffstat (limited to 'internal/app')
-rw-r--r--internal/app/app.go8
-rw-r--r--internal/app/app_nixos_test.go10
-rw-r--r--internal/app/app_test.go4
-rw-r--r--internal/app/export_test.go4
-rw-r--r--internal/app/launch.machinectl.go4
-rw-r--r--internal/app/launch.sudo.go2
-rw-r--r--internal/app/seal.go13
-rw-r--r--internal/app/share.display.go4
-rw-r--r--internal/app/share.pulse.go6
-rw-r--r--internal/app/share.system.go4
-rw-r--r--internal/app/start.go9
-rw-r--r--internal/app/system.go6
12 files changed, 35 insertions, 39 deletions
diff --git a/internal/app/app.go b/internal/app/app.go
index 264975c5..28564ebf 100644
--- a/internal/app/app.go
+++ b/internal/app/app.go
@@ -3,8 +3,8 @@ package app
import (
"sync"
- "git.ophivana.moe/security/fortify/internal"
- "git.ophivana.moe/security/fortify/internal/shim"
+ "git.ophivana.moe/security/fortify/cmd/fshim/ipc/shim"
+ "git.ophivana.moe/security/fortify/internal/linux"
)
type App interface {
@@ -25,7 +25,7 @@ type app struct {
// application unique identifier
id *ID
// operating system interface
- os internal.System
+ os linux.System
// shim process manager
shim *shim.Shim
// child process related information
@@ -63,7 +63,7 @@ func (a *app) WaitErr() error {
return a.waitErr
}
-func New(os internal.System) (App, error) {
+func New(os linux.System) (App, error) {
a := new(app)
a.id = new(ID)
a.os = os
diff --git a/internal/app/app_nixos_test.go b/internal/app/app_nixos_test.go
index 11079215..f7eb4c0e 100644
--- a/internal/app/app_nixos_test.go
+++ b/internal/app/app_nixos_test.go
@@ -9,8 +9,8 @@ import (
"git.ophivana.moe/security/fortify/acl"
"git.ophivana.moe/security/fortify/dbus"
"git.ophivana.moe/security/fortify/helper/bwrap"
- "git.ophivana.moe/security/fortify/internal"
"git.ophivana.moe/security/fortify/internal/app"
+ "git.ophivana.moe/security/fortify/internal/linux"
"git.ophivana.moe/security/fortify/internal/system"
)
@@ -579,8 +579,12 @@ func (s *stubNixOS) Exit(code int) {
panic("called exit on stub with code " + strconv.Itoa(code))
}
-func (s *stubNixOS) Paths() internal.Paths {
- return internal.Paths{
+func (s *stubNixOS) FshimPath() string {
+ return "/nix/store/00000000000000000000000000000000-fortify-0.0.10/bin/.fshim"
+}
+
+func (s *stubNixOS) Paths() linux.Paths {
+ return linux.Paths{
SharePath: "/tmp/fortify.1971",
RuntimePath: "/run/user/1971",
RunDirPath: "/run/user/1971/fortify",
diff --git a/internal/app/app_test.go b/internal/app/app_test.go
index fd223afb..de68e531 100644
--- a/internal/app/app_test.go
+++ b/internal/app/app_test.go
@@ -7,14 +7,14 @@ import (
"time"
"git.ophivana.moe/security/fortify/helper/bwrap"
- "git.ophivana.moe/security/fortify/internal"
"git.ophivana.moe/security/fortify/internal/app"
+ "git.ophivana.moe/security/fortify/internal/linux"
"git.ophivana.moe/security/fortify/internal/system"
)
type sealTestCase struct {
name string
- os internal.System
+ os linux.System
config *app.Config
id app.ID
wantSys *system.I
diff --git a/internal/app/export_test.go b/internal/app/export_test.go
index 8e524681..56eb4a31 100644
--- a/internal/app/export_test.go
+++ b/internal/app/export_test.go
@@ -2,11 +2,11 @@ package app
import (
"git.ophivana.moe/security/fortify/helper/bwrap"
- "git.ophivana.moe/security/fortify/internal"
+ "git.ophivana.moe/security/fortify/internal/linux"
"git.ophivana.moe/security/fortify/internal/system"
)
-func NewWithID(id ID, os internal.System) App {
+func NewWithID(id ID, os linux.System) App {
a := new(app)
a.id = &id
a.os = os
diff --git a/internal/app/launch.machinectl.go b/internal/app/launch.machinectl.go
index c1d26101..3c196b84 100644
--- a/internal/app/launch.machinectl.go
+++ b/internal/app/launch.machinectl.go
@@ -47,8 +47,8 @@ func (a *app) commandBuilderMachineCtl(shimEnv string) (args []string) {
}
innerCommand.WriteString("; ")
- // launch fortify as shim
- innerCommand.WriteString("exec " + a.seal.sys.executable + " shim")
+ // launch fortify shim
+ innerCommand.WriteString("exec " + a.os.FshimPath())
// append inner command
args = append(args, innerCommand.String())
diff --git a/internal/app/launch.sudo.go b/internal/app/launch.sudo.go
index e7a20672..dbb49318 100644
--- a/internal/app/launch.sudo.go
+++ b/internal/app/launch.sudo.go
@@ -24,7 +24,7 @@ func (a *app) commandBuilderSudo(shimEnv string) (args []string) {
args = append(args, shimEnv)
// -- $@
- args = append(args, "--", a.seal.sys.executable, "shim")
+ args = append(args, "--", a.os.FshimPath())
return
}
diff --git a/internal/app/seal.go b/internal/app/seal.go
index 80c3ec29..502ec6e2 100644
--- a/internal/app/seal.go
+++ b/internal/app/seal.go
@@ -7,10 +7,10 @@ import (
"path"
"strconv"
+ shim "git.ophivana.moe/security/fortify/cmd/fshim/ipc"
"git.ophivana.moe/security/fortify/dbus"
- "git.ophivana.moe/security/fortify/internal"
"git.ophivana.moe/security/fortify/internal/fmsg"
- "git.ophivana.moe/security/fortify/internal/shim"
+ "git.ophivana.moe/security/fortify/internal/linux"
"git.ophivana.moe/security/fortify/internal/state"
"git.ophivana.moe/security/fortify/internal/system"
)
@@ -66,7 +66,7 @@ type appSeal struct {
// seal system-level component
sys *appSealSys
- internal.Paths
+ linux.Paths
// protected by upstream mutex
}
@@ -127,13 +127,6 @@ func (a *app) Seal(config *Config) error {
// create seal system component
seal.sys = new(appSealSys)
- // look up fortify executable path
- if p, err := a.os.Executable(); err != nil {
- return fmsg.WrapErrorSuffix(err, "cannot look up fortify executable path:")
- } else {
- seal.sys.executable = p
- }
-
// look up user from system
if u, err := a.os.Lookup(config.User); err != nil {
if errors.As(err, new(user.UnknownUserError)) {
diff --git a/internal/app/share.display.go b/internal/app/share.display.go
index 95132119..7e814a83 100644
--- a/internal/app/share.display.go
+++ b/internal/app/share.display.go
@@ -5,8 +5,8 @@ import (
"path"
"git.ophivana.moe/security/fortify/acl"
- "git.ophivana.moe/security/fortify/internal"
"git.ophivana.moe/security/fortify/internal/fmsg"
+ "git.ophivana.moe/security/fortify/internal/linux"
"git.ophivana.moe/security/fortify/internal/system"
)
@@ -23,7 +23,7 @@ var (
ErrXDisplay = errors.New(display + " unset")
)
-func (seal *appSeal) shareDisplay(os internal.System) error {
+func (seal *appSeal) shareDisplay(os linux.System) error {
// pass $TERM to launcher
if t, ok := os.LookupEnv(term); ok {
seal.sys.bwrap.SetEnv[term] = t
diff --git a/internal/app/share.pulse.go b/internal/app/share.pulse.go
index fa5c0a7a..14315342 100644
--- a/internal/app/share.pulse.go
+++ b/internal/app/share.pulse.go
@@ -6,8 +6,8 @@ import (
"io/fs"
"path"
- "git.ophivana.moe/security/fortify/internal"
"git.ophivana.moe/security/fortify/internal/fmsg"
+ "git.ophivana.moe/security/fortify/internal/linux"
"git.ophivana.moe/security/fortify/internal/system"
)
@@ -25,7 +25,7 @@ var (
ErrPulseMode = errors.New("unexpected pulse socket mode")
)
-func (seal *appSeal) sharePulse(os internal.System) error {
+func (seal *appSeal) sharePulse(os linux.System) error {
if !seal.et.Has(system.EPulse) {
return nil
}
@@ -78,7 +78,7 @@ func (seal *appSeal) sharePulse(os internal.System) error {
}
// discoverPulseCookie attempts various standard methods to discover the current user's PulseAudio authentication cookie
-func discoverPulseCookie(os internal.System) (string, error) {
+func discoverPulseCookie(os linux.System) (string, error) {
if p, ok := os.LookupEnv(pulseCookie); ok {
return p, nil
}
diff --git a/internal/app/share.system.go b/internal/app/share.system.go
index 600119ee..cf2df947 100644
--- a/internal/app/share.system.go
+++ b/internal/app/share.system.go
@@ -4,7 +4,7 @@ import (
"path"
"git.ophivana.moe/security/fortify/acl"
- "git.ophivana.moe/security/fortify/internal"
+ "git.ophivana.moe/security/fortify/internal/linux"
"git.ophivana.moe/security/fortify/internal/system"
)
@@ -38,7 +38,7 @@ func (seal *appSeal) shareSystem() {
seal.sys.bwrap.Tmpfs(seal.SharePath, 1*1024*1024)
}
-func (seal *appSeal) sharePasswd(os internal.System) {
+func (seal *appSeal) sharePasswd(os linux.System) {
// look up shell
sh := "/bin/sh"
if s, ok := os.LookupEnv(shell); ok {
diff --git a/internal/app/start.go b/internal/app/start.go
index a50be6ea..376d3067 100644
--- a/internal/app/start.go
+++ b/internal/app/start.go
@@ -8,9 +8,10 @@ import (
"path/filepath"
"strings"
+ shim0 "git.ophivana.moe/security/fortify/cmd/fshim/ipc"
+ "git.ophivana.moe/security/fortify/cmd/fshim/ipc/shim"
"git.ophivana.moe/security/fortify/helper"
"git.ophivana.moe/security/fortify/internal/fmsg"
- "git.ophivana.moe/security/fortify/internal/shim"
"git.ophivana.moe/security/fortify/internal/state"
"git.ophivana.moe/security/fortify/internal/system"
)
@@ -22,9 +23,9 @@ func (a *app) Start() error {
defer a.lock.Unlock()
// resolve exec paths
- shimExec := [3]string{a.seal.sys.executable, helper.BubblewrapName}
+ shimExec := [2]string{helper.BubblewrapName}
if len(a.seal.command) > 0 {
- shimExec[2] = a.seal.command[0]
+ shimExec[1] = a.seal.command[0]
}
for i, n := range shimExec {
if len(n) == 0 {
@@ -53,7 +54,7 @@ func (a *app) Start() error {
// construct shim manager
a.shim = shim.New(a.seal.toolPath, uint32(a.seal.sys.UID()), path.Join(a.seal.share, "shim"), a.seal.wl,
- &shim.Payload{
+ &shim0.Payload{
Argv: a.seal.command,
Exec: shimExec,
Bwrap: a.seal.sys.bwrap,
diff --git a/internal/app/system.go b/internal/app/system.go
index 74b8e611..3c17cf41 100644
--- a/internal/app/system.go
+++ b/internal/app/system.go
@@ -5,7 +5,7 @@ import (
"git.ophivana.moe/security/fortify/dbus"
"git.ophivana.moe/security/fortify/helper/bwrap"
- "git.ophivana.moe/security/fortify/internal"
+ "git.ophivana.moe/security/fortify/internal/linux"
"git.ophivana.moe/security/fortify/internal/system"
)
@@ -17,8 +17,6 @@ type appSealSys struct {
// default formatted XDG_RUNTIME_DIR of User
runtime string
- // sealed path to fortify executable, used by shim
- executable string
// target user sealed from config
user *user.User
@@ -30,7 +28,7 @@ type appSealSys struct {
}
// shareAll calls all share methods in sequence
-func (seal *appSeal) shareAll(bus [2]*dbus.Config, os internal.System) error {
+func (seal *appSeal) shareAll(bus [2]*dbus.Config, os linux.System) error {
if seal.shared {
panic("seal shared twice")
}