| /* |
| * 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 |