From a7ed6c15d33d4e55d016df9ed9af79829fa18c9d Mon Sep 17 00:00:00 2001 From: topjohnwu Date: Wed, 20 Dec 2017 12:14:46 +0800 Subject: [PATCH] More precise sudb management --- build.gradle | 2 +- src/main/assets/changelog.md | 3 +- .../com/topjohnwu/magisk/MagiskManager.java | 13 ++------ .../com/topjohnwu/magisk/SplashActivity.java | 6 ++-- .../magisk/database/SuDatabaseHelper.java | 32 +++++++++++++------ .../com/topjohnwu/magisk/utils/ShowUI.java | 1 - .../com/topjohnwu/magisk/utils/Utils.java | 6 ++-- src/main/res/values-el/strings.xml | 1 - 8 files changed, 33 insertions(+), 31 deletions(-) diff --git a/build.gradle b/build.gradle index fad26e0cc..df7474948 100644 --- a/build.gradle +++ b/build.gradle @@ -8,7 +8,7 @@ android { applicationId "com.topjohnwu.magisk" minSdkVersion 21 targetSdkVersion 27 - versionCode 74 + versionCode 75 versionName "5.4.3" ndk { moduleName 'zipadjust' diff --git a/src/main/assets/changelog.md b/src/main/assets/changelog.md index b94da241e..f4dff6541 100644 --- a/src/main/assets/changelog.md +++ b/src/main/assets/changelog.md @@ -1,4 +1,4 @@ -### v5.4.3 (74) +### v5.4.3 (75) - Fix dynamic resource loading, should prevent crashing when checking SafetyNet - Update SignAPK to use very little RAM, should expand old device support - Support settings migration after hiding Magisk Manager @@ -7,3 +7,4 @@ - Add dark theme to superuser requests - Properly handle new `KEEPVERITY` and `HIGHCOMP` flags for installation - Adapt su database to `/data/adb/magisk.adb` and installation paths to `/data/adb` +- Massive improvements for repackaging Magisk Manager diff --git a/src/main/java/com/topjohnwu/magisk/MagiskManager.java b/src/main/java/com/topjohnwu/magisk/MagiskManager.java index 698c94101..c8940648e 100644 --- a/src/main/java/com/topjohnwu/magisk/MagiskManager.java +++ b/src/main/java/com/topjohnwu/magisk/MagiskManager.java @@ -106,16 +106,7 @@ public class MagiskManager extends Application { } catch (PackageManager.NameNotFoundException ignored) { /* Expected */ } } - suDB = new SuDatabaseHelper(true); - - if (getPackageName().equals(Const.ORIG_PKG_NAME)) { - String pkg = suDB.getStrings(Const.Key.SU_REQUESTER, null); - if (pkg != null) { - Utils.uninstallPkg(pkg); - suDB.setStrings(Const.Key.SU_REQUESTER, null); - } - } - + suDB = new SuDatabaseHelper(false); repoDB = new RepoDatabaseHelper(this); defaultLocale = Locale.getDefault(); setLocale(); @@ -212,7 +203,7 @@ public class MagiskManager extends Application { keepEnc = false; } - if (suDB != null) { + if (suDB != null && !SuDatabaseHelper.verified) { suDB.close(); suDB = new SuDatabaseHelper(); } diff --git a/src/main/java/com/topjohnwu/magisk/SplashActivity.java b/src/main/java/com/topjohnwu/magisk/SplashActivity.java index 34d203a27..c8f304abd 100644 --- a/src/main/java/com/topjohnwu/magisk/SplashActivity.java +++ b/src/main/java/com/topjohnwu/magisk/SplashActivity.java @@ -35,6 +35,9 @@ public class SplashActivity extends Activity { MagiskManager mm = getMagiskManager(); + mm.loadMagiskInfo(); + Utils.loadPrefs(); + // Dynamic detect all locales new LoadLocale().exec(); @@ -45,9 +48,6 @@ public class SplashActivity extends Activity { getSystemService(NotificationManager.class).createNotificationChannel(channel); } - mm.loadMagiskInfo(); - Utils.loadPrefs(); - LoadModules loadModuleTask = new LoadModules(); if (Utils.checkNetworkStatus()) { diff --git a/src/main/java/com/topjohnwu/magisk/database/SuDatabaseHelper.java b/src/main/java/com/topjohnwu/magisk/database/SuDatabaseHelper.java index ab3e618c5..ed040e288 100644 --- a/src/main/java/com/topjohnwu/magisk/database/SuDatabaseHelper.java +++ b/src/main/java/com/topjohnwu/magisk/database/SuDatabaseHelper.java @@ -29,6 +29,7 @@ import java.util.List; public class SuDatabaseHelper extends SQLiteOpenHelper { public static final String DB_NAME = "su.db"; + public static boolean verified = false; private static final int DATABASE_VER = 5; private static final String POLICY_TABLE = "policies"; @@ -41,7 +42,7 @@ public class SuDatabaseHelper extends SQLiteOpenHelper { private PackageManager pm; private SQLiteDatabase mDb; - private static Context initDB(boolean local) { + private static Context initDB(boolean verify) { Context context; MagiskManager ce = MagiskManager.get(); if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) { @@ -61,46 +62,49 @@ public class SuDatabaseHelper extends SQLiteOpenHelper { } File db = Utils.getDatabasePath(context, DB_NAME); - if (local && db.length() == 0) { + if (!verify && db.length() == 0) { ce.loadMagiskInfo(); - return initDB(false); + return initDB(true); } // Only care about local db (no shell involved) - if (local) + if (!verify) return context; // We need to make sure the global db is setup properly if (ce.magiskVersionCode >= 1464 && Shell.rootAccess()) { - Shell.su_raw(Utils.fmt("mkdir %s; chmod 700 %s", GLOBAL_DB.getParent(), GLOBAL_DB.getParent())); + Shell.su(Utils.fmt("mkdir %s 2>/dev/null; chmod 700 %s", GLOBAL_DB.getParent(), GLOBAL_DB.getParent())); if (!Utils.itemExist(GLOBAL_DB)) { db = context.getDatabasePath(DB_NAME); Shell.su(Utils.fmt("cp -af %s %s; rm -f %s*", db, GLOBAL_DB, db)); } try { + db.getParentFile().mkdirs(); db.createNewFile(); } catch (IOException e) { e.printStackTrace(); } - // Make sure the global and local db matches - if (!TextUtils.equals(Utils.checkMD5(GLOBAL_DB), Utils.checkMD5(db))) { + // Make sure the global and local db is the same inode + verified = TextUtils.equals(Utils.checkInode(GLOBAL_DB), Utils.checkInode(db)); + if (!verified) { Shell.su(Utils.fmt( "chown 0.0 %s; chmod 666 %s; chcon u:object_r:su_file:s0 %s;" + "mount -o bind %s %s", GLOBAL_DB, GLOBAL_DB, GLOBAL_DB, GLOBAL_DB, db)); + verified = TextUtils.equals(Utils.checkInode(GLOBAL_DB), Utils.checkInode(db)); } } return context; } public SuDatabaseHelper() { - this(false); + this(true); } - public SuDatabaseHelper(boolean local) { - this(initDB(local)); + public SuDatabaseHelper(boolean verify) { + this(initDB(verify)); } private SuDatabaseHelper(Context context) { @@ -109,6 +113,14 @@ public class SuDatabaseHelper extends SQLiteOpenHelper { pm = context.getPackageManager(); mDb = getWritableDatabase(); cleanup(); + + if (context.getPackageName().equals(Const.ORIG_PKG_NAME)) { + String pkg = getStrings(Const.Key.SU_REQUESTER, null); + if (pkg != null) { + Utils.uninstallPkg(pkg); + setStrings(Const.Key.SU_REQUESTER, null); + } + } } @Override diff --git a/src/main/java/com/topjohnwu/magisk/utils/ShowUI.java b/src/main/java/com/topjohnwu/magisk/utils/ShowUI.java index ec89fddb2..76b881134 100644 --- a/src/main/java/com/topjohnwu/magisk/utils/ShowUI.java +++ b/src/main/java/com/topjohnwu/magisk/utils/ShowUI.java @@ -239,7 +239,6 @@ public class ShowUI { Utils.fmt("MagiskManager-v%s.apk", mm.remoteManagerVersionString))) .setCancelable(true) .setPositiveButton(R.string.install, (d, i) -> { - Utils.dumpPrefs(); Utils.runWithPermission(activity, Manifest.permission.WRITE_EXTERNAL_STORAGE, () -> { Intent intent = new Intent(mm, ManagerUpdate.class); intent.putExtra(Const.Key.INTENT_SET_LINK, mm.managerLink); diff --git a/src/main/java/com/topjohnwu/magisk/utils/Utils.java b/src/main/java/com/topjohnwu/magisk/utils/Utils.java index 6f6915080..3a8bd0c8d 100644 --- a/src/main/java/com/topjohnwu/magisk/utils/Utils.java +++ b/src/main/java/com/topjohnwu/magisk/utils/Utils.java @@ -62,9 +62,9 @@ public class Utils { return Shell.su(fmt("cat %s | sed '$a\\ ' | sed '$d'", path)); } - public static String checkMD5(Object path) { - List ret = Shell.su(fmt("md5sum %s", path)); - return isValidShellResponse(ret) ? ret.get(0).split("\\s+")[0] : null; + public static String checkInode(Object path) { + List ret = Shell.su(fmt("ls -i %s", path)); + return isValidShellResponse(ret) ? ret.get(0).trim().split("\\s+")[0] : null; } public static void uninstallPkg(String pkg) { diff --git a/src/main/res/values-el/strings.xml b/src/main/res/values-el/strings.xml index f8d92a3bb..68ad4beab 100644 --- a/src/main/res/values-el/strings.xml +++ b/src/main/res/values-el/strings.xml @@ -1,6 +1,5 @@ - Απόκρυψη του Magisk Modules Λήψεις