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

Commit 0f27c56b authored by ashastry's avatar ashastry Committed by android-build-merger
Browse files

Merge "Permit privileged system apps to send SMS without persisting." am: 98399f06 am: 50650f64

am: 648b911c

Change-Id: I8ca4c6590ec367faf249389f52409263e7160bf4
parents a965a0dd 648b911c
Loading
Loading
Loading
Loading
+27 −18
Original line number Original line Diff line number Diff line
@@ -16,6 +16,7 @@


package android.telephony;
package android.telephony;


import android.annotation.SystemApi;
import android.app.ActivityThread;
import android.app.ActivityThread;
import android.app.PendingIntent;
import android.app.PendingIntent;
import android.content.ActivityNotFoundException;
import android.content.ActivityNotFoundException;
@@ -298,13 +299,13 @@ public final class SmsManager {
    public void sendTextMessage(
    public void sendTextMessage(
            String destinationAddress, String scAddress, String text,
            String destinationAddress, String scAddress, String text,
            PendingIntent sentIntent, PendingIntent deliveryIntent) {
            PendingIntent sentIntent, PendingIntent deliveryIntent) {
        sendTextMessageInternal(destinationAddress, scAddress, text,
        sendTextMessageInternal(destinationAddress, scAddress, text, sentIntent, deliveryIntent,
            sentIntent, deliveryIntent, true /* persistMessageForCarrierApp*/);
                true /* persistMessage*/);
    }
    }


    private void sendTextMessageInternal(String destinationAddress, String scAddress,
    private void sendTextMessageInternal(String destinationAddress, String scAddress,
            String text, PendingIntent sentIntent, PendingIntent deliveryIntent,
            String text, PendingIntent sentIntent, PendingIntent deliveryIntent,
            boolean persistMessageForCarrierApp) {
            boolean persistMessage) {
        if (TextUtils.isEmpty(destinationAddress)) {
        if (TextUtils.isEmpty(destinationAddress)) {
            throw new IllegalArgumentException("Invalid destinationAddress");
            throw new IllegalArgumentException("Invalid destinationAddress");
        }
        }
@@ -318,7 +319,7 @@ public final class SmsManager {
            iccISms.sendTextForSubscriber(getSubscriptionId(), ActivityThread.currentPackageName(),
            iccISms.sendTextForSubscriber(getSubscriptionId(), ActivityThread.currentPackageName(),
                    destinationAddress,
                    destinationAddress,
                    scAddress, text, sentIntent, deliveryIntent,
                    scAddress, text, sentIntent, deliveryIntent,
                    persistMessageForCarrierApp);
                    persistMessage);
        } catch (RemoteException ex) {
        } catch (RemoteException ex) {
            // ignore it
            // ignore it
        }
        }
@@ -327,16 +328,20 @@ public final class SmsManager {
    /**
    /**
     * Send a text based SMS without writing it into the SMS Provider.
     * Send a text based SMS without writing it into the SMS Provider.
     *
     *
     * <p>Only the carrier app can call this method.</p>
     * <p>Requires Permission:
     * {@link android.Manifest.permission#MODIFY_PHONE_STATE} or the calling app has carrier
     * privileges.
     * </p>
     *
     *
     * @see #sendTextMessage(String, String, String, PendingIntent, PendingIntent)
     * @see #sendTextMessage(String, String, String, PendingIntent, PendingIntent)
     * @hide
     * @hide
     */
     */
    @SystemApi
    public void sendTextMessageWithoutPersisting(
    public void sendTextMessageWithoutPersisting(
            String destinationAddress, String scAddress, String text,
            String destinationAddress, String scAddress, String text,
            PendingIntent sentIntent, PendingIntent deliveryIntent) {
            PendingIntent sentIntent, PendingIntent deliveryIntent) {
        sendTextMessageInternal(destinationAddress, scAddress, text,
        sendTextMessageInternal(destinationAddress, scAddress, text, sentIntent, deliveryIntent,
            sentIntent, deliveryIntent, false /* persistMessageForCarrierApp*/);
                false /* persistMessage */);
    }
    }


    /**
    /**
@@ -465,14 +470,14 @@ public final class SmsManager {
    public void sendMultipartTextMessage(
    public void sendMultipartTextMessage(
            String destinationAddress, String scAddress, ArrayList<String> parts,
            String destinationAddress, String scAddress, ArrayList<String> parts,
            ArrayList<PendingIntent> sentIntents, ArrayList<PendingIntent> deliveryIntents) {
            ArrayList<PendingIntent> sentIntents, ArrayList<PendingIntent> deliveryIntents) {
        sendMultipartTextMessageInternal(destinationAddress, scAddress, parts,
        sendMultipartTextMessageInternal(destinationAddress, scAddress, parts, sentIntents,
              sentIntents, deliveryIntents, true /* persistMessageForCarrierApp*/);
                deliveryIntents, true /* persistMessage*/);
    }
    }


    private void sendMultipartTextMessageInternal(
    private void sendMultipartTextMessageInternal(
            String destinationAddress, String scAddress, ArrayList<String> parts,
            String destinationAddress, String scAddress, List<String> parts,
            ArrayList<PendingIntent> sentIntents, ArrayList<PendingIntent> deliveryIntents,
            List<PendingIntent> sentIntents, List<PendingIntent> deliveryIntents,
            boolean persistMessageForCarrierApp) {
            boolean persistMessage) {
        if (TextUtils.isEmpty(destinationAddress)) {
        if (TextUtils.isEmpty(destinationAddress)) {
            throw new IllegalArgumentException("Invalid destinationAddress");
            throw new IllegalArgumentException("Invalid destinationAddress");
        }
        }
@@ -486,7 +491,7 @@ public final class SmsManager {
                iccISms.sendMultipartTextForSubscriber(getSubscriptionId(),
                iccISms.sendMultipartTextForSubscriber(getSubscriptionId(),
                        ActivityThread.currentPackageName(),
                        ActivityThread.currentPackageName(),
                        destinationAddress, scAddress, parts,
                        destinationAddress, scAddress, parts,
                        sentIntents, deliveryIntents, persistMessageForCarrierApp);
                        sentIntents, deliveryIntents, persistMessage);
            } catch (RemoteException ex) {
            } catch (RemoteException ex) {
                // ignore it
                // ignore it
            }
            }
@@ -507,16 +512,20 @@ public final class SmsManager {
    /**
    /**
     * Send a multi-part text based SMS without writing it into the SMS Provider.
     * Send a multi-part text based SMS without writing it into the SMS Provider.
     *
     *
     * <p>Only the carrier app can call this method.</p>
     * <p>Requires Permission:
     * {@link android.Manifest.permission#MODIFY_PHONE_STATE} or the calling app has carrier
     * privileges.
     * </p>
     *
     *
     * @see #sendMultipartTextMessage(String, String, ArrayList, ArrayList, ArrayList)
     * @see #sendMultipartTextMessage(String, String, ArrayList, ArrayList, ArrayList)
     * @hide
     * @hide
     **/
     **/
    @SystemApi
    public void sendMultipartTextMessageWithoutPersisting(
    public void sendMultipartTextMessageWithoutPersisting(
            String destinationAddress, String scAddress, ArrayList<String> parts,
            String destinationAddress, String scAddress, List<String> parts,
            ArrayList<PendingIntent> sentIntents, ArrayList<PendingIntent> deliveryIntents) {
            List<PendingIntent> sentIntents, List<PendingIntent> deliveryIntents) {
        sendMultipartTextMessageInternal(destinationAddress, scAddress, parts,
        sendMultipartTextMessageInternal(destinationAddress, scAddress, parts, sentIntents,
            sentIntents, deliveryIntents, false /* persistMessageForCarrierApp*/);
                deliveryIntents, false /* persistMessage*/);
    }
    }


    /**
    /**
+6 −6
Original line number Original line Diff line number Diff line
@@ -34,7 +34,6 @@ import android.os.AsyncResult;
import android.os.Binder;
import android.os.Binder;
import android.os.Handler;
import android.os.Handler;
import android.os.Message;
import android.os.Message;
import android.os.Process;
import android.os.UserManager;
import android.os.UserManager;
import android.provider.Telephony;
import android.provider.Telephony;
import android.service.carrier.CarrierMessagingService;
import android.service.carrier.CarrierMessagingService;
@@ -1118,20 +1117,20 @@ public class IccSmsInterfaceManager {
    }
    }


    /**
    /**
     * Enforces that the caller is one of the following:
     * Enforces that the caller has {@link android.Manifest.permission#MODIFY_PHONE_STATE}
     * permission or is one of the following apps:
     * <ul>
     * <ul>
     *     <li> Phone process
     *     <li> IMS App
     *     <li> IMS App
     *     <li> Carrier App
     *     <li> Carrier App
     * </ul>
     * </ul>
     */
     */
    private void enforcePrivilegedAppPermissions() {
    private void enforcePrivilegedAppPermissions() {
        int callingUid = Binder.getCallingUid();
        if (mContext.checkCallingOrSelfPermission(android.Manifest.permission.MODIFY_PHONE_STATE)
        // Allow the phone process itself to send, inject messages.
                == PackageManager.PERMISSION_GRANTED) {
        if (callingUid == Process.PHONE_UID) {
            return;
            return;
        }
        }


        int callingUid = Binder.getCallingUid();
        String carrierImsPackage = CarrierSmsUtils.getCarrierImsPackageForIntent(mContext, mPhone,
        String carrierImsPackage = CarrierSmsUtils.getCarrierImsPackageForIntent(mContext, mPhone,
                new Intent(CarrierMessagingService.SERVICE_INTERFACE));
                new Intent(CarrierMessagingService.SERVICE_INTERFACE));
        try {
        try {
@@ -1145,6 +1144,7 @@ public class IccSmsInterfaceManager {
                log("Cannot find configured carrier ims package");
                log("Cannot find configured carrier ims package");
            }
            }
        }
        }

        enforceCarrierPrivilege();
        enforceCarrierPrivilege();
    }
    }