From 0faebbc1e54f26ed71b54b109bf85deb19a3e56c Mon Sep 17 00:00:00 2001 From: Kaustubh Patange Date: Sat, 26 Dec 2020 23:20:20 +0530 Subject: [PATCH] [Fixed] #2890 with the help of #2899 (cherry picked from commit 70802d3c622476a95bf70f967d6a2ccdba98a65d) --- .../provider/scheme/LinkParserHelper.java | 149 --------------- .../provider/scheme/LinkParserHelper.kt | 169 ++++++++++++++++++ .../provider/scheme/SchemeParser.java | 5 +- 3 files changed, 172 insertions(+), 151 deletions(-) delete mode 100644 app/src/main/java/com/fastaccess/provider/scheme/LinkParserHelper.java create mode 100644 app/src/main/java/com/fastaccess/provider/scheme/LinkParserHelper.kt diff --git a/app/src/main/java/com/fastaccess/provider/scheme/LinkParserHelper.java b/app/src/main/java/com/fastaccess/provider/scheme/LinkParserHelper.java deleted file mode 100644 index e6838dd3b..000000000 --- a/app/src/main/java/com/fastaccess/provider/scheme/LinkParserHelper.java +++ /dev/null @@ -1,149 +0,0 @@ -package com.fastaccess.provider.scheme; - -import android.net.Uri; -import androidx.annotation.NonNull; -import androidx.annotation.Nullable; -import android.text.TextUtils; -import android.webkit.MimeTypeMap; - -import com.annimon.stream.Optional; -import com.annimon.stream.Stream; -import com.fastaccess.helper.InputHelper; -import com.fastaccess.helper.ObjectsCompat; -import com.fastaccess.helper.PrefGetter; - -import java.util.Arrays; -import java.util.List; - -/** - * Created by Kosh on 11 Apr 2017, 10:02 PM - */ - -public class LinkParserHelper { - public static final String HOST_DEFAULT = "github.com"; - public static final String PROTOCOL_HTTPS = "https"; - static final String HOST_GISTS = "gist.github.com"; - static final String HOST_GISTS_RAW = "gist.githubusercontent.com"; - static final String RAW_AUTHORITY = "raw.githubusercontent.com"; - static final String API_AUTHORITY = "api.github.com"; - static final List IGNORED_LIST = Arrays.asList("notifications", "settings", "blog", - "explore", "dashboard", "repositories", "logout", "sessions", "site", "security", - "contact", "about", "logos", "login", "pricing", ""); - - @SafeVarargs static Optional returnNonNull(@NonNull T... t) { - return Stream.of(t).filter(ObjectsCompat::nonNull).findFirst(); - } - - @NonNull static Uri getBlobBuilder(@NonNull Uri uri) { - boolean isSvg = "svg".equalsIgnoreCase(MimeTypeMap.getFileExtensionFromUrl(uri.toString())); - List segments = uri.getPathSegments(); - if (isSvg) { - Uri svgBlob = Uri.parse(uri.toString().replace("blob/", "")); - return svgBlob.buildUpon().authority(RAW_AUTHORITY).build(); - } - Uri.Builder urlBuilder = new Uri.Builder(); - String owner = segments.get(0); - String repo = segments.get(1); - String branch = segments.get(3); - urlBuilder.scheme("https") - .authority(API_AUTHORITY) - .appendPath("repos") - .appendPath(owner) - .appendPath(repo) - .appendPath("contents"); - for (int i = 4; i < segments.size(); i++) { - urlBuilder.appendPath(segments.get(i)); - } - if (uri.getQueryParameterNames() != null) { - for (String query : uri.getQueryParameterNames()) { - urlBuilder.appendQueryParameter(query, uri.getQueryParameter(query)); - } - } - if (uri.getEncodedFragment() != null) { - urlBuilder.encodedFragment(uri.getEncodedFragment()); - } - urlBuilder.appendQueryParameter("ref", branch); - return urlBuilder.build(); - } - - public static boolean isEnterprise(@Nullable String url) { - if (InputHelper.isEmpty(url) || !PrefGetter.isEnterprise()) return false; - String enterpriseUrl = PrefGetter.getEnterpriseUrl().toLowerCase(); - url = url.toLowerCase(); - return url.equalsIgnoreCase(enterpriseUrl) || url.startsWith(enterpriseUrl) || url.startsWith(getEndpoint(enterpriseUrl)) - || url.contains(enterpriseUrl) || enterpriseUrl.contains(url); - } - - public static String stripScheme(@NonNull String url) { - try { - Uri uri = Uri.parse(url); - return !InputHelper.isEmpty(uri.getAuthority()) ? uri.getAuthority() : url; - } catch (Exception ignored) {} - return url; - } - - @NonNull public static String getEndpoint(@NonNull String url) { - if (url.startsWith("http://")) { - url = url.replace("http://", "https://"); - } - if (!url.startsWith("https://")) { - url = "https://" + url; - } - return getEnterpriseUrl(url); - } - - @NonNull private static String getEnterpriseUrl(@NonNull String url) { - if (url.endsWith("/api/v3/")) { - return url; - } else if (url.endsWith("/api/")) { - return url + "v3/"; - } else if (url.endsWith("/api")) { - return url + "/v3/"; - } else if (url.endsWith("/api/v3")) { - return url + "/"; - } else if (!url.endsWith("/")) { - return url + "/api/v3/"; - } else if (url.endsWith("/")) { - return url + "api/v3/"; - } - return url; - } - - public static String getEnterpriseGistUrl(@NonNull String url, boolean isEnterprise) { - if (isEnterprise) { - Uri uri = Uri.parse(url); - boolean isGist = uri == null || uri.getPathSegments() == null ? url.contains("gist/") : uri.getPathSegments().get(0).equals("gist"); - if (isGist) { - String enterpriseUrl = PrefGetter.getEnterpriseUrl(); - if (!url.contains(enterpriseUrl + "/raw/")) { - url = url.replace(enterpriseUrl, enterpriseUrl + "/raw"); - } - } - } - return url; - } - - @Nullable public static String getGistId(@NonNull Uri uri) { - String gistId = null; - if (uri.toString().contains("raw/gist")) { - if (uri.getPathSegments().size() > 5) { - gistId = uri.getPathSegments().get(5); - } - } else if (uri.getPathSegments() != null) { - if (TextUtils.equals(LinkParserHelper.HOST_GISTS_RAW, uri.getAuthority())) { - if (uri.getPathSegments().size() > 1) { - gistId = uri.getPathSegments().get(1); - } - } - } - return gistId; - } - - public static boolean isGithubBlobImage(@NonNull String url) { - return Uri.parse(url).getAuthority().equals(HOST_DEFAULT) && url.contains("/blob/"); - } - - public static String minifyGithubImageUri(@NonNull String url) { - return url.replace(HOST_DEFAULT, RAW_AUTHORITY).replace("blob/",""); - } -} diff --git a/app/src/main/java/com/fastaccess/provider/scheme/LinkParserHelper.kt b/app/src/main/java/com/fastaccess/provider/scheme/LinkParserHelper.kt new file mode 100644 index 000000000..cec853ac0 --- /dev/null +++ b/app/src/main/java/com/fastaccess/provider/scheme/LinkParserHelper.kt @@ -0,0 +1,169 @@ +package com.fastaccess.provider.scheme + +import android.net.Uri +import android.text.TextUtils +import android.webkit.MimeTypeMap +import com.annimon.stream.Optional +import com.annimon.stream.Stream +import com.fastaccess.helper.InputHelper +import com.fastaccess.helper.ObjectsCompat +import com.fastaccess.helper.PrefGetter + +/** + * Created by Kosh on 11 Apr 2017, 10:02 PM + */ +object LinkParserHelper { + const val HOST_DEFAULT = "github.com" + const val PROTOCOL_HTTPS = "https" + const val HOST_GISTS = "gist.github.com" + const val HOST_GISTS_RAW = "gist.githubusercontent.com" + const val RAW_AUTHORITY = "raw.githubusercontent.com" + const val API_AUTHORITY = "api.github.com" + @JvmField + val IGNORED_LIST: List = listOf("notifications", "settings", "blog", + "explore", "dashboard", "repositories", "logout", "sessions", "site", "security", + "contact", "about", "logos", "login", "pricing", "") + + val escapeSymbols: Map = mapOf( + """ to "\"", "'" to "'", + "<" to "<", ">" to ">", "&" to "&") + + @JvmStatic + @SafeVarargs + fun returnNonNull(vararg t: T): Optional { + return Stream.of(*t).filter { obj: T -> ObjectsCompat.nonNull(obj) }.findFirst() + } + + @JvmStatic + fun getBlobBuilder(uri: Uri): Uri { + val isSvg = "svg".equals(MimeTypeMap.getFileExtensionFromUrl(uri.toString()), ignoreCase = true) + val segments = uri.pathSegments + if (isSvg) { + val svgBlob = Uri.parse(uri.toString().replace("blob/", "")) + return svgBlob.buildUpon().authority(RAW_AUTHORITY).build() + } + val urlBuilder = Uri.Builder() + val owner = segments[0] + val repo = segments[1] + val branch = segments[3] + urlBuilder.scheme("https") + .authority(API_AUTHORITY) + .appendPath("repos") + .appendPath(owner) + .appendPath(repo) + .appendPath("contents") + for (i in 4 until segments.size) { + urlBuilder.appendPath(segments[i]) + } + if (uri.queryParameterNames != null) { + for (query in uri.queryParameterNames) { + urlBuilder.appendQueryParameter(query, uri.getQueryParameter(query)) + } + } + if (uri.encodedFragment != null) { + urlBuilder.encodedFragment(uri.encodedFragment) + } + urlBuilder.appendQueryParameter("ref", branch) + return urlBuilder.build() + } + + @JvmStatic + fun isEnterprise(url: String?): Boolean { + var urlString = url + if (InputHelper.isEmpty(urlString) || !PrefGetter.isEnterprise()) return false + val enterpriseUrl = PrefGetter.getEnterpriseUrl().toLowerCase() + urlString = urlString!!.toLowerCase() + return (urlString.equals(enterpriseUrl, ignoreCase = true) || urlString.startsWith(enterpriseUrl) || urlString.startsWith(getEndpoint(enterpriseUrl)) + || urlString.contains(enterpriseUrl) || enterpriseUrl.contains(urlString)) + } + + fun stripScheme(url: String): String? { + try { + val uri = Uri.parse(url) + return if (!InputHelper.isEmpty(uri.authority)) uri.authority else url + } catch (ignored: Exception) { + } + return url + } + + @JvmStatic + fun getEndpoint(url: String): String { + var url = url + if (url.startsWith("http://")) { + url = url.replace("http://", "https://") + } + if (!url.startsWith("https://")) { + url = "https://$url" + } + return getEnterpriseUrl(url) + } + + private fun getEnterpriseUrl(url: String): String { + if (url.endsWith("/api/v3/")) { + return url + } else if (url.endsWith("/api/")) { + return url + "v3/" + } else if (url.endsWith("/api")) { + return "$url/v3/" + } else if (url.endsWith("/api/v3")) { + return "$url/" + } else if (!url.endsWith("/")) { + return "$url/api/v3/" + } else if (url.endsWith("/")) { + return url + "api/v3/" + } + return url + } + + @JvmStatic + fun getEnterpriseGistUrl(url: String, isEnterprise: Boolean): String { + var urlString = url + if (isEnterprise) { + val uri = Uri.parse(urlString) + val isGist = if (uri == null || uri.pathSegments == null) urlString.contains("gist/") else uri.pathSegments[0] == "gist" + if (isGist) { + val enterpriseUrl = PrefGetter.getEnterpriseUrl() + if (!urlString.contains("$enterpriseUrl/raw/")) { + urlString = urlString.replace(enterpriseUrl, "$enterpriseUrl/raw") + } + } + } + return urlString + } + + @JvmStatic + fun getGistId(uri: Uri): String? { + var gistId: String? = null + if (uri.toString().contains("raw/gist")) { + if (uri.pathSegments.size > 5) { + gistId = uri.pathSegments[5] + } + } else if (uri.pathSegments != null) { + if (TextUtils.equals(HOST_GISTS_RAW, uri.authority)) { + if (uri.pathSegments.size > 1) { + gistId = uri.pathSegments[1] + } + } + } + return gistId + } + + @JvmStatic + fun isGithubBlobImage(url: String): Boolean { + return Uri.parse(url).authority == HOST_DEFAULT && url.contains("/blob/") + } + + @JvmStatic + fun minifyGithubImageUri(url: String): String { + return url.replace(HOST_DEFAULT, RAW_AUTHORITY).replace("blob/", "") + } + + @JvmStatic + fun parseReferenceSymbols(uri: Uri): Uri { + var formattedUrl = uri.toString() + escapeSymbols.entries.forEach { + formattedUrl = formattedUrl.replace(it.key, it.value) + } + return Uri.parse(formattedUrl) + } +} \ No newline at end of file diff --git a/app/src/main/java/com/fastaccess/provider/scheme/SchemeParser.java b/app/src/main/java/com/fastaccess/provider/scheme/SchemeParser.java index e7cc28db3..2cd61a5b8 100644 --- a/app/src/main/java/com/fastaccess/provider/scheme/SchemeParser.java +++ b/app/src/main/java/com/fastaccess/provider/scheme/SchemeParser.java @@ -67,8 +67,9 @@ public static void launchUri(@NonNull Context context, @NonNull Uri data, boolea launchUri(context, data, showRepoBtn, false); } - public static void launchUri(@NonNull Context context, @NonNull Uri data, boolean showRepoBtn, boolean newDocument) { - Logger.e(data); + public static void launchUri(@NonNull Context context, @NonNull Uri uri, boolean showRepoBtn, boolean newDocument) { + Logger.e(uri); + Uri data = LinkParserHelper.parseReferenceSymbols(uri); Intent intent = convert(context, data, showRepoBtn); if (intent != null) { intent.putExtra(BundleConstant.SCHEME_URL, data.toString());