Improve Androidacy api for config with certificate pinning + minor code changes.

pull/55/head
Fox2Code 2 years ago
parent e565a7018f
commit ef00997ea4

@ -28,6 +28,7 @@
android:theme="@style/Theme.MagiskModuleManager"
android:fullBackupContent="@xml/full_backup_content"
android:dataExtractionRules="@xml/data_extraction_rules"
android:networkSecurityConfig="@xml/network_security_config"
android:usesCleartextTraffic="false"
tools:targetApi="s">
<receiver android:name="com.fox2code.mmm.manager.ModuleBootReceive"

@ -110,7 +110,7 @@ public enum ActionButtonType {
String config = moduleHolder.getMainModuleConfig();
if (config == null) return;
if (config.startsWith("https://www.androidacy.com/")) {
IntentHelper.openUrlAndroidacy(button.getContext(), config, false);
IntentHelper.openUrlAndroidacy(button.getContext(), config, true);
} else {
IntentHelper.openConfig(button.getContext(), config);
}

@ -10,8 +10,13 @@ import com.fox2code.mmm.installer.InstallerInitializer;
import com.fox2code.mmm.manager.LocalModuleInfo;
import com.fox2code.mmm.manager.ModuleInfo;
import com.fox2code.mmm.manager.ModuleManager;
import com.fox2code.mmm.utils.Files;
import com.fox2code.mmm.utils.IntentHelper;
import java.io.File;
import java.io.IOException;
import java.nio.charset.StandardCharsets;
public class AndroidacyWebAPI {
private static final String TAG = "AndroidacyWebAPI";
private final AndroidacyActivity activity;
@ -131,4 +136,33 @@ public class AndroidacyWebAPI {
public void hideActionBar() {
this.activity.hideActionBar();
}
/**
* Return true if the module is an Andoridacy module.
*/
@JavascriptInterface
public boolean isAndroidacyModule(String moduleId) {
LocalModuleInfo localModuleInfo = ModuleManager.getINSTANCE().getModules().get(moduleId);
return localModuleInfo != null && ("Androidacy".equals(localModuleInfo.author) ||
(localModuleInfo.config != null &&
localModuleInfo.config.startsWith("https://www.androidacy.com/")));
}
/**
* get a module file, return an empty string if not
* an Andoridacy module or if file doesn't exists.
*/
@JavascriptInterface
public String getAndroidacyModuleFile(String moduleId, String moduleFile) {
if (!this.isAndroidacyModule(moduleId)) return "";
File moduleFolder = new File("/data/adb/modules/" + moduleId);
File absModuleFile = new File(moduleFolder, moduleFile).getAbsoluteFile();
if (!absModuleFile.getPath().startsWith(moduleFolder.getPath())) return "";
try {
return new String(Files.readSU(absModuleFile
.getAbsoluteFile()), StandardCharsets.UTF_8);
} catch (IOException e) {
return "";
}
}
}

@ -209,14 +209,30 @@ public class InstallerActivity extends CompatActivity {
"sh \"" + installScript.getAbsolutePath() + "\"" +
" /dev/null 1 \"" + file.getAbsolutePath() + "\"")
.to(installerController, installerMonitor);
} else if (MainApplication.isUsingMagiskCommand() || noExtensions) {
installerMonitor = new InstallerMonitor(new File(InstallerInitializer
.peekMagiskPath().equals("/sbin") ? "/sbin/magisk" : "/system/bin/magisk"));
} else {
String installCommand;
File installExecutable;
if (InstallerInitializer.peekMagiskVersion() >=
Constants.MAGISK_VER_CODE_INSTALL_COMMAND &&
(noExtensions || MainApplication.isUsingMagiskCommand())) {
installCommand = "magisk --install-module \"" + file.getAbsolutePath() + "\"";
installExecutable = new File(InstallerInitializer.peekMagiskPath()
.equals("/sbin") ? "/sbin/magisk" : "/system/bin/magisk");
} else {
installExecutable = this.extractInstallScript("module_installer_compat.sh");
if (installExecutable == null) {
this.setInstallStateFinished(false,
"! Failed to extract module install script", "");
return;
}
installCommand = "sh \"" + installExecutable.getAbsolutePath() + "\"" +
" /dev/null 1 \"" + file.getAbsolutePath() + "\"";
}
installerMonitor = new InstallerMonitor(installExecutable);
if (noExtensions) {
installJob = Shell.su( // No Extensions
"cd \"" + this.moduleCache.getAbsolutePath() + "\"",
"magisk --install-module \"" + file.getAbsolutePath() + "\"")
.to(installerController, installerMonitor);
installCommand).to(installerController, installerMonitor);
} else {
installJob = Shell.su("export MMM_EXT_SUPPORT=1",
"export MMM_USER_LANGUAGE=" + (MainApplication.isForceEnglish() ?
@ -225,27 +241,8 @@ public class InstallerActivity extends CompatActivity {
"export MMM_APP_VERSION=" + BuildConfig.VERSION_NAME,
"export MMM_TEXT_WRAP=" + (this.textWrap ? "1" : "0"),
"cd \"" + this.moduleCache.getAbsolutePath() + "\"",
"magisk --install-module \"" + file.getAbsolutePath() + "\"")
.to(installerController, installerMonitor);
}
} else {
File installScript = this.extractInstallScript("module_installer_compat.sh");
if (installScript == null) {
this.setInstallStateFinished(false,
"! Failed to extract module install script", "");
return;
installCommand).to(installerController, installerMonitor);
}
installerMonitor = new InstallerMonitor(installScript);
installJob = Shell.su("export MMM_EXT_SUPPORT=1",
"export MMM_USER_LANGUAGE=" + (MainApplication.isForceEnglish() ?
"en-US" : Resources.getSystem()
.getConfiguration().locale.toLanguageTag()),
"export MMM_APP_VERSION=" + BuildConfig.VERSION_NAME,
"export MMM_TEXT_WRAP=" + (this.textWrap ? "1" : "0"),
"cd \"" + this.moduleCache.getAbsolutePath() + "\"",
"sh \"" + installScript.getAbsolutePath() + "\"" +
" /dev/null 1 \"" + file.getAbsolutePath() + "\"")
.to(installerController, installerMonitor);
}
boolean success = installJob.exec().isSuccess();
// Wait one UI cycle before disabling controller or processing results

@ -0,0 +1,10 @@
<?xml version="1.0" encoding="utf-8"?>
<network-security-config>
<domain-config>
<domain includeSubdomains="true">androidacy.com</domain>
<pin-set expiration="2023-01-02">
<pin digest="SHA-256">V6pbbd2/CCaa1dr+vGnpUrA1xoZ/GgncNuYzD26dikw=</pin>
<pin digest="SHA-256">FEzVOUp4dF3gI0ZVPRJhFbSJVXR+uQmMH65xhs1glH4=</pin>
</pin-set>
</domain-config>
</network-security-config>
Loading…
Cancel
Save