package com.fox2code.mmm.androidacy; import android.net.Uri; import androidx.annotation.NonNull; import androidx.annotation.Nullable; import com.fox2code.mmm.BuildConfig; public enum AndroidacyUtil { ; public static final String REFERRER = "utm_source=FoxMMM&utm_medium=app"; public static boolean isAndroidacyLink(@Nullable Uri uri) { return uri != null && isAndroidacyLink(uri.toString(), uri); } public static boolean isAndroidacyLink(@Nullable String url) { return url != null && isAndroidacyLink(url, Uri.parse(url)); } static boolean isAndroidacyLink(@NonNull String url, @NonNull Uri uri) { int i; // Check both string and Uri to mitigate parse exploit return url.startsWith("https://") && (i = url.indexOf("/", 8)) != -1 && url.substring(8, i).endsWith("api.androidacy.com") && uri.getHost().endsWith("api.androidacy.com"); } public static boolean isAndroidacyFileUrl(@Nullable String url) { if (url == null) return false; for (String prefix : new String[]{"https://production-api.androidacy.com/magisk/file/", "https://staging-api.androidacy.com/magisk/file/"}) { // Make both staging and non staging act the same if (url.startsWith(prefix)) return true; } return false; } // Avoid logging token public static String hideToken(@NonNull String url) { int i = url.lastIndexOf("token="); if (i == -1) return url; int i2 = url.indexOf('&', i); int i3 = url.indexOf(' ', i); if (i3 != -1 && i3 < i2) i2 = i3; if (i2 == -1) { return url.substring(0, i + 6) + ""; } else { return url.substring(0, i + 6) + "" + url.substring(i2); } } public static String getModuleId(String moduleUrl) { // Get the &module= part int i = moduleUrl.indexOf("&module="); String moduleId; // Match until next & or end if (i != -1) { int j = moduleUrl.indexOf('&', i + 1); if (j == -1) { moduleId = moduleUrl.substring(i + 8); } else { moduleId = moduleUrl.substring(i + 8, j); } // URL decode moduleId = Uri.decode(moduleId); // Strip non alphanumeric moduleId = moduleId.replaceAll("[^a-zA-Z\\d]", ""); return moduleId; } if (BuildConfig.DEBUG) { throw new IllegalArgumentException("Invalid module url: " + moduleUrl); } return null; } public static String getModuleTitle(String moduleUrl) { // Get the &title= part int i = moduleUrl.indexOf("&moduleTitle="); // Match until next & or end if (i != -1) { int j = moduleUrl.indexOf('&', i + 1); if (j == -1) { return Uri.decode(moduleUrl.substring(i + 13)); } else { return Uri.decode(moduleUrl.substring(i + 13, j)); } } return null; } public static String getChecksumFromURL(String moduleUrl) { // Get the &version= part int i = moduleUrl.indexOf("&checksum="); // Match until next & or end if (i != -1) { int j = moduleUrl.indexOf('&', i + 1); if (j == -1) { return moduleUrl.substring(i + 10); } else { return moduleUrl.substring(i + 10, j); } } return null; } }