blob: 4daab0fa450f02d05c9f7908bde2924334679c34 [file] [log] [blame]
Austin Borger249e6592024-03-10 22:28:11 -07001/*
2 * Copyright (C) 2024 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16#ifndef ANDROID_SERVERS_CAMERA_ATTRIBUTION_AND_PERMISSION_UTILS_H
17#define ANDROID_SERVERS_CAMERA_ATTRIBUTION_AND_PERMISSION_UTILS_H
18
19#include <android/content/AttributionSourceState.h>
20#include <android/permission/PermissionChecker.h>
21#include <binder/BinderService.h>
Austin Borger22c5c852024-03-08 13:31:36 -080022#include <private/android_filesystem_config.h>
Austin Borger249e6592024-03-10 22:28:11 -070023
24namespace android {
25
26class CameraService;
27
28using content::AttributionSourceState;
29using permission::PermissionChecker;
30
31/**
32 * Utility class consolidating methods/data for verifying permissions and the identity of the
33 * caller.
34 */
35class AttributionAndPermissionUtils {
Avichal Rakesh5788fec2024-03-15 14:39:20 -070036 public:
Austin Borger249e6592024-03-10 22:28:11 -070037 AttributionAndPermissionUtils() { }
38 virtual ~AttributionAndPermissionUtils() {}
39
40 void setCameraService(wp<CameraService> cameraService) {
41 mCameraService = cameraService;
42 }
43
Austin Borger65e64642024-06-11 15:58:23 -070044 static AttributionSourceState buildAttributionSource(int callingPid, int callingUid) {
45 AttributionSourceState attributionSource{};
46 attributionSource.pid = callingPid;
47 attributionSource.uid = callingUid;
48 return attributionSource;
49 }
50
51 static AttributionSourceState buildAttributionSource(int callingPid, int callingUid,
52 int32_t deviceId) {
53 AttributionSourceState attributionSource = buildAttributionSource(callingPid, callingUid);
54 attributionSource.deviceId = deviceId;
55 return attributionSource;
56 }
57
Austin Borger22c5c852024-03-08 13:31:36 -080058 // Utilities handling Binder calling identities (previously in CameraThreadState)
59 virtual int getCallingUid();
60 virtual int getCallingPid();
61 virtual int64_t clearCallingIdentity();
62 virtual void restoreCallingIdentity(int64_t token);
63
Austin Borger249e6592024-03-10 22:28:11 -070064 /**
65 * Pre-grants the permission if the attribution source uid is for an automotive
66 * privileged client. Otherwise uses system service permission checker to check
67 * for the appropriate permission. If this function is called for accessing a specific
68 * camera,then the cameraID must not be empty. CameraId is used only in case of automotive
69 * privileged client so that permission is pre-granted only to access system camera device
70 * which is located outside of the vehicle body frame because camera located inside the vehicle
71 * cabin would need user permission.
72 */
73 virtual bool checkPermissionForPreflight(const std::string &cameraId,
74 const std::string &permission, const AttributionSourceState& attributionSource,
75 const std::string& message, int32_t attributedOpCode);
76
77 // Can camera service trust the caller based on the calling UID?
78 virtual bool isTrustedCallingUid(uid_t uid);
79
80 virtual bool isAutomotiveDevice();
81 virtual bool isHeadlessSystemUserMode();
82
83 /**
84 * Returns true if the client has uid AID_AUTOMOTIVE_EVS and the device is an automotive device.
85 */
86 virtual bool isAutomotivePrivilegedClient(int32_t uid);
87
88 virtual status_t getUidForPackage(const std::string &packageName, int userId,
89 /*inout*/uid_t& uid, int err);
90 virtual bool isCallerCameraServerNotDelegating();
91
92 // Utils for checking specific permissions
93 virtual bool hasPermissionsForCamera(const std::string& cameraId,
94 const AttributionSourceState& attributionSource);
95 virtual bool hasPermissionsForSystemCamera(const std::string& cameraId,
96 const AttributionSourceState& attributionSource, bool checkCameraPermissions = true);
97 virtual bool hasPermissionsForCameraHeadlessSystemUser(const std::string& cameraId,
98 const AttributionSourceState& attributionSource);
99 virtual bool hasPermissionsForCameraPrivacyAllowlist(
100 const AttributionSourceState& attributionSource);
101 virtual bool hasPermissionsForOpenCloseListener(
102 const AttributionSourceState& attributionSource);
103
104 static const std::string sDumpPermission;
105 static const std::string sManageCameraPermission;
106 static const std::string sCameraPermission;
107 static const std::string sSystemCameraPermission;
108 static const std::string sCameraHeadlessSystemUserPermission;
109 static const std::string sCameraPrivacyAllowlistPermission;
110 static const std::string sCameraSendSystemEventsPermission;
111 static const std::string sCameraOpenCloseListenerPermission;
112 static const std::string sCameraInjectExternalCameraPermission;
113
Avichal Rakesh5788fec2024-03-15 14:39:20 -0700114 protected:
Austin Borger249e6592024-03-10 22:28:11 -0700115 wp<CameraService> mCameraService;
116
117 bool checkAutomotivePrivilegedClient(const std::string &cameraId,
118 const AttributionSourceState &attributionSource);
Avichal Rakesh5788fec2024-03-15 14:39:20 -0700119
120 private:
121 std::unique_ptr<permission::PermissionChecker> mPermissionChecker =
122 std::make_unique<permission::PermissionChecker>();
Austin Borger249e6592024-03-10 22:28:11 -0700123};
124
125/**
126 * Class to be inherited by classes encapsulating AttributionAndPermissionUtils. Provides an
127 * additional utility layer above AttributionAndPermissionUtils calls, and avoids verbosity
128 * in the encapsulating class's methods.
129 */
130class AttributionAndPermissionUtilsEncapsulator {
131protected:
132 std::shared_ptr<AttributionAndPermissionUtils> mAttributionAndPermissionUtils;
133
134public:
135 AttributionAndPermissionUtilsEncapsulator(
136 std::shared_ptr<AttributionAndPermissionUtils> attributionAndPermissionUtils)
137 : mAttributionAndPermissionUtils(attributionAndPermissionUtils) { }
138
139 static AttributionSourceState buildAttributionSource(int callingPid, int callingUid) {
Austin Borger65e64642024-06-11 15:58:23 -0700140 return AttributionAndPermissionUtils::buildAttributionSource(callingPid, callingUid);
Austin Borger249e6592024-03-10 22:28:11 -0700141 }
142
143 static AttributionSourceState buildAttributionSource(int callingPid, int callingUid,
Biswarup Pale506e732024-03-27 13:46:20 +0000144 int32_t deviceId) {
Austin Borger65e64642024-06-11 15:58:23 -0700145 return AttributionAndPermissionUtils::buildAttributionSource(
146 callingPid, callingUid, deviceId);
Biswarup Pale506e732024-03-27 13:46:20 +0000147 }
148
149 static AttributionSourceState buildAttributionSource(int callingPid, int callingUid,
150 const std::string& packageName, int32_t deviceId) {
151 AttributionSourceState attributionSource = buildAttributionSource(callingPid, callingUid,
152 deviceId);
Austin Borger249e6592024-03-10 22:28:11 -0700153 attributionSource.packageName = packageName;
154 return attributionSource;
155 }
156
Austin Borger22c5c852024-03-08 13:31:36 -0800157 int getCallingUid() const {
158 return mAttributionAndPermissionUtils->getCallingUid();
159 }
160
161 int getCallingPid() const {
162 return mAttributionAndPermissionUtils->getCallingPid();
163 }
164
165 int64_t clearCallingIdentity() const {
166 return mAttributionAndPermissionUtils->clearCallingIdentity();
167 }
168
169 void restoreCallingIdentity(int64_t token) const {
170 mAttributionAndPermissionUtils->restoreCallingIdentity(token);
171 }
172
173 // The word 'System' here does not refer to callers only on the system
174 // partition. They just need to have an android system uid.
175 bool callerHasSystemUid() const {
176 return (getCallingUid() < AID_APP_START);
177 }
178
Biswarup Pale506e732024-03-27 13:46:20 +0000179 bool hasPermissionsForCamera(int callingPid, int callingUid, int32_t deviceId) const {
180 return hasPermissionsForCamera(std::string(), callingPid, callingUid, deviceId);
Austin Borger249e6592024-03-10 22:28:11 -0700181 }
182
183 bool hasPermissionsForCamera(int callingPid, int callingUid,
Biswarup Pale506e732024-03-27 13:46:20 +0000184 const std::string& packageName, int32_t deviceId) const {
185 return hasPermissionsForCamera(std::string(), callingPid, callingUid, packageName,
186 deviceId);
Austin Borger249e6592024-03-10 22:28:11 -0700187 }
188
189 bool hasPermissionsForCamera(const std::string& cameraId, int callingPid,
Biswarup Pale506e732024-03-27 13:46:20 +0000190 int callingUid, int32_t deviceId) const {
191 auto attributionSource = buildAttributionSource(callingPid, callingUid,
192 deviceId);
Austin Borger249e6592024-03-10 22:28:11 -0700193 return mAttributionAndPermissionUtils->hasPermissionsForCamera(cameraId, attributionSource);
194 }
195
196 bool hasPermissionsForCamera(const std::string& cameraId, int callingPid, int callingUid,
Biswarup Pale506e732024-03-27 13:46:20 +0000197 const std::string& packageName, int32_t deviceId) const {
198 auto attributionSource = buildAttributionSource(callingPid, callingUid, packageName,
199 deviceId);
Austin Borger249e6592024-03-10 22:28:11 -0700200 return mAttributionAndPermissionUtils->hasPermissionsForCamera(cameraId, attributionSource);
201 }
202
203 bool hasPermissionsForSystemCamera(const std::string& cameraId, int callingPid, int callingUid,
204 bool checkCameraPermissions = true) const {
205 auto attributionSource = buildAttributionSource(callingPid, callingUid);
206 return mAttributionAndPermissionUtils->hasPermissionsForSystemCamera(
207 cameraId, attributionSource, checkCameraPermissions);
208 }
209
210 bool hasPermissionsForCameraHeadlessSystemUser(const std::string& cameraId, int callingPid,
211 int callingUid) const {
212 auto attributionSource = buildAttributionSource(callingPid, callingUid);
213 return mAttributionAndPermissionUtils->hasPermissionsForCameraHeadlessSystemUser(
214 cameraId, attributionSource);
215 }
216
217 bool hasPermissionsForCameraPrivacyAllowlist(int callingPid, int callingUid) const {
218 auto attributionSource = buildAttributionSource(callingPid, callingUid);
219 return mAttributionAndPermissionUtils->hasPermissionsForCameraPrivacyAllowlist(
220 attributionSource);
221 }
222
223 bool hasPermissionsForOpenCloseListener(int callingPid, int callingUid) const {
224 auto attributionSource = buildAttributionSource(callingPid, callingUid);
225 return mAttributionAndPermissionUtils->hasPermissionsForOpenCloseListener(
226 attributionSource);
227 }
228
229 bool isAutomotiveDevice() const {
230 return mAttributionAndPermissionUtils->isAutomotiveDevice();
231 }
232
233 bool isAutomotivePrivilegedClient(int32_t uid) const {
234 return mAttributionAndPermissionUtils->isAutomotivePrivilegedClient(uid);
235 }
236
237 bool isTrustedCallingUid(uid_t uid) const {
238 return mAttributionAndPermissionUtils->isTrustedCallingUid(uid);
239 }
240
241 bool isHeadlessSystemUserMode() const {
242 return mAttributionAndPermissionUtils->isHeadlessSystemUserMode();
243 }
244
245 status_t getUidForPackage(const std::string &packageName, int userId,
246 /*inout*/uid_t& uid, int err) const {
247 return mAttributionAndPermissionUtils->getUidForPackage(packageName, userId, uid, err);
248 }
249
250 bool isCallerCameraServerNotDelegating() const {
251 return mAttributionAndPermissionUtils->isCallerCameraServerNotDelegating();
252 }
253};
254
255} // namespace android
256
257#endif // ANDROID_SERVERS_CAMERA_ATTRIBUTION_AND_PERMISSION_UTILS_H