@@ -21,6 +21,8 @@ package builtin
2121
2222import (
2323 "strings"
24+
25+ "github.com/snapcore/snapd/release"
2426)
2527
2628const cameraSummary = `allows access to all cameras`
@@ -56,6 +58,26 @@ const cameraConnectedPlugAppArmor = `
5658/sys/devices/platform/**/usb*/**/video4linux/** r,
5759`
5860
61+ const cameraConnectedPlugTouchAppArmor = `
62+ # Support for Android-based Camera stack on Ubuntu Touch
63+ /android{,/**} r,
64+ /{,android/}system/build.prop r,
65+ /{,android/}vendor/build.prop r,
66+ /{,android/}odm/build.prop r,
67+
68+ # libcamera_compat_layer doesn't require proprietary vendor blobs
69+ /{,android/}system/lib{,64}/** r,
70+ /{,android/}system/lib{,64}/**.so m,
71+
72+ # Commonly expected Android paths
73+ /{,dev/}socket/property_service rw,
74+ /{,dev/}socket/logdw rw,
75+ /{,dev/}__properties__/** r,
76+
77+ # Allow access to the CameraService on app-only binder
78+ /dev/{,binderfs/}binder rw,
79+ `
80+
5981// DetectCameraFromPath returns true if the given path corresponds to an
6082// AppArmor rule with the prompt prefix from the camera interface.
6183//
@@ -74,13 +96,18 @@ var cameraConnectedPlugUDev = []string{
7496}
7597
7698func init () {
99+ connectedPlugAppArmor := cameraConnectedPlugAppArmor
100+ if release .OnTouch {
101+ connectedPlugAppArmor += cameraConnectedPlugTouchAppArmor
102+ }
103+
77104 registerIface (& commonInterface {
78105 name : "camera" ,
79106 summary : cameraSummary ,
80107 implicitOnCore : true ,
81108 implicitOnClassic : true ,
82109 baseDeclarationSlots : cameraBaseDeclarationSlots ,
83- connectedPlugAppArmor : cameraConnectedPlugAppArmor ,
110+ connectedPlugAppArmor : connectedPlugAppArmor ,
84111 connectedPlugUDev : cameraConnectedPlugUDev ,
85112 })
86113}
0 commit comments