Add attributionTag to audio-recordings
... by replacing packageName/uid/pid by the Identity class.
This allows us to track which parts of the app trigger audio-recordings.
90% of the code is just sending around the additional parameters.
This adds it for the Java and native API.
Test: atest CtsAppOpsTestCases
CtsNativeMediaAAudioTestCases
Fixes: 160150145
Change-Id: Ibd7b884f7fcd4668a4e27f997e59cfc3217a9e89
diff --git a/media/libmediaplayerservice/Android.bp b/media/libmediaplayerservice/Android.bp
index 56c8368..d250976 100644
--- a/media/libmediaplayerservice/Android.bp
+++ b/media/libmediaplayerservice/Android.bp
@@ -35,6 +35,8 @@
"android.hardware.media.c2@1.0",
"android.hardware.media.omx@1.0",
"av-types-aidl-cpp",
+ "media_permission-aidl-cpp",
+ "libaudioclient_aidl_conversion",
"libbase",
"libandroid_net",
"libaudioclient",
@@ -73,9 +75,13 @@
"libstagefright_nuplayer",
"libstagefright_rtsp",
"libstagefright_timedtext",
+ "media_permission-aidl-cpp",
],
- export_shared_lib_headers: ["libmedia"],
+ export_shared_lib_headers: [
+ "libmedia",
+ "media_permission-aidl-cpp",
+ ],
include_dirs: [
"frameworks/av/media/libstagefright/rtsp",
diff --git a/media/libmediaplayerservice/MediaPlayerService.cpp b/media/libmediaplayerservice/MediaPlayerService.cpp
index 1d5ccca..b85e139 100644
--- a/media/libmediaplayerservice/MediaPlayerService.cpp
+++ b/media/libmediaplayerservice/MediaPlayerService.cpp
@@ -49,6 +49,7 @@
#include <codec2/hidl/client.h>
#include <datasource/HTTPBase.h>
+#include <media/AidlConversion.h>
#include <media/IMediaHTTPService.h>
#include <media/IRemoteDisplay.h>
#include <media/IRemoteDisplayClient.h>
@@ -94,6 +95,7 @@
using android::NOT_ENOUGH_DATA;
using android::Parcel;
using android::media::VolumeShaper;
+using android::media::permission::Identity;
// Max number of entries in the filter.
const int kMaxFilterSize = 64; // I pulled that out of thin air.
@@ -453,14 +455,21 @@
ALOGV("MediaPlayerService destroyed");
}
-sp<IMediaRecorder> MediaPlayerService::createMediaRecorder(const String16 &opPackageName)
+sp<IMediaRecorder> MediaPlayerService::createMediaRecorder(const Identity& identity)
{
- pid_t pid = IPCThreadState::self()->getCallingPid();
- sp<MediaRecorderClient> recorder = new MediaRecorderClient(this, pid, opPackageName);
+ // TODO b/182392769: use identity util
+ Identity verifiedIdentity = identity;
+ verifiedIdentity.uid = VALUE_OR_FATAL(
+ legacy2aidl_uid_t_int32_t(IPCThreadState::self()->getCallingUid()));
+ verifiedIdentity.pid = VALUE_OR_FATAL(
+ legacy2aidl_pid_t_int32_t(IPCThreadState::self()->getCallingPid()));
+ sp<MediaRecorderClient> recorder =
+ new MediaRecorderClient(this, verifiedIdentity);
wp<MediaRecorderClient> w = recorder;
Mutex::Autolock lock(mLock);
mMediaRecorderClients.add(w);
- ALOGV("Create new media recorder client from pid %d", pid);
+ ALOGV("Create new media recorder client from pid %s",
+ verifiedIdentity.toString().c_str());
return recorder;
}
@@ -480,17 +489,21 @@
}
sp<IMediaPlayer> MediaPlayerService::create(const sp<IMediaPlayerClient>& client,
- audio_session_t audioSessionId, std::string opPackageName)
+ audio_session_t audioSessionId, const Identity& identity)
{
- pid_t pid = IPCThreadState::self()->getCallingPid();
int32_t connId = android_atomic_inc(&mNextConnId);
+ // TODO b/182392769: use identity util
+ Identity verifiedIdentity = identity;
+ verifiedIdentity.pid = VALUE_OR_FATAL(
+ legacy2aidl_pid_t_int32_t(IPCThreadState::self()->getCallingPid()));
+ verifiedIdentity.uid = VALUE_OR_FATAL(
+ legacy2aidl_uid_t_int32_t(IPCThreadState::self()->getCallingUid()));
sp<Client> c = new Client(
- this, pid, connId, client, audioSessionId,
- IPCThreadState::self()->getCallingUid(), opPackageName);
+ this, verifiedIdentity, connId, client, audioSessionId);
- ALOGV("Create new client(%d) from pid %d, uid %d, ", connId, pid,
- IPCThreadState::self()->getCallingUid());
+ ALOGV("Create new client(%d) from %s, ", connId,
+ verifiedIdentity.toString().c_str());
wp<Client> w = c;
{
@@ -543,8 +556,8 @@
char buffer[SIZE];
String8 result;
result.append(" Client\n");
- snprintf(buffer, 255, " pid(%d), connId(%d), status(%d), looping(%s)\n",
- mPid, mConnId, mStatus, mLoop?"true": "false");
+ snprintf(buffer, 255, " Identity(%s), connId(%d), status(%d), looping(%s)\n",
+ mIdentity.toString().c_str(), mConnId, mStatus, mLoop?"true": "false");
result.append(buffer);
sp<MediaPlayerBase> p;
@@ -608,7 +621,7 @@
for (int i = 0, n = mMediaRecorderClients.size(); i < n; ++i) {
sp<MediaRecorderClient> c = mMediaRecorderClients[i].promote();
if (c != 0) {
- snprintf(buffer, 255, " MediaRecorderClient pid(%d)\n", c->mPid);
+ snprintf(buffer, 255, " MediaRecorderClient pid(%d)\n", c->mIdentity.pid);
result.append(buffer);
write(fd, result.string(), result.size());
result = "\n";
@@ -731,20 +744,18 @@
}
MediaPlayerService::Client::Client(
- const sp<MediaPlayerService>& service, pid_t pid,
+ const sp<MediaPlayerService>& service, const Identity& identity,
int32_t connId, const sp<IMediaPlayerClient>& client,
- audio_session_t audioSessionId, uid_t uid, const std::string& opPackageName)
- : mOpPackageName(opPackageName)
+ audio_session_t audioSessionId)
+ : mIdentity(identity)
{
ALOGV("Client(%d) constructor", connId);
- mPid = pid;
mConnId = connId;
mService = service;
mClient = client;
mLoop = false;
mStatus = NO_INIT;
mAudioSessionId = audioSessionId;
- mUid = uid;
mRetransmitEndpointValid = false;
mAudioAttributes = NULL;
mListener = new Listener(this);
@@ -757,7 +768,7 @@
MediaPlayerService::Client::~Client()
{
- ALOGV("Client(%d) destructor pid = %d", mConnId, mPid);
+ ALOGV("Client(%d) destructor identity = %s", mConnId, mIdentity.toString().c_str());
mAudioOutput.clear();
wp<Client> client(this);
disconnect();
@@ -770,7 +781,7 @@
void MediaPlayerService::Client::disconnect()
{
- ALOGV("disconnect(%d) from pid %d", mConnId, mPid);
+ ALOGV("disconnect(%d) from identity %s", mConnId, mIdentity.toString().c_str());
// grab local reference and clear main reference to prevent future
// access to object
sp<MediaPlayerBase> p;
@@ -810,11 +821,12 @@
p.clear();
}
if (p == NULL) {
- p = MediaPlayerFactory::createPlayer(playerType, mListener, mPid);
+ p = MediaPlayerFactory::createPlayer(playerType, mListener,
+ VALUE_OR_FATAL(aidl2legacy_int32_t_pid_t(mIdentity.pid)));
}
if (p != NULL) {
- p->setUID(mUid);
+ p->setUID(VALUE_OR_FATAL(aidl2legacy_int32_t_uid_t(mIdentity.uid)));
}
return p;
@@ -922,8 +934,8 @@
mAudioDeviceUpdatedListener = new AudioDeviceUpdatedNotifier(p);
if (!p->hardwareOutput()) {
- mAudioOutput = new AudioOutput(mAudioSessionId, IPCThreadState::self()->getCallingUid(),
- mPid, mAudioAttributes, mAudioDeviceUpdatedListener, mOpPackageName);
+ mAudioOutput = new AudioOutput(mAudioSessionId, mIdentity,
+ mAudioAttributes, mAudioDeviceUpdatedListener);
static_cast<MediaPlayerInterface*>(p.get())->setAudioSink(mAudioOutput);
}
@@ -1772,9 +1784,8 @@
#undef LOG_TAG
#define LOG_TAG "AudioSink"
-MediaPlayerService::AudioOutput::AudioOutput(audio_session_t sessionId, uid_t uid, int pid,
- const audio_attributes_t* attr, const sp<AudioSystem::AudioDeviceCallback>& deviceCallback,
- const std::string& opPackageName)
+MediaPlayerService::AudioOutput::AudioOutput(audio_session_t sessionId, const Identity& identity,
+ const audio_attributes_t* attr, const sp<AudioSystem::AudioDeviceCallback>& deviceCallback)
: mCallback(NULL),
mCallbackCookie(NULL),
mCallbackData(NULL),
@@ -1786,8 +1797,7 @@
mMsecsPerFrame(0),
mFrameSize(0),
mSessionId(sessionId),
- mUid(uid),
- mPid(pid),
+ mIdentity(identity),
mSendLevel(0.0),
mAuxEffectId(0),
mFlags(AUDIO_OUTPUT_FLAG_NONE),
@@ -1795,8 +1805,7 @@
mSelectedDeviceId(AUDIO_PORT_HANDLE_NONE),
mRoutedDeviceId(AUDIO_PORT_HANDLE_NONE),
mDeviceCallbackEnabled(false),
- mDeviceCallback(deviceCallback),
- mOpPackageName(opPackageName)
+ mDeviceCallback(deviceCallback)
{
ALOGV("AudioOutput(%d)", sessionId);
if (attr != NULL) {
@@ -2185,13 +2194,11 @@
mSessionId,
AudioTrack::TRANSFER_CALLBACK,
offloadInfo,
- mUid,
- mPid,
+ mIdentity,
mAttributes,
doNotReconnect,
1.0f, // default value for maxRequiredSpeed
- mSelectedDeviceId,
- mOpPackageName);
+ mSelectedDeviceId);
} else {
// TODO: Due to buffer memory concerns, we use a max target playback speed
// based on mPlaybackRate at the time of open (instead of kMaxRequiredSpeed),
@@ -2214,13 +2221,11 @@
mSessionId,
AudioTrack::TRANSFER_DEFAULT,
NULL, // offload info
- mUid,
- mPid,
+ mIdentity,
mAttributes,
doNotReconnect,
targetSpeed,
- mSelectedDeviceId,
- mOpPackageName);
+ mSelectedDeviceId);
}
// Set caller name so it can be logged in destructor.
// MediaMetricsConstants.h: AMEDIAMETRICS_PROP_CALLERNAME_VALUE_MEDIA
diff --git a/media/libmediaplayerservice/MediaPlayerService.h b/media/libmediaplayerservice/MediaPlayerService.h
index aca4369..35a65d3 100644
--- a/media/libmediaplayerservice/MediaPlayerService.h
+++ b/media/libmediaplayerservice/MediaPlayerService.h
@@ -27,12 +27,13 @@
#include <utils/String8.h>
#include <utils/Vector.h>
+#include <media/AidlConversion.h>
#include <media/AudioResamplerPublic.h>
#include <media/AudioSystem.h>
#include <media/MediaPlayerInterface.h>
#include <media/Metadata.h>
#include <media/stagefright/foundation/ABase.h>
-
+#include <android/media/permission/Identity.h>
#include <system/audio.h>
@@ -79,11 +80,9 @@
public:
AudioOutput(
audio_session_t sessionId,
- uid_t uid,
- int pid,
+ const media::permission::Identity& identity,
const audio_attributes_t * attr,
- const sp<AudioSystem::AudioDeviceCallback>& deviceCallback,
- const std::string& opPackageName);
+ const sp<AudioSystem::AudioDeviceCallback>& deviceCallback);
virtual ~AudioOutput();
virtual bool ready() const { return mTrack != 0; }
@@ -170,8 +169,7 @@
float mMsecsPerFrame;
size_t mFrameSize;
audio_session_t mSessionId;
- uid_t mUid;
- int mPid;
+ media::permission::Identity mIdentity;
float mSendLevel;
int mAuxEffectId;
audio_output_flags_t mFlags;
@@ -181,7 +179,6 @@
bool mDeviceCallbackEnabled;
wp<AudioSystem::AudioDeviceCallback> mDeviceCallback;
mutable Mutex mLock;
- const std::string mOpPackageName;
// static variables below not protected by mutex
static bool mIsOnEmulator;
@@ -234,13 +231,13 @@
static void instantiate();
// IMediaPlayerService interface
- virtual sp<IMediaRecorder> createMediaRecorder(const String16 &opPackageName);
+ virtual sp<IMediaRecorder> createMediaRecorder(const media::permission::Identity &identity);
void removeMediaRecorderClient(const wp<MediaRecorderClient>& client);
virtual sp<IMediaMetadataRetriever> createMetadataRetriever();
virtual sp<IMediaPlayer> create(const sp<IMediaPlayerClient>& client,
audio_session_t audioSessionId,
- const std::string opPackageName);
+ const media::permission::Identity& identity);
virtual sp<IMediaCodecList> getCodecList() const;
@@ -382,7 +379,9 @@
void notify(int msg, int ext1, int ext2, const Parcel *obj);
- pid_t pid() const { return mPid; }
+ pid_t pid() const {
+ return VALUE_OR_FATAL(aidl2legacy_int32_t_pid_t(mIdentity.pid));
+ }
virtual status_t dump(int fd, const Vector<String16>& args);
audio_session_t getAudioSessionId() { return mAudioSessionId; }
@@ -412,12 +411,10 @@
friend class MediaPlayerService;
Client( const sp<MediaPlayerService>& service,
- pid_t pid,
+ const media::permission::Identity& identity,
int32_t connId,
const sp<IMediaPlayerClient>& client,
- audio_session_t audioSessionId,
- uid_t uid,
- const std::string& opPackageName);
+ audio_session_t audioSessionId);
Client();
virtual ~Client();
@@ -461,20 +458,18 @@
sp<MediaPlayerService> mService;
sp<IMediaPlayerClient> mClient;
sp<AudioOutput> mAudioOutput;
- pid_t mPid;
+ const media::permission::Identity mIdentity;
status_t mStatus;
bool mLoop;
int32_t mConnId;
audio_session_t mAudioSessionId;
audio_attributes_t * mAudioAttributes;
- uid_t mUid;
sp<ANativeWindow> mConnectedWindow;
sp<IBinder> mConnectedWindowBinder;
struct sockaddr_in mRetransmitEndpoint;
bool mRetransmitEndpointValid;
sp<Client> mNextClient;
sp<MediaPlayerBase::Listener> mListener;
- const std::string mOpPackageName;
// Metadata filters.
media::Metadata::Filter mMetadataAllow; // protected by mLock
diff --git a/media/libmediaplayerservice/MediaRecorderClient.cpp b/media/libmediaplayerservice/MediaRecorderClient.cpp
index 1e72dd1..e2c8f8f 100644
--- a/media/libmediaplayerservice/MediaRecorderClient.cpp
+++ b/media/libmediaplayerservice/MediaRecorderClient.cpp
@@ -124,12 +124,10 @@
ALOGE("Invalid audio source: %d", as);
return BAD_VALUE;
}
- pid_t pid = IPCThreadState::self()->getCallingPid();
- uid_t uid = IPCThreadState::self()->getCallingUid();
if ((as == AUDIO_SOURCE_FM_TUNER
- && !(captureAudioOutputAllowed(pid, uid) || captureTunerAudioInputAllowed(pid, uid)))
- || !recordingAllowed(String16(""), pid, uid)) {
+ && !(captureAudioOutputAllowed(mIdentity) || captureTunerAudioInputAllowed(mIdentity)))
+ || !recordingAllowed(mIdentity)) {
return PERMISSION_DENIED;
}
Mutex::Autolock lock(mLock);
@@ -378,12 +376,13 @@
return NO_ERROR;
}
-MediaRecorderClient::MediaRecorderClient(const sp<MediaPlayerService>& service, pid_t pid,
- const String16& opPackageName)
+MediaRecorderClient::MediaRecorderClient(const sp<MediaPlayerService>& service,
+ const Identity& identity)
{
ALOGV("Client constructor");
- mPid = pid;
- mRecorder = new StagefrightRecorder(opPackageName);
+ // identity already validated in createMediaRecorder
+ mIdentity = identity;
+ mRecorder = new StagefrightRecorder(identity);
mMediaPlayerService = service;
}
diff --git a/media/libmediaplayerservice/MediaRecorderClient.h b/media/libmediaplayerservice/MediaRecorderClient.h
index e041855..24c6ee1 100644
--- a/media/libmediaplayerservice/MediaRecorderClient.h
+++ b/media/libmediaplayerservice/MediaRecorderClient.h
@@ -22,6 +22,7 @@
#include <media/AudioSystem.h>
#include <media/IMediaRecorder.h>
+#include <android/media/permission/Identity.h>
#include <vector>
@@ -93,14 +94,13 @@
MediaRecorderClient(
const sp<MediaPlayerService>& service,
- pid_t pid,
- const String16& opPackageName);
+ const media::permission::Identity& identity);
virtual ~MediaRecorderClient();
std::vector<DeathNotifier> mDeathNotifiers;
sp<AudioDeviceUpdatedNotifier> mAudioDeviceUpdatedNotifier;
- pid_t mPid;
+ media::permission::Identity mIdentity;
mutable Mutex mLock;
MediaRecorderBase *mRecorder;
sp<MediaPlayerService> mMediaPlayerService;
diff --git a/media/libmediaplayerservice/StagefrightRecorder.cpp b/media/libmediaplayerservice/StagefrightRecorder.cpp
index ecbdf61..b485b1e 100644
--- a/media/libmediaplayerservice/StagefrightRecorder.cpp
+++ b/media/libmediaplayerservice/StagefrightRecorder.cpp
@@ -33,6 +33,7 @@
#include <binder/IPCThreadState.h>
#include <binder/IServiceManager.h>
+#include <media/AidlConversion.h>
#include <media/IMediaPlayerService.h>
#include <media/MediaMetricsItem.h>
#include <media/stagefright/foundation/ABuffer.h>
@@ -114,8 +115,8 @@
}
-StagefrightRecorder::StagefrightRecorder(const String16 &opPackageName)
- : MediaRecorderBase(opPackageName),
+StagefrightRecorder::StagefrightRecorder(const Identity& clientIdentity)
+ : MediaRecorderBase(clientIdentity),
mWriter(NULL),
mOutputFd(-1),
mAudioSource((audio_source_t)AUDIO_SOURCE_CNT), // initialize with invalid value
@@ -157,7 +158,7 @@
// we run as part of the media player service; what we really want to
// know is the app which requested the recording.
- mMetricsItem->setUid(mClientUid);
+ mMetricsItem->setUid(VALUE_OR_FATAL(aidl2legacy_int32_t_uid_t(mClient.uid)));
// populate the values from the raw fields.
@@ -1129,7 +1130,8 @@
}
status_t StagefrightRecorder::setClientName(const String16& clientName) {
- mClientName = clientName;
+
+ mClient.packageName = VALUE_OR_RETURN_STATUS(legacy2aidl_String16_string(clientName));
return OK;
}
@@ -1141,10 +1143,6 @@
return INVALID_OPERATION;
}
- // Get UID and PID here for permission checking
- mClientUid = IPCThreadState::self()->getCallingUid();
- mClientPid = IPCThreadState::self()->getCallingPid();
-
status_t status = OK;
switch (mOutputFormat) {
@@ -1344,12 +1342,10 @@
sp<AudioSource> audioSource =
new AudioSource(
&attr,
- mOpPackageName,
+ mClient,
sourceSampleRate,
mAudioChannels,
mSampleRate,
- mClientUid,
- mClientPid,
mSelectedDeviceId,
mSelectedMicDirection,
mSelectedMicFieldDimension);
@@ -1871,6 +1867,10 @@
Size videoSize;
videoSize.width = mVideoWidth;
videoSize.height = mVideoHeight;
+ uid_t uid = VALUE_OR_RETURN_STATUS(aidl2legacy_int32_t_uid_t(mClient.uid));
+ pid_t pid = VALUE_OR_RETURN_STATUS(aidl2legacy_int32_t_pid_t(mClient.pid));
+ String16 clientName = VALUE_OR_RETURN_STATUS(
+ aidl2legacy_string_view_String16(mClient.packageName.value_or("")));
if (mCaptureFpsEnable) {
if (!(mCaptureFps > 0.)) {
ALOGE("Invalid mCaptureFps value: %lf", mCaptureFps);
@@ -1878,13 +1878,13 @@
}
mCameraSourceTimeLapse = CameraSourceTimeLapse::CreateFromCamera(
- mCamera, mCameraProxy, mCameraId, mClientName, mClientUid, mClientPid,
+ mCamera, mCameraProxy, mCameraId, clientName, uid, pid,
videoSize, mFrameRate, mPreviewSurface,
std::llround(1e6 / mCaptureFps));
*cameraSource = mCameraSourceTimeLapse;
} else {
*cameraSource = CameraSource::CreateFromCamera(
- mCamera, mCameraProxy, mCameraId, mClientName, mClientUid, mClientPid,
+ mCamera, mCameraProxy, mCameraId, clientName, uid, pid,
videoSize, mFrameRate,
mPreviewSurface);
}
diff --git a/media/libmediaplayerservice/StagefrightRecorder.h b/media/libmediaplayerservice/StagefrightRecorder.h
index 4bba869..278f348 100644
--- a/media/libmediaplayerservice/StagefrightRecorder.h
+++ b/media/libmediaplayerservice/StagefrightRecorder.h
@@ -26,6 +26,9 @@
#include <system/audio.h>
#include <media/hardware/MetadataBufferType.h>
+#include <android/media/permission/Identity.h>
+
+using namespace android::media::permission;
namespace android {
@@ -42,7 +45,7 @@
struct ALooper;
struct StagefrightRecorder : public MediaRecorderBase {
- explicit StagefrightRecorder(const String16 &opPackageName);
+ explicit StagefrightRecorder(const Identity& clientIdentity);
virtual ~StagefrightRecorder();
virtual status_t init();
virtual status_t setAudioSource(audio_source_t as);
@@ -98,9 +101,6 @@
sp<IGraphicBufferProducer> mPreviewSurface;
sp<PersistentSurface> mPersistentSurface;
sp<IMediaRecorderClient> mListener;
- String16 mClientName;
- uid_t mClientUid;
- pid_t mClientPid;
sp<MediaWriter> mWriter;
int mOutputFd;
sp<AudioSource> mAudioSourceNode;
diff --git a/media/libmediaplayerservice/tests/stagefrightRecorder/Android.bp b/media/libmediaplayerservice/tests/stagefrightRecorder/Android.bp
index b84d64b..5b16911 100644
--- a/media/libmediaplayerservice/tests/stagefrightRecorder/Android.bp
+++ b/media/libmediaplayerservice/tests/stagefrightRecorder/Android.bp
@@ -73,6 +73,8 @@
"libstagefright",
"libstagefright_foundation",
"libutils",
+ "media_permission-aidl-cpp",
+ "libaudioclient_aidl_conversion",
],
cflags: [
diff --git a/media/libmediaplayerservice/tests/stagefrightRecorder/StagefrightRecorderTest.cpp b/media/libmediaplayerservice/tests/stagefrightRecorder/StagefrightRecorderTest.cpp
index 5751631..6dea53d 100644
--- a/media/libmediaplayerservice/tests/stagefrightRecorder/StagefrightRecorderTest.cpp
+++ b/media/libmediaplayerservice/tests/stagefrightRecorder/StagefrightRecorderTest.cpp
@@ -59,7 +59,10 @@
}
void SetUp() override {
- mStfRecorder = new StagefrightRecorder(String16(LOG_TAG));
+ // TODO b/182392769: use identity util
+ Identity identity;
+ identity.packageName = std::string(LOG_TAG);
+ mStfRecorder = new StagefrightRecorder(identity);
ASSERT_NE(mStfRecorder, nullptr) << "Failed to create the instance of recorder";
mOutputAudioFp = fopen(OUTPUT_FILE_NAME_AUDIO, "wb");