Skip to content
This repository was archived by the owner on May 4, 2023. It is now read-only.

Commit ded15c0

Browse files
committed
Try fixing staging Androidacy. (And fail)
1 parent c63f0b7 commit ded15c0

File tree

12 files changed

+157
-44
lines changed

12 files changed

+157
-44
lines changed

app/src/main/java/com/fox2code/mmm/MainActivity.java

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,6 @@
1616
import androidx.annotation.NonNull;
1717
import androidx.appcompat.widget.SearchView;
1818
import androidx.cardview.widget.CardView;
19-
import androidx.core.app.NotificationManagerCompat;
2019
import androidx.core.graphics.ColorUtils;
2120
import androidx.recyclerview.widget.LinearLayoutManager;
2221
import androidx.recyclerview.widget.RecyclerView;

app/src/main/java/com/fox2code/mmm/MainApplication.java

Lines changed: 0 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -17,16 +17,10 @@
1717
import androidx.emoji2.text.DefaultEmojiCompatConfig;
1818
import androidx.emoji2.text.EmojiCompat;
1919
import androidx.emoji2.text.FontRequestEmojiCompatConfig;
20-
import androidx.work.Constraints;
21-
import androidx.work.ExistingPeriodicWorkPolicy;
22-
import androidx.work.NetworkType;
23-
import androidx.work.PeriodicWorkRequest;
24-
import androidx.work.WorkManager;
2520

2621
import com.fox2code.foxcompat.FoxActivity;
2722
import com.fox2code.foxcompat.FoxApplication;
2823
import com.fox2code.foxcompat.FoxThemeWrapper;
29-
import com.fox2code.mmm.background.BackgroundUpdateChecker;
3024
import com.fox2code.mmm.installer.InstallerInitializer;
3125
import com.fox2code.mmm.utils.GMSProviderInstaller;
3226
import com.fox2code.mmm.utils.Http;
@@ -37,7 +31,6 @@
3731
import java.util.Date;
3832
import java.util.Locale;
3933
import java.util.Random;
40-
import java.util.concurrent.TimeUnit;
4134

4235
import io.noties.markwon.Markwon;
4336
import io.noties.markwon.html.HtmlPlugin;

app/src/main/java/com/fox2code/mmm/XHooks.java

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,6 @@
88
import androidx.annotation.Keep;
99

1010
import com.fox2code.mmm.manager.ModuleManager;
11-
import com.fox2code.mmm.repo.RepoData;
1211
import com.fox2code.mmm.repo.RepoManager;
1312

