diff options
author | Yorke Lee <yorkelee@google.com> | 2015-04-23 13:23:28 -0700 |
---|---|---|
committer | Yorke Lee <yorkelee@google.com> | 2015-04-27 13:00:31 -0700 |
commit | 77b65aa3d1c2db02ce664c4b31e10370efe645cb (patch) | |
tree | e68771bbd67b8d4411af76b1ac16aca06e6d8e98 /src/com/android | |
parent | 74e4f99cada94d6ca6be5d1bfee9abe7c4561253 (diff) | |
download | packages_providers_ContactsProvider-77b65aa3d1c2db02ce664c4b31e10370efe645cb.zip packages_providers_ContactsProvider-77b65aa3d1c2db02ce664c4b31e10370efe645cb.tar.gz packages_providers_ContactsProvider-77b65aa3d1c2db02ce664c4b31e10370efe645cb.tar.bz2 |
Grant VoicemailContentProvider permissions to default or system dialers
Bug: 20333102
Change-Id: Icb54620cf9241b3999bcb3de1b73394c71becb2f
Diffstat (limited to 'src/com/android')
3 files changed, 30 insertions, 19 deletions
diff --git a/src/com/android/providers/contacts/CallLogProvider.java b/src/com/android/providers/contacts/CallLogProvider.java index 547e4d3..76481bd 100644 --- a/src/com/android/providers/contacts/CallLogProvider.java +++ b/src/com/android/providers/contacts/CallLogProvider.java @@ -303,7 +303,7 @@ public class CallLogProvider extends ContentProvider { // permission and also requires the additional voicemail param set. if (hasVoicemailValue(values)) { checkIsAllowVoicemailRequest(uri); - mVoicemailPermissions.checkCallerHasWriteAccess(); + mVoicemailPermissions.checkCallerHasWriteAccess(getCallingPackage()); } if (mCallsInserter == null) { SQLiteDatabase db = mDbHelper.getWritableDatabase(); @@ -411,9 +411,9 @@ public class CallLogProvider extends ContentProvider { SelectionBuilder selectionBuilder, boolean isQuery) { if (isAllowVoicemailRequest(uri)) { if (isQuery) { - mVoicemailPermissions.checkCallerHasReadAccess(); + mVoicemailPermissions.checkCallerHasReadAccess(getCallingPackage()); } else { - mVoicemailPermissions.checkCallerHasWriteAccess(); + mVoicemailPermissions.checkCallerHasWriteAccess(getCallingPackage()); } } else { selectionBuilder.addClause(EXCLUDE_VOICEMAIL_SELECTION); diff --git a/src/com/android/providers/contacts/VoicemailContentProvider.java b/src/com/android/providers/contacts/VoicemailContentProvider.java index dc84129..ba51b8e 100644 --- a/src/com/android/providers/contacts/VoicemailContentProvider.java +++ b/src/com/android/providers/contacts/VoicemailContentProvider.java @@ -255,7 +255,7 @@ public class VoicemailContentProvider extends ContentProvider } // You must have access to the provider given in values. - if (!mVoicemailPermissions.callerHasWriteAccess()) { + if (!mVoicemailPermissions.callerHasWriteAccess(getCallingPackage())) { checkPackagesMatch(getCallingPackage_(), values.getAsString(VoicemailContract.SOURCE_PACKAGE_FIELD), uriData.getUri()); @@ -296,7 +296,7 @@ public class VoicemailContentProvider extends ContentProvider return UriData.createUriData(uri); } - if (mVoicemailPermissions.callerHasReadAccess()) { + if (mVoicemailPermissions.callerHasReadAccess(getCallingPackage())) { return UriData.createUriData(uri); } @@ -353,7 +353,7 @@ public class VoicemailContentProvider extends ContentProvider * @throws SecurityException if the check fails. */ private void checkPackagePermission(UriData uriData) { - if (!mVoicemailPermissions.callerHasWriteAccess()) { + if (!mVoicemailPermissions.callerHasWriteAccess(getCallingPackage())) { if (!uriData.hasSourcePackage()) { // You cannot have a match if this is not a provider URI. throw new SecurityException(String.format( @@ -414,14 +414,16 @@ public class VoicemailContentProvider extends ContentProvider } /** - * Whether or not the calling package has the appropriate read/write permission + * Whether or not the calling package has the appropriate read/write permission. The user + * selected default and/or system dialers are always allowed to read and write to the + * VoicemailContentProvider. * * @param read Whether or not this operation is a read * * @return True if the package has the permission required to perform the read/write operation */ private boolean hasReadWritePermission(boolean read) { - return read ? mVoicemailPermissions.callerHasReadAccess() : - mVoicemailPermissions.callerHasWriteAccess(); + return read ? mVoicemailPermissions.callerHasReadAccess(getCallingPackage()) : + mVoicemailPermissions.callerHasWriteAccess(getCallingPackage()); } } diff --git a/src/com/android/providers/contacts/VoicemailPermissions.java b/src/com/android/providers/contacts/VoicemailPermissions.java index 0aac18a..e1c9b57 100644 --- a/src/com/android/providers/contacts/VoicemailPermissions.java +++ b/src/com/android/providers/contacts/VoicemailPermissions.java @@ -18,6 +18,7 @@ package com.android.providers.contacts; import android.content.Context; import android.content.pm.PackageManager; +import android.telecom.DefaultDialerManager; /** * Provides method related to check various voicemail permissions under the @@ -37,13 +38,19 @@ public class VoicemailPermissions { } /** Determine if the calling process has full read access to all voicemails. */ - public boolean callerHasReadAccess() { + public boolean callerHasReadAccess(String callingPackage) { + if (DefaultDialerManager.isDefaultOrSystemDialer(mContext, callingPackage)) { + return true; + } return callerHasPermission(android.Manifest.permission.READ_VOICEMAIL); } /** Determine if the calling process has the permission required to update and remove all * voicemails */ - public boolean callerHasWriteAccess() { + public boolean callerHasWriteAccess(String callingPackage) { + if (DefaultDialerManager.isDefaultOrSystemDialer(mContext, callingPackage)) { + return true; + } return callerHasPermission(android.Manifest.permission.WRITE_VOICEMAIL); } @@ -64,17 +71,19 @@ public class VoicemailPermissions { * * @throws SecurityException if the caller does not have the voicemail source permission. */ - public void checkCallerHasReadAccess() { - if (!callerHasReadAccess()) { - throw new SecurityException(String.format("The caller must have %s permission: ", - android.Manifest.permission.READ_VOICEMAIL)); + public void checkCallerHasReadAccess(String callingPackage) { + if (!callerHasReadAccess(callingPackage)) { + throw new SecurityException(String.format("The caller must be the default or system " + + "dialer, or have the system-only %s permission: ", + android.Manifest.permission.READ_VOICEMAIL)); } } - public void checkCallerHasWriteAccess() { - if (!callerHasWriteAccess()) { - throw new SecurityException(String.format("The caller must have %s permission: ", - android.Manifest.permission.WRITE_VOICEMAIL)); + public void checkCallerHasWriteAccess(String callingPackage) { + if (!callerHasWriteAccess(callingPackage)) { + throw new SecurityException(String.format("The caller must be the default or system " + + "dialer, or have the system-only %s permission: ", + android.Manifest.permission.WRITE_VOICEMAIL)); } } |