Version 1.8.0
This commit is contained in:
parent
9029781974
commit
d2ec7ce49e
16
CHANGELOG.md
16
CHANGELOG.md
|
@ -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/),
|
||||
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
|
||||
|
||||
### Compatibility note
|
||||
|
|
|
@ -230,5 +230,13 @@
|
|||
"cleaning_tool_clean_urls_label": {
|
||||
"message": "Hier finden Sie die gesäuberten URLs:",
|
||||
"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."
|
||||
}
|
||||
}
|
|
@ -230,5 +230,13 @@
|
|||
"cleaning_tool_clean_urls_label": {
|
||||
"message": "Here you can find the cleaned 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"
|
||||
}
|
||||
}
|
26
clearurls.js
26
clearurls.js
|
@ -48,6 +48,14 @@ function removeFieldsFormURL(provider, pureUrl)
|
|||
var cancel = false;
|
||||
var rawRules = provider.getRawRules();
|
||||
|
||||
if(storage.localHostsSkipping && checkLocalURL(pureUrl)) {
|
||||
return {
|
||||
"changes": false,
|
||||
"url": url,
|
||||
"cancel": false
|
||||
};
|
||||
}
|
||||
|
||||
/*
|
||||
* Apply raw rules to the URL.
|
||||
*/
|
||||
|
@ -66,8 +74,9 @@ function removeFieldsFormURL(provider, pureUrl)
|
|||
|
||||
increaseURLCounter();
|
||||
|
||||
if(!checkOSAndroid())
|
||||
{
|
||||
checkOSAndroid().then((res) => {
|
||||
if(!res) {
|
||||
|
||||
if(storage.badgedStatus) {
|
||||
browser.browserAction.setBadgeText({text: (++badges[tabid]).toString(), tabId: tabid});
|
||||
}
|
||||
|
@ -76,6 +85,7 @@ function removeFieldsFormURL(provider, pureUrl)
|
|||
browser.browserAction.setBadgeText({text: "", tabId: tabid});
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
changes = true;
|
||||
}
|
||||
|
@ -144,8 +154,9 @@ function removeFieldsFormURL(provider, pureUrl)
|
|||
|
||||
increaseURLCounter();
|
||||
|
||||
if(!checkOSAndroid())
|
||||
{
|
||||
checkOSAndroid().then((res) => {
|
||||
if(!res) {
|
||||
|
||||
if(storage.badgedStatus) {
|
||||
browser.browserAction.setBadgeText({text: (++badges[tabid]).toString(), tabId: tabid});
|
||||
}
|
||||
|
@ -154,6 +165,8 @@ function removeFieldsFormURL(provider, pureUrl)
|
|||
browser.browserAction.setBadgeText({text: "", tabId: tabid});
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
changes = true;
|
||||
}
|
||||
});
|
||||
|
@ -175,8 +188,8 @@ function removeFieldsFormURL(provider, pureUrl)
|
|||
|
||||
increaseURLCounter();
|
||||
|
||||
if(!checkOSAndroid())
|
||||
{
|
||||
checkOSAndroid().then((res) => {
|
||||
if(!res) {
|
||||
if(storage.badgedStatus) {
|
||||
browser.browserAction.setBadgeText({text: (++badges[tabid]).toString(), tabId: tabid});
|
||||
}
|
||||
|
@ -185,6 +198,7 @@ function removeFieldsFormURL(provider, pureUrl)
|
|||
browser.browserAction.setBadgeText({text: "", tabId: tabid});
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
cancel = true;
|
||||
}
|
||||
|
|
|
@ -26,6 +26,10 @@
|
|||
*/
|
||||
function pureCleaning(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++) {
|
||||
var result = {
|
||||
|
|
|
@ -110,8 +110,6 @@ function save()
|
|||
function: "reload",
|
||||
params: []
|
||||
}).then(handleResponse, handleError);
|
||||
|
||||
//location.reload();
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -159,12 +157,17 @@ function getData()
|
|||
params: ["historyListenerEnabled"]
|
||||
}).then((data) => {
|
||||
handleResponseData(data, "historyListenerEnabled", "historyListenerEnabled");
|
||||
browser.runtime.sendMessage({
|
||||
function: "getData",
|
||||
params: ["localHostsSkipping"]
|
||||
}).then((data) => {
|
||||
handleResponseData(data, "localHostsSkipping", "localHostsSkipping");
|
||||
changeSwitchButton("contextMenuEnabled", "contextMenuEnabled");
|
||||
changeSwitchButton("historyListenerEnabled", "historyListenerEnabled");
|
||||
changeSwitchButton("localHostsSkipping", "localHostsSkipping");
|
||||
}, handleError);
|
||||
}, handleError);
|
||||
}, handleError);
|
||||
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -184,6 +187,7 @@ function setText()
|
|||
$('#save_settings_btn').prop('title', translate('settings_html_save_button_title'));
|
||||
injectText("context_menu_enabled", "context_menu_enabled");
|
||||
$('#history_listener_enabled').html(translate('history_listener_enabled'));
|
||||
injectText("local_hosts_skipping", "local_hosts_skipping");
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
|
@ -160,6 +160,7 @@ function initSettings()
|
|||
storage.ruleURL = "https://gitlab.com/KevinRoebert/ClearUrls/raw/master/data/data.min.json";
|
||||
storage.contextMenuEnabled = true;
|
||||
storage.historyListenerEnabled = true;
|
||||
storage.localHostsSkipping = true;
|
||||
|
||||
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"];
|
||||
|
|
|
@ -67,10 +67,10 @@ function reload()
|
|||
* Check if it is an android device.
|
||||
* @return bool
|
||||
*/
|
||||
function checkOSAndroid()
|
||||
async function checkOSAndroid()
|
||||
{
|
||||
if(os === undefined || os === null || os === "") {
|
||||
chrome.runtime.getPlatformInfo(function(info) {
|
||||
await chrome.runtime.getPlatformInfo(function(info) {
|
||||
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.
|
||||
* @param {String} url URL as String
|
||||
|
@ -225,13 +250,15 @@ function increaseURLCounter()
|
|||
*/
|
||||
function changeIcon()
|
||||
{
|
||||
if(!checkOSAndroid()) {
|
||||
checkOSAndroid().then((res) => {
|
||||
if(!res) {
|
||||
if(storage.globalStatus){
|
||||
browser.browserAction.setIcon({path: "img/clearurls_128x128.png"});
|
||||
} else{
|
||||
browser.browserAction.setIcon({path: "img/clearurls_gray_128x128.png"});
|
||||
}
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -241,11 +268,13 @@ function changeIcon()
|
|||
*/
|
||||
function setBadgedStatus()
|
||||
{
|
||||
if(!checkOSAndroid() && storage.badgedStatus){
|
||||
checkOSAndroid().then((res) => {
|
||||
if(!res && storage.badgedStatus) {
|
||||
browser.browserAction.setBadgeBackgroundColor({
|
||||
'color': '#'+storage.badged_color
|
||||
});
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
750
external_js/ip-range-check.js
Normal file
750
external_js/ip-range-check.js
Normal 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]);
|
|
@ -90,6 +90,14 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|||
</label>
|
||||
</p>
|
||||
<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>
|
||||
<label id="history_listener_enabled" style="font-weight: bold;"></label><br />
|
||||
<label class="switch">
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
{
|
||||
"manifest_version": 2,
|
||||
"name": "ClearURLs",
|
||||
"version": "1.7.4",
|
||||
"version": "1.8.0",
|
||||
"author": "Kevin R.",
|
||||
"description": "Remove tracking elements from URLs.",
|
||||
"homepage_url": "https://gitlab.com/KevinRoebert/ClearUrls",
|
||||
|
@ -65,7 +65,8 @@
|
|||
"clearurls.js",
|
||||
"core_js/pureCleaning.js",
|
||||
"core_js/context_menu.js",
|
||||
"core_js/historyListener.js"
|
||||
"core_js/historyListener.js",
|
||||
"external_js/ip-range-check.js"
|
||||
]
|
||||
},
|
||||
"content_scripts": [
|
||||
|
|
9473
package-lock.json
generated
Normal file
9473
package-lock.json
generated
Normal file
File diff suppressed because it is too large
Load Diff
|
@ -22,11 +22,12 @@
|
|||
}
|
||||
],
|
||||
"dependencies": {
|
||||
"twbs/bootstrap": "3.3.7",
|
||||
"jquery/jquery": "3.2.1",
|
||||
"orsozed/sha256.jquery.plugin": "1.0",
|
||||
"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": {
|
||||
"web": "https://gitlab.com/KevinRoebert/ClearUrls/issues/new"
|
||||
|
|
Loading…
Reference in New Issue
Block a user