From 5032bc0b15cde6d2c0b13507fae4741fcbe1117f Mon Sep 17 00:00:00 2001 From: LoveSy Date: Sat, 15 May 2021 12:34:27 +0800 Subject: [PATCH] [core] Prefs for modules in non-primary user space (#582) --- .../lspd/service/ILSPApplicationService.aidl | 2 -- .../config/LSPApplicationServiceClient.java | 11 -------- .../lspd/hooker/HandleBindAppHooker.java | 28 +------------------ .../lsposed/lspd/service/ConfigManager.java | 7 +++-- .../lspd/service/LSPApplicationService.java | 8 +----- 5 files changed, 6 insertions(+), 50 deletions(-) diff --git a/core/src/main/aidl/org/lsposed/lspd/service/ILSPApplicationService.aidl b/core/src/main/aidl/org/lsposed/lspd/service/ILSPApplicationService.aidl index 9d2f30e1..a06d2613 100644 --- a/core/src/main/aidl/org/lsposed/lspd/service/ILSPApplicationService.aidl +++ b/core/src/main/aidl/org/lsposed/lspd/service/ILSPApplicationService.aidl @@ -11,7 +11,5 @@ interface ILSPApplicationService { String getPrefsPath(String packageName) = 7; - String getCachePath(String fileName) = 8; - ParcelFileDescriptor getModuleLogger() = 9; } diff --git a/core/src/main/java/org/lsposed/lspd/config/LSPApplicationServiceClient.java b/core/src/main/java/org/lsposed/lspd/config/LSPApplicationServiceClient.java index 56b1a3af..e6650f1a 100644 --- a/core/src/main/java/org/lsposed/lspd/config/LSPApplicationServiceClient.java +++ b/core/src/main/java/org/lsposed/lspd/config/LSPApplicationServiceClient.java @@ -108,17 +108,6 @@ public class LSPApplicationServiceClient implements ILSPApplicationService { return null; } - @Override - public String getCachePath(String fileName) { - try { - if (baseCachePath == null) - baseCachePath = service.getCachePath(""); - return baseCachePath + File.separator + fileName; - } catch (RemoteException | NullPointerException ignored) { - } - return null; - } - @Override public ParcelFileDescriptor getModuleLogger() { try { diff --git a/core/src/main/java/org/lsposed/lspd/hooker/HandleBindAppHooker.java b/core/src/main/java/org/lsposed/lspd/hooker/HandleBindAppHooker.java index 17352000..ecc18d00 100644 --- a/core/src/main/java/org/lsposed/lspd/hooker/HandleBindAppHooker.java +++ b/core/src/main/java/org/lsposed/lspd/hooker/HandleBindAppHooker.java @@ -36,8 +36,6 @@ import org.lsposed.lspd.util.Utils; import java.io.File; import java.io.IOException; -import java.nio.file.Files; -import java.nio.file.Path; import java.util.Map; import de.robv.android.xposed.XC_MethodHook; @@ -84,7 +82,6 @@ public class HandleBindAppHooker extends XC_MethodHook { boolean isModule = moduleBinder != null; int xposedminversion = -1; boolean xposedsharedprefs = false; - boolean xposedmigrateprefs = false; try { if (isModule) { Map metaData = MetaDataReader.getMetaData(new File(appInfo.sourceDir)); @@ -95,7 +92,6 @@ public class HandleBindAppHooker extends XC_MethodHook { xposedminversion = MetaDataReader.extractIntPart((String) minVersionRaw); } xposedsharedprefs = metaData.containsKey("xposedsharedprefs"); - xposedmigrateprefs = metaData.containsKey("xposedmigrateprefs"); } } catch (NumberFormatException | IOException e) { Hookers.logE("ApkParser fails", e); @@ -113,32 +109,10 @@ public class HandleBindAppHooker extends XC_MethodHook { } } }); - final boolean migratePrefs = xposedmigrateprefs; XposedHelpers.findAndHookMethod(ContextImpl.class, "getPreferencesDir", new XC_MethodHook() { @Override protected void afterHookedMethod(MethodHookParam param) { - File newDir = new File(serviceClient.getPrefsPath(appInfo.packageName)); - if (migratePrefs) { - File oldDir = (File) param.getResult(); - for (File oldFile : oldDir.listFiles()) { - Path oldPath = oldFile.toPath(); - if (!Files.isSymbolicLink(oldPath)) { - Utils.logD("Migrating prefs file: " + oldFile.getAbsolutePath()); - Path newPath = new File(newDir, oldFile.getName()).toPath(); - try { - Files.move(oldPath, newPath); - try { - Files.createSymbolicLink(oldPath, newPath); - } catch (IOException e) { - Utils.logD("Symlink creation failed", e); - } - } catch (IOException e) { - Utils.logD("File move operation failed", e); - } - } - } - } - param.setResult(newDir); + param.setResult(new File(serviceClient.getPrefsPath(appInfo.packageName))); } }); } diff --git a/core/src/main/java/org/lsposed/lspd/service/ConfigManager.java b/core/src/main/java/org/lsposed/lspd/service/ConfigManager.java index 03dcda4f..4b6c1fe1 100644 --- a/core/src/main/java/org/lsposed/lspd/service/ConfigManager.java +++ b/core/src/main/java/org/lsposed/lspd/service/ConfigManager.java @@ -620,8 +620,9 @@ public class ConfigManager { return miscPath + File.separator + "cache" + File.separator + fileName; } - public String getPrefsPath(String fileName) { - return miscPath + File.separator + "prefs" + File.separator + fileName; + public String getPrefsPath(String fileName, int uid) { + int userId = uid % PER_USER_RANGE; + return miscPath + File.separator + "prefs" + (userId == 0 ? "" : String.valueOf(userId)) + File.separator + fileName + File.separator; } public static void grantManagerPermission() { @@ -651,7 +652,7 @@ public class ConfigManager { public boolean ensureModulePrefsPermission(int uid) { String packageName = cachedModule.get(uid); if (packageName == null) return false; - File path = new File(getPrefsPath(packageName)); + File path = new File(getPrefsPath(packageName, uid)); try { if (path.exists() && !path.isDirectory()) path.delete(); if (!path.exists()) Files.createDirectories(path.toPath()); diff --git a/core/src/main/java/org/lsposed/lspd/service/LSPApplicationService.java b/core/src/main/java/org/lsposed/lspd/service/LSPApplicationService.java index ac5636db..0aac5951 100644 --- a/core/src/main/java/org/lsposed/lspd/service/LSPApplicationService.java +++ b/core/src/main/java/org/lsposed/lspd/service/LSPApplicationService.java @@ -79,13 +79,7 @@ public class LSPApplicationService extends ILSPApplicationService.Stub { @Override public String getPrefsPath(String packageName) throws RemoteException { ensureRegistered(); - return ConfigManager.getInstance().getPrefsPath(packageName); - } - - @Override - public String getCachePath(String fileName) throws RemoteException { - ensureRegistered(); - return ConfigManager.getInstance().getCachePath(fileName); + return ConfigManager.getInstance().getPrefsPath(packageName, Binder.getCallingUid()); } @Override