From 4f1a16baf2269274eb36cbde955f7d13be46fbde Mon Sep 17 00:00:00 2001 From: Eric Rahm Date: Mon, 5 Jan 2015 15:15:07 -0800 Subject: [PATCH] Bug 1111135 - Part 2: Check for 3gpp permission. r=roc --- dom/media/MediaRecorder.cpp | 37 +++++++++++++++++++++++++++++-------- dom/media/MediaRecorder.h | 2 ++ 2 files changed, 31 insertions(+), 8 deletions(-) diff --git a/dom/media/MediaRecorder.cpp b/dom/media/MediaRecorder.cpp index f616a69fa06a..29f800db480e 100644 --- a/dom/media/MediaRecorder.cpp +++ b/dom/media/MediaRecorder.cpp @@ -545,6 +545,33 @@ private: } } + bool Check3gppPermission() + { + nsCOMPtr doc = mRecorder->GetOwner()->GetExtantDoc(); + if (!doc) { + return false; + } + + uint16_t appStatus = nsIPrincipal::APP_STATUS_NOT_INSTALLED; + doc->NodePrincipal()->GetAppStatus(&appStatus); + + // Certified applications can always assign AUDIO_3GPP + if (appStatus == nsIPrincipal::APP_STATUS_CERTIFIED) { + return true; + } + + nsCOMPtr pm = + do_GetService(NS_PERMISSIONMANAGER_CONTRACTID); + + if (!pm) { + return false; + } + + uint32_t perm = nsIPermissionManager::DENY_ACTION; + pm->TestExactPermissionFromPrincipal(doc->NodePrincipal(), "audio-capture:3gpp", &perm); + return perm == nsIPermissionManager::ALLOW_ACTION; + } + void InitEncoder(uint8_t aTrackTypes) { LOG(PR_LOG_DEBUG, ("Session.InitEncoder %p", this)); @@ -553,14 +580,8 @@ private: // Allocate encoder and bind with union stream. // At this stage, the API doesn't allow UA to choose the output mimeType format. - nsCOMPtr doc = mRecorder->GetOwner()->GetExtantDoc(); - uint16_t appStatus = nsIPrincipal::APP_STATUS_NOT_INSTALLED; - if (doc) { - doc->NodePrincipal()->GetAppStatus(&appStatus); - } - // Only allow certificated application can assign AUDIO_3GPP - if (appStatus == nsIPrincipal::APP_STATUS_CERTIFIED && - mRecorder->mMimeType.EqualsLiteral(AUDIO_3GPP)) { + // Make sure the application has permission to assign AUDIO_3GPP + if (mRecorder->mMimeType.EqualsLiteral(AUDIO_3GPP) && Check3gppPermission()) { mEncoder = MediaEncoder::CreateEncoder(NS_LITERAL_STRING(AUDIO_3GPP), aTrackTypes); } else { mEncoder = MediaEncoder::CreateEncoder(NS_LITERAL_STRING(""), aTrackTypes); diff --git a/dom/media/MediaRecorder.h b/dom/media/MediaRecorder.h index fbfb3595a5f5..dad6fdfe3066 100644 --- a/dom/media/MediaRecorder.h +++ b/dom/media/MediaRecorder.h @@ -148,6 +148,8 @@ private: // Register MediaRecorder into Document to listen the activity changes. void RegisterActivityObserver(); void UnRegisterActivityObserver(); + + bool Check3gppPermission(); }; }