From 4d334e9d524a85d88c7a4bcd7eb85777d91064ee Mon Sep 17 00:00:00 2001 From: LoveSy Date: Thu, 18 Feb 2021 04:40:30 +0800 Subject: [PATCH] [core] Grant manager permission --- .../github/lsposed/lspd/nativebridge/ModuleLogger.java | 2 +- .../io/github/lsposed/lspd/service/ConfigManager.java | 9 +++++++++ .../io/github/lsposed/lspd/service/LSPosedService.java | 8 ++++++++ .../io/github/lsposed/lspd/service/PackageService.java | 5 +++++ .../io/github/lsposed/lspd/service/ServiceManager.java | 6 ++++++ 5 files changed, 29 insertions(+), 1 deletion(-) diff --git a/core/src/main/java/io/github/lsposed/lspd/nativebridge/ModuleLogger.java b/core/src/main/java/io/github/lsposed/lspd/nativebridge/ModuleLogger.java index e513aa20..8f53c0f6 100644 --- a/core/src/main/java/io/github/lsposed/lspd/nativebridge/ModuleLogger.java +++ b/core/src/main/java/io/github/lsposed/lspd/nativebridge/ModuleLogger.java @@ -36,7 +36,7 @@ public class ModuleLogger { public static void initLogger(ParcelFileDescriptor fileDescriptor) { if (fd == -1 && fileDescriptor!= null) { - fd = fileDescriptor.getFd(); + fd = fileDescriptor.detachFd(); } } diff --git a/core/src/main/java/io/github/lsposed/lspd/service/ConfigManager.java b/core/src/main/java/io/github/lsposed/lspd/service/ConfigManager.java index ffeac01b..177c6c1a 100644 --- a/core/src/main/java/io/github/lsposed/lspd/service/ConfigManager.java +++ b/core/src/main/java/io/github/lsposed/lspd/service/ConfigManager.java @@ -126,6 +126,7 @@ public class ConfigManager { public synchronized void updateManager(@NonNull String packageName) { writeText(managerPath, packageName); + manager = packageName; updateManager(); } @@ -411,4 +412,12 @@ public class ConfigManager { public String getPrefsPath(String fileName) { return miscPath + File.separator + "prefs" + File.separator + fileName; } + + public void grantManagerPermission() { + try { + PackageService.grantRuntimePermission(manager, "android.permission.INTERACT_ACROSS_USERS", 0); + } catch (RemoteException e) { + Log.e(TAG, Log.getStackTraceString(e)); + } + } } diff --git a/core/src/main/java/io/github/lsposed/lspd/service/LSPosedService.java b/core/src/main/java/io/github/lsposed/lspd/service/LSPosedService.java index 510e907b..4f4ecee8 100644 --- a/core/src/main/java/io/github/lsposed/lspd/service/LSPosedService.java +++ b/core/src/main/java/io/github/lsposed/lspd/service/LSPosedService.java @@ -37,6 +37,7 @@ public class LSPosedService extends ILSPosedService.Stub { String packageName = (uri != null) ? uri.getSchemeSpecificPart() : null; if (packageName == null) { Log.e(TAG, "Package name is null"); + return; } int uid = intent.getIntExtra(Intent.EXTRA_UID, -1); boolean replacing = intent.getBooleanExtra(Intent.EXTRA_REPLACING, false); @@ -51,6 +52,13 @@ public class LSPosedService extends ILSPosedService.Stub { if (isXposedModule) { ConfigManager.getInstance().updateModuleApkPath(packageName, pkgInfo.applicationInfo.sourceDir); } + if (!intent.getAction().equals(Intent.ACTION_PACKAGE_REMOVED) && uid > 0 && ConfigManager.getInstance().isManager(packageName)) { + try { + ConfigManager.getInstance().grantManagerPermission(); + } catch (Throwable e) { + Log.e(TAG, Log.getStackTraceString(e)); + } + } } } diff --git a/core/src/main/java/io/github/lsposed/lspd/service/PackageService.java b/core/src/main/java/io/github/lsposed/lspd/service/PackageService.java index c064ce1d..85b69e7f 100644 --- a/core/src/main/java/io/github/lsposed/lspd/service/PackageService.java +++ b/core/src/main/java/io/github/lsposed/lspd/service/PackageService.java @@ -43,4 +43,9 @@ public class PackageService { } return new ParceledListSlice<>(res); } + + public static void grantRuntimePermission(String packageName, String permissionName, int userId) throws RemoteException { + IPackageManager pm = getPackageManager(); + pm.grantRuntimePermission(packageName, permissionName, userId); + } } diff --git a/core/src/main/java/io/github/lsposed/lspd/service/ServiceManager.java b/core/src/main/java/io/github/lsposed/lspd/service/ServiceManager.java index 1e009314..077d1beb 100644 --- a/core/src/main/java/io/github/lsposed/lspd/service/ServiceManager.java +++ b/core/src/main/java/io/github/lsposed/lspd/service/ServiceManager.java @@ -55,6 +55,12 @@ public class ServiceManager { } }); + try { + ConfigManager.getInstance().grantManagerPermission(); + } catch (Throwable e) { + Log.e(TAG, Log.getStackTraceString(e)); + } + Looper.loop(); Log.i(TAG, "server exited");