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
 | |
| }
 |