package com.fox2code.mmm.androidacy; import android.net.Uri; import androidx.annotation.NonNull; import androidx.annotation.Nullable; import com.fox2code.mmm.BuildConfig; import java.util.Objects; 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") && Objects.requireNonNull(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/downloads/", "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) { // for token, device_id, and client_id, replace with by using replaceAll to match until the next non-alphanumeric character or end // Also, URL decode url = Uri.decode(url); url = url + "&"; url = url.replaceAll("token=[^&]*", "token="); url = url.replaceAll("device_id=[^&]*", "device_id="); url = url.replaceAll("client_id=[^&]*", "client_id="); // remove last & added at the end url = url.substring(0, url.length() - 1); return url; } 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; } }