All checks were successful
Test / Create distribution (push) Successful in 33s
Test / Sandbox (push) Successful in 2m12s
Test / Hakurei (push) Successful in 3m3s
Test / Hpkg (push) Successful in 3m58s
Test / Sandbox (race detector) (push) Successful in 4m24s
Test / Hakurei (race detector) (push) Successful in 5m11s
Test / Flake checks (push) Successful in 1m22s
This is relocated to hst to validate early. Signed-off-by: Ophestra <cat@gensokyo.uk>
110 lines
2.6 KiB
Go
110 lines
2.6 KiB
Go
package hst
|
|
|
|
import (
|
|
"strconv"
|
|
"strings"
|
|
)
|
|
|
|
// BadInterfaceError is returned when Interface fails an undocumented check in xdg-dbus-proxy,
|
|
// which would have cause a silent failure.
|
|
type BadInterfaceError struct {
|
|
// Interface is the offending interface string.
|
|
Interface string
|
|
// Segment is passed through from the [BusConfig.CheckInterfaces] argument.
|
|
Segment string
|
|
}
|
|
|
|
func (e *BadInterfaceError) Message() string { return e.Error() }
|
|
func (e *BadInterfaceError) Error() string {
|
|
if e == nil {
|
|
return "<nil>"
|
|
}
|
|
return "bad interface string " + strconv.Quote(e.Interface) + " in " + e.Segment + " bus configuration"
|
|
}
|
|
|
|
// BusConfig configures the xdg-dbus-proxy process.
|
|
type BusConfig struct {
|
|
// See set 'see' policy for NAME (--see=NAME)
|
|
See []string `json:"see"`
|
|
// Talk set 'talk' policy for NAME (--talk=NAME)
|
|
Talk []string `json:"talk"`
|
|
// Own set 'own' policy for NAME (--own=NAME)
|
|
Own []string `json:"own"`
|
|
|
|
// Call set RULE for calls on NAME (--call=NAME=RULE)
|
|
Call map[string]string `json:"call"`
|
|
// Broadcast set RULE for broadcasts from NAME (--broadcast=NAME=RULE)
|
|
Broadcast map[string]string `json:"broadcast"`
|
|
|
|
// Log turn on logging (--log)
|
|
Log bool `json:"log,omitempty"`
|
|
// Filter enable filtering (--filter)
|
|
Filter bool `json:"filter"`
|
|
}
|
|
|
|
// Interfaces iterates over all interface strings specified in [BusConfig].
|
|
func (c *BusConfig) Interfaces(yield func(string) bool) {
|
|
if c == nil {
|
|
return
|
|
}
|
|
|
|
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 for invalid interface strings based on an undocumented check in xdg-dbus-error,
|
|
// returning [BadInterfaceError] if one is encountered.
|
|
func (c *BusConfig) CheckInterfaces(segment string) error {
|
|
if c == nil {
|
|
return nil
|
|
}
|
|
|
|
for iface := range c.Interfaces {
|
|
/*
|
|
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
|
|
}
|