ServiceUtilities.cpp revision 44deb053252a3bd2f57a007ab9560f4924f62394
144deb053252a3bd2f57a007ab9560f4924f62394Glenn Kasten/*
244deb053252a3bd2f57a007ab9560f4924f62394Glenn Kasten * Copyright (C) 2012 The Android Open Source Project
344deb053252a3bd2f57a007ab9560f4924f62394Glenn Kasten *
444deb053252a3bd2f57a007ab9560f4924f62394Glenn Kasten * Licensed under the Apache License, Version 2.0 (the "License");
544deb053252a3bd2f57a007ab9560f4924f62394Glenn Kasten * you may not use this file except in compliance with the License.
644deb053252a3bd2f57a007ab9560f4924f62394Glenn Kasten * You may obtain a copy of the License at
744deb053252a3bd2f57a007ab9560f4924f62394Glenn Kasten *
844deb053252a3bd2f57a007ab9560f4924f62394Glenn Kasten *      http://www.apache.org/licenses/LICENSE-2.0
944deb053252a3bd2f57a007ab9560f4924f62394Glenn Kasten *
1044deb053252a3bd2f57a007ab9560f4924f62394Glenn Kasten * Unless required by applicable law or agreed to in writing, software
1144deb053252a3bd2f57a007ab9560f4924f62394Glenn Kasten * distributed under the License is distributed on an "AS IS" BASIS,
1244deb053252a3bd2f57a007ab9560f4924f62394Glenn Kasten * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1344deb053252a3bd2f57a007ab9560f4924f62394Glenn Kasten * See the License for the specific language governing permissions and
1444deb053252a3bd2f57a007ab9560f4924f62394Glenn Kasten * limitations under the License.
1544deb053252a3bd2f57a007ab9560f4924f62394Glenn Kasten */
1644deb053252a3bd2f57a007ab9560f4924f62394Glenn Kasten
1744deb053252a3bd2f57a007ab9560f4924f62394Glenn Kasten#include <binder/IPCThreadState.h>
1844deb053252a3bd2f57a007ab9560f4924f62394Glenn Kasten#include <binder/IServiceManager.h>
1944deb053252a3bd2f57a007ab9560f4924f62394Glenn Kasten#include <binder/PermissionCache.h>
2044deb053252a3bd2f57a007ab9560f4924f62394Glenn Kasten#include "ServiceUtilities.h"
2144deb053252a3bd2f57a007ab9560f4924f62394Glenn Kasten
2244deb053252a3bd2f57a007ab9560f4924f62394Glenn Kastennamespace android {
2344deb053252a3bd2f57a007ab9560f4924f62394Glenn Kasten
2444deb053252a3bd2f57a007ab9560f4924f62394Glenn Kasten// This optimization assumes mediaserver process doesn't fork, which it doesn't
2544deb053252a3bd2f57a007ab9560f4924f62394Glenn Kastenconst pid_t getpid_cached = getpid();
2644deb053252a3bd2f57a007ab9560f4924f62394Glenn Kasten
2744deb053252a3bd2f57a007ab9560f4924f62394Glenn Kastenbool recordingAllowed() {
2844deb053252a3bd2f57a007ab9560f4924f62394Glenn Kasten    if (getpid_cached == IPCThreadState::self()->getCallingPid()) return true;
2944deb053252a3bd2f57a007ab9560f4924f62394Glenn Kasten    static const String16 sRecordAudio("android.permission.RECORD_AUDIO");
3044deb053252a3bd2f57a007ab9560f4924f62394Glenn Kasten    // don't use PermissionCache; this is not a system permission
3144deb053252a3bd2f57a007ab9560f4924f62394Glenn Kasten    bool ok = checkCallingPermission(sRecordAudio);
3244deb053252a3bd2f57a007ab9560f4924f62394Glenn Kasten    if (!ok) ALOGE("Request requires android.permission.RECORD_AUDIO");
3344deb053252a3bd2f57a007ab9560f4924f62394Glenn Kasten    return ok;
3444deb053252a3bd2f57a007ab9560f4924f62394Glenn Kasten}
3544deb053252a3bd2f57a007ab9560f4924f62394Glenn Kasten
3644deb053252a3bd2f57a007ab9560f4924f62394Glenn Kastenbool settingsAllowed() {
3744deb053252a3bd2f57a007ab9560f4924f62394Glenn Kasten    if (getpid_cached == IPCThreadState::self()->getCallingPid()) return true;
3844deb053252a3bd2f57a007ab9560f4924f62394Glenn Kasten    static const String16 sAudioSettings("android.permission.MODIFY_AUDIO_SETTINGS");
3944deb053252a3bd2f57a007ab9560f4924f62394Glenn Kasten    // don't use PermissionCache; this is not a system permission
4044deb053252a3bd2f57a007ab9560f4924f62394Glenn Kasten    bool ok = checkCallingPermission(sAudioSettings);
4144deb053252a3bd2f57a007ab9560f4924f62394Glenn Kasten    if (!ok) ALOGE("Request requires android.permission.MODIFY_AUDIO_SETTINGS");
4244deb053252a3bd2f57a007ab9560f4924f62394Glenn Kasten    return ok;
4344deb053252a3bd2f57a007ab9560f4924f62394Glenn Kasten}
4444deb053252a3bd2f57a007ab9560f4924f62394Glenn Kasten
4544deb053252a3bd2f57a007ab9560f4924f62394Glenn Kastenbool dumpAllowed() {
4644deb053252a3bd2f57a007ab9560f4924f62394Glenn Kasten    // don't optimize for same pid, since mediaserver never dumps itself
4744deb053252a3bd2f57a007ab9560f4924f62394Glenn Kasten    static const String16 sDump("android.permission.DUMP");
4844deb053252a3bd2f57a007ab9560f4924f62394Glenn Kasten    // OK to use PermissionCache; this is a system permission
4944deb053252a3bd2f57a007ab9560f4924f62394Glenn Kasten    bool ok = PermissionCache::checkCallingPermission(sDump);
5044deb053252a3bd2f57a007ab9560f4924f62394Glenn Kasten    // convention is for caller to dump an error message to fd instead of logging here
5144deb053252a3bd2f57a007ab9560f4924f62394Glenn Kasten    //if (!ok) ALOGE("Request requires android.permission.DUMP");
5244deb053252a3bd2f57a007ab9560f4924f62394Glenn Kasten    return ok;
5344deb053252a3bd2f57a007ab9560f4924f62394Glenn Kasten}
5444deb053252a3bd2f57a007ab9560f4924f62394Glenn Kasten
5544deb053252a3bd2f57a007ab9560f4924f62394Glenn Kasten} // namespace android
56