1edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project/* 2edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * Copyright (C) 2005 The Android Open Source Project 3edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * 4edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License"); 5edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * you may not use this file except in compliance with the License. 6edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * You may obtain a copy of the License at 7edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * 8edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * http://www.apache.org/licenses/LICENSE-2.0 9edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * 10edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * Unless required by applicable law or agreed to in writing, software 11edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS, 12edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * See the License for the specific language governing permissions and 14edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * limitations under the License. 15edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project */ 16edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 17edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#define LOG_TAG "PermissionController" 18edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 19c5b2c0bf8007562536b822eb060fc54a01f8e08bMathias Agopian#include <binder/IPermissionController.h> 20edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 21edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <utils/Log.h> 22c5b2c0bf8007562536b822eb060fc54a01f8e08bMathias Agopian#include <binder/Parcel.h> 23edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <utils/String8.h> 24edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 25208059f67ed2dd9fa025e07fcb6954d3cb61c79eMathias Agopian#include <private/binder/Static.h> 26edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 27edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectnamespace android { 28edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 29edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ---------------------------------------------------------------------- 30edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 31edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectclass BpPermissionController : public BpInterface<IPermissionController> 32edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 33edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectpublic: 34edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project BpPermissionController(const sp<IBinder>& impl) 35edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project : BpInterface<IPermissionController>(impl) 36edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { 37edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 38837a0d0fb2c3fba8082d47d04cb6120af1eb9a54Brad Fitzpatrick 39edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project virtual bool checkPermission(const String16& permission, int32_t pid, int32_t uid) 40edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { 41edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project Parcel data, reply; 42edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project data.writeInterfaceToken(IPermissionController::getInterfaceDescriptor()); 43edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project data.writeString16(permission); 44edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project data.writeInt32(pid); 45edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project data.writeInt32(uid); 46edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project remote()->transact(CHECK_PERMISSION_TRANSACTION, data, &reply); 47edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // fail on exception 48837a0d0fb2c3fba8082d47d04cb6120af1eb9a54Brad Fitzpatrick if (reply.readExceptionCode() != 0) return 0; 49edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return reply.readInt32() != 0; 50edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 51edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}; 52edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 53edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectIMPLEMENT_META_INTERFACE(PermissionController, "android.os.IPermissionController"); 54edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 55edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ---------------------------------------------------------------------- 56edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 57edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatus_t BnPermissionController::onTransact( 58edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project uint32_t code, const Parcel& data, Parcel* reply, uint32_t flags) 59edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 60edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project //printf("PermissionController received: "); data.print(); 61edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project switch(code) { 62edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project case CHECK_PERMISSION_TRANSACTION: { 63edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project CHECK_INTERFACE(IPermissionController, data, reply); 64edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project String16 permission = data.readString16(); 65edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project int32_t pid = data.readInt32(); 66edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project int32_t uid = data.readInt32(); 67edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project bool res = checkPermission(permission, pid, uid); 68837a0d0fb2c3fba8082d47d04cb6120af1eb9a54Brad Fitzpatrick reply->writeNoException(); 69edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project reply->writeInt32(res ? 1 : 0); 70edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return NO_ERROR; 71edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } break; 72edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project default: 73edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return BBinder::onTransact(code, data, reply, flags); 74edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 75edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 76edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 77edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}; // namespace android 78