# apparmor.d - Full set of apparmor profiles
# Copyright (C) 2023-2024 Alexandre Pujol <alexandre@pujol.io>
# SPDX-License-Identifier: GPL-2.0-only

abi <abi/4.0>,

include <tunables/global>

@{exec_path} = @{bin}/kwin_wayland
@{att} = /att/kwin_wayland/
profile kwin_wayland /{,usr/}bin/kwin_wayland flags=(attach_disconnected,attach_disconnected.path=@{att},mediate_deleted) {
  include <abstractions/attached/base>
  include <abstractions/app-launcher-user>
  include <abstractions/audio-client>
  include <abstractions/bus-session>
  include <abstractions/bus/system/org.freedesktop.locale1>
  include <abstractions/common/kde>
  include <abstractions/fontconfig-cache-write>
  include <abstractions/input>
  include <abstractions/attached/nameservice-strict>
  include <abstractions/sys/dmi>

  # See https://community.kde.org/Distributions/Packaging_Recommendations#KWin_package_configuration
  capability sys_nice,

  capability sys_ptrace,

  network netlink raw,

  signal receive set=term peer=sddm,
  signal receive set=(kill, term) peer=kwin_wayland_wrapper,
  signal send set=usr1 peer=kscreenlocker_greet,
  signal send set=(abrt kill term),

  ptrace read,

  unix type=stream peer=(label=xkbcomp),
  unix type=stream peer=(label=xwayland),

  #aa/dbus own bus=session name=org.freedesktop.a11y.Manager
  include <abstractions/bus/session/own>
  dbus bind bus=session name=org.freedesktop.a11y.Manager{,.*},
  dbus receive bus=session path=/org/freedesktop/a11y/Manager{,/**}
       interface=org.freedesktop.a11y.Manager{,.*}
       peer=(name="@{busname}"),
  dbus send bus=session path=/org/freedesktop/a11y/Manager{,/**}
       interface=org.freedesktop.a11y.Manager{,.*}
       peer=(name="{@{busname},org.freedesktop.DBus}"),
  # DBus.Properties: reply to properties request from anyone
  dbus (send receive) bus=session path=/org/freedesktop/a11y/Manager{,/**}
       interface=org.freedesktop.DBus.Properties
       member={Get,GetAll,Set,PropertiesChanged}
       peer=(name="{@{busname},org.freedesktop.DBus}"),
  # DBus.Introspectable: allow clients to introspect the service
  dbus receive bus=session path=/org/freedesktop/a11y/Manager{,/**}
       interface=org.freedesktop.DBus.Introspectable
       member=Introspect
       peer=(name="@{busname}"),
  # DBus.ObjectManager: allow clients to enumerate sources
  dbus receive bus=session path=/org/freedesktop/a11y/Manager{,/**}
       interface=org.freedesktop.DBus.ObjectManager
       member=GetManagedObjects
       peer=(name="{@{busname},org.freedesktop.a11y.Manager{,.*}}"),
  dbus send bus=session path=/org/freedesktop/a11y/Manager{,/**}
       interface=org.freedesktop.DBus.ObjectManager
       member={InterfacesAdded,InterfacesRemoved}
       peer=(name="{@{busname},org.freedesktop.DBus}"),

  #aa/dbus own bus=session name=org.freedesktop.ScreenSaver
  dbus bind bus=session name=org.freedesktop.ScreenSaver{,.*},
  dbus receive bus=session path=/org/freedesktop/ScreenSaver{,/**}
       interface=org.freedesktop.ScreenSaver{,.*}
       peer=(name="@{busname}"),
  dbus send bus=session path=/org/freedesktop/ScreenSaver{,/**}
       interface=org.freedesktop.ScreenSaver{,.*}
       peer=(name="{@{busname},org.freedesktop.DBus}"),
  # DBus.Properties: reply to properties request from anyone
  dbus (send receive) bus=session path=/org/freedesktop/ScreenSaver{,/**}
       interface=org.freedesktop.DBus.Properties
       member={Get,GetAll,Set,PropertiesChanged}
       peer=(name="{@{busname},org.freedesktop.DBus}"),
  # DBus.Introspectable: allow clients to introspect the service
  dbus receive bus=session path=/org/freedesktop/ScreenSaver{,/**}
       interface=org.freedesktop.DBus.Introspectable
       member=Introspect
       peer=(name="@{busname}"),
  # DBus.ObjectManager: allow clients to enumerate sources
  dbus receive bus=session path=/org/freedesktop/ScreenSaver{,/**}
       interface=org.freedesktop.DBus.ObjectManager
       member=GetManagedObjects
       peer=(name="{@{busname},org.freedesktop.ScreenSaver{,.*}}"),
  dbus send bus=session path=/org/freedesktop/ScreenSaver{,/**}
       interface=org.freedesktop.DBus.ObjectManager
       member={InterfacesAdded,InterfacesRemoved}
       peer=(name="{@{busname},org.freedesktop.DBus}"),

  #aa/dbus own bus=session name=org.kde.keyboard
  dbus bind bus=session name=org.kde.keyboard{,.*},
  dbus receive bus=session path=/org/kde/keyboard{,/**}
       interface=org.kde.keyboard{,.*}
       peer=(name="@{busname}"),
  dbus send bus=session path=/org/kde/keyboard{,/**}
       interface=org.kde.keyboard{,.*}
       peer=(name="{@{busname},org.freedesktop.DBus}"),
  # DBus.Properties: reply to properties request from anyone
  dbus (send receive) bus=session path=/org/kde/keyboard{,/**}
       interface=org.freedesktop.DBus.Properties
       member={Get,GetAll,Set,PropertiesChanged}
       peer=(name="{@{busname},org.freedesktop.DBus}"),
  # DBus.Introspectable: allow clients to introspect the service
  dbus receive bus=session path=/org/kde/keyboard{,/**}
       interface=org.freedesktop.DBus.Introspectable
       member=Introspect
       peer=(name="@{busname}"),
  # DBus.ObjectManager: allow clients to enumerate sources
  dbus receive bus=session path=/org/kde/keyboard{,/**}
       interface=org.freedesktop.DBus.ObjectManager
       member=GetManagedObjects
       peer=(name="{@{busname},org.kde.keyboard{,.*}}"),
  dbus send bus=session path=/org/kde/keyboard{,/**}
       interface=org.freedesktop.DBus.ObjectManager
       member={InterfacesAdded,InterfacesRemoved}
       peer=(name="{@{busname},org.freedesktop.DBus}"),

  #aa/dbus own bus=session name=org.kde.KeyboardLayouts path=/Layouts
  dbus bind bus=session name=org.kde.KeyboardLayouts{,.*},
  dbus receive bus=session path=/Layouts
       interface=org.kde.KeyboardLayouts{,.*}
       peer=(name="@{busname}"),
  dbus send bus=session path=/Layouts
       interface=org.kde.KeyboardLayouts{,.*}
       peer=(name="{@{busname},org.freedesktop.DBus}"),
  # DBus.Properties: reply to properties request from anyone
  dbus (send receive) bus=session path=/Layouts
       interface=org.freedesktop.DBus.Properties
       member={Get,GetAll,Set,PropertiesChanged}
       peer=(name="{@{busname},org.freedesktop.DBus}"),
  # DBus.Introspectable: allow clients to introspect the service
  dbus receive bus=session path=/Layouts
       interface=org.freedesktop.DBus.Introspectable
       member=Introspect
       peer=(name="@{busname}"),
  # DBus.ObjectManager: allow clients to enumerate sources
  dbus receive bus=session path=/Layouts
       interface=org.freedesktop.DBus.ObjectManager
       member=GetManagedObjects
       peer=(name="{@{busname},org.kde.KeyboardLayouts{,.*}}"),
  dbus send bus=session path=/Layouts
       interface=org.freedesktop.DBus.ObjectManager
       member={InterfacesAdded,InterfacesRemoved}
       peer=(name="{@{busname},org.freedesktop.DBus}"),

  #aa/dbus own bus=session name=org.kde.KGlobalAccel path=/kglobalaccel
  dbus bind bus=session name=org.kde.KGlobalAccel{,.*},
  dbus receive bus=session path=/kglobalaccel
       interface=org.kde.KGlobalAccel{,.*}
       peer=(name="@{busname}"),
  dbus send bus=session path=/kglobalaccel
       interface=org.kde.KGlobalAccel{,.*}
       peer=(name="{@{busname},org.freedesktop.DBus}"),
  # DBus.Properties: reply to properties request from anyone
  dbus (send receive) bus=session path=/kglobalaccel
       interface=org.freedesktop.DBus.Properties
       member={Get,GetAll,Set,PropertiesChanged}
       peer=(name="{@{busname},org.freedesktop.DBus}"),
  # DBus.Introspectable: allow clients to introspect the service
  dbus receive bus=session path=/kglobalaccel
       interface=org.freedesktop.DBus.Introspectable
       member=Introspect
       peer=(name="@{busname}"),
  # DBus.ObjectManager: allow clients to enumerate sources
  dbus receive bus=session path=/kglobalaccel
       interface=org.freedesktop.DBus.ObjectManager
       member=GetManagedObjects
       peer=(name="{@{busname},org.kde.KGlobalAccel{,.*}}"),
  dbus send bus=session path=/kglobalaccel
       interface=org.freedesktop.DBus.ObjectManager
       member={InterfacesAdded,InterfacesRemoved}
       peer=(name="{@{busname},org.freedesktop.DBus}"),

  #aa/dbus own bus=session name=org.kde.KWin
  dbus bind bus=session name=org.kde.KWin{,.*},
  dbus receive bus=session path=/org/kde/KWin{,/**}
       interface=org.kde.KWin{,.*}
       peer=(name="@{busname}"),
  dbus send bus=session path=/org/kde/KWin{,/**}
       interface=org.kde.KWin{,.*}
       peer=(name="{@{busname},org.freedesktop.DBus}"),
  # DBus.Properties: reply to properties request from anyone
  dbus (send receive) bus=session path=/org/kde/KWin{,/**}
       interface=org.freedesktop.DBus.Properties
       member={Get,GetAll,Set,PropertiesChanged}
       peer=(name="{@{busname},org.freedesktop.DBus}"),
  # DBus.Introspectable: allow clients to introspect the service
  dbus receive bus=session path=/org/kde/KWin{,/**}
       interface=org.freedesktop.DBus.Introspectable
       member=Introspect
       peer=(name="@{busname}"),
  # DBus.ObjectManager: allow clients to enumerate sources
  dbus receive bus=session path=/org/kde/KWin{,/**}
       interface=org.freedesktop.DBus.ObjectManager
       member=GetManagedObjects
       peer=(name="{@{busname},org.kde.KWin{,.*}}"),
  dbus send bus=session path=/org/kde/KWin{,/**}
       interface=org.freedesktop.DBus.ObjectManager
       member={InterfacesAdded,InterfacesRemoved}
       peer=(name="{@{busname},org.freedesktop.DBus}"),

  #aa/dbus own bus=session name=org.kde.NightColor path=/ColorCorrect
  dbus bind bus=session name=org.kde.NightColor{,.*},
  dbus receive bus=session path=/ColorCorrect
       interface=org.kde.NightColor{,.*}
       peer=(name="@{busname}"),
  dbus send bus=session path=/ColorCorrect
       interface=org.kde.NightColor{,.*}
       peer=(name="{@{busname},org.freedesktop.DBus}"),
  # DBus.Properties: reply to properties request from anyone
  dbus (send receive) bus=session path=/ColorCorrect
       interface=org.freedesktop.DBus.Properties
       member={Get,GetAll,Set,PropertiesChanged}
       peer=(name="{@{busname},org.freedesktop.DBus}"),
  # DBus.Introspectable: allow clients to introspect the service
  dbus receive bus=session path=/ColorCorrect
       interface=org.freedesktop.DBus.Introspectable
       member=Introspect
       peer=(name="@{busname}"),
  # DBus.ObjectManager: allow clients to enumerate sources
  dbus receive bus=session path=/ColorCorrect
       interface=org.freedesktop.DBus.ObjectManager
       member=GetManagedObjects
       peer=(name="{@{busname},org.kde.NightColor{,.*}}"),
  dbus send bus=session path=/ColorCorrect
       interface=org.freedesktop.DBus.ObjectManager
       member={InterfacesAdded,InterfacesRemoved}
       peer=(name="{@{busname},org.freedesktop.DBus}"),

  #aa/dbus own bus=session name=org.kde.screensaver
  dbus bind bus=session name=org.kde.screensaver{,.*},
  dbus receive bus=session path=/org/kde/screensaver{,/**}
       interface=org.kde.screensaver{,.*}
       peer=(name="@{busname}"),
  dbus send bus=session path=/org/kde/screensaver{,/**}
       interface=org.kde.screensaver{,.*}
       peer=(name="{@{busname},org.freedesktop.DBus}"),
  # DBus.Properties: reply to properties request from anyone
  dbus (send receive) bus=session path=/org/kde/screensaver{,/**}
       interface=org.freedesktop.DBus.Properties
       member={Get,GetAll,Set,PropertiesChanged}
       peer=(name="{@{busname},org.freedesktop.DBus}"),
  # DBus.Introspectable: allow clients to introspect the service
  dbus receive bus=session path=/org/kde/screensaver{,/**}
       interface=org.freedesktop.DBus.Introspectable
       member=Introspect
       peer=(name="@{busname}"),
  # DBus.ObjectManager: allow clients to enumerate sources
  dbus receive bus=session path=/org/kde/screensaver{,/**}
       interface=org.freedesktop.DBus.ObjectManager
       member=GetManagedObjects
       peer=(name="{@{busname},org.kde.screensaver{,.*}}"),
  dbus send bus=session path=/org/kde/screensaver{,/**}
       interface=org.freedesktop.DBus.ObjectManager
       member={InterfacesAdded,InterfacesRemoved}
       peer=(name="{@{busname},org.freedesktop.DBus}"),

  #aa/dbus own bus=session name=org.kde.touchpad
  dbus bind bus=session name=org.kde.touchpad{,.*},
  dbus receive bus=session path=/org/kde/touchpad{,/**}
       interface=org.kde.touchpad{,.*}
       peer=(name="@{busname}"),
  dbus send bus=session path=/org/kde/touchpad{,/**}
       interface=org.kde.touchpad{,.*}
       peer=(name="{@{busname},org.freedesktop.DBus}"),
  # DBus.Properties: reply to properties request from anyone
  dbus (send receive) bus=session path=/org/kde/touchpad{,/**}
       interface=org.freedesktop.DBus.Properties
       member={Get,GetAll,Set,PropertiesChanged}
       peer=(name="{@{busname},org.freedesktop.DBus}"),
  # DBus.Introspectable: allow clients to introspect the service
  dbus receive bus=session path=/org/kde/touchpad{,/**}
       interface=org.freedesktop.DBus.Introspectable
       member=Introspect
       peer=(name="@{busname}"),
  # DBus.ObjectManager: allow clients to enumerate sources
  dbus receive bus=session path=/org/kde/touchpad{,/**}
       interface=org.freedesktop.DBus.ObjectManager
       member=GetManagedObjects
       peer=(name="{@{busname},org.kde.touchpad{,.*}}"),
  dbus send bus=session path=/org/kde/touchpad{,/**}
       interface=org.freedesktop.DBus.ObjectManager
       member={InterfacesAdded,InterfacesRemoved}
       peer=(name="{@{busname},org.freedesktop.DBus}"),


  #aa/dbus talk bus=session name=org.kde.ActivityManager path=/ActivityManager label=kactivitymanagerd
  # Unix: allow connection to the profile
  unix type=stream peer=(label=kactivitymanagerd),
  # org.kde.ActivityManager: send and receive anything to the interface on the specific peer label
  dbus (send receive) bus=session path=/ActivityManager
       interface=org.kde.ActivityManager{,.*}
       peer=(name="{@{busname},org.kde.ActivityManager{,.*},org.freedesktop.DBus}", label=kactivitymanagerd),
  dbus send bus=session path=/ActivityManager
       interface=org.kde.ActivityManager{,.*}
       peer=(name="org.kde.ActivityManager{,.*}"),
  # DBus.Properties: read and send properties
  dbus (send receive) bus=session path=/ActivityManager
       interface=org.freedesktop.DBus.Properties
       member={Get,GetAll,Set,PropertiesChanged}
       peer=(name="{@{busname},org.kde.ActivityManager{,.*},org.freedesktop.DBus}", label=kactivitymanagerd),
  # DBus.Introspectable: allow service introspection
  dbus send bus=session path=/ActivityManager
       interface=org.freedesktop.DBus.Introspectable
       member=Introspect
       peer=(name="{@{busname},org.kde.ActivityManager{,.*},org.freedesktop.DBus}", label=kactivitymanagerd),
  # DBus.ObjectManager: allow clients to enumerate sources
  dbus send bus=session path=/ActivityManager
       interface=org.freedesktop.DBus.ObjectManager
       member=GetManagedObjects
       peer=(name="{@{busname},org.kde.ActivityManager{,.*},org.freedesktop.DBus}", label=kactivitymanagerd),
  dbus receive bus=session path=/ActivityManager
       interface=org.freedesktop.DBus.ObjectManager
       member={InterfacesAdded,InterfacesRemoved}
       peer=(name="{@{busname},org.kde.ActivityManager{,.*},org.freedesktop.DBus}", label=kactivitymanagerd),

  #aa/dbus talk bus=session name=org.kde.Solid.PowerManagement label=kde-powerdevil
  # Unix: allow connection to the profile
  unix type=stream peer=(label=kde-powerdevil),
  # org.kde.Solid.PowerManagement: send and receive anything to the interface on the specific peer label
  dbus (send receive) bus=session path=/org/kde/Solid/PowerManagement{,/**}
       interface=org.kde.Solid.PowerManagement{,.*}
       peer=(name="{@{busname},org.kde.Solid.PowerManagement{,.*},org.freedesktop.DBus}", label=kde-powerdevil),
  dbus send bus=session path=/org/kde/Solid/PowerManagement{,/**}
       interface=org.kde.Solid.PowerManagement{,.*}
       peer=(name="org.kde.Solid.PowerManagement{,.*}"),
  # DBus.Properties: read and send properties
  dbus (send receive) bus=session path=/org/kde/Solid/PowerManagement{,/**}
       interface=org.freedesktop.DBus.Properties
       member={Get,GetAll,Set,PropertiesChanged}
       peer=(name="{@{busname},org.kde.Solid.PowerManagement{,.*},org.freedesktop.DBus}", label=kde-powerdevil),
  # DBus.Introspectable: allow service introspection
  dbus send bus=session path=/org/kde/Solid/PowerManagement{,/**}
       interface=org.freedesktop.DBus.Introspectable
       member=Introspect
       peer=(name="{@{busname},org.kde.Solid.PowerManagement{,.*},org.freedesktop.DBus}", label=kde-powerdevil),
  # DBus.ObjectManager: allow clients to enumerate sources
  dbus send bus=session path=/org/kde/Solid/PowerManagement{,/**}
       interface=org.freedesktop.DBus.ObjectManager
       member=GetManagedObjects
       peer=(name="{@{busname},org.kde.Solid.PowerManagement{,.*},org.freedesktop.DBus}", label=kde-powerdevil),
  dbus receive bus=session path=/org/kde/Solid/PowerManagement{,/**}
       interface=org.freedesktop.DBus.ObjectManager
       member={InterfacesAdded,InterfacesRemoved}
       peer=(name="{@{busname},org.kde.Solid.PowerManagement{,.*},org.freedesktop.DBus}", label=kde-powerdevil),


  #aa/dbus talk bus=system name=org.freedesktop.login1 label=systemd-logind
  # Unix: allow connection to the profile
  unix type=stream peer=(label=systemd-logind),
  # org.freedesktop.login1: send and receive anything to the interface on the specific peer label
  dbus (send receive) bus=system path=/org/freedesktop/login1{,/**}
       interface=org.freedesktop.login1{,.*}
       peer=(name="{@{busname},org.freedesktop.login1{,.*},org.freedesktop.DBus}", label=systemd-logind),
  dbus send bus=system path=/org/freedesktop/login1{,/**}
       interface=org.freedesktop.login1{,.*}
       peer=(name="org.freedesktop.login1{,.*}"),
  # DBus.Properties: read and send properties
  dbus (send receive) bus=system path=/org/freedesktop/login1{,/**}
       interface=org.freedesktop.DBus.Properties
       member={Get,GetAll,Set,PropertiesChanged}
       peer=(name="{@{busname},org.freedesktop.login1{,.*},org.freedesktop.DBus}", label=systemd-logind),
  # DBus.Introspectable: allow service introspection
  dbus send bus=system path=/org/freedesktop/login1{,/**}
       interface=org.freedesktop.DBus.Introspectable
       member=Introspect
       peer=(name="{@{busname},org.freedesktop.login1{,.*},org.freedesktop.DBus}", label=systemd-logind),
  # DBus.ObjectManager: allow clients to enumerate sources
  dbus send bus=system path=/org/freedesktop/login1{,/**}
       interface=org.freedesktop.DBus.ObjectManager
       member=GetManagedObjects
       peer=(name="{@{busname},org.freedesktop.login1{,.*},org.freedesktop.DBus}", label=systemd-logind),
  dbus receive bus=system path=/org/freedesktop/login1{,/**}
       interface=org.freedesktop.DBus.ObjectManager
       member={InterfacesAdded,InterfacesRemoved}
       peer=(name="{@{busname},org.freedesktop.login1{,.*},org.freedesktop.DBus}", label=systemd-logind),


  @{exec_path} mr,

  @{lib}/kwin_killer_helper rix,

  /etc/xdg/Xwayland-session.d/00-at-spi cx -> at-spi,
  /etc/xdg/Xwayland-session.d/00-pulseaudio-x11 cx -> pulseaudio,
  /etc/xdg/Xwayland-session.d/10-ibus-x11 cx -> ibus,
  /{,usr/}lib{,exec,32,64}/*-linux-gnu*/{,libexec/}kscreenlocker_greet Px,
  /{,usr/}lib{,exec,32,64}/kscreenlocker_greet Px,

  /usr/share/color/icc/{,**} r,
  /usr/share/desktop-directories/*.directory r,
  /usr/share/kglobalaccel/{,**} r,
  /usr/share/kservices{5,6}/{,**} r,
  /usr/share/kservicetypes5/{,*.desktop} r,
  /usr/share/kwin/{,**} r,
  /usr/share/kwin-wayland/{,**} r,
  /usr/share/libinput-*/{,**} r,
  /usr/share/libinput/{,**} r,
  /usr/share/plasma/desktoptheme/** r,

  /etc/machine-id r,
  /etc/xdg/** r,

  / r,
  owner @{HOME}/ r,

  owner @{sddm_local_dirs}/ w,
  owner @{sddm_share_dirs}/ w,
  owner @{sddm_state_dirs}/ w,

  owner @{sddm_cache_dirs}/kwin/ rw,
  owner @{sddm_cache_dirs}/kwin/** rwlk,
  owner @{sddm_cache_dirs}/kcrash-metadata/ w,
  owner @{sddm_cache_dirs}/kwinsession.kcache rw,

  owner @{sddm_config_dirs}/kglobalshortcutsrc@{atomic} rwlk,
  owner @{sddm_config_dirs}/kwinrulesrc@{atomic} rwlk,
  owner @{sddm_config_dirs}/kwinoutputconfig.json rw,
  owner @{sddm_config_dirs}/kwinrc@{atomic} rwlk,
  owner @{sddm_config_dirs}/kxkbrc r,

  owner @{sddm_state_dirs}/kglobalshortcutsstaterc@{atomic} rwlk,

  owner @{user_cache_dirs}/ r,
  owner @{user_cache_dirs}/drkonqi/{,application-not-responding/} w,
  owner @{user_cache_dirs}/drkonqi/application-not-responding/*.@{hex32}.*.json w,
  owner @{user_cache_dirs}/ksvg-elements@{atomic} rwlk,
  owner @{user_cache_dirs}/kwin/ rw,
  owner @{user_cache_dirs}/kwin/** rwlk -> @{user_cache_dirs}/kwin/**,
  owner @{user_cache_dirs}/kwinsession.kcache rw,
  owner @{user_cache_dirs}/plasma_theme_*.kcache rw,
  owner @{user_cache_dirs}/plasma-svgelements@{atomic} rwlk,

  owner @{user_config_dirs}/auroraerc r,
  owner @{user_config_dirs}/breezerc@{atomic} rwlk,
  owner @{user_config_dirs}/oxygenrc@{atomic} rwlk,
  owner @{user_config_dirs}/kaccessrc r,
  owner @{user_config_dirs}/kaccess.notifyrc r,
  owner @{user_config_dirs}/kcminputrc@{atomic} rwlk,
  owner @{user_config_dirs}/kde.org/ w,
  owner @{user_config_dirs}/kde.org/kwin.conf@{atomic} rwlk,
  owner @{user_config_dirs}/kdedefaults/* r,
  owner @{user_config_dirs}/kglobalshortcutsrc@{atomic} rwlk,
  owner @{user_config_dirs}/khotkeysrc r,
  owner @{user_config_dirs}/klaunchrc r,
  owner @{user_config_dirs}/kscreenlockerrc r,
  owner @{user_config_dirs}/kwinoutputconfig.json rw,
  owner @{user_config_dirs}/kwinrc@{atomic} rwlk,
  owner @{user_config_dirs}/kwinrulesrc@{atomic} rwlk,
  owner @{user_config_dirs}/kxkbrc r,
  owner @{user_config_dirs}/Kvantum/{,**} r,
  owner @{user_config_dirs}/menus/** r,

  owner @{user_share_dirs}/aurorae/themes/{,**} r,
  owner @{user_share_dirs}/kscreen/* r,
  owner @{user_share_dirs}/kwin/effects/{,**} r,
  owner @{user_share_dirs}/kwin/scripts/{,**} r,
  owner @{user_share_dirs}/plasma/desktoptheme/{,**} r,
  owner @{user_share_dirs}/smod/decorations/{,**} r,

  owner @{user_state_dirs}/ w,
  owner @{user_state_dirs}/kglobalshortcutsstaterc@{atomic} rwlk,
  owner @{user_state_dirs}/kwinstaterc@{atomic} rwlk,

  owner /dev/shm/.org.chromium.Chromium.@{rand6} rw,

  @{sys}/bus/ r,
  @{sys}/class/ r,
  @{sys}/class/drm/ r,
  @{sys}/devices/**/uevent r,

  @{run}/mount/utab r,

  @{run}/udev/data/+acpi:* r,             # Exposes ACPI objects (power buttons, batteries, thermal)
  @{run}/udev/data/+dmi:* r,              # for motherboard info
  @{run}/udev/data/+hid:* r,              # For Human Interface Device (mice, controllers, drawing tablets, scanners)
  @{run}/udev/data/+i2c:* r,              # For Inter-Integrated Circuit, low-speed peripherals (sensors, EEPROMs, etc.)
  @{run}/udev/data/+pci:* r,              # Identifies all PCI devices (CPU, GPU, Network, Disks, USB, etc.)
  @{run}/udev/data/+platform:* r,         # Identifies onboard devices (laptop/board model, power controllers, thermal sensors)
  @{run}/udev/data/+serio:* r,            # for touchpad
  @{run}/udev/data/+sound:card@{int} r,   # for sound card
  @{run}/udev/data/+usb:* r,              # Identifies all USB devices

  @{run}/udev/data/c10:@{int} r,          # for non-serial mice, misc features
  @{run}/udev/data/c189:@{int} r,         # for /dev/bus/usb/**

  owner @{run}/user/@{uid}/kwin-xwayland-eis-socket.@{int} w,
  owner @{run}/user/@{uid}/kwin-xwayland-eis-socket.@{int}.lock rwk,
  owner @{run}/user/@{uid}/wayland-@{int}.lock rwk,

  @{att}@{run}/systemd/inhibit/@{int}.ref rw,

  @{PROC}/@{pids}/maps r,
  @{PROC}/@{pids}/mountinfo r,
  @{PROC}/@{pids}/task/@{tid}/comm rw,
  @{PROC}/sys/kernel/random/boot_id r,

  @{att}/dev/input/event@{int} rw,
  @{att}/dev/dri/card@{int} rw,

  /dev/tty r,
  /dev/tty@{u8} rw,

  profile at-spi {
    include <abstractions/attached/base>
    include <abstractions/bus-session>
    include <abstractions/bus/session/org.a11y>
    include <abstractions/attached/consoles>

    unix bind type=stream addr=@@{udbus}/bus/busctl/busctl,

    @{sh_path}    r,
    @{bin}/busctl rix,
    @{bin}/sed    rix,
    @{bin}/xprop  rpx,

    /etc/xdg/Xwayland-session.d/00-at-spi r,
    /usr/share/color/icc/{,**} r,

    /home/ r,
    owner @{HOME}/ r,

    /dev/udmabuf rw,

    include if exists <local/kwin_wayland_at-spi>
  }

  profile pulseaudio {
    include <abstractions/attached/base>
    include <abstractions/attached/consoles>

    @{sh_path}   rix,
    @{bin}/pactl  px,

    /etc/xdg/Xwayland-session.d/00-pulseaudio-x11 r,

    owner @{HOME}/ r,

    include if exists <local/kwin_wayland_pulseaudio>
  }

  profile ibus {
    include <abstractions/attached/base>
    include <abstractions/attached/consoles>

    @{sh_path}    r,
    @{lib}/{,ibus/}ibus-x11 px,

    /etc/xdg/Xwayland-session.d/10-ibus-x11 r,

    /home/ r,
    owner @{HOME}/ r,

    include if exists <local/kwin_wayland_ibus>
  }

  include if exists <local/kwin_wayland>
}

# vim:syntax=apparmor
