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

Commit 4256e499 authored by Madhusudhan R. Adupala's avatar Madhusudhan R. Adupala
Browse files

Enable SMS interception for CarrierIms Package.

Enable the interception of SMS by apps that are built onto
the system and are currently bound by the ImsResolver
for a particular subscription.

Bug: 29899506
Test: Manually verified

Change-Id: I0ca04b169d94df04ac6e18201384fc13da91a069
parent 51b3661b
Loading
Loading
Loading
Loading
+11 −9
Original line number Diff line number Diff line
@@ -46,8 +46,7 @@ public class CarrierServicesSmsFilter {
    protected static final boolean DBG = true;

    private final Context mContext;
    private final int mPhoneId;
    private final int mSubId;
    private final Phone mPhone;
    private final byte[][] mPdus;
    private final int mDestPort;
    private final String mPduFormat;
@@ -57,16 +56,14 @@ public class CarrierServicesSmsFilter {
    @VisibleForTesting
    public CarrierServicesSmsFilter(
            Context context,
            int phoneId,
            int subId,
            Phone phone,
            byte[][] pdus,
            int destPort,
            String pduFormat,
            CarrierServicesSmsFilterCallbackInterface carrierServicesSmsFilterCallback,
            String logTag) {
        mContext = context;
        mPhoneId = phoneId;
        mSubId = subId;
        mPhone = phone;
        mPdus = pdus;
        mDestPort = destPort;
        mPduFormat = pduFormat;
@@ -84,6 +81,11 @@ public class CarrierServicesSmsFilter {
        if (carrierAppForFiltering.isPresent()) {
            smsFilterPackages.add(carrierAppForFiltering.get());
        }
        String carrierImsPackage = CarrierSmsUtils.getCarrierImsPackageForIntent(mContext, mPhone,
                new Intent(CarrierMessagingService.SERVICE_INTERFACE));
        if (carrierImsPackage != null) {
            smsFilterPackages.add(carrierImsPackage);
        }
        FilterAggregator filterAggregator = new FilterAggregator(smsFilterPackages.size());
        for (String smsFilterPackage : smsFilterPackages) {
            filterWithPackage(smsFilterPackage, filterAggregator);
@@ -94,7 +96,7 @@ public class CarrierServicesSmsFilter {

    private Optional<String> getCarrierAppPackageForFiltering() {
        List<String> carrierPackages = null;
        UiccCard card = UiccController.getInstance().getUiccCard(mPhoneId);
        UiccCard card = UiccController.getInstance().getUiccCard(mPhone.getPhoneId());
        if (card != null) {
            carrierPackages = card.getCarrierPackageNamesForIntent(
                    mContext.getPackageManager(),
@@ -209,8 +211,8 @@ public class CarrierServicesSmsFilter {
        protected void onServiceReady(ICarrierMessagingService carrierMessagingService) {
            try {
                carrierMessagingService.filterSms(
                        new MessagePdu(Arrays.asList(mPdus)), mSmsFormat, mDestPort, mSubId,
                        mSmsFilterCallback);
                        new MessagePdu(Arrays.asList(mPdus)), mSmsFormat, mDestPort,
                        mPhone.getSubId(), mSmsFilterCallback);
            } catch (RemoteException e) {
                loge("Exception filtering the SMS: " + e);
                mSmsFilterCallback.onFilterComplete(
+24 −3
Original line number Diff line number Diff line
@@ -25,6 +25,8 @@ import android.app.AppOpsManager;
import android.app.PendingIntent;
import android.content.ContentResolver;
import android.content.Context;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.database.Cursor;
import android.database.sqlite.SQLiteException;
import android.net.Uri;
@@ -35,6 +37,7 @@ import android.os.Message;
import android.os.Process;
import android.os.UserManager;
import android.provider.Telephony;
import android.service.carrier.CarrierMessagingService;
import android.telephony.Rlog;
import android.telephony.SmsManager;
import android.telephony.SmsMessage;
@@ -465,7 +468,7 @@ public class IccSmsInterfaceManager {
     *  the same time an SMS received from radio is acknowledged back.
     */
    public void injectSmsPdu(byte[] pdu, String format, PendingIntent receivedIntent) {
        enforceCarrierPrivilege();
        enforceCarrierOrCarrierImsPrivilege();
        if (Rlog.isLoggable("SMS", Log.VERBOSE)) {
            log("pdu: " + pdu +
                "\n format=" + format +
@@ -507,8 +510,8 @@ public class IccSmsInterfaceManager {
                Manifest.permission.SEND_SMS,
                "Sending SMS message");
        if (!persistMessageForNonDefaultSmsApp) {
            // Only allow carrier app to skip auto message persistence.
            enforceCarrierPrivilege();
            // Only allow carrier app or carrier ims to skip auto message persistence.
            enforceCarrierOrCarrierImsPrivilege();
        }
        if (Rlog.isLoggable("SMS", Log.VERBOSE)) {
            int i = 0;
@@ -1115,6 +1118,24 @@ public class IccSmsInterfaceManager {
        }
    }

    private void enforceCarrierOrCarrierImsPrivilege() {
        int callingUid = Binder.getCallingUid();
        String carrierImsPackage = CarrierSmsUtils.getCarrierImsPackageForIntent(mContext, mPhone,
                new Intent(CarrierMessagingService.SERVICE_INTERFACE));
        try {
            if (carrierImsPackage != null
                    && callingUid == mContext.getPackageManager().getPackageUid(
                            carrierImsPackage, 0)) {
              return;
            }
        } catch (PackageManager.NameNotFoundException e) {
            if (Rlog.isLoggable("SMS", Log.DEBUG)) {
                log("Cannot find configured carrier ims package");
            }
        }
        enforceCarrierPrivilege();
    }

    private void enforceCarrierOrPhonePrivilege() {
        int callingUid = Binder.getCallingUid();
        if (callingUid != Process.PHONE_UID) {
+1 −2
Original line number Diff line number Diff line
@@ -947,8 +947,7 @@ public abstract class InboundSmsHandler extends StateMachine {
                new CarrierServicesSmsFilterCallback(
                        pdus, destPort, tracker.getFormat(), resultReceiver, userUnlocked);
        CarrierServicesSmsFilter carrierServicesFilter = new CarrierServicesSmsFilter(
                mContext, mPhone.getPhoneId(), mPhone.getSubId(), pdus, destPort,
                tracker.getFormat(), filterCallback, getName());
                mContext, mPhone, pdus, destPort, tracker.getFormat(), filterCallback, getName());
        if (carrierServicesFilter.filter()) {
            return true;
        }
+7 −3
Original line number Diff line number Diff line
@@ -1735,9 +1735,13 @@ public abstract class SMSDispatcher extends Handler {

        List<String> carrierPackages = card.getCarrierPackageNamesForIntent(
            mContext.getPackageManager(), new Intent(CarrierMessagingService.SERVICE_INTERFACE));
        // TODO: Add Check for IMS app if there are no carrier packages.
        return (carrierPackages != null && carrierPackages.size() == 1) ?
                carrierPackages.get(0) : null;
        if (carrierPackages != null && carrierPackages.size() == 1) {
            return carrierPackages.get(0);
        }
        // If there is no carrier package which implements CarrierMessagingService, then lookup if
        // for a carrierImsPackage that implements CarrierMessagingService.
        return CarrierSmsUtils.getCarrierImsPackageForIntent(mContext, mPhone,
                new Intent(CarrierMessagingService.SERVICE_INTERFACE));
    }

    protected int getSubId() {
+1 −1
Original line number Diff line number Diff line
@@ -72,7 +72,7 @@ public class CarrierServicesSmsFilterTest extends TelephonyTest {
    public void setUp() throws Exception {
        super.setUp(getClass().getSimpleName());
        mCarrierServicesSmsFilterUT = new CarrierServicesSmsFilter(
                mContext, mPhone.getPhoneId(), mPhone.getSubId(), new byte[][]{SMS_PDU},
                mContext, mPhone, new byte[][]{SMS_PDU},
                0, null, mFilterCallback, getClass().getSimpleName());
    }