From 9c7a1d09524efdfa558015d1208166fe0666d0ae Mon Sep 17 00:00:00 2001 From: emanuele-f Date: Mon, 6 Jun 2022 16:43:18 +0200 Subject: [PATCH] Fix permission grant inside work profile --- .../remote_capture/AppsResolver.java | 3 +-- .../remote_capture/CaptureService.java | 11 +--------- .../com/emanuelef/remote_capture/Utils.java | 20 +++++++++++++++++-- 3 files changed, 20 insertions(+), 14 deletions(-) diff --git a/app/src/main/java/com/emanuelef/remote_capture/AppsResolver.java b/app/src/main/java/com/emanuelef/remote_capture/AppsResolver.java index 1260aa08..f11bc20f 100644 --- a/app/src/main/java/com/emanuelef/remote_capture/AppsResolver.java +++ b/app/src/main/java/com/emanuelef/remote_capture/AppsResolver.java @@ -41,7 +41,6 @@ import java.util.Arrays; public class AppsResolver { private static final String TAG = "AppsResolver"; - public static final int PER_USER_RANGE = 100000; private final SparseArray mApps; private final PackageManager mPm; private final Context mContext; @@ -140,7 +139,7 @@ public class AppsResolver { if(getPackageInfoAsUser == null) getPackageInfoAsUser = PackageManager.class.getDeclaredMethod("getPackageInfoAsUser", String.class, int.class, int.class); - PackageInfo pinfo = (PackageInfo) getPackageInfoAsUser.invoke(mPm, packageName, pm_flags, uid / PER_USER_RANGE); + PackageInfo pinfo = (PackageInfo) getPackageInfoAsUser.invoke(mPm, packageName, pm_flags, Utils.getUserId(uid)); if(pinfo != null) return new AppDescriptor(mPm, pinfo); } catch (NoSuchMethodException | IllegalAccessException | InvocationTargetException e) { diff --git a/app/src/main/java/com/emanuelef/remote_capture/CaptureService.java b/app/src/main/java/com/emanuelef/remote_capture/CaptureService.java index a6fd6fde..b3da8996 100644 --- a/app/src/main/java/com/emanuelef/remote_capture/CaptureService.java +++ b/app/src/main/java/com/emanuelef/remote_capture/CaptureService.java @@ -421,7 +421,7 @@ public class CaptureService extends VpnService implements Runnable { } else { // Root capture if(checkCallingOrSelfPermission(Utils.INTERACT_ACROSS_USERS) != PackageManager.PERMISSION_GRANTED) { - boolean success = Utils.rootGrantPermission(Utils.INTERACT_ACROSS_USERS); + boolean success = Utils.rootGrantPermission(this, Utils.INTERACT_ACROSS_USERS); Utils.showToast(this, success ? R.string.permission_granted : R.string.permission_grant_fail, "INTERACT_ACROSS_USERS"); } } @@ -1021,15 +1021,6 @@ public class CaptureService extends VpnService implements Runnable { public int blockQuick() { return(mSettings.block_quic ? 1 : 0); } - public int getOwnAppUid() { - AppDescriptor app = AppsResolver.resolve(getPackageManager(), BuildConfig.APPLICATION_ID, 0); - - if(app != null) - return app.getUid(); - - return Utils.UID_NO_FILTER; - } - // returns 1 if dumpPcapData should be called public int pcapDumpEnabled() { return((mSettings.dump_mode != Prefs.DumpMode.NONE) ? 1 : 0); diff --git a/app/src/main/java/com/emanuelef/remote_capture/Utils.java b/app/src/main/java/com/emanuelef/remote_capture/Utils.java index 3d2d631d..47c724fd 100644 --- a/app/src/main/java/com/emanuelef/remote_capture/Utils.java +++ b/app/src/main/java/com/emanuelef/remote_capture/Utils.java @@ -20,6 +20,7 @@ package com.emanuelef.remote_capture; import android.Manifest; +import android.annotation.SuppressLint; import android.app.Activity; import android.app.Dialog; import android.app.PendingIntent; @@ -128,6 +129,7 @@ import javax.net.ssl.HttpsURLConnection; public class Utils { static final String TAG = "Utils"; public static final String INTERACT_ACROSS_USERS = "android.permission.INTERACT_ACROSS_USERS"; + public static final int PER_USER_RANGE = 100000; public static final int UID_UNKNOWN = -1; public static final int UID_NO_FILTER = -2; private static Boolean rootAvailable = null; @@ -1184,7 +1186,21 @@ public class Utils { tv.setMovementMethod(LinkMovementMethod.getInstance()); } - public static boolean rootGrantPermission(String perm) { - return CaptureService.rootCmd("pm", String.format("grant %s %s", BuildConfig.APPLICATION_ID, perm)) == 0; + public static int getPCAPdroidUid(Context context) { + // NOTE: when called from a work profile, it correctly returns the work profile UID + AppDescriptor app = AppsResolver.resolve(context.getPackageManager(), BuildConfig.APPLICATION_ID, 0); + if(app != null) + return app.getUid(); + return Utils.UID_UNKNOWN; + } + + // returns the user ID of a given app uid + public static int getUserId(int uid) { + return uid / PER_USER_RANGE; + } + + @SuppressLint("DefaultLocale") + public static boolean rootGrantPermission(Context context, String perm) { + return CaptureService.rootCmd("pm", String.format("grant --user %d %s %s", getUserId(getPCAPdroidUid(context)), BuildConfig.APPLICATION_ID, perm)) == 0; } }