Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 8a42ac4e authored by arunvoddu's avatar arunvoddu Committed by Arun kumar Voddu
Browse files

Fixed the smscAddress API permission validation

BUG: 268588506
BUG: 269708461
Test: atest android.telephony.cts.SmsManagerTest#testGetSetSmscAddress and verified manually sms and Mms.

Change-Id: I9436a1abda681a4c0b1fb7635dcb1837e2b6b40e
parent 55b6e4f4
Loading
Loading
Loading
Loading
+2 −0
Original line number Diff line number Diff line
@@ -908,6 +908,7 @@ public class IccSmsInterfaceManager {
    public String getSmscAddressFromIccEf(String callingPackage) {
        if (!mSmsPermissions.checkCallingOrSelfCanGetSmscAddress(
                callingPackage, "getSmscAddressFromIccEf")) {
            loge("Caller do not have permission to call GetSmscAddress");
            return null;
        }
        enforceNotOnHandlerThread("getSmscAddressFromIccEf");
@@ -929,6 +930,7 @@ public class IccSmsInterfaceManager {
    public boolean setSmscAddressOnIccEf(String callingPackage, String smsc) {
        if (!mSmsPermissions.checkCallingOrSelfCanSetSmscAddress(
                callingPackage, "setSmscAddressOnIccEf")) {
            loge("Caller do not have permission to call SetSmscAddress");
            return false;
        }
        enforceNotOnHandlerThread("setSmscAddressOnIccEf");
+5 −9
Original line number Diff line number Diff line
@@ -45,6 +45,7 @@ import android.telephony.ServiceState;
import android.telephony.SmsManager;
import android.telephony.SmsMessage;
import android.telephony.TelephonyManager;
import android.text.TextUtils;

import com.android.ims.ImsManager;
import com.android.internal.annotations.VisibleForTesting;
@@ -459,12 +460,7 @@ public class SmsDispatchersController extends Handler {
    private String getSmscAddressFromUSIM(String callingPkg) {
        IccSmsInterfaceManager iccSmsIntMgr = mPhone.getIccSmsInterfaceManager();
        if (iccSmsIntMgr != null) {
            long identity = Binder.clearCallingIdentity();
            try {
            return iccSmsIntMgr.getSmscAddressFromIccEf(callingPkg);
            } finally {
                Binder.restoreCallingIdentity(identity);
            }
        } else {
            Rlog.d(TAG, "getSmscAddressFromIccEf iccSmsIntMgr is null");
        }
@@ -1303,7 +1299,7 @@ public class SmsDispatchersController extends Handler {
     */
    protected void sendData(String callingPackage, String destAddr, String scAddr, int destPort,
            byte[] data, PendingIntent sentIntent, PendingIntent deliveryIntent, boolean isForVvm) {
        if (scAddr == null) {
        if (TextUtils.isEmpty(scAddr)) {
            scAddr = getSmscAddressFromUSIM(callingPackage);
        }

@@ -1542,7 +1538,7 @@ public class SmsDispatchersController extends Handler {
            PendingIntent deliveryIntent, Uri messageUri, String callingPkg, boolean persistMessage,
            int priority, boolean expectMore, int validityPeriod, boolean isForVvm,
            long messageId, boolean skipShortCodeCheck) {
        if (scAddr == null) {
        if (TextUtils.isEmpty(scAddr)) {
            scAddr = getSmscAddressFromUSIM(callingPkg);
        }

@@ -1691,7 +1687,7 @@ public class SmsDispatchersController extends Handler {
            ArrayList<PendingIntent> deliveryIntents, Uri messageUri, String callingPkg,
            boolean persistMessage, int priority, boolean expectMore, int validityPeriod,
            long messageId) {
        if (scAddr == null) {
        if (TextUtils.isEmpty(scAddr)) {
            scAddr = getSmscAddressFromUSIM(callingPkg);
        }

+20 −13
Original line number Diff line number Diff line
@@ -135,16 +135,17 @@ public class SmsPermissions {
    public boolean checkCallingOrSelfCanGetSmscAddress(String callingPackage, String message) {
        // Allow it to the default SMS app always.
        boolean isDefaultSmsPackage;
        int callerUid = Binder.getCallingUid();
        final long identity = Binder.clearCallingIdentity();
        try {
            isDefaultSmsPackage = isCallerDefaultSmsPackage(callingPackage);
            isDefaultSmsPackage = isCallerDefaultSmsPackage(callingPackage, callerUid);
        } finally {
            Binder.restoreCallingIdentity(identity);
        }

        if (!isDefaultSmsPackage) {
            TelephonyPermissions
                        .enforceCallingOrSelfReadPrivilegedPhoneStatePermissionOrCarrierPrivilege(
            Rlog.d(LOG_TAG, "Caller is not a default SMS application");
            TelephonyPermissions.
                    enforceCallingOrSelfReadPrivilegedPhoneStatePermissionOrCarrierPrivilege(
                            mContext, mPhone.getSubId(), message);
        }
        return true;
@@ -162,25 +163,26 @@ public class SmsPermissions {
    public boolean checkCallingOrSelfCanSetSmscAddress(String callingPackage, String message) {
        // Allow it to the default SMS app always.
        boolean isDefaultSmsPackage;
        int callerUid = Binder.getCallingUid();
        final long identity = Binder.clearCallingIdentity();
        try {
            isDefaultSmsPackage = isCallerDefaultSmsPackage(callingPackage);
            isDefaultSmsPackage = isCallerDefaultSmsPackage(callingPackage, callerUid);
        } finally {
            Binder.restoreCallingIdentity(identity);
        }

        if (!isDefaultSmsPackage) {
            Rlog.d(LOG_TAG, "Caller is not a default SMS application");
            // Allow it with MODIFY_PHONE_STATE or Carrier Privileges
            TelephonyPermissions.enforceCallingOrSelfModifyPermissionOrCarrierPrivilege(
                    mContext, mPhone.getSubId(), message);
            TelephonyPermissions.enforceCallingOrSelfModifyPermissionOrCarrierPrivilege(mContext,
                    mPhone.getSubId(), message);
        }
        return true;
    }

    /** Check if a package is default SMS app. */
    @VisibleForTesting
    public boolean isCallerDefaultSmsPackage(String packageName) {
        if (packageNameMatchesCallingUid(packageName)) {
    public boolean isCallerDefaultSmsPackage(String packageName, int callerUid) {
        if (packageNameMatchesCallingUid(packageName, callerUid)) {
            UserHandle userHandle = TelephonyUtils.getSubscriptionUserHandle(mContext,
                    mPhone.getSubId());
            return SmsApplication.isDefaultSmsApplicationAsUser(mContext, packageName, userHandle);
@@ -188,16 +190,21 @@ public class SmsPermissions {
        return false;
    }

    @VisibleForTesting
    public boolean packageNameMatchesCallingUid(String packageName) {
        return packageNameMatchesCallingUid(packageName, Binder.getCallingUid());
    }

    /**
     * Check if the passed in packageName belongs to the calling uid.
     * @param packageName name of the package to check
     * @return true if package belongs to calling uid, false otherwise
     */
    @VisibleForTesting
    public boolean packageNameMatchesCallingUid(String packageName) {
    public boolean packageNameMatchesCallingUid(String packageName, int callerUid) {
        try {
            ((AppOpsManager) mContext.getSystemService(Context.APP_OPS_SERVICE))
                    .checkPackage(Binder.getCallingUid(), packageName);
                    .checkPackage(callerUid, packageName);
            // If checkPackage doesn't throw an exception then we are the given package
            return true;
        } catch (SecurityException e) {
+1 −1
Original line number Diff line number Diff line
@@ -78,7 +78,7 @@ public class SmsPermissionsTest extends TelephonyTest {
                }

                @Override
                public boolean isCallerDefaultSmsPackage(String packageName) {
                public boolean isCallerDefaultSmsPackage(String packageName, int uid) {
                    return mCallerIsDefaultSmsPackage;
                }
            };