aboutsummaryrefslogtreecommitdiffhomepage
path: root/internal/system/dbus.go
diff options
context:
space:
mode:
Diffstat (limited to 'internal/system/dbus.go')
-rw-r--r--internal/system/dbus.go148
1 files changed, 0 insertions, 148 deletions
diff --git a/internal/system/dbus.go b/internal/system/dbus.go
deleted file mode 100644
index cbb127ed..00000000
--- a/internal/system/dbus.go
+++ /dev/null
@@ -1,148 +0,0 @@
-package system
-
-import (
- "bytes"
- "errors"
- "log"
- "strings"
- "sync"
-
- "git.gensokyo.uk/security/fortify/dbus"
-)
-
-var (
- ErrDBusConfig = errors.New("dbus config not supplied")
-)
-
-func (sys *I) MustProxyDBus(sessionPath string, session *dbus.Config, systemPath string, system *dbus.Config) *I {
- if _, err := sys.ProxyDBus(session, system, sessionPath, systemPath); err != nil {
- panic(err.Error())
- } else {
- return sys
- }
-}
-
-func (sys *I) ProxyDBus(session, system *dbus.Config, sessionPath, systemPath string) (func(), error) {
- d := new(DBus)
-
- // session bus is mandatory
- if session == nil {
- return nil, sys.wrapErr(ErrDBusConfig,
- "attempted to seal message bus proxy without session bus config")
- }
-
- // system bus is optional
- d.system = system != nil
-
- // upstream address, downstream socket path
- var sessionBus, systemBus [2]string
-
- // resolve upstream bus addresses
- sessionBus[0], systemBus[0] = dbus.Address()
-
- // set paths from caller
- sessionBus[1], systemBus[1] = sessionPath, systemPath
-
- // create proxy instance
- d.proxy = dbus.New(sessionBus, systemBus)
-
- defer func() {
- if sys.IsVerbose() && d.proxy.Sealed() {
- sys.println("sealed session proxy", session.Args(sessionBus))
- if system != nil {
- sys.println("sealed system proxy", system.Args(systemBus))
- }
- sys.println("message bus proxy final args:", d.proxy)
- }
- }()
-
- // queue operation
- sys.ops = append(sys.ops, d)
-
- // seal dbus proxy
- d.out = &scanToFmsg{msg: new(strings.Builder)}
- return d.out.Dump, sys.wrapErrSuffix(d.proxy.Seal(session, system),
- "cannot seal message bus proxy:")
-}
-
-type DBus struct {
- proxy *dbus.Proxy
-
- out *scanToFmsg
- // whether system bus proxy is enabled
- system bool
-}
-
-func (d *DBus) Type() Enablement { return Process }
-
-func (d *DBus) apply(sys *I) error {
- sys.printf("session bus proxy on %q for upstream %q", d.proxy.Session()[1], d.proxy.Session()[0])
- if d.system {
- sys.printf("system bus proxy on %q for upstream %q", d.proxy.System()[1], d.proxy.System()[0])
- }
-
- // this starts the process and blocks until ready
- if err := d.proxy.Start(sys.ctx, d.out, true); err != nil {
- d.out.Dump()
- return sys.wrapErrSuffix(err,
- "cannot start message bus proxy:")
- }
- sys.println("starting message bus proxy:", d.proxy)
- return nil
-}
-
-func (d *DBus) revert(sys *I, _ *Criteria) error {
- // criteria ignored here since dbus is always process-scoped
- sys.println("terminating message bus proxy")
- d.proxy.Close()
- defer sys.println("message bus proxy exit")
- return sys.wrapErrSuffix(d.proxy.Wait(), "message bus proxy error:")
-}
-
-func (d *DBus) Is(o Op) bool {
- d0, ok := o.(*DBus)
- return ok && d0 != nil &&
- ((d.proxy == nil && d0.proxy == nil) ||
- (d.proxy != nil && d0.proxy != nil && d.proxy.String() == d0.proxy.String()))
-}
-
-func (d *DBus) Path() string {
- return "(dbus proxy)"
-}
-
-func (d *DBus) String() string {
- return d.proxy.String()
-}
-
-type scanToFmsg struct {
- msg *strings.Builder
- msgbuf []string
-
- mu sync.RWMutex
-}
-
-func (s *scanToFmsg) Write(p []byte) (n int, err error) {
- s.mu.Lock()
- defer s.mu.Unlock()
- return s.write(p, 0)
-}
-
-func (s *scanToFmsg) write(p []byte, a int) (int, error) {
- if i := bytes.IndexByte(p, '\n'); i == -1 {
- n, _ := s.msg.Write(p)
- return a + n, nil
- } else {
- n, _ := s.msg.Write(p[:i])
- s.msgbuf = append(s.msgbuf, s.msg.String())
- s.msg.Reset()
- return s.write(p[i+1:], a+n+1)
- }
-}
-
-func (s *scanToFmsg) Dump() {
- s.mu.RLock()
- for _, msg := range s.msgbuf {
- log.Println(msg)
- }
- s.mu.RUnlock()
-}