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

Commit 79aaecdf authored by Arun kumar Voddu's avatar Arun kumar Voddu Committed by Android (Google) Code Review
Browse files

Merge "Fixed the smscAddress API permission validation BUG: 268588506 BUG:...

Merge "Fixed the smscAddress API permission validation BUG: 268588506 BUG: 269708461 Test: atest android.telephony.cts.SmsManagerTest#testGetSetSmscAddress and verified manually sms and Mms." into udc-dev
parents 6129a180 8a42ac4e
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;
                }
            };