Loading core/java/android/app/AppOpsManager.java +28 −1 Original line number Diff line number Diff line Loading @@ -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 = Loading Loading @@ -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, }; /** Loading Loading @@ -324,6 +333,9 @@ public class AppOpsManager { null, null, null, null, null, null, }; /** Loading Loading @@ -377,6 +389,9 @@ public class AppOpsManager { "WIFI_CHANGE", "BLUETOOTH_CHANGE", "DATA_CONNECT_CHANGE", "SEND_MMS", "READ_MMS", "WRITE_MMS", }; /** Loading Loading @@ -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, }; /** Loading Loading @@ -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 }; /** Loading Loading @@ -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 }; Loading Loading @@ -591,6 +615,9 @@ public class AppOpsManager { false, false, false, false, false, false, }; private static HashMap<String, Integer> sOpStrToOp = new HashMap<String, Integer>(); Loading core/java/android/net/http/AndroidHttpClient.java +60 −0 Original line number Diff line number Diff line Loading @@ -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; Loading @@ -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; Loading Loading @@ -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); } Loading core/res/res/values/config.xml +12 −9 Original line number Diff line number Diff line Loading @@ -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> Loading @@ -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> Loading
core/java/android/app/AppOpsManager.java +28 −1 Original line number Diff line number Diff line Loading @@ -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 = Loading Loading @@ -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, }; /** Loading Loading @@ -324,6 +333,9 @@ public class AppOpsManager { null, null, null, null, null, null, }; /** Loading Loading @@ -377,6 +389,9 @@ public class AppOpsManager { "WIFI_CHANGE", "BLUETOOTH_CHANGE", "DATA_CONNECT_CHANGE", "SEND_MMS", "READ_MMS", "WRITE_MMS", }; /** Loading Loading @@ -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, }; /** Loading Loading @@ -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 }; /** Loading Loading @@ -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 }; Loading Loading @@ -591,6 +615,9 @@ public class AppOpsManager { false, false, false, false, false, false, }; private static HashMap<String, Integer> sOpStrToOp = new HashMap<String, Integer>(); Loading
core/java/android/net/http/AndroidHttpClient.java +60 −0 Original line number Diff line number Diff line Loading @@ -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; Loading @@ -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; Loading Loading @@ -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); } Loading
core/res/res/values/config.xml +12 −9 Original line number Diff line number Diff line Loading @@ -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> Loading @@ -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>