Rietveld Code Review Tool
Help | Bug tracker | Discussion group | Source code

Side by Side Diff: assets/js/basedomain.js

Issue 8482109: ABP/Android JavaScript code (Closed)
Patch Set: ABP/Android JavaScript code Created Nov. 12, 2012, 9:32 a.m.
Left:
Right:
Use n/p to move between diff chunks; N/P to move between comments.
Jump to:
View unified diff | Download patch
OLDNEW
(Empty)
1 /*!
2 * Parts of original code from ipv6.js <https://github.com/beaugunderson/javascr ipt-ipv6>
3 * Copyright 2011 Beau Gunderson
4 * Available under MIT license <http://mths.be/mit>
5 */
6
7 const RE_V4 = /^(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?|0x[0-9a-f][0-9a-f]?|0 [0-7]{3})\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?|0x[0-9a-f][0-9a-f]?|0[0-7 ]{3})$/i;
8 const RE_V4_HEX = /^0x([0-9a-f]{8})$/i;
9 const RE_V4_NUMERIC = /^[0-9]+$/;
10 const RE_V4inV6 = /(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(?:25[0-5]|2 [0-4][0-9]|[01]?[0-9][0-9]?)$/;
11
12 const RE_BAD_CHARACTERS = /([^0-9a-f:])/i;
13 const RE_BAD_ADDRESS = /([0-9a-f]{5,}|:{3,}|[^:]:$|^:[^:]$)/i;
14
15 function isIPv4(address)
16 {
17 if (RE_V4.test(address))
18 return true;
19 if (RE_V4_HEX.test(address))
20 return true;
21 if (RE_V4_NUMERIC.test(address))
22 return true;
23 return false;
24 }
25
26 function isIPv6(address)
27 {
28 var a4addon = 0;
29 var address4 = address.match(RE_V4inV6);
30 if (address4)
31 {
32 var temp4 = address4[0].split('.');
33 for (var i = 0; i < 4; i++)
34 {
35 if (/^0[0-9]+/.test(temp4[i]))
36 return false;
37 }
38 address = address.replace(RE_V4inV6, '');
39 if (/[0-9]$/.test(address))
40 return false;
41
42 address = address + temp4.join(':');
43 a4addon = 2;
44 }
45
46 if (RE_BAD_CHARACTERS.test(address))
47 return false;
48
49 if (RE_BAD_ADDRESS.test(address))
50 return false;
51
52 function count(string, substring)
53 {
54 return (string.length - string.replace(new RegExp(substring,"g"), '').length ) / substring.length;
55 }
56
57 var halves = count(address, '::');
58 if (halves == 1 && count(address, ':') <= 6 + 2 + a4addon)
59 return true;
60 if (halves == 0 && count(address, ':') == 7 + a4addon)
61 return true;
62 return false;
63 }
64
65 // Returns base domain for specified host based on Public Suffix List
66 function getBaseDomain(hostname)
67 {
68 // remove trailing dot(s)
69 hostname = hostname.replace(/\.+$/, '');
70
71 // return IP address untouched
72 if (isIPv6(hostname) || isIPv4(hostname))
73 return hostname;
74
75 // decode punycode if exists
76 if (hostname.indexOf('xn--') >= 0)
77 {
78 hostname = punycode.toUnicode(hostname);
79 }
80
81 // search through PSL
82 var prevDomains = [];
83 var curDomain = hostname;
84 var nextDot = curDomain.indexOf('.');
85 var tld = 0;
86
87 while (true)
88 {
89 var suffix = publicSuffixes[curDomain];
90 if (typeof(suffix) != 'undefined')
91 {
92 tld = suffix;
93 break;
94 }
95
96 if (nextDot < 0)
97 {
98 tld = 1;
99 break;
100 }
101
102 prevDomains.push(curDomain.substring(0,nextDot));
103 curDomain = curDomain.substring(nextDot+1);
104 nextDot = curDomain.indexOf('.');
105 }
106
107 while (tld > 0 && prevDomains.length > 0)
108 {
109 curDomain = prevDomains.pop() + '.' + curDomain;
110 tld--;
111 }
112
113 return curDomain;
114 }
OLDNEW

Powered by Google App Engine
This is Rietveld