blob: f94f413d8b40bf99d6062978a7f7eed864828c61 [file] [log] [blame]
The Android Open Source Projectedbf3b62009-03-03 19:31:44 -08001/*
2 * Copyright (C) 2005 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
17#define LOG_TAG "PermissionController"
18
Mathias Agopianc5b2c0b2009-05-19 19:08:10 -070019#include <binder/IPermissionController.h>
The Android Open Source Projectedbf3b62009-03-03 19:31:44 -080020
The Android Open Source Projectedbf3b62009-03-03 19:31:44 -080021#include <utils/Log.h>
Mathias Agopianc5b2c0b2009-05-19 19:08:10 -070022#include <binder/Parcel.h>
The Android Open Source Projectedbf3b62009-03-03 19:31:44 -080023#include <utils/String8.h>
24
The Android Open Source Projectedbf3b62009-03-03 19:31:44 -080025namespace android {
26
27// ----------------------------------------------------------------------
28
29class BpPermissionController : public BpInterface<IPermissionController>
30{
31public:
Chih-Hung Hsiehe2347b72016-04-25 15:41:05 -070032 explicit BpPermissionController(const sp<IBinder>& impl)
The Android Open Source Projectedbf3b62009-03-03 19:31:44 -080033 : BpInterface<IPermissionController>(impl)
34 {
35 }
Brad Fitzpatrick837a0d02010-07-13 15:33:35 -070036
The Android Open Source Projectedbf3b62009-03-03 19:31:44 -080037 virtual bool checkPermission(const String16& permission, int32_t pid, int32_t uid)
38 {
39 Parcel data, reply;
40 data.writeInterfaceToken(IPermissionController::getInterfaceDescriptor());
41 data.writeString16(permission);
42 data.writeInt32(pid);
43 data.writeInt32(uid);
44 remote()->transact(CHECK_PERMISSION_TRANSACTION, data, &reply);
45 // fail on exception
Brad Fitzpatrick837a0d02010-07-13 15:33:35 -070046 if (reply.readExceptionCode() != 0) return 0;
The Android Open Source Projectedbf3b62009-03-03 19:31:44 -080047 return reply.readInt32() != 0;
48 }
Svet Ganovf1377f52015-04-28 12:09:01 -070049
Jeff Sharkey7afcb3f2018-04-09 12:58:40 -060050 virtual int32_t noteOp(const String16& op, int32_t uid, const String16& packageName)
51 {
52 Parcel data, reply;
53 data.writeInterfaceToken(IPermissionController::getInterfaceDescriptor());
54 data.writeString16(op);
55 data.writeInt32(uid);
56 data.writeString16(packageName);
57 remote()->transact(NOTE_OP_TRANSACTION, data, &reply);
58 // fail on exception
59 if (reply.readExceptionCode() != 0) return 2; // MODE_ERRORED
60 return reply.readInt32();
61 }
62
Svet Ganovf1377f52015-04-28 12:09:01 -070063 virtual void getPackagesForUid(const uid_t uid, Vector<String16>& packages)
64 {
65 Parcel data, reply;
66 data.writeInterfaceToken(IPermissionController::getInterfaceDescriptor());
67 data.writeInt32(uid);
68 remote()->transact(GET_PACKAGES_FOR_UID_TRANSACTION, data, &reply);
69 // fail on exception
70 if (reply.readExceptionCode() != 0) {
71 return;
72 }
73 const int32_t size = reply.readInt32();
74 if (size <= 0) {
75 return;
76 }
77 for (int i = 0; i < size; i++) {
78 packages.push(reply.readString16());
79 }
80 }
Svetoslavb412f6e2015-04-29 16:50:41 -070081
82 virtual bool isRuntimePermission(const String16& permission)
83 {
84 Parcel data, reply;
85 data.writeInterfaceToken(IPermissionController::getInterfaceDescriptor());
86 data.writeString16(permission);
87 remote()->transact(IS_RUNTIME_PERMISSION_TRANSACTION, data, &reply);
88 // fail on exception
89 if (reply.readExceptionCode() != 0) return false;
90 return reply.readInt32() != 0;
91 }
Svet Ganove752a5c2018-01-15 17:14:20 -080092
93 virtual int getPackageUid(const String16& package, int flags)
94 {
95 Parcel data, reply;
96 data.writeInterfaceToken(IPermissionController::getInterfaceDescriptor());
97 data.writeString16(package);
98 data.writeInt32(flags);
99 remote()->transact(GET_PACKAGE_UID_TRANSACTION, data, &reply);
100 // fail on exception
101 if (reply.readExceptionCode() != 0) return false;
102 return reply.readInt32();
103 }
The Android Open Source Projectedbf3b62009-03-03 19:31:44 -0800104};
105
Jooyung Hanc91e3cb2020-11-25 06:38:17 +0900106IMPLEMENT_META_INTERFACE(PermissionController, "android.os.IPermissionController")
The Android Open Source Projectedbf3b62009-03-03 19:31:44 -0800107
108// ----------------------------------------------------------------------
109
Jiyong Parkb86c8662018-10-29 23:01:57 +0900110// NOLINTNEXTLINE(google-default-arguments)
The Android Open Source Projectedbf3b62009-03-03 19:31:44 -0800111status_t BnPermissionController::onTransact(
112 uint32_t code, const Parcel& data, Parcel* reply, uint32_t flags)
113{
The Android Open Source Projectedbf3b62009-03-03 19:31:44 -0800114 switch(code) {
115 case CHECK_PERMISSION_TRANSACTION: {
116 CHECK_INTERFACE(IPermissionController, data, reply);
117 String16 permission = data.readString16();
118 int32_t pid = data.readInt32();
119 int32_t uid = data.readInt32();
120 bool res = checkPermission(permission, pid, uid);
Brad Fitzpatrick837a0d02010-07-13 15:33:35 -0700121 reply->writeNoException();
The Android Open Source Projectedbf3b62009-03-03 19:31:44 -0800122 reply->writeInt32(res ? 1 : 0);
123 return NO_ERROR;
124 } break;
Svet Ganovf1377f52015-04-28 12:09:01 -0700125
Jeff Sharkey7afcb3f2018-04-09 12:58:40 -0600126 case NOTE_OP_TRANSACTION: {
127 CHECK_INTERFACE(IPermissionController, data, reply);
128 String16 op = data.readString16();
129 int32_t uid = data.readInt32();
130 String16 packageName = data.readString16();
131 int32_t res = noteOp(op, uid, packageName);
132 reply->writeNoException();
133 reply->writeInt32(res);
134 return NO_ERROR;
135 } break;
136
Svet Ganovf1377f52015-04-28 12:09:01 -0700137 case GET_PACKAGES_FOR_UID_TRANSACTION: {
138 CHECK_INTERFACE(IPermissionController, data, reply);
139 int32_t uid = data.readInt32();
140 Vector<String16> packages;
141 getPackagesForUid(uid, packages);
142 reply->writeNoException();
143 size_t size = packages.size();
144 reply->writeInt32(size);
145 for (size_t i = 0; i < size; i++) {
146 reply->writeString16(packages[i]);
147 }
148 return NO_ERROR;
149 } break;
150
Svetoslavb412f6e2015-04-29 16:50:41 -0700151 case IS_RUNTIME_PERMISSION_TRANSACTION: {
152 CHECK_INTERFACE(IPermissionController, data, reply);
153 String16 permission = data.readString16();
154 const bool res = isRuntimePermission(permission);
155 reply->writeNoException();
156 reply->writeInt32(res ? 1 : 0);
157 return NO_ERROR;
158 } break;
159
Svet Ganove752a5c2018-01-15 17:14:20 -0800160 case GET_PACKAGE_UID_TRANSACTION: {
161 CHECK_INTERFACE(IPermissionController, data, reply);
162 String16 package = data.readString16();
163 int flags = data.readInt32();
164 const int uid = getPackageUid(package, flags);
165 reply->writeNoException();
166 reply->writeInt32(uid);
167 return NO_ERROR;
168 } break;
169
The Android Open Source Projectedbf3b62009-03-03 19:31:44 -0800170 default:
171 return BBinder::onTransact(code, data, reply, flags);
172 }
173}
174
Steven Moreland61ff8492019-09-26 16:05:45 -0700175} // namespace android