Use Brave clean urls file

pull/214/head
M66B 6 months ago
parent e37d1605c4
commit 3f6974fea0

@ -51,3 +51,4 @@ FairEmail uses parts or all of:
* [Prism](https://github.com/PrismJS/prism). Copyright (c) 2012 Lea Verou. [MIT LICENSE](https://github.com/PrismJS/prism/blob/master/LICENSE).
* [Jayway JsonPath](https://github.com/json-path/JsonPath). Copyright 2011 the original author or authors. [Apache License 2.0](https://github.com/json-path/JsonPath/blob/master/LICENSE).
* [tinylog 2](https://github.com/tinylog-org/tinylog). Copyright 2016-2023 Martin Winandy. [Apache License 2.0](https://github.com/tinylog-org/tinylog/blob/v2.7/license.txt).
* [Brave Lists](https://github.com/brave/adblock-lists). [Mozilla Public License Version 2.0](https://github.com/brave/adblock-lists/blob/master/LICENSE).

@ -51,3 +51,4 @@ FairEmail uses parts or all of:
* [Prism](https://github.com/PrismJS/prism). Copyright (c) 2012 Lea Verou. [MIT LICENSE](https://github.com/PrismJS/prism/blob/master/LICENSE).
* [Jayway JsonPath](https://github.com/json-path/JsonPath). Copyright 2011 the original author or authors. [Apache License 2.0](https://github.com/json-path/JsonPath/blob/master/LICENSE).
* [tinylog 2](https://github.com/tinylog-org/tinylog). Copyright 2016-2023 Martin Winandy. [Apache License 2.0](https://github.com/tinylog-org/tinylog/blob/v2.7/license.txt).
* [Brave Lists](https://github.com/brave/adblock-lists). [Mozilla Public License Version 2.0](https://github.com/brave/adblock-lists/blob/master/LICENSE).

@ -0,0 +1,524 @@
[
{
"include": [
"*://*.amazon.ae/*",
"*://*.amazon.ca/*",
"*://*.amazon.cn/*",
"*://*.amazon.co.jp/*",
"*://*.amazon.co.uk/*",
"*://*.amazon.com/*",
"*://*.amazon.com.au/*",
"*://*.amazon.com.be/*",
"*://*.amazon.com.br/*",
"*://*.amazon.com.mx/*",
"*://*.amazon.com.tr/*",
"*://*.amazon.de/*",
"*://*.amazon.eg/*",
"*://*.amazon.es/*",
"*://*.amazon.fr/*",
"*://*.amazon.in/*",
"*://*.amazon.it/*",
"*://*.amazon.nl/*",
"*://*.amazon.pl/*",
"*://*.amazon.sa/*",
"*://*.amazon.se/*",
"*://*.amazon.sg/*"
],
"exclude": [
],
"params": [
"content-id",
"linkCode",
"tag",
"crid",
"pd_rd_r",
"pd_rd_w",
"pd_rd_wg",
"pf_rd_i",
"pf_rd_m",
"pf_rd_p",
"pf_rd_r",
"pf_rd_s",
"pf_rd_t",
"qid",
"sprefix"
]
},
{
"include": [
"*://*.bandcamp.com/*"
],
"exclude": [
],
"params": [
"from"
]
},
{
"include": [
"*://*.imdb.com/*"
],
"exclude": [
],
"params": [
"pf_rd_m",
"pf_rd_p",
"pf_rd_r",
"pf_rd_s",
"pf_rd_t",
"pf_rd_i",
"ref_"
]
},
{
"include": [
"*://www.instagram.com/*"
],
"exclude": [
],
"params": [
"igshid",
"ig_rid"
]
},
{
"include": [
"*://*.twitter.com/*"
],
"exclude": [
"*://*.twitter.com/i/redirect?*"
],
"params": [
"cxt",
"ref_src",
"ref_url",
"s",
"t"
]
},
{
"include": [
"*://hbr.org/*",
"*://techcrunch.com/*"
],
"exclude": [
],
"params": [
"tpcc"
]
},
{
"include": [
"*://www.wsj.com/*"
],
"exclude": [
],
"params": [
"mod"
]
},
{
"include": [
"*://actionnetwork.org/*"
],
"exclude": [
],
"params": [
"source"
]
},
{
"include": [
"*://www.zillow.com/*"
],
"exclude": [
],
"params": [
"rtoken"
]
},
{
"include": [
"*://feverup.com/*"
],
"exclude": [
],
"params": [
"CAMEFROM"
]
},
{
"include": [
"*://www.linkedin.com/in/*"
],
"exclude": [
],
"params": [
"trackingCode",
"original_referer"
]
},
{
"include": [
"*://www.linkedin.com/help/*"
],
"exclude": [
],
"params": [
"mcid",
"src",
"trk"
]
},
{
"include": [
"*://youtu.be/?*",
"*://*.youtube.com/watch?*"
],
"exclude": [
],
"params": [
"embeds_euri",
"embeds_loader_url_for_pings",
"embeds_origin",
"feature",
"si",
"source_ve_path"
]
},
{
"include": [
"*://medium.com/*"
],
"exclude": [
],
"params": [
"source"
]
},
{
"include": [
"*://eprint.iacr.org/*",
"*://hackernoon.com/*",
"*://www.backerkit.com/*",
"*://*.kickstarter.com/*"
],
"exclude": [
],
"params": [
"ref"
]
},
{
"include": [
"*://*.tiktok.com/*"
],
"exclude": [
],
"params": [
"embed_source",
"refer",
"referer_url",
"referer_video_id"
]
},
{
"include": [
"*://*.bloomberglaw.com/*",
"*://*.bloomberg.com/*"
],
"exclude": [
],
"params": [
"trk",
"in_source",
"leadSource",
"srnd"
]
},
{
"include": [
"*://*.aliexpress.com/item/*"
],
"exclude": [
],
"params": [
"algo_exp_id",
"pdp_npi",
"curPageLogUid"
]
},
{
"include": [
"*://*/*"
],
"exclude": [
"*://app.hive.co/*"
],
"params": [
"h_sid",
"h_slt"
]
},
{
"include": [
"*://*.eventbrite.com/*"
],
"exclude": [
],
"params": [
"aff",
"can_id",
"email_referrer",
"email_subject",
"link_id",
"source"
]
},
{
"include": [
"*://*.seek.com.au/*",
"*://*.seek.co.nz/*"
],
"exclude": [
],
"params": [
"tracking"
]
},
{
"include": [
"*://mailchi.mp/*"
],
"exclude": [
],
"params": [
"e"
]
},
{
"include": [
"*://*.songkick.com/*"
],
"exclude": [
],
"params": [
"deep_link_campaign",
"deep_link_medium",
"deep_link_source"
]
},
{
"include": [
"*://*.humblebundle.com/*"
],
"exclude": [
],
"params": [
"hmb_campaign",
"hmb_medium",
"hmb_source"
]
},
{
"include": [
"*://*/*"
],
"exclude": [
],
"params": [
"__hssc",
"__hstc",
"_hsenc",
"_hsmi",
"hsCtaTracking",
"cm_cr",
"cm_me",
"cm_re",
"cm_sp",
"cm_mmc",
"cm_mmca1",
"cm_mmca2",
"cm_mmca3",
"cm_mmca4",
"cm_mmca5",
"cm_mmca6",
"cm_mmca7",
"cm_mmca8",
"cm_mmca9",
"cm_mmca10",
"cm_mmca11",
"cm_mmca12",
"cm_mmca13",
"cm_mmca14",
"cm_mmca15",
"hsa_acc",
"hsa_ad",
"hsa_cam",
"hsa_grp",
"hsa_kw",
"hsa_la",
"hsa_mt",
"hsa_net",
"hsa_ol",
"hsa_src",
"hsa_tgt",
"hsa_ver",
"action_object_map",
"action_ref_map",
"action_type_map",
"fb_action_ids",
"fb_action_types",
"fb_comment_id",
"fb_ref",
"fb_source",
"irclickid",
"irgwc",
"ir_adid",
"ir_campaignid",
"ir_partnerid",
"yadclid",
"yadordid",
"yclid",
"ymclid",
"ysclid",
"cx_click",
"cx_recsOrder",
"cx_recsWidget",
"at_campaign",
"at_campaign_type",
"at_channel",
"at_creation",
"at_custom1",
"at_custom2",
"at_custom3",
"at_custom4",
"at_detail_placement",
"at_emailtype",
"at_format",
"at_format",
"at_general_placement",
"at_identifier",
"at_link",
"at_link_id",
"at_link_origin",
"at_link_type",
"at_medium",
"at_network",
"at_platform",
"at_ptr_name",
"at_recipient_id",
"at_recipient_list",
"at_send_date",
"at_term",
"at_type",
"at_variant",
"brave-campaign-id",
"brave-creative-id",
"brave-creative-set-id",
"ml_subscriber",
"ml_subscriber_hash",
"mc_cid",
"ss_campaign_id",
"ss_campaign_name",
"ss_campaign_sent_date",
"ss_source",
"mtm_campaign",
"mtm_cid",
"mtm_content",
"mtm_group",
"mtm_keyword",
"mtm_kwd",
"mtm_medium",
"mtm_placement",
"mtm_source",
"piwik_campaign",
"piwik_kwd",
"pk_campaign",
"pk_cid",
"pk_content",
"pk_cpn",
"pk_keyword",
"pk_kwd",
"pk_medium",
"pk_source",
"utm_ad",
"utm_affiliate",
"utm_brand",
"utm_campaign",
"utm_campaignid",
"utm_channel",
"utm_cid",
"utm_content",
"utm_creative",
"utm_device",
"utm_emcid",
"utm_emmid",
"utm_id",
"utm_keyword",
"utm_medium",
"utm_name",
"utm_place",
"utm_product",
"utm_pubreferrer",
"utm_reader",
"utm_referrer",
"utm_serial",
"utm_session",
"utm_siteid",
"utm_social",
"utm_social-type",
"utm_source",
"utm_supplier",
"utm_swu",
"utm_term",
"utm_umguk",
"utm_userid",
"utm_viz_id",
"gbraid",
"wbraid",
"gclsrc",
"gclid",
"usqp",
"guccounter",
"guce_referrer",
"guce_referrer_sig",
"ex_cid"
]
},
{
"include": [
"https://dev-pages.bravesoftware.com/clean-urls/*"
],
"exclude": [
"https://dev-pages.bravesoftware.com/clean-urls/exempted/*"
],
"params": [
"brave_testing1",
"brave_testing2"
]
}
]

@ -6367,7 +6367,7 @@ public class AdapterMessage extends RecyclerView.Adapter<AdapterMessage.ViewHold
uri = alt;
}
Uri sanitized = UriHelper.sanitize(uri);
Uri sanitized = UriHelper.sanitize(context, uri);
if (sanitized != null && isActivate(sanitized))
uri = sanitized;
else if (title != null) {
@ -6453,7 +6453,7 @@ public class AdapterMessage extends RecyclerView.Adapter<AdapterMessage.ViewHold
boolean link_sanitize = prefs.getBoolean(chost + ".link_sanitize", false);
if (link_sanitize && UriHelper.isHyperLink(uri)) {
Uri sanitized = UriHelper.sanitize(uri);
Uri sanitized = UriHelper.sanitize(context, uri);
if (sanitized != null)
uri = sanitized;
Log.i("Open sanitized=" + uri);

@ -131,7 +131,7 @@ public class FragmentDialogOpenLink extends FragmentDialogBase {
if (uri.isOpaque())
sanitized = uri;
else {
Uri s = UriHelper.sanitize(uri);
Uri s = UriHelper.sanitize(context, uri);
sanitized = (s == null ? uri : s);
}

@ -29,6 +29,8 @@ import androidx.annotation.NonNull;
import androidx.core.net.MailTo;
import androidx.core.util.PatternsCompat;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
import java.io.BufferedReader;
@ -42,6 +44,7 @@ import java.util.Collections;
import java.util.HashSet;
import java.util.List;
import java.util.Locale;
import java.util.regex.Pattern;
public class UriHelper {
// https://publicsuffix.org/
@ -76,7 +79,6 @@ public class UriHelper {
"kclickid", // https://support.freespee.com/hc/en-us/articles/202577831-Kenshoo-integration
// https://github.com/brave/adblock-lists/blob/master/brave-lists/clean-urls.json
"oly_anon_id", "oly_enc_id", // https://training.omeda.com/knowledge-base/olytics-product-outline/
"_openstat", // https://yandex.com/support/direct/statistics/url-tags.html
"vero_conv", "vero_id", // https://help.getvero.com/cloud/articles/what-is-vero_id/
@ -260,7 +262,7 @@ public class UriHelper {
}
}
static Uri sanitize(Uri uri) {
static Uri sanitize(Context context, Uri uri) {
if (uri.isOpaque())
return uri;
@ -393,6 +395,15 @@ public class UriHelper {
if (url.isOpaque() || !isHyperLink(url))
return uri;
JSONArray jclean;
try (InputStream is = context.getAssets().open("clean-urls.json")) {
String json = Helper.readStream(is);
jclean = new JSONArray(json);
} catch (Throwable ex) {
Log.e(ex);
jclean = new JSONArray();
}
Uri.Builder builder = url.buildUpon();
builder.clearQuery();
@ -402,6 +413,37 @@ public class UriHelper {
host = host.toLowerCase(Locale.ROOT);
if (path != null)
path = path.toLowerCase(Locale.ROOT);
// https://github.com/brave/adblock-lists/blob/master/brave-lists/clean-urls.json
JSONArray jparams = null;
for (int i = 0; i < jclean.length(); i++)
try {
JSONObject jitem = jclean.getJSONObject(i);
JSONArray jinclude = jitem.getJSONArray("include");
JSONArray jexclude = jitem.getJSONArray("exclude");
boolean include = false;
for (int j = 0; j < jinclude.length(); j++)
if (Pattern.matches(escapeStar(jinclude.getString(j)), url.toString())) {
include = true;
break;
}
if (include)
for (int j = 0; j < jexclude.length(); j++)
if (Pattern.matches(escapeStar(jexclude.getString(j)), url.toString())) {
include = false;
break;
}
if (include) {
jparams = jitem.getJSONArray("params");
break;
}
} catch (JSONException ex) {
Log.e(ex);
}
boolean first = "www.facebook.com".equals(host);
for (String key : url.getQueryParameterNames()) {
// https://en.wikipedia.org/wiki/UTM_parameters
@ -420,12 +462,26 @@ public class UriHelper {
else if (!TextUtils.isEmpty(key))
for (String value : url.getQueryParameters(key)) {
Log.i("Query " + key + "=" + value);
Uri suri = Uri.parse(value);
if (suri != null && isHyperLink(suri)) {
Uri s = sanitize(suri);
return (s == null ? suri : s);
if (jparams != null)
for (int j = 0; j < jparams.length(); j++)
try {
if (key.equals(jparams.getString(j))) {
changed = true;
break;
}
} catch (JSONException ex) {
Log.e(ex);
}
if (!changed) {
Uri suri = Uri.parse(value);
if (suri != null && isHyperLink(suri)) {
Uri s = sanitize(context, suri);
return (s == null ? suri : s);
}
builder.appendQueryParameter(key, value);
}
builder.appendQueryParameter(key, value);
}
first = false;
}
@ -433,6 +489,13 @@ public class UriHelper {
return (changed ? builder.build() : null);
}
private static String escapeStar(String regex) {
for (char kar : "\\.?![]{}()<>*+-=^$|".toCharArray())
if (kar != '*')
regex = regex.replace("" + kar, "\\" + kar);
return regex.replace("*", ".*");
}
static Uri secure(Uri uri, boolean https) {
String scheme = uri.getScheme();
if (https ? "http".equals(scheme) : "https".equals(scheme)) {

Loading…
Cancel
Save