1413
/**

app/src/main/java/com/fox2code/mmm/androidacy/AndroidacyActivity.java

Lines changed: 79 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -31,9 +31,14 @@
3131
import com.fox2code.mmm.MainApplication;
3232
import com.fox2code.mmm.R;
3333
import com.fox2code.mmm.XHooks;
34+
import com.fox2code.mmm.repo.RepoManager;
3435
import com.fox2code.mmm.utils.Http;
3536
import com.fox2code.mmm.utils.IntentHelper;
3637

38+
import org.json.JSONException;
39+
import org.json.JSONObject;
40+
41+
import java.io.IOException;
3742
import java.util.HashMap;
3843

3944
/**
@@ -134,6 +139,8 @@ public boolean shouldOverrideUrlLoading(
134139
// Don't open non Androidacy urls inside WebView
135140
if (request.isForMainFrame() &&
136141
!AndroidacyUtil.isAndroidacyLink(request.getUrl())) {
142+
Log.i(TAG, "Exiting WebView " + // hideToken in case isAndroidacyLink fail.
143+
AndroidacyUtil.hideToken(request.getUrl().toString()));
137144
IntentHelper.openUri(view.getContext(), request.getUrl().toString());
138145
return true;
139146
}
@@ -152,6 +159,7 @@ public void onPageFinished(WebView view, String url) {
152159

153160
private void onReceivedError(String url, int errorCode) {
154161
if ((url.startsWith("https://api.androidacy.com/magisk/") ||
162+
url.startsWith("https://staging-api.androidacy.com/magisk/") ||
155163
url.equals(pageUrl)) && (errorCode == 419 || errorCode == 429 || errorCode == 503)) {
156164
Toast.makeText(AndroidacyActivity.this,
157165
"Too many requests!", Toast.LENGTH_LONG).show();
@@ -188,38 +196,89 @@ public boolean onShowFileChooser(WebView webView, ValueCallback<Uri[]> filePathC
188196

189197
@Override
190198
public boolean onConsoleMessage(ConsoleMessage consoleMessage) {
191-
switch (consoleMessage.messageLevel()) {
192-
case TIP:
193-
Log.v(TAG, consoleMessage.message());
194-
break;
195-
case LOG:
196-
Log.i(TAG, consoleMessage.message());
197-
break;
198-
case WARNING:
199-
Log.w(TAG, consoleMessage.message());
200-
break;
201-
case ERROR:
202-
Log.e(TAG, consoleMessage.message());
203-
break;
204-
case DEBUG:
205-
Log.d(TAG, consoleMessage.message());
206-
break;
199+
if (BuildConfig.DEBUG) {
200+
switch (consoleMessage.messageLevel()) {
201+
case TIP:
202+
Log.v(TAG, consoleMessage.message());
203+
break;
204+
case LOG:
205+
Log.i(TAG, consoleMessage.message());
206+
break;
207+
case WARNING:
208+
Log.w(TAG, consoleMessage.message());
209+
break;
210+
case ERROR:
211+
Log.e(TAG, consoleMessage.message());
212+
break;
213+
case DEBUG:
214+
Log.d(TAG, consoleMessage.message());
215+
break;
216+
}
207217
}
208218
return super.onConsoleMessage(consoleMessage);
209219
}
210220
});
211221
this.webView.setDownloadListener((
212222
downloadUrl, userAgent, contentDisposition, mimetype, contentLength) -> {
213-
if (AndroidacyUtil.isAndroidacyLink(downloadUrl)) {
223+
if (AndroidacyUtil.isAndroidacyLink(downloadUrl) && !this.backOnResume) {
214224
AndroidacyWebAPI androidacyWebAPI = this.androidacyWebAPI;
215225
if (androidacyWebAPI != null) {
216-
if (androidacyWebAPI.consumedAction && !androidacyWebAPI.downloadMode) {
217-
return; // Native module popup may cause download after consumed action
226+
if (!androidacyWebAPI.downloadMode) {
227+
if (androidacyWebAPI.consumedAction)
228+
return; // Native module popup may cause download after consumed action
229+
int lenPrefix = 0;
230+
// Workaround WebView/Chromium bug
231+
for (String prefix : new String[]{
232+
"https://api.androidacy.com/magisk/download/",
233+
"https://staging-api.androidacy.com/magisk/download/"
234+
}) { // Make both staging and non staging act the same
235+
if (downloadUrl.startsWith(prefix)) lenPrefix = prefix.length();
236+
}
237+
if (lenPrefix != 0) {
238+
final String moduleId = downloadUrl.substring(lenPrefix);
239+
webView.evaluateJavascript("document.querySelector(" +
240+
"\"#download-form input[name=_token]\").value",
241+
result -> new Thread("Androidacy popup workaround thread") {
242+
@Override
243+
public void run() {
244+
if (androidacyWebAPI.consumedAction) return;
245+
try {
246+
JSONObject jsonObject = new JSONObject();
247+
jsonObject.put("moduleId", moduleId);
248+
jsonObject.put("token", RepoManager.getINSTANCE()
249+
.getAndroidacyRepoData().getToken());
250+
jsonObject.put("_token", result);
251+
String realUrl = Http.doHttpPostRedirect(downloadUrl,
252+
jsonObject.toString(), true);
253+
if (downloadUrl.equals(realUrl)) {
254+
Log.e(TAG, "Failed to resolve URL");
255+
return;
256+
}
257+
Log.i(TAG, "Got url: " + realUrl);
258+
androidacyWebAPI.openNativeModuleDialogRaw(realUrl,
259+
moduleId, "", androidacyWebAPI.canInstall());
260+
} catch (IOException | JSONException e) {
261+
Log.e(TAG, "Failed redirect intercept", e);
262+
}
263+
}
264+
}.start());
265+
return;
266+
}
218267
}
219268
androidacyWebAPI.consumedAction = true;
220269
androidacyWebAPI.downloadMode = false;
221-
} else if (this.backOnResume) return;
270+
}
222271
this.backOnResume = true;
272+
Log.i(TAG, "Exiting WebView " +
273+
AndroidacyUtil.hideToken(downloadUrl));
274+
for (String prefix : new String[]{
275+
"https://api.androidacy.com/magisk/download/",
276+
"https://staging-api.androidacy.com/magisk/download/"
277+
}) {
278+
if (downloadUrl.startsWith(prefix)) {
279+
return;
280+
}
281+
}
223282
IntentHelper.openCustomTab(this, downloadUrl);
224283
}
225284
});

app/src/main/java/com/fox2code/mmm/androidacy/AndroidacyRepoData.java

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@
2929
import okhttp3.HttpUrl;
3030

3131
@SuppressWarnings("KotlinInternalInJava")
32-
public class AndroidacyRepoData extends RepoData {
32+
public final class AndroidacyRepoData extends RepoData {
3333
private static final String TAG = "AndroidacyRepoData";
3434
private static final HttpUrl OK_HTTP_URL;
3535
static {
@@ -284,6 +284,10 @@ private String injectToken(String url) {
284284
// Do not inject token for non Androidacy urls
285285
if (!AndroidacyUtil.isAndroidacyLink(url))
286286
return url;
287+
if (this.testMode && url.startsWith("https://api.androidacy.com/")) {
288+
Log.e(TAG, "Got non test mode url: " + AndroidacyUtil.hideToken(url));
289+
url = "https://staging-api.androidacy.com/" + url.substring(27);
290+
}
287291
String token = "token=" + this.token;
288292
if (!url.contains(token)) {
289293
if (url.lastIndexOf('/') < url.lastIndexOf('?')) {
@@ -300,4 +304,8 @@ private String injectToken(String url) {
300304
public String getName() {
301305
return this.testMode ? super.getName() + " (Test Mode)" : super.getName();
302306
}
307+
308+
String getToken() {
309+
return this.token;
310+
}
303311
}

app/src/main/java/com/fox2code/mmm/androidacy/AndroidacyUtil.java

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,4 +23,18 @@ static boolean isAndroidacyLink(@NonNull String url,@NonNull Uri uri) {
2323
url.substring(8, i).endsWith(".androidacy.com") &&
2424
uri.getHost().endsWith(".androidacy.com");
2525
}
26+
27+
// Avoid logging token
28+
public static String hideToken(@NonNull String url) {
29+
int i = url.lastIndexOf("token=");
30+
if (i == -1) return url;
31+
int i2 = url.indexOf('&', i);
32+
if (i2 == -1) {
33+
return url.substring(0, i + 6) +
34+
"<token>";
35+
} else {
36+
return url.substring(0, i + 6) +
37+
"<token>" + url.substring(i2);
38+
}
39+
}
2640
}

app/src/main/java/com/fox2code/mmm/androidacy/AndroidacyWebAPI.java

Lines changed: 16 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,8 @@
3737

3838
@Keep
3939
public class AndroidacyWebAPI {
40+
public static final int COMPAT_UNSUPPORTED = 0;
41+
public static final int COMPAT_DOWNLOAD = 1;
4042
private static final String TAG = "AndroidacyWebAPI";
4143
private static final int MAX_COMPAT_MODE = 1;
4244
private final AndroidacyActivity activity;
@@ -46,6 +48,8 @@ public class AndroidacyWebAPI {
4648
boolean downloadMode;
4749
int effectiveCompatMode;
4850
int notifiedCompatMode;
51+
String nonceToken;
52+
Runnable nonceTask;
4953

5054
public AndroidacyWebAPI(AndroidacyActivity activity, boolean allowInstall) {
5155
this.activity = activity;
@@ -505,15 +509,25 @@ public String getMonetColor(String id) {
505509
}
506510
}
507511

512+
@JavascriptInterface
513+
public void setNonceToken(String nonceToken) {
514+
this.nonceToken = nonceToken;
515+
Runnable nonceTask = this.nonceTask;
516+
if (nonceTask != null) {
517+
this.nonceTask = null;
518+
nonceTask.run();
519+
}
520+
}
521+
508522
// Androidacy feature level declaration method
509523

510524
@JavascriptInterface
511525
public void notifyCompatUnsupported() {
512-
this.notifyCompatModeRaw(0);
526+
this.notifyCompatModeRaw(COMPAT_UNSUPPORTED);
513527
}
514528

515529
@JavascriptInterface
516530
public void notifyCompatDownloadButton() {
517-
this.notifyCompatModeRaw(1);
531+
this.notifyCompatModeRaw(COMPAT_DOWNLOAD);
518532
}
519533
}

app/src/main/java/com/fox2code/mmm/repo/CustomRepoData.java

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,6 @@
1010
import java.io.File;
1111
import java.io.IOException;
1212
import java.nio.charset.StandardCharsets;
13-
import java.util.List;
1413

1514
public final class CustomRepoData extends RepoData {
1615
boolean loadedExternal;

app/src/main/java/com/fox2code/mmm/repo/RepoData.java

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -47,10 +47,9 @@ protected RepoData(String url, File cacheRoot, SharedPreferences cachedPreferenc
4747
this.cachedPreferences = cachedPreferences;
4848
this.metaDataCache = new File(cacheRoot, "modules.json");
4949
this.moduleHashMap = new HashMap<>();
50-
this.name = this.url; // Set url as default name
50+
this.defaultName = url; // Set url as default name
5151
this.enabled = !this.isLimited() && MainApplication.getSharedPreferences()
5252
.getBoolean("pref_" + this.id + "_enabled", this.isEnabledByDefault());
53-
this.defaultName = url;
5453
this.defaultWebsite = "https://" + Uri.parse(url).getHost() + "/";
5554
if (!this.cacheRoot.isDirectory()) {
5655
this.cacheRoot.mkdirs();

app/src/main/java/com/fox2code/mmm/repo/RepoManager.java

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,6 @@
44
import android.content.SharedPreferences;
55
import android.util.Log;
66

7-
import com.fox2code.mmm.MainActivity;
87
import com.fox2code.mmm.MainApplication;
98
import com.fox2code.mmm.XHooks;
109
import com.fox2code.mmm.androidacy.AndroidacyRepoData;
@@ -92,7 +91,11 @@ private RepoManager(MainApplication mainApplication) {
9291
this.androidacyRepoData = this.addAndroidacyRepoData();
9392
this.customRepoManager = new CustomRepoManager(mainApplication, this);
9493
// Populate default cache
94+
boolean x = false;
9595
for (RepoData repoData:this.repoData.values()) {
96+
if (repoData == this.androidacyRepoData) {
97+
if (x) return; x = true;
98+
}
9699
this.populateDefaultCache(repoData);
97100
}
98101
this.initialized = true;
@@ -319,12 +322,12 @@ private RepoData addRepoData(String url, String fallBackName) {
319322
new CustomRepoData(url, cacheRoot, sharedPreferences) :
320323
new RepoData(url, cacheRoot, sharedPreferences);
321324
if (fallBackName != null && !fallBackName.isEmpty()) {
325+
repoData.defaultName = fallBackName;
322326
if (repoData instanceof CustomRepoData) {
323327
((CustomRepoData) repoData).loadedExternal = true;
324328
this.customRepoManager.dirty = true;
325329
repoData.updateEnabledState();
326330
}
327-
repoData.defaultName = fallBackName;
328331
}
329332
switch (url) {
330333
case MAGISK_REPO:

0 commit comments

Comments
 (0)