diff options
| author | Ophestra <cat@gensokyo.uk> | 2025-10-08 04:57:22 +0900 |
|---|---|---|
| committer | Ophestra <cat@gensokyo.uk> | 2025-10-08 04:57:22 +0900 |
| commit | 9b507715d42f74c3f18fe817c2464abfca1b0182 (patch) | |
| tree | c3d8ee5ef6809aaf3174bd6ecb00b8115261897e /system | |
| parent | 12ab7ea3b465a130933efd9e7fe044f3636dc6ed (diff) | |
hst/dbus: validate interface strings
This is relocated to hst to validate early.
Signed-off-by: Ophestra <cat@gensokyo.uk>
Diffstat (limited to 'system')
| -rw-r--r-- | system/dbus/config.go | 62 | ||||
| -rw-r--r-- | system/dbus/config_test.go | 6 | ||||
| -rw-r--r-- | system/dbus/proxy.go | 14 |
3 files changed, 4 insertions, 78 deletions
diff --git a/system/dbus/config.go b/system/dbus/config.go index 2aeb3bb7..2a09ee90 100644 --- a/system/dbus/config.go +++ b/system/dbus/config.go @@ -1,74 +1,12 @@ package dbus import ( - "strings" - "hakurei.app/hst" ) // ProxyPair is an upstream dbus address and a downstream socket path. type ProxyPair [2]string -// interfacesAll returns an iterator over all interfaces specified in c. -func interfacesAll(c *hst.BusConfig) func(yield func(string) bool) { - return func(yield func(string) bool) { - for _, iface := range c.See { - if !yield(iface) { - return - } - } - for _, iface := range c.Talk { - if !yield(iface) { - return - } - } - for _, iface := range c.Own { - if !yield(iface) { - return - } - } - - for iface := range c.Call { - if !yield(iface) { - return - } - } - for iface := range c.Broadcast { - if !yield(iface) { - return - } - } - } -} - -// checkInterfaces checks [hst.BusConfig] for invalid interfaces based on an undocumented check in xdg-dbus-error, -// returning [BadInterfaceError] if one is encountered. -func checkInterfaces(c *hst.BusConfig, segment string) error { - for iface := range interfacesAll(c) { - /* - xdg-dbus-proxy fails without output when this condition is not met: - char *dot = strrchr (filter->interface, '.'); - if (dot != NULL) - { - *dot = 0; - if (strcmp (dot + 1, "*") != 0) - filter->member = g_strdup (dot + 1); - } - - trim ".*" since they are removed before searching for '.': - if (g_str_has_suffix (name, ".*")) - { - name[strlen (name) - 2] = 0; - wildcard = TRUE; - } - */ - if strings.IndexByte(strings.TrimSuffix(iface, ".*"), '.') == -1 { - return &BadInterfaceError{iface, segment} - } - } - return nil -} - // Args returns the xdg-dbus-proxy arguments equivalent of [hst.BusConfig]. func Args(c *hst.BusConfig, bus ProxyPair) (args []string) { argc := 2 + len(c.See) + len(c.Talk) + len(c.Own) + len(c.Call) + len(c.Broadcast) diff --git a/system/dbus/config_test.go b/system/dbus/config_test.go index 9a0e570e..84477e40 100644 --- a/system/dbus/config_test.go +++ b/system/dbus/config_test.go @@ -10,7 +10,7 @@ import ( "hakurei.app/system/dbus" ) -func TestConfig_Args(t *testing.T) { +func TestConfigArgs(t *testing.T) { for _, tc := range testCasesExt { if tc.wantErr { // args does not check for nulls @@ -19,9 +19,7 @@ func TestConfig_Args(t *testing.T) { t.Run("build arguments for "+tc.id, func(t *testing.T) { if got := dbus.Args(tc.c, tc.bus); !slices.Equal(got, tc.want) { - t.Errorf("Args(%q) = %v, want %v", - tc.bus, - got, tc.want) + t.Errorf("Args: %v, want %v", got, tc.want) } }) } diff --git a/system/dbus/proxy.go b/system/dbus/proxy.go index 59a1d7d4..535f233d 100644 --- a/system/dbus/proxy.go +++ b/system/dbus/proxy.go @@ -2,7 +2,6 @@ package dbus import ( "context" - "fmt" "io" "sync" "syscall" @@ -16,15 +15,6 @@ import ( // Overriding ProxyName will only affect Proxy instance created after the change. var ProxyName = "xdg-dbus-proxy" -type BadInterfaceError struct { - Interface string - Segment string -} - -func (e *BadInterfaceError) Error() string { - return fmt.Sprintf("bad interface string %q in %s bus configuration", e.Interface, e.Segment) -} - // Proxy holds the state of a xdg-dbus-proxy process, and should never be copied. type Proxy struct { helper helper.Helper @@ -74,13 +64,13 @@ func Finalise(sessionBus, systemBus ProxyPair, session, system *hst.BusConfig) ( var args []string if session != nil { - if err = checkInterfaces(session, "session"); err != nil { + if err = session.CheckInterfaces("session"); err != nil { return } args = append(args, Args(session, sessionBus)...) } if system != nil { - if err = checkInterfaces(system, "system"); err != nil { + if err = system.CheckInterfaces("system"); err != nil { return } args = append(args, Args(system, systemBus)...) |
