github.com/bugraaydogar/snapd@v0.0.0-20210315170335-8c70bb858939/interfaces/builtin/media_hub.go (about)

     1  // -*- Mode: Go; indent-tabs-mode: t -*-
     2  
     3  /*
     4   * Copyright (C) 2017 Canonical Ltd
     5   *
     6   * This program is free software: you can redistribute it and/or modify
     7   * it under the terms of the GNU General Public License version 3 as
     8   * published by the Free Software Foundation.
     9   *
    10   * This program is distributed in the hope that it will be useful,
    11   * but WITHOUT ANY WARRANTY; without even the implied warranty of
    12   * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    13   * GNU General Public License for more details.
    14   *
    15   * You should have received a copy of the GNU General Public License
    16   * along with this program.  If not, see <http://www.gnu.org/licenses/>.
    17   *
    18   */
    19  
    20  package builtin
    21  
    22  import (
    23  	"strings"
    24  
    25  	"github.com/snapcore/snapd/interfaces"
    26  	"github.com/snapcore/snapd/interfaces/apparmor"
    27  	"github.com/snapcore/snapd/interfaces/seccomp"
    28  	"github.com/snapcore/snapd/snap"
    29  )
    30  
    31  const mediaHubSummary = `allows operating as the media-hub service`
    32  
    33  const mediaHubBaseDeclarationSlots = `
    34    media-hub:
    35      allow-installation:
    36        slot-snap-type:
    37          - app
    38          - core
    39      deny-connection:
    40        on-classic: false
    41  `
    42  
    43  const mediaHubPermanentSlotAppArmor = `
    44  # Description: Allow operating as the media-hub service.
    45  
    46  # DBus accesses
    47  #include <abstractions/dbus-session-strict>
    48  
    49  dbus (send)
    50      bus=session
    51      path=/org/freedesktop/DBus
    52      interface=org.freedesktop.DBus
    53      member="{Request,Release}Name"
    54      peer=(name=org.freedesktop.DBus, label=unconfined),
    55  
    56  # Allow querying AppArmor
    57  dbus (send)
    58      bus=session
    59      path=/org/freedesktop/DBus
    60      interface=org.freedesktop.DBus
    61      member="GetConnectionAppArmorSecurityContext"
    62      peer=(name=org.freedesktop.DBus, label=unconfined),
    63  
    64  # Allow binding the service to the requested connection name
    65  dbus (bind)
    66      bus=session
    67      name="core.ubuntu.media.Service",
    68  
    69  # Allow communications with unconfined processes
    70  dbus (receive, send)
    71      bus=session
    72      path=/com/ubuntu/media/Service{,/**}
    73      interface=org.freedesktop.DBus{,.*}
    74      peer=(label=unconfined),
    75  
    76  # Allow unconfined processes to introspect us
    77  dbus (receive)
    78      bus=session
    79      interface=org.freedesktop.DBus.Introspectable
    80      peer=(label=unconfined),
    81  
    82  dbus (receive, send)
    83      bus=session
    84      path=/core/ubuntu/media/Service{,/**}
    85      peer=(label=unconfined),
    86  
    87  # Allow sending/receiving mpris signals for session path
    88  dbus (receive, send)
    89      bus=session
    90      path=/core/ubuntu/media/Service/sessions/**
    91      interface="org.mpris.MediaPlayer2{,.Player,.TrackList}"
    92      peer=(label=unconfined),
    93  
    94  # Allow sending properties signals for session path
    95  dbus (send)
    96      bus=session
    97      path=/core/ubuntu/media/Service/sessions/**
    98      interface="org.freedesktop.DBus.Properties"
    99      peer=(label=unconfined),
   100  `
   101  
   102  const mediaHubConnectedSlotAppArmor = `
   103  # Allow clients to query/modify and get notified of service properties
   104  dbus (receive, send)
   105      bus=session
   106      interface=org.freedesktop.DBus.Properties
   107      path=/core/ubuntu/media/Service{,/**}
   108      peer=(label=###PLUG_SECURITY_TAGS###),
   109  
   110  # Allow client to introspect our DBus api
   111  dbus (receive)
   112      bus=session
   113      interface=org.freedesktop.DBus.Introspectable
   114      path=/core/ubuntu/media/Service
   115      member="Introspect"
   116      peer=(label=###PLUG_SECURITY_TAGS###),
   117  
   118  # Allow clients to manage Player sessions
   119  dbus (receive)
   120      bus=session
   121      interface="core.ubuntu.media.Service{,.*}"
   122      path=/core/ubuntu/media/Service
   123      peer=(label=###PLUG_SECURITY_TAGS###),
   124  `
   125  
   126  const mediaHubConnectedPlugAppArmor = `
   127  # Description: Allow using media-hub service.
   128  
   129  #include <abstractions/dbus-session-strict>
   130  
   131  # Allow clients to query/modify and get notified of service properties
   132  dbus (receive, send)
   133      bus=session
   134      interface=org.freedesktop.DBus.Properties
   135      path=/core/ubuntu/media/Service{,/**}
   136      peer=(label=###SLOT_SECURITY_TAGS###),
   137  
   138  # Allow client to introspect our DBus api
   139  dbus (send)
   140      bus=session
   141      interface=org.freedesktop.DBus.Introspectable
   142      path=/core/ubuntu/media/Service
   143      member="Introspect"
   144      peer=(label=###SLOT_SECURITY_TAGS###),
   145  
   146  # Allow clients to manage Player sessions
   147  dbus (send)
   148      bus=session
   149      interface="core.ubuntu.media.Service{,.*}"
   150      path=/core/ubuntu/media/Service
   151      peer=(label=###SLOT_SECURITY_TAGS###),
   152  `
   153  
   154  const mediaHubPermanentSlotSecComp = `
   155  # Description: Allow operating as the media-hub service.
   156  
   157  bind
   158  `
   159  
   160  type mediaHubInterface struct{}
   161  
   162  func (iface *mediaHubInterface) Name() string {
   163  	return "media-hub"
   164  }
   165  
   166  func (iface *mediaHubInterface) StaticInfo() interfaces.StaticInfo {
   167  	return interfaces.StaticInfo{
   168  		Summary:              mediaHubSummary,
   169  		BaseDeclarationSlots: mediaHubBaseDeclarationSlots,
   170  	}
   171  }
   172  
   173  func (iface *mediaHubInterface) AppArmorConnectedPlug(spec *apparmor.Specification, plug *interfaces.ConnectedPlug, slot *interfaces.ConnectedSlot) error {
   174  	old := "###SLOT_SECURITY_TAGS###"
   175  	new := slotAppLabelExpr(slot)
   176  	spec.AddSnippet(strings.Replace(mediaHubConnectedPlugAppArmor, old, new, -1))
   177  	return nil
   178  }
   179  
   180  func (iface *mediaHubInterface) AppArmorPermanentSlot(spec *apparmor.Specification, slot *snap.SlotInfo) error {
   181  	spec.AddSnippet(mediaHubPermanentSlotAppArmor)
   182  	return nil
   183  }
   184  
   185  func (iface *mediaHubInterface) AppArmorConnectedSlot(spec *apparmor.Specification, plug *interfaces.ConnectedPlug, slot *interfaces.ConnectedSlot) error {
   186  	old := "###PLUG_SECURITY_TAGS###"
   187  	new := plugAppLabelExpr(plug)
   188  	spec.AddSnippet(strings.Replace(mediaHubConnectedSlotAppArmor, old, new, -1))
   189  	return nil
   190  }
   191  
   192  func (iface *mediaHubInterface) SecCompPermanentSlot(spec *seccomp.Specification, slot *snap.SlotInfo) error {
   193  	spec.AddSnippet(mediaHubPermanentSlotSecComp)
   194  	return nil
   195  }
   196  
   197  func (iface *mediaHubInterface) AutoConnect(*snap.PlugInfo, *snap.SlotInfo) bool {
   198  	// allow what declarations allowed
   199  	return true
   200  }
   201  
   202  func init() {
   203  	registerIface(&mediaHubInterface{})
   204  }