ServiceUtilities.cpp revision 949a926cadbc961fbb649c91d76d7aee8ea4d7bd
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
24949a926cadbc961fbb649c91d76d7aee8ea4d7bdGlenn Kasten// Not valid until initialized by AudioFlinger constructor.  It would have to be
25949a926cadbc961fbb649c91d76d7aee8ea4d7bdGlenn Kasten// re-initialized if the process containing AudioFlinger service forks (which it doesn't).
26949a926cadbc961fbb649c91d76d7aee8ea4d7bdGlenn Kastenpid_t getpid_cached;
2744deb053252a3bd2f57a007ab9560f4924f62394Glenn Kasten
2844deb053252a3bd2f57a007ab9560f4924f62394Glenn Kastenbool recordingAllowed() {
2944deb053252a3bd2f57a007ab9560f4924f62394Glenn Kasten    if (getpid_cached == IPCThreadState::self()->getCallingPid()) return true;
3044deb053252a3bd2f57a007ab9560f4924f62394Glenn Kasten    static const String16 sRecordAudio("android.permission.RECORD_AUDIO");
3144deb053252a3bd2f57a007ab9560f4924f62394Glenn Kasten    // don't use PermissionCache; this is not a system permission
3244deb053252a3bd2f57a007ab9560f4924f62394Glenn Kasten    bool ok = checkCallingPermission(sRecordAudio);
3344deb053252a3bd2f57a007ab9560f4924f62394Glenn Kasten    if (!ok) ALOGE("Request requires android.permission.RECORD_AUDIO");
3444deb053252a3bd2f57a007ab9560f4924f62394Glenn Kasten    return ok;
3544deb053252a3bd2f57a007ab9560f4924f62394Glenn Kasten}
3644deb053252a3bd2f57a007ab9560f4924f62394Glenn Kasten
3744deb053252a3bd2f57a007ab9560f4924f62394Glenn Kastenbool settingsAllowed() {
3844deb053252a3bd2f57a007ab9560f4924f62394Glenn Kasten    if (getpid_cached == IPCThreadState::self()->getCallingPid()) return true;
3944deb053252a3bd2f57a007ab9560f4924f62394Glenn Kasten    static const String16 sAudioSettings("android.permission.MODIFY_AUDIO_SETTINGS");
4044deb053252a3bd2f57a007ab9560f4924f62394Glenn Kasten    // don't use PermissionCache; this is not a system permission
4144deb053252a3bd2f57a007ab9560f4924f62394Glenn Kasten    bool ok = checkCallingPermission(sAudioSettings);
4244deb053252a3bd2f57a007ab9560f4924f62394Glenn Kasten    if (!ok) ALOGE("Request requires android.permission.MODIFY_AUDIO_SETTINGS");
4344deb053252a3bd2f57a007ab9560f4924f62394Glenn Kasten    return ok;
4444deb053252a3bd2f57a007ab9560f4924f62394Glenn Kasten}
4544deb053252a3bd2f57a007ab9560f4924f62394Glenn Kasten
4644deb053252a3bd2f57a007ab9560f4924f62394Glenn Kastenbool dumpAllowed() {
4744deb053252a3bd2f57a007ab9560f4924f62394Glenn Kasten    // don't optimize for same pid, since mediaserver never dumps itself
4844deb053252a3bd2f57a007ab9560f4924f62394Glenn Kasten    static const String16 sDump("android.permission.DUMP");
4944deb053252a3bd2f57a007ab9560f4924f62394Glenn Kasten    // OK to use PermissionCache; this is a system permission
5044deb053252a3bd2f57a007ab9560f4924f62394Glenn Kasten    bool ok = PermissionCache::checkCallingPermission(sDump);
5144deb053252a3bd2f57a007ab9560f4924f62394Glenn Kasten    // convention is for caller to dump an error message to fd instead of logging here
5244deb053252a3bd2f57a007ab9560f4924f62394Glenn Kasten    //if (!ok) ALOGE("Request requires android.permission.DUMP");
5344deb053252a3bd2f57a007ab9560f4924f62394Glenn Kasten    return ok;
5444deb053252a3bd2f57a007ab9560f4924f62394Glenn Kasten}
5544deb053252a3bd2f57a007ab9560f4924f62394Glenn Kasten
5644deb053252a3bd2f57a007ab9560f4924f62394Glenn Kasten} // namespace android
57