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

Commit 7cce2a9f authored by Shashank Mittal's avatar Shashank Mittal
Browse files

AppOps: Fix mms control in AppOps.

Add support to check user permission before sending MMS.
Also seperate out SMS operations from MMS operations.

CRs-Fixed: 549192
Change-Id: Ia5b73e6b6a2c48b608a0ef1d199429c6c0e21f75
parent 588d6797
Loading
Loading
Loading
Loading
+28 −1
Original line number Diff line number Diff line
@@ -201,7 +201,13 @@ public class AppOpsManager {
    /** @hide */
    public static final int OP_DATA_CONNECT_CHANGE = 45;
    /** @hide */
    public static final int _NUM_OP = 46;
    public static final int OP_SEND_MMS = 46;
    /** @hide */
    public static final int OP_READ_MMS = 47;
    /** @hide */
    public static final int OP_WRITE_MMS = 48;
    /** @hide */
    public static final int _NUM_OP = 49;

    /** Access to coarse location information. */
    public static final String OPSTR_COARSE_LOCATION =
@@ -271,6 +277,9 @@ public class AppOpsManager {
            OP_WIFI_CHANGE,
            OP_BLUETOOTH_CHANGE,
            OP_DATA_CONNECT_CHANGE,
            OP_SEND_MMS,
            OP_READ_MMS,
            OP_WRITE_MMS,
    };

    /**
@@ -324,6 +333,9 @@ public class AppOpsManager {
            null,
            null,
            null,
            null,
            null,
            null,
    };

    /**
@@ -377,6 +389,9 @@ public class AppOpsManager {
            "WIFI_CHANGE",
            "BLUETOOTH_CHANGE",
            "DATA_CONNECT_CHANGE",
            "SEND_MMS",
            "READ_MMS",
            "WRITE_MMS",
    };

    /**
@@ -430,6 +445,9 @@ public class AppOpsManager {
            android.Manifest.permission.CHANGE_WIFI_STATE,
            android.Manifest.permission.BLUETOOTH,
            android.Manifest.permission.CHANGE_NETWORK_STATE,
            android.Manifest.permission.SEND_SMS,
            android.Manifest.permission.READ_SMS,
            android.Manifest.permission.WRITE_SMS,
    };

    /**
@@ -482,6 +500,9 @@ public class AppOpsManager {
            AppOpsManager.MODE_ALLOWED, // OP_WIFI_CHANGE
            AppOpsManager.MODE_ALLOWED, // OP_BLUETOOTH_CHANGE
            AppOpsManager.MODE_ALLOWED, // OP_DATA_CHANGE
            AppOpsManager.MODE_ALLOWED, // OP_SEND_MMS
            AppOpsManager.MODE_ALLOWED, // OP_READ_MMS
            AppOpsManager.MODE_ALLOWED, // OP_WRITE_MMS
    };

    /**
@@ -534,6 +555,9 @@ public class AppOpsManager {
            AppOpsManager.MODE_ASK,     // OP_WIFI_CHANGE
            AppOpsManager.MODE_ASK,     // OP_BLUETOOTH_CHANGE
            AppOpsManager.MODE_ASK,     // OP_DATA_CHANGE
            AppOpsManager.MODE_ASK,     // OP_SEND_MMS
            AppOpsManager.MODE_ASK,     // OP_READ_MMS
            AppOpsManager.MODE_ASK,     // OP_WRITE_MMS
    };


@@ -591,6 +615,9 @@ public class AppOpsManager {
            false,
            false,
            false,
            false,
            false,
            false,
    };

    private static HashMap<String, Integer> sOpStrToOp = new HashMap<String, Integer>();
+60 −0
Original line number Diff line number Diff line
@@ -42,6 +42,7 @@ import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.impl.client.RequestWrapper;
import org.apache.http.impl.conn.tsccm.ThreadSafeClientConnManager;
import org.apache.http.params.BasicHttpParams;
import org.apache.http.params.CoreProtocolPNames;
import org.apache.http.params.HttpConnectionParams;
import org.apache.http.params.HttpParams;
import org.apache.http.params.HttpProtocolParams;
@@ -49,10 +50,13 @@ import org.apache.http.protocol.BasicHttpContext;
import org.apache.http.protocol.BasicHttpProcessor;
import org.apache.http.protocol.HttpContext;

import android.app.ActivityThread;
import android.app.AppOpsManager;
import android.content.ContentResolver;
import android.content.Context;
import android.net.SSLCertificateSocketFactory;
import android.net.SSLSessionCache;
import android.os.Binder;
import android.os.Looper;
import android.util.Base64;
import android.util.Log;
@@ -248,46 +252,102 @@ public final class AndroidHttpClient implements HttpClient {
        return delegate.getConnectionManager();
    }

    private boolean isMmsRequest()
    {
        if(delegate.getParams().getParameter(CoreProtocolPNames.USER_AGENT).toString().contains("Android-Mms"))
            return true;

        return false;
    }

    private boolean checkMmsOps()
    {
        AppOpsManager appOps = (AppOpsManager) ActivityThread.currentApplication().getSystemService(Context.APP_OPS_SERVICE);
        int callingUid = Binder.getCallingUid();
        String callingPackage= ActivityThread.currentPackageName();

        if (appOps.noteOp(AppOpsManager.OP_SEND_MMS, callingUid, callingPackage) !=
                AppOpsManager.MODE_ALLOWED)
                return false;

        return true;
    }

    private String getMethod(HttpUriRequest request) {
        if(request != null)
            return request.getMethod();
        return null;
    }

    private String getMethod(HttpRequest request) {
        if(request != null)
            if(request.getRequestLine() != null)
                return request.getRequestLine().getMethod();
        return null;
    }

    private boolean checkMmsSendPermission(String method) {
        if(isMmsRequest() && method.equals("POST"))
            return checkMmsOps();
        return true;
    }

    public HttpResponse execute(HttpUriRequest request) throws IOException {
        if(!checkMmsSendPermission(getMethod(request)))
            throw new IOException("Permission denied");
        return delegate.execute(request);
    }

    public HttpResponse execute(HttpUriRequest request, HttpContext context)
            throws IOException {
        if(!checkMmsSendPermission(getMethod(request)))
            throw new IOException("Permission denied");
        return delegate.execute(request, context);
    }

    public HttpResponse execute(HttpHost target, HttpRequest request)
            throws IOException {
        if(!checkMmsSendPermission(getMethod(request)))
            throw new IOException("Permission denied");
        return delegate.execute(target, request);
    }

    public HttpResponse execute(HttpHost target, HttpRequest request,
            HttpContext context) throws IOException {
        if(!checkMmsSendPermission(getMethod(request)))
            throw new IOException("Permission denied");
        return delegate.execute(target, request, context);
    }

    public <T> T execute(HttpUriRequest request,
            ResponseHandler<? extends T> responseHandler)
            throws IOException, ClientProtocolException {
        if(!checkMmsSendPermission(getMethod(request)))
            throw new IOException("Permission denied");
        return delegate.execute(request, responseHandler);
    }

    public <T> T execute(HttpUriRequest request,
            ResponseHandler<? extends T> responseHandler, HttpContext context)
            throws IOException, ClientProtocolException {
        if(!checkMmsSendPermission(getMethod(request)))
            throw new IOException("Permission denied");
        return delegate.execute(request, responseHandler, context);
    }

    public <T> T execute(HttpHost target, HttpRequest request,
            ResponseHandler<? extends T> responseHandler) throws IOException,
            ClientProtocolException {
        if(!checkMmsSendPermission(getMethod(request)))
            throw new IOException("Permission denied");
        return delegate.execute(target, request, responseHandler);
    }

    public <T> T execute(HttpHost target, HttpRequest request,
            ResponseHandler<? extends T> responseHandler, HttpContext context)
            throws IOException, ClientProtocolException {
        if(!checkMmsSendPermission(getMethod(request)))
            throw new IOException("Permission denied");
        return delegate.execute(target, request, responseHandler, context);
    }

+12 −9
Original line number Diff line number Diff line
@@ -1327,15 +1327,15 @@
        <item>Trying to post notification</item>
        <item>Trying to access location</item>
        <item>Trying to make phone call</item>
        <item>Trying to read SMS/MMS</item>
        <item>Trying to write/modify SMS/MMS</item>
        <item>Trying to receive SMS/MMS</item>
        <item>Trying to receive SMS/MMS</item>
        <item>Trying to receive SMS/MMS</item>
        <item>Trying to receive SMS/MMS</item>
        <item>Trying to send SMS/MMS</item>
        <item>Trying to read SMS/MMS</item>
        <item>Trying to write/modify SMS/MMS</item>
        <item>Trying to read SMS</item>
        <item>Trying to write/modify SMS</item>
        <item>Trying to receive SMS</item>
        <item>Trying to receive SMS</item>
        <item>Trying to receive SMS</item>
        <item>Trying to receive SMS</item>
        <item>Trying to send SMS</item>
        <item>Trying to read SMS</item>
        <item>Trying to write/modify SMS</item>
        <item>Trying to modify settings</item>
        <item>Trying to draw on top</item>
        <item>Trying to access notifications</item>
@@ -1359,5 +1359,8 @@
        <item>Trying to turn on/off Wifi</item>
        <item>Trying to turn on/off bluetooth</item>
        <item>Trying to turn on/off mobile data</item>
        <item>Trying to send MMS</item>
        <item>Trying to read MMS</item>
        <item>Trying to write MMS</item>
    </string-array>
</resources>