Version 1.8.0

This commit is contained in:
Kevin Röbert 2019-09-11 18:08:41 +02:00
parent 9029781974
commit d2ec7ce49e
13 changed files with 10371 additions and 54 deletions

View File

@ -4,6 +4,22 @@ All notable changes to this project will be documented in this file.
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
## [1.8.0] - 2019-09-11
### Compatibility note
- Require Firefox >= 55
- Require Chrome >= 22
### Added
- Added default option to skip URLs with a host in a local range
### Fixed
- Fixed [#238](https://gitlab.com/KevinRoebert/ClearUrls/issues/238)
- Fixed wrong count on cleaning tool (forgot to count also the total amount of elements at cleaning tool)
### Changed
- Improvements on check for android systems ([#206](https://gitlab.com/KevinRoebert/ClearUrls/issues/206))
## [1.7.4] - 2019-09-06 ## [1.7.4] - 2019-09-06
### Compatibility note ### Compatibility note

View File

@ -230,5 +230,13 @@
"cleaning_tool_clean_urls_label": { "cleaning_tool_clean_urls_label": {
"message": "Hier finden Sie die gesäuberten URLs:", "message": "Hier finden Sie die gesäuberten URLs:",
"description": "Diese Zeichenfolge wird als Titel auf der Bereinigungswerkzeugseite für die bereinigten URLs verwendet." "description": "Diese Zeichenfolge wird als Titel auf der Bereinigungswerkzeugseite für die bereinigten URLs verwendet."
},
"local_hosts_skipping": {
"message": "Auslassen von lokalen URLs (10.0.0.0/8, 172.16.0.0/12, 192.168.0.0/16, 100.64.0.0/10, 169.254.0.0/16, 127.0.0.1, localhost)",
"description": "Diese Zeichenkette wird als Beschreibung für das Auslassen von lokalen URLs verwendet."
},
"local_hosts_skipping_title": {
"message": "Auslassen von lokalen URLs",
"description": "Diese Zeichenkette wird als Titel für das Auslassen von lokalen URLs verwendet."
} }
} }

View File

@ -230,5 +230,13 @@
"cleaning_tool_clean_urls_label": { "cleaning_tool_clean_urls_label": {
"message": "Here you can find the cleaned URLs:", "message": "Here you can find the cleaned URLs:",
"description": "This string is used as title on the cleaning tool page for the clean URLs." "description": "This string is used as title on the cleaning tool page for the clean URLs."
},
"local_hosts_skipping": {
"message": "Skipping URLs on local hosts (10.0.0.0/8, 172.16.0.0/12, 192.168.0.0/16, 100.64.0.0/10, 169.254.0.0/16, 127.0.0.1, localhost)",
"description": "This string is used as label for the local host skipping switch"
},
"local_hosts_skipping_title": {
"message": "Skipping URLs on local hosts",
"description": "This string is used as title for the local host skipping switch"
} }
} }

View File

@ -48,6 +48,14 @@ function removeFieldsFormURL(provider, pureUrl)
var cancel = false; var cancel = false;
var rawRules = provider.getRawRules(); var rawRules = provider.getRawRules();
if(storage.localHostsSkipping && checkLocalURL(pureUrl)) {
return {
"changes": false,
"url": url,
"cancel": false
};
}
/* /*
* Apply raw rules to the URL. * Apply raw rules to the URL.
*/ */
@ -66,8 +74,9 @@ function removeFieldsFormURL(provider, pureUrl)
increaseURLCounter(); increaseURLCounter();
if(!checkOSAndroid()) checkOSAndroid().then((res) => {
{ if(!res) {
if(storage.badgedStatus) { if(storage.badgedStatus) {
browser.browserAction.setBadgeText({text: (++badges[tabid]).toString(), tabId: tabid}); browser.browserAction.setBadgeText({text: (++badges[tabid]).toString(), tabId: tabid});
} }
@ -76,6 +85,7 @@ function removeFieldsFormURL(provider, pureUrl)
browser.browserAction.setBadgeText({text: "", tabId: tabid}); browser.browserAction.setBadgeText({text: "", tabId: tabid});
} }
} }
});
changes = true; changes = true;
} }
@ -144,8 +154,9 @@ function removeFieldsFormURL(provider, pureUrl)
increaseURLCounter(); increaseURLCounter();
if(!checkOSAndroid()) checkOSAndroid().then((res) => {
{ if(!res) {
if(storage.badgedStatus) { if(storage.badgedStatus) {
browser.browserAction.setBadgeText({text: (++badges[tabid]).toString(), tabId: tabid}); browser.browserAction.setBadgeText({text: (++badges[tabid]).toString(), tabId: tabid});
} }
@ -154,6 +165,8 @@ function removeFieldsFormURL(provider, pureUrl)
browser.browserAction.setBadgeText({text: "", tabId: tabid}); browser.browserAction.setBadgeText({text: "", tabId: tabid});
} }
} }
});
changes = true; changes = true;
} }
}); });
@ -175,8 +188,8 @@ function removeFieldsFormURL(provider, pureUrl)
increaseURLCounter(); increaseURLCounter();
if(!checkOSAndroid()) checkOSAndroid().then((res) => {
{ if(!res) {
if(storage.badgedStatus) { if(storage.badgedStatus) {
browser.browserAction.setBadgeText({text: (++badges[tabid]).toString(), tabId: tabid}); browser.browserAction.setBadgeText({text: (++badges[tabid]).toString(), tabId: tabid});
} }
@ -185,6 +198,7 @@ function removeFieldsFormURL(provider, pureUrl)
browser.browserAction.setBadgeText({text: "", tabId: tabid}); browser.browserAction.setBadgeText({text: "", tabId: tabid});
} }
} }
});
cancel = true; cancel = true;
} }

View File

@ -26,6 +26,10 @@
*/ */
function pureCleaning(url) { function pureCleaning(url) {
var cleanURL = url; var cleanURL = url;
var URLbeforeReplaceCount = countFields(url);
//Add Fields form Request to global url counter
increaseGlobalURLCounter(URLbeforeReplaceCount);
for (var i = 0; i < providers.length; i++) { for (var i = 0; i < providers.length; i++) {
var result = { var result = {

View File

@ -110,8 +110,6 @@ function save()
function: "reload", function: "reload",
params: [] params: []
}).then(handleResponse, handleError); }).then(handleResponse, handleError);
//location.reload();
} }
/** /**
@ -159,12 +157,17 @@ function getData()
params: ["historyListenerEnabled"] params: ["historyListenerEnabled"]
}).then((data) => { }).then((data) => {
handleResponseData(data, "historyListenerEnabled", "historyListenerEnabled"); handleResponseData(data, "historyListenerEnabled", "historyListenerEnabled");
browser.runtime.sendMessage({
function: "getData",
params: ["localHostsSkipping"]
}).then((data) => {
handleResponseData(data, "localHostsSkipping", "localHostsSkipping");
changeSwitchButton("contextMenuEnabled", "contextMenuEnabled"); changeSwitchButton("contextMenuEnabled", "contextMenuEnabled");
changeSwitchButton("historyListenerEnabled", "historyListenerEnabled"); changeSwitchButton("historyListenerEnabled", "historyListenerEnabled");
changeSwitchButton("localHostsSkipping", "localHostsSkipping");
}, handleError);
}, handleError); }, handleError);
}, handleError); }, handleError);
} }
/** /**
@ -184,6 +187,7 @@ function setText()
$('#save_settings_btn').prop('title', translate('settings_html_save_button_title')); $('#save_settings_btn').prop('title', translate('settings_html_save_button_title'));
injectText("context_menu_enabled", "context_menu_enabled"); injectText("context_menu_enabled", "context_menu_enabled");
$('#history_listener_enabled').html(translate('history_listener_enabled')); $('#history_listener_enabled').html(translate('history_listener_enabled'));
injectText("local_hosts_skipping", "local_hosts_skipping");
} }
/** /**

View File

@ -160,6 +160,7 @@ function initSettings()
storage.ruleURL = "https://gitlab.com/KevinRoebert/ClearUrls/raw/master/data/data.min.json"; storage.ruleURL = "https://gitlab.com/KevinRoebert/ClearUrls/raw/master/data/data.min.json";
storage.contextMenuEnabled = true; storage.contextMenuEnabled = true;
storage.historyListenerEnabled = true; storage.historyListenerEnabled = true;
storage.localHostsSkipping = true;
if(getBrowser() === "Firefox") { if(getBrowser() === "Firefox") {
storage.types = ["font", "image", "imageset", "main_frame", "media", "object", "object_subrequest", "other", "script", "stylesheet", "sub_frame", "websocket", "xbl", "xml_dtd", "xmlhttprequest", "xslt"]; storage.types = ["font", "image", "imageset", "main_frame", "media", "object", "object_subrequest", "other", "script", "stylesheet", "sub_frame", "websocket", "xbl", "xml_dtd", "xmlhttprequest", "xslt"];

View File

@ -67,10 +67,10 @@ function reload()
* Check if it is an android device. * Check if it is an android device.
* @return bool * @return bool
*/ */
function checkOSAndroid() async function checkOSAndroid()
{ {
if(os === undefined || os === null || os === "") { if(os === undefined || os === null || os === "") {
chrome.runtime.getPlatformInfo(function(info) { await chrome.runtime.getPlatformInfo(function(info) {
os = info.os; os = info.os;
}); });
} }
@ -84,6 +84,31 @@ function checkOSAndroid()
} }
} }
/**
* Extract the host without port from an url.
* @param {String} url URL as String
* @return {Array} host as string
*/
function extractHost(url) {
let parsed_url = new URL(url);
return parsed_url.hostname;
}
/**
* Returns true if the url has a local host.
* @param {String} url URL as String
* @return {boolean}
*/
function checkLocalURL(url) {
let host = extractHost(url);
return ipRangeCheck(host, ["10.0.0.0/8", "172.16.0.0/12",
"192.168.0.0/16", "100.64.0.0/10",
"169.254.0.0/16", "127.0.0.1"])||
host === 'localhost';
}
/** /**
* Return the number of parameters query strings. * Return the number of parameters query strings.
* @param {String} url URL as String * @param {String} url URL as String
@ -225,13 +250,15 @@ function increaseURLCounter()
*/ */
function changeIcon() function changeIcon()
{ {
if(!checkOSAndroid()) { checkOSAndroid().then((res) => {
if(!res) {
if(storage.globalStatus){ if(storage.globalStatus){
browser.browserAction.setIcon({path: "img/clearurls_128x128.png"}); browser.browserAction.setIcon({path: "img/clearurls_128x128.png"});
} else{ } else{
browser.browserAction.setIcon({path: "img/clearurls_gray_128x128.png"}); browser.browserAction.setIcon({path: "img/clearurls_gray_128x128.png"});
} }
} }
});
} }
/** /**
@ -241,11 +268,13 @@ function changeIcon()
*/ */
function setBadgedStatus() function setBadgedStatus()
{ {
if(!checkOSAndroid() && storage.badgedStatus){ checkOSAndroid().then((res) => {
if(!res && storage.badgedStatus) {
browser.browserAction.setBadgeBackgroundColor({ browser.browserAction.setBadgeBackgroundColor({
'color': '#'+storage.badged_color 'color': '#'+storage.badged_color
}); });
} }
});
} }
/** /**

View File

@ -0,0 +1,750 @@
/**
* MIT License
*
* Copyright (c) 2018 Daniel Compton
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in all
* copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
* SOFTWARE.
*
* https://github.com/danielcompton/ip-range-check
*
* Build with: Browserify
*/
var ipRangeCheck;
(function(){function r(e,n,t){function o(i,f){if(!n[i]){if(!e[i]){var c="function"==typeof require&&require;if(!f&&c)return c(i,!0);if(u)return u(i,!0);var a=new Error("Cannot find module '"+i+"'");throw a.code="MODULE_NOT_FOUND",a}var p=n[i]={exports:{}};e[i][0].call(p.exports,function(r){var n=e[i][1][r];return o(n||r)},p,p.exports,r,e,n,t)}return n[i].exports}for(var u="function"==typeof require&&require,i=0;i<t.length;i++)o(t[i]);return o}return r})()({1:[function(require,module,exports){
ipRangeCheck = require("ip-range-check");
},{"ip-range-check":2}],2:[function(require,module,exports){
var ipaddr = require("ipaddr.js");
module.exports = check_many_cidrs;
function check_many_cidrs(addr, range) {
if (typeof (range) === "string") {
return check_single_cidr(addr, range)
}
else if (typeof (range) === "object") //list
{
var ip_is_in_range = false;
for (var i = 0; i < range.length; i++) {
if (check_single_cidr(addr, range[i])) {
ip_is_in_range = true;
break;
}
}
return ip_is_in_range;
}
}
function check_single_cidr(addr, cidr) {
try {
var parsed_addr = ipaddr.process(addr);
if (cidr.indexOf('/') === -1) {
var parsed_cidr_as_ip = ipaddr.process(cidr);
if ((parsed_addr.kind() === "ipv6") && (parsed_cidr_as_ip.kind() === "ipv6")){
return (parsed_addr.toNormalizedString() === parsed_cidr_as_ip.toNormalizedString())
}
return (parsed_addr.toString() == parsed_cidr_as_ip.toString())
}
else {
var parsed_range = ipaddr.parseCIDR(cidr);
return parsed_addr.match(parsed_range)
}
}
catch (e) {
return false
}
}
},{"ipaddr.js":3}],3:[function(require,module,exports){
(function() {
var expandIPv6, ipaddr, ipv4Part, ipv4Regexes, ipv6Part, ipv6Regexes, matchCIDR, root, zoneIndex;
ipaddr = {};
root = this;
if ((typeof module !== "undefined" && module !== null) && module.exports) {
module.exports = ipaddr;
} else {
root['ipaddr'] = ipaddr;
}
matchCIDR = function(first, second, partSize, cidrBits) {
var part, shift;
if (first.length !== second.length) {
throw new Error("ipaddr: cannot match CIDR for objects with different lengths");
}
part = 0;
while (cidrBits > 0) {
shift = partSize - cidrBits;
if (shift < 0) {
shift = 0;
}
if (first[part] >> shift !== second[part] >> shift) {
return false;
}
cidrBits -= partSize;
part += 1;
}
return true;
};
ipaddr.subnetMatch = function(address, rangeList, defaultName) {
var k, len, rangeName, rangeSubnets, subnet;
if (defaultName == null) {
defaultName = 'unicast';
}
for (rangeName in rangeList) {
rangeSubnets = rangeList[rangeName];
if (rangeSubnets[0] && !(rangeSubnets[0] instanceof Array)) {
rangeSubnets = [rangeSubnets];
}
for (k = 0, len = rangeSubnets.length; k < len; k++) {
subnet = rangeSubnets[k];
if (address.kind() === subnet[0].kind()) {
if (address.match.apply(address, subnet)) {
return rangeName;
}
}
}
}
return defaultName;
};
ipaddr.IPv4 = (function() {
function IPv4(octets) {
var k, len, octet;
if (octets.length !== 4) {
throw new Error("ipaddr: ipv4 octet count should be 4");
}
for (k = 0, len = octets.length; k < len; k++) {
octet = octets[k];
if (!((0 <= octet && octet <= 255))) {
throw new Error("ipaddr: ipv4 octet should fit in 8 bits");
}
}
this.octets = octets;
}
IPv4.prototype.kind = function() {
return 'ipv4';
};
IPv4.prototype.toString = function() {
return this.octets.join(".");
};
IPv4.prototype.toNormalizedString = function() {
return this.toString();
};
IPv4.prototype.toByteArray = function() {
return this.octets.slice(0);
};
IPv4.prototype.match = function(other, cidrRange) {
var ref;
if (cidrRange === void 0) {
ref = other, other = ref[0], cidrRange = ref[1];
}
if (other.kind() !== 'ipv4') {
throw new Error("ipaddr: cannot match ipv4 address with non-ipv4 one");
}
return matchCIDR(this.octets, other.octets, 8, cidrRange);
};
IPv4.prototype.SpecialRanges = {
unspecified: [[new IPv4([0, 0, 0, 0]), 8]],
broadcast: [[new IPv4([255, 255, 255, 255]), 32]],
multicast: [[new IPv4([224, 0, 0, 0]), 4]],
linkLocal: [[new IPv4([169, 254, 0, 0]), 16]],
loopback: [[new IPv4([127, 0, 0, 0]), 8]],
carrierGradeNat: [[new IPv4([100, 64, 0, 0]), 10]],
"private": [[new IPv4([10, 0, 0, 0]), 8], [new IPv4([172, 16, 0, 0]), 12], [new IPv4([192, 168, 0, 0]), 16]],
reserved: [[new IPv4([192, 0, 0, 0]), 24], [new IPv4([192, 0, 2, 0]), 24], [new IPv4([192, 88, 99, 0]), 24], [new IPv4([198, 51, 100, 0]), 24], [new IPv4([203, 0, 113, 0]), 24], [new IPv4([240, 0, 0, 0]), 4]]
};
IPv4.prototype.range = function() {
return ipaddr.subnetMatch(this, this.SpecialRanges);
};
IPv4.prototype.toIPv4MappedAddress = function() {
return ipaddr.IPv6.parse("::ffff:" + (this.toString()));
};
IPv4.prototype.prefixLengthFromSubnetMask = function() {
var cidr, i, k, octet, stop, zeros, zerotable;
zerotable = {
0: 8,
128: 7,
192: 6,
224: 5,
240: 4,
248: 3,
252: 2,
254: 1,
255: 0
};
cidr = 0;
stop = false;
for (i = k = 3; k >= 0; i = k += -1) {
octet = this.octets[i];
if (octet in zerotable) {
zeros = zerotable[octet];
if (stop && zeros !== 0) {
return null;
}
if (zeros !== 8) {
stop = true;
}
cidr += zeros;
} else {
return null;
}
}
return 32 - cidr;
};
return IPv4;
})();
ipv4Part = "(0?\\d+|0x[a-f0-9]+)";
ipv4Regexes = {
fourOctet: new RegExp("^" + ipv4Part + "\\." + ipv4Part + "\\." + ipv4Part + "\\." + ipv4Part + "$", 'i'),
longValue: new RegExp("^" + ipv4Part + "$", 'i')
};
ipaddr.IPv4.parser = function(string) {
var match, parseIntAuto, part, shift, value;
parseIntAuto = function(string) {
if (string[0] === "0" && string[1] !== "x") {
return parseInt(string, 8);
} else {
return parseInt(string);
}
};
if (match = string.match(ipv4Regexes.fourOctet)) {
return (function() {
var k, len, ref, results;
ref = match.slice(1, 6);
results = [];
for (k = 0, len = ref.length; k < len; k++) {
part = ref[k];
results.push(parseIntAuto(part));
}
return results;
})();
} else if (match = string.match(ipv4Regexes.longValue)) {
value = parseIntAuto(match[1]);
if (value > 0xffffffff || value < 0) {
throw new Error("ipaddr: address outside defined range");
}
return ((function() {
var k, results;
results = [];
for (shift = k = 0; k <= 24; shift = k += 8) {
results.push((value >> shift) & 0xff);
}
return results;
})()).reverse();
} else {
return null;
}
};
ipaddr.IPv6 = (function() {
function IPv6(parts, zoneId) {
var i, k, l, len, part, ref;
if (parts.length === 16) {
this.parts = [];
for (i = k = 0; k <= 14; i = k += 2) {
this.parts.push((parts[i] << 8) | parts[i + 1]);
}
} else if (parts.length === 8) {
this.parts = parts;
} else {
throw new Error("ipaddr: ipv6 part count should be 8 or 16");
}
ref = this.parts;
for (l = 0, len = ref.length; l < len; l++) {
part = ref[l];
if (!((0 <= part && part <= 0xffff))) {
throw new Error("ipaddr: ipv6 part should fit in 16 bits");
}
}
if (zoneId) {
this.zoneId = zoneId;
}
}
IPv6.prototype.kind = function() {
return 'ipv6';
};
IPv6.prototype.toString = function() {
return this.toNormalizedString().replace(/((^|:)(0(:|$))+)/, '::');
};
IPv6.prototype.toRFC5952String = function() {
var bestMatchIndex, bestMatchLength, match, regex, string;
regex = /((^|:)(0(:|$)){2,})/g;
string = this.toNormalizedString();
bestMatchIndex = 0;
bestMatchLength = -1;
while ((match = regex.exec(string))) {
if (match[0].length > bestMatchLength) {
bestMatchIndex = match.index;
bestMatchLength = match[0].length;
}
}
if (bestMatchLength < 0) {
return string;
}
return string.substring(0, bestMatchIndex) + '::' + string.substring(bestMatchIndex + bestMatchLength);
};
IPv6.prototype.toByteArray = function() {
var bytes, k, len, part, ref;
bytes = [];
ref = this.parts;
for (k = 0, len = ref.length; k < len; k++) {
part = ref[k];
bytes.push(part >> 8);
bytes.push(part & 0xff);
}
return bytes;
};
IPv6.prototype.toNormalizedString = function() {
var addr, part, suffix;
addr = ((function() {
var k, len, ref, results;
ref = this.parts;
results = [];
for (k = 0, len = ref.length; k < len; k++) {
part = ref[k];
results.push(part.toString(16));
}
return results;
}).call(this)).join(":");
suffix = '';
if (this.zoneId) {
suffix = '%' + this.zoneId;
}
return addr + suffix;
};
IPv6.prototype.toFixedLengthString = function() {
var addr, part, suffix;
addr = ((function() {
var k, len, ref, results;
ref = this.parts;
results = [];
for (k = 0, len = ref.length; k < len; k++) {
part = ref[k];
results.push(part.toString(16).padStart(4, '0'));
}
return results;
}).call(this)).join(":");
suffix = '';
if (this.zoneId) {
suffix = '%' + this.zoneId;
}
return addr + suffix;
};
IPv6.prototype.match = function(other, cidrRange) {
var ref;
if (cidrRange === void 0) {
ref = other, other = ref[0], cidrRange = ref[1];
}
if (other.kind() !== 'ipv6') {
throw new Error("ipaddr: cannot match ipv6 address with non-ipv6 one");
}
return matchCIDR(this.parts, other.parts, 16, cidrRange);
};
IPv6.prototype.SpecialRanges = {
unspecified: [new IPv6([0, 0, 0, 0, 0, 0, 0, 0]), 128],
linkLocal: [new IPv6([0xfe80, 0, 0, 0, 0, 0, 0, 0]), 10],
multicast: [new IPv6([0xff00, 0, 0, 0, 0, 0, 0, 0]), 8],
loopback: [new IPv6([0, 0, 0, 0, 0, 0, 0, 1]), 128],
uniqueLocal: [new IPv6([0xfc00, 0, 0, 0, 0, 0, 0, 0]), 7],
ipv4Mapped: [new IPv6([0, 0, 0, 0, 0, 0xffff, 0, 0]), 96],
rfc6145: [new IPv6([0, 0, 0, 0, 0xffff, 0, 0, 0]), 96],
rfc6052: [new IPv6([0x64, 0xff9b, 0, 0, 0, 0, 0, 0]), 96],
'6to4': [new IPv6([0x2002, 0, 0, 0, 0, 0, 0, 0]), 16],
teredo: [new IPv6([0x2001, 0, 0, 0, 0, 0, 0, 0]), 32],
reserved: [[new IPv6([0x2001, 0xdb8, 0, 0, 0, 0, 0, 0]), 32]]
};
IPv6.prototype.range = function() {
return ipaddr.subnetMatch(this, this.SpecialRanges);
};
IPv6.prototype.isIPv4MappedAddress = function() {
return this.range() === 'ipv4Mapped';
};
IPv6.prototype.toIPv4Address = function() {
var high, low, ref;
if (!this.isIPv4MappedAddress()) {
throw new Error("ipaddr: trying to convert a generic ipv6 address to ipv4");
}
ref = this.parts.slice(-2), high = ref[0], low = ref[1];
return new ipaddr.IPv4([high >> 8, high & 0xff, low >> 8, low & 0xff]);
};
IPv6.prototype.prefixLengthFromSubnetMask = function() {
var cidr, i, k, part, stop, zeros, zerotable;
zerotable = {
0: 16,
32768: 15,
49152: 14,
57344: 13,
61440: 12,
63488: 11,
64512: 10,
65024: 9,
65280: 8,
65408: 7,
65472: 6,
65504: 5,
65520: 4,
65528: 3,
65532: 2,
65534: 1,
65535: 0
};
cidr = 0;
stop = false;
for (i = k = 7; k >= 0; i = k += -1) {
part = this.parts[i];
if (part in zerotable) {
zeros = zerotable[part];
if (stop && zeros !== 0) {
return null;
}
if (zeros !== 16) {
stop = true;
}
cidr += zeros;
} else {
return null;
}
}
return 128 - cidr;
};
return IPv6;
})();
ipv6Part = "(?:[0-9a-f]+::?)+";
zoneIndex = "%[0-9a-z]{1,}";
ipv6Regexes = {
zoneIndex: new RegExp(zoneIndex, 'i'),
"native": new RegExp("^(::)?(" + ipv6Part + ")?([0-9a-f]+)?(::)?(" + zoneIndex + ")?$", 'i'),
transitional: new RegExp(("^((?:" + ipv6Part + ")|(?:::)(?:" + ipv6Part + ")?)") + (ipv4Part + "\\." + ipv4Part + "\\." + ipv4Part + "\\." + ipv4Part) + ("(" + zoneIndex + ")?$"), 'i')
};
expandIPv6 = function(string, parts) {
var colonCount, lastColon, part, replacement, replacementCount, zoneId;
if (string.indexOf('::') !== string.lastIndexOf('::')) {
return null;
}
zoneId = (string.match(ipv6Regexes['zoneIndex']) || [])[0];
if (zoneId) {
zoneId = zoneId.substring(1);
string = string.replace(/%.+$/, '');
}
colonCount = 0;
lastColon = -1;
while ((lastColon = string.indexOf(':', lastColon + 1)) >= 0) {
colonCount++;
}
if (string.substr(0, 2) === '::') {
colonCount--;
}
if (string.substr(-2, 2) === '::') {
colonCount--;
}
if (colonCount > parts) {
return null;
}
replacementCount = parts - colonCount;
replacement = ':';
while (replacementCount--) {
replacement += '0:';
}
string = string.replace('::', replacement);
if (string[0] === ':') {
string = string.slice(1);
}
if (string[string.length - 1] === ':') {
string = string.slice(0, -1);
}
parts = (function() {
var k, len, ref, results;
ref = string.split(":");
results = [];
for (k = 0, len = ref.length; k < len; k++) {
part = ref[k];
results.push(parseInt(part, 16));
}
return results;
})();
return {
parts: parts,
zoneId: zoneId
};
};
ipaddr.IPv6.parser = function(string) {
var addr, k, len, match, octet, octets, zoneId;
if (ipv6Regexes['native'].test(string)) {
return expandIPv6(string, 8);
} else if (match = string.match(ipv6Regexes['transitional'])) {
zoneId = match[6] || '';
addr = expandIPv6(match[1].slice(0, -1) + zoneId, 6);
if (addr.parts) {
octets = [parseInt(match[2]), parseInt(match[3]), parseInt(match[4]), parseInt(match[5])];
for (k = 0, len = octets.length; k < len; k++) {
octet = octets[k];
if (!((0 <= octet && octet <= 255))) {
return null;
}
}
addr.parts.push(octets[0] << 8 | octets[1]);
addr.parts.push(octets[2] << 8 | octets[3]);
return {
parts: addr.parts,
zoneId: addr.zoneId
};
}
}
return null;
};
ipaddr.IPv4.isIPv4 = ipaddr.IPv6.isIPv6 = function(string) {
return this.parser(string) !== null;
};
ipaddr.IPv4.isValid = function(string) {
var e;
try {
new this(this.parser(string));
return true;
} catch (error1) {
e = error1;
return false;
}
};
ipaddr.IPv4.isValidFourPartDecimal = function(string) {
if (ipaddr.IPv4.isValid(string) && string.match(/^(0|[1-9]\d*)(\.(0|[1-9]\d*)){3}$/)) {
return true;
} else {
return false;
}
};
ipaddr.IPv6.isValid = function(string) {
var addr, e;
if (typeof string === "string" && string.indexOf(":") === -1) {
return false;
}
try {
addr = this.parser(string);
new this(addr.parts, addr.zoneId);
return true;
} catch (error1) {
e = error1;
return false;
}
};
ipaddr.IPv4.parse = function(string) {
var parts;
parts = this.parser(string);
if (parts === null) {
throw new Error("ipaddr: string is not formatted like ip address");
}
return new this(parts);
};
ipaddr.IPv6.parse = function(string) {
var addr;
addr = this.parser(string);
if (addr.parts === null) {
throw new Error("ipaddr: string is not formatted like ip address");
}
return new this(addr.parts, addr.zoneId);
};
ipaddr.IPv4.parseCIDR = function(string) {
var maskLength, match, parsed;
if (match = string.match(/^(.+)\/(\d+)$/)) {
maskLength = parseInt(match[2]);
if (maskLength >= 0 && maskLength <= 32) {
parsed = [this.parse(match[1]), maskLength];
Object.defineProperty(parsed, 'toString', {
value: function() {
return this.join('/');
}
});
return parsed;
}
}
throw new Error("ipaddr: string is not formatted like an IPv4 CIDR range");
};
ipaddr.IPv4.subnetMaskFromPrefixLength = function(prefix) {
var filledOctetCount, j, octets;
prefix = parseInt(prefix);
if (prefix < 0 || prefix > 32) {
throw new Error('ipaddr: invalid IPv4 prefix length');
}
octets = [0, 0, 0, 0];
j = 0;
filledOctetCount = Math.floor(prefix / 8);
while (j < filledOctetCount) {
octets[j] = 255;
j++;
}
if (filledOctetCount < 4) {
octets[filledOctetCount] = Math.pow(2, prefix % 8) - 1 << 8 - (prefix % 8);
}
return new this(octets);
};
ipaddr.IPv4.broadcastAddressFromCIDR = function(string) {
var cidr, error, i, ipInterfaceOctets, octets, subnetMaskOctets;
try {
cidr = this.parseCIDR(string);
ipInterfaceOctets = cidr[0].toByteArray();
subnetMaskOctets = this.subnetMaskFromPrefixLength(cidr[1]).toByteArray();
octets = [];
i = 0;
while (i < 4) {
octets.push(parseInt(ipInterfaceOctets[i], 10) | parseInt(subnetMaskOctets[i], 10) ^ 255);
i++;
}
return new this(octets);
} catch (error1) {
error = error1;
throw new Error('ipaddr: the address does not have IPv4 CIDR format');
}
};
ipaddr.IPv4.networkAddressFromCIDR = function(string) {
var cidr, error, i, ipInterfaceOctets, octets, subnetMaskOctets;
try {
cidr = this.parseCIDR(string);
ipInterfaceOctets = cidr[0].toByteArray();
subnetMaskOctets = this.subnetMaskFromPrefixLength(cidr[1]).toByteArray();
octets = [];
i = 0;
while (i < 4) {
octets.push(parseInt(ipInterfaceOctets[i], 10) & parseInt(subnetMaskOctets[i], 10));
i++;
}
return new this(octets);
} catch (error1) {
error = error1;
throw new Error('ipaddr: the address does not have IPv4 CIDR format');
}
};
ipaddr.IPv6.parseCIDR = function(string) {
var maskLength, match, parsed;
if (match = string.match(/^(.+)\/(\d+)$/)) {
maskLength = parseInt(match[2]);
if (maskLength >= 0 && maskLength <= 128) {
parsed = [this.parse(match[1]), maskLength];
Object.defineProperty(parsed, 'toString', {
value: function() {
return this.join('/');
}
});
return parsed;
}
}
throw new Error("ipaddr: string is not formatted like an IPv6 CIDR range");
};
ipaddr.isValid = function(string) {
return ipaddr.IPv6.isValid(string) || ipaddr.IPv4.isValid(string);
};
ipaddr.parse = function(string) {
if (ipaddr.IPv6.isValid(string)) {
return ipaddr.IPv6.parse(string);
} else if (ipaddr.IPv4.isValid(string)) {
return ipaddr.IPv4.parse(string);
} else {
throw new Error("ipaddr: the address has neither IPv6 nor IPv4 format");
}
};
ipaddr.parseCIDR = function(string) {
var e;
try {
return ipaddr.IPv6.parseCIDR(string);
} catch (error1) {
e = error1;
try {
return ipaddr.IPv4.parseCIDR(string);
} catch (error1) {
e = error1;
throw new Error("ipaddr: the address has neither IPv6 nor IPv4 CIDR format");
}
}
};
ipaddr.fromByteArray = function(bytes) {
var length;
length = bytes.length;
if (length === 4) {
return new ipaddr.IPv4(bytes);
} else if (length === 16) {
return new ipaddr.IPv6(bytes);
} else {
throw new Error("ipaddr: the binary input is neither an IPv6 nor IPv4 address");
}
};
ipaddr.process = function(string) {
var addr;
addr = this.parse(string);
if (addr.kind() === 'ipv6' && addr.isIPv4MappedAddress()) {
return addr.toIPv4Address();
} else {
return addr;
}
};
}).call(this);
},{}]},{},[1]);

View File

@ -90,6 +90,14 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
</label> </label>
</p> </p>
<br /> <br />
<p>
<label id="local_hosts_skipping" style="font-weight: bold;"></label><br />
<label class="switch">
<input type="checkbox" id="localHostsSkipping">
<span class="slider round"></span>
</label>
</p>
<br />
<p> <p>
<label id="history_listener_enabled" style="font-weight: bold;"></label><br /> <label id="history_listener_enabled" style="font-weight: bold;"></label><br />
<label class="switch"> <label class="switch">

View File

@ -1,7 +1,7 @@
{ {
"manifest_version": 2, "manifest_version": 2,
"name": "ClearURLs", "name": "ClearURLs",
"version": "1.7.4", "version": "1.8.0",
"author": "Kevin R.", "author": "Kevin R.",
"description": "Remove tracking elements from URLs.", "description": "Remove tracking elements from URLs.",
"homepage_url": "https://gitlab.com/KevinRoebert/ClearUrls", "homepage_url": "https://gitlab.com/KevinRoebert/ClearUrls",
@ -65,7 +65,8 @@
"clearurls.js", "clearurls.js",
"core_js/pureCleaning.js", "core_js/pureCleaning.js",
"core_js/context_menu.js", "core_js/context_menu.js",
"core_js/historyListener.js" "core_js/historyListener.js",
"external_js/ip-range-check.js"
] ]
}, },
"content_scripts": [ "content_scripts": [

9473
package-lock.json generated Normal file

File diff suppressed because it is too large Load Diff

View File

@ -22,11 +22,12 @@
} }
], ],
"dependencies": { "dependencies": {
"twbs/bootstrap": "3.3.7",
"jquery/jquery": "3.2.1",
"orsozed/sha256.jquery.plugin": "1.0",
"DataTables/DataTables": "1.10.16", "DataTables/DataTables": "1.10.16",
"lauren/pick-a-color": "1.2.3" "ip-range-check": "^0.2.0",
"jquery/jquery": "3.2.1",
"lauren/pick-a-color": "1.2.3",
"orsozed/sha256.jquery.plugin": "1.0",
"twbs/bootstrap": "3.3.7"
}, },
"bugs": { "bugs": {
"web": "https://gitlab.com/KevinRoebert/ClearUrls/issues/new" "web": "https://gitlab.com/KevinRoebert/ClearUrls/issues/new"