/* * Copyright (C) 2009 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 <stdint.h> #include <utils/Log.h> #include <binder/IPCThreadState.h> #include <binder/IServiceManager.h> #include <binder/Permission.h> namespace android { // --------------------------------------------------------------------------- Permission::Permission(char const* name) : mPermissionName(name), mPid(getpid()) { } Permission::Permission(const String16& name) : mPermissionName(name), mPid(getpid()) { } Permission::Permission(const Permission& rhs) : mPermissionName(rhs.mPermissionName), mGranted(rhs.mGranted), mPid(rhs.mPid) { } Permission::~Permission() { } bool Permission::operator < (const Permission& rhs) const { return mPermissionName < rhs.mPermissionName; } bool Permission::checkCalling() const { IPCThreadState* ipcState = IPCThreadState::self(); pid_t pid = ipcState->getCallingPid(); uid_t uid = ipcState->getCallingUid(); return doCheckPermission(pid, uid); } bool Permission::check(pid_t pid, uid_t uid) const { return doCheckPermission(pid, uid); } bool Permission::doCheckPermission(pid_t pid, uid_t uid) const { if ((uid == 0) || (pid == mPid)) { // root and ourselves is always okay return true; } else { // see if we already granted this permission for this uid Mutex::Autolock _l(mLock); if (mGranted.indexOf(uid) >= 0) return true; } bool granted = checkPermission(mPermissionName, pid, uid); if (granted) { Mutex::Autolock _l(mLock); // no need to check again, the old item will be replaced if it is // already there. mGranted.add(uid); } return granted; } // --------------------------------------------------------------------------- }; // namespace android