From 06dbe5bf2cbb4dac0c7294e4cad7831f0d64c889 Mon Sep 17 00:00:00 2001 From: Chong Zhang Date: Mon, 2 Nov 2020 16:02:07 -0800 Subject: [PATCH] Add APermissionManager_checkPermission to libandroid And allow IActivityManager#checkPermission to be used by native code. bug: 172283477 bug: 159172726 Change-Id: I582fb918ac3ddc2289ef0040a4391db407673692 --- core/java/android/app/IActivityManager.aidl | 4 +- native/android/Android.bp | 1 + native/android/TEST_MAPPING | 17 ++++++++ native/android/libandroid.map.txt | 1 + native/android/permission_manager.cpp | 43 +++++++++++++++++++++ 5 files changed, 64 insertions(+), 2 deletions(-) create mode 100644 native/android/TEST_MAPPING create mode 100644 native/android/permission_manager.cpp diff --git a/core/java/android/app/IActivityManager.aidl b/core/java/android/app/IActivityManager.aidl index 879d4373f964c..0769b8584dac0 100644 --- a/core/java/android/app/IActivityManager.aidl +++ b/core/java/android/app/IActivityManager.aidl @@ -98,6 +98,8 @@ interface IActivityManager { void unregisterUidObserver(in IUidObserver observer); boolean isUidActive(int uid, String callingPackage); int getUidProcessState(int uid, in String callingPackage); + @UnsupportedAppUsage + int checkPermission(in String permission, int pid, int uid); // =============== End of transactions used on native side as well ============================ // Special low-level communication with activity manager. @@ -215,8 +217,6 @@ interface IActivityManager { void setProcessLimit(int max); @UnsupportedAppUsage int getProcessLimit(); - @UnsupportedAppUsage - int checkPermission(in String permission, int pid, int uid); int checkUriPermission(in Uri uri, int pid, int uid, int mode, int userId, in IBinder callerToken); void grantUriPermission(in IApplicationThread caller, in String targetPkg, in Uri uri, diff --git a/native/android/Android.bp b/native/android/Android.bp index 02e1ebe05b028..7793d6c45d5e8 100644 --- a/native/android/Android.bp +++ b/native/android/Android.bp @@ -46,6 +46,7 @@ cc_library_shared { "native_window_jni.cpp", "net.c", "obb.cpp", + "permission_manager.cpp", "sensor.cpp", "sharedmem.cpp", "storage_manager.cpp", diff --git a/native/android/TEST_MAPPING b/native/android/TEST_MAPPING new file mode 100644 index 0000000000000..6a5d2c008b1dd --- /dev/null +++ b/native/android/TEST_MAPPING @@ -0,0 +1,17 @@ +{ + "presubmit": [ + { + "name": "CtsPermissionManagerNativeTestCases", + "file_patterns": ["permission_manager.cpp"] + }, + { + "name": "CtsPermissionTestCases", + "options": [ + { + "include-filter": "android.permission.cts.PermissionManagerNativeJniTest" + } + ], + "file_patterns": ["permission_manager.cpp"] + } + ] +} diff --git a/native/android/libandroid.map.txt b/native/android/libandroid.map.txt index 0414930b40780..3027eac3a2248 100644 --- a/native/android/libandroid.map.txt +++ b/native/android/libandroid.map.txt @@ -176,6 +176,7 @@ LIBANDROID { AObbInfo_getPackageName; AObbInfo_getVersion; AObbScanner_getObbInfo; + APermissionManager_checkPermission; # introduced=31 ASensorEventQueue_disableSensor; ASensorEventQueue_enableSensor; ASensorEventQueue_getEvents; diff --git a/native/android/permission_manager.cpp b/native/android/permission_manager.cpp new file mode 100644 index 0000000000000..166e00e8dbe27 --- /dev/null +++ b/native/android/permission_manager.cpp @@ -0,0 +1,43 @@ +/* + * Copyright (C) 2020 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include +#include + +namespace android { +namespace permissionmananger { + +// Global instance of ActivityManager, service is obtained only on first use. +static ActivityManager gAm; + +} // permissionmanager +} // android + +using namespace android; +using namespace permissionmananger; + +int32_t APermissionManager_checkPermission(const char* permission, + pid_t pid, + uid_t uid, + int32_t* outResult) { + status_t result = gAm.checkPermission(String16(permission), pid, uid, outResult); + if (result == DEAD_OBJECT) { + return PERMISSION_MANAGER_STATUS_SERVICE_UNAVAILABLE; + } else if (result != NO_ERROR) { + return PERMISSION_MANAGER_STATUS_ERROR_UNKNOWN; + } + return PERMISSION_MANAGER_STATUS_OK; +}