aboutsummaryrefslogtreecommitdiffhomepage
path: root/internal/app/pulse.go
diff options
context:
space:
mode:
Diffstat (limited to 'internal/app/pulse.go')
-rw-r--r--internal/app/pulse.go109
1 files changed, 0 insertions, 109 deletions
diff --git a/internal/app/pulse.go b/internal/app/pulse.go
deleted file mode 100644
index 8b4921ed..00000000
--- a/internal/app/pulse.go
+++ /dev/null
@@ -1,109 +0,0 @@
-package app
-
-import (
- "errors"
- "fmt"
- "io/fs"
- "os"
- "path"
-
- "git.ophivana.moe/cat/fortify/acl"
- "git.ophivana.moe/cat/fortify/internal"
- "git.ophivana.moe/cat/fortify/internal/util"
- "git.ophivana.moe/cat/fortify/internal/verbose"
-)
-
-const (
- pulseServer = "PULSE_SERVER"
- pulseCookie = "PULSE_COOKIE"
-
- home = "HOME"
- xdgConfigHome = "XDG_CONFIG_HOME"
-)
-
-func (a *App) SharePulse() {
- a.setEnablement(internal.EnablePulse)
-
- // ensure PulseAudio directory ACL (e.g. `/run/user/%d/pulse`)
- pulse := path.Join(a.runtimePath, "pulse")
- pulseS := path.Join(pulse, "native")
- if s, err := os.Stat(pulse); err != nil {
- if !errors.Is(err, fs.ErrNotExist) {
- internal.Fatal("Error accessing PulseAudio directory:", err)
- }
- internal.Fatal(fmt.Sprintf("PulseAudio dir '%s' not found", pulse))
- } else {
- // add environment variable for new process
- a.AppendEnv(pulseServer, "unix:"+pulseS)
- if err = acl.UpdatePerm(pulse, a.UID(), acl.Execute); err != nil {
- internal.Fatal("Error preparing PulseAudio:", err)
- } else {
- a.exit.RegisterRevertPath(pulse)
- }
-
- // ensure PulseAudio socket permission (e.g. `/run/user/%d/pulse/native`)
- if s, err = os.Stat(pulseS); err != nil {
- if errors.Is(err, fs.ErrNotExist) {
- internal.Fatal("PulseAudio directory found but socket does not exist")
- }
- internal.Fatal("Error accessing PulseAudio socket:", err)
- } else {
- if m := s.Mode(); m&0o006 != 0o006 {
- internal.Fatal(fmt.Sprintf("Unexpected permissions on '%s':", pulseS), m)
- }
- }
-
- // Publish current user's pulse-cookie for target user
- pulseCookieSource := discoverPulseCookie()
- pulseCookieFinal := path.Join(a.sharePath, "pulse-cookie")
- a.AppendEnv(pulseCookie, pulseCookieFinal)
- verbose.Printf("Publishing PulseAudio cookie '%s' to '%s'\n", pulseCookieSource, pulseCookieFinal)
- if err = util.CopyFile(pulseCookieFinal, pulseCookieSource); err != nil {
- internal.Fatal("Error copying PulseAudio cookie:", err)
- }
- if err = acl.UpdatePerm(pulseCookieFinal, a.UID(), acl.Read); err != nil {
- internal.Fatal("Error publishing PulseAudio cookie:", err)
- } else {
- a.exit.RegisterRevertPath(pulseCookieFinal)
- }
-
- verbose.Printf("PulseAudio dir '%s' configured\n", pulse)
- }
-}
-
-// discoverPulseCookie try various standard methods to discover the current user's PulseAudio authentication cookie
-func discoverPulseCookie() string {
- if p, ok := os.LookupEnv(pulseCookie); ok {
- return p
- }
-
- if p, ok := os.LookupEnv(home); ok {
- p = path.Join(p, ".pulse-cookie")
- if s, err := os.Stat(p); err != nil {
- if !errors.Is(err, fs.ErrNotExist) {
- internal.Fatal("Error accessing PulseAudio cookie:", err)
- // unreachable
- return p
- }
- } else if !s.IsDir() {
- return p
- }
- }
-
- if p, ok := os.LookupEnv(xdgConfigHome); ok {
- p = path.Join(p, "pulse", "cookie")
- if s, err := os.Stat(p); err != nil {
- if !errors.Is(err, fs.ErrNotExist) {
- internal.Fatal("Error accessing PulseAudio cookie:", err)
- // unreachable
- return p
- }
- } else if !s.IsDir() {
- return p
- }
- }
-
- internal.Fatal(fmt.Sprintf("Cannot locate PulseAudio cookie (tried $%s, $%s/pulse/cookie, $%s/.pulse-cookie)",
- pulseCookie, xdgConfigHome, home))
- return ""
-}