Software /
code /
prosody
Annotate
util/ip.lua @ 8068:5abb6bc45edd
Merge 0.10->trunk
author | Kim Alvefur <zash@zash.se> |
---|---|
date | Sun, 09 Apr 2017 01:25:58 +0200 |
parent | 7486:c415a3fd4485 |
child | 8382:e5d00bf4a4d5 |
rev | line source |
---|---|
4419
b1e49cc314cb
util.ip: New module containing IP related functions
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff
changeset
|
1 -- Prosody IM |
b1e49cc314cb
util.ip: New module containing IP related functions
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff
changeset
|
2 -- Copyright (C) 2008-2011 Florian Zeitz |
b1e49cc314cb
util.ip: New module containing IP related functions
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff
changeset
|
3 -- |
b1e49cc314cb
util.ip: New module containing IP related functions
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff
changeset
|
4 -- This project is MIT/X11 licensed. Please see the |
b1e49cc314cb
util.ip: New module containing IP related functions
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff
changeset
|
5 -- COPYING file in the source package for more information. |
b1e49cc314cb
util.ip: New module containing IP related functions
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff
changeset
|
6 -- |
b1e49cc314cb
util.ip: New module containing IP related functions
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff
changeset
|
7 |
b1e49cc314cb
util.ip: New module containing IP related functions
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff
changeset
|
8 local ip_methods = {}; |
b1e49cc314cb
util.ip: New module containing IP related functions
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff
changeset
|
9 local ip_mt = { __index = function (ip, key) return (ip_methods[key])(ip); end, |
b1e49cc314cb
util.ip: New module containing IP related functions
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff
changeset
|
10 __tostring = function (ip) return ip.addr; end, |
b1e49cc314cb
util.ip: New module containing IP related functions
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff
changeset
|
11 __eq = function (ipA, ipB) return ipA.addr == ipB.addr; end}; |
b1e49cc314cb
util.ip: New module containing IP related functions
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff
changeset
|
12 local hex2bits = { ["0"] = "0000", ["1"] = "0001", ["2"] = "0010", ["3"] = "0011", ["4"] = "0100", ["5"] = "0101", ["6"] = "0110", ["7"] = "0111", ["8"] = "1000", ["9"] = "1001", ["A"] = "1010", ["B"] = "1011", ["C"] = "1100", ["D"] = "1101", ["E"] = "1110", ["F"] = "1111" }; |
b1e49cc314cb
util.ip: New module containing IP related functions
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff
changeset
|
13 |
b1e49cc314cb
util.ip: New module containing IP related functions
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff
changeset
|
14 local function new_ip(ipStr, proto) |
7052
306aabf2d57d
util.ip: Automatically determine protocol of IP address if none specified. Return error if invalid. [Backported from 0.10]
Matthew Wild <mwild1@gmail.com>
parents:
5597
diff
changeset
|
15 if not proto then |
306aabf2d57d
util.ip: Automatically determine protocol of IP address if none specified. Return error if invalid. [Backported from 0.10]
Matthew Wild <mwild1@gmail.com>
parents:
5597
diff
changeset
|
16 local sep = ipStr:match("^%x+(.)"); |
7053
3049137d14b6
util.ip: Fix protocol detection of IPv6 addresses beginning with : [Backported from 0.10]
Matthew Wild <mwild1@gmail.com>
parents:
7052
diff
changeset
|
17 if sep == ":" or (not(sep) and ipStr:sub(1,1) == ":") then |
3049137d14b6
util.ip: Fix protocol detection of IPv6 addresses beginning with : [Backported from 0.10]
Matthew Wild <mwild1@gmail.com>
parents:
7052
diff
changeset
|
18 proto = "IPv6" |
3049137d14b6
util.ip: Fix protocol detection of IPv6 addresses beginning with : [Backported from 0.10]
Matthew Wild <mwild1@gmail.com>
parents:
7052
diff
changeset
|
19 elseif sep == "." then |
3049137d14b6
util.ip: Fix protocol detection of IPv6 addresses beginning with : [Backported from 0.10]
Matthew Wild <mwild1@gmail.com>
parents:
7052
diff
changeset
|
20 proto = "IPv4" |
7052
306aabf2d57d
util.ip: Automatically determine protocol of IP address if none specified. Return error if invalid. [Backported from 0.10]
Matthew Wild <mwild1@gmail.com>
parents:
5597
diff
changeset
|
21 end |
306aabf2d57d
util.ip: Automatically determine protocol of IP address if none specified. Return error if invalid. [Backported from 0.10]
Matthew Wild <mwild1@gmail.com>
parents:
5597
diff
changeset
|
22 if not proto then |
306aabf2d57d
util.ip: Automatically determine protocol of IP address if none specified. Return error if invalid. [Backported from 0.10]
Matthew Wild <mwild1@gmail.com>
parents:
5597
diff
changeset
|
23 return nil, "invalid address"; |
306aabf2d57d
util.ip: Automatically determine protocol of IP address if none specified. Return error if invalid. [Backported from 0.10]
Matthew Wild <mwild1@gmail.com>
parents:
5597
diff
changeset
|
24 end |
306aabf2d57d
util.ip: Automatically determine protocol of IP address if none specified. Return error if invalid. [Backported from 0.10]
Matthew Wild <mwild1@gmail.com>
parents:
5597
diff
changeset
|
25 elseif proto ~= "IPv4" and proto ~= "IPv6" then |
4419
b1e49cc314cb
util.ip: New module containing IP related functions
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff
changeset
|
26 return nil, "invalid protocol"; |
b1e49cc314cb
util.ip: New module containing IP related functions
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff
changeset
|
27 end |
7055
23de70d19e77
util.ip: Support zone id syntax in IPv6 addresses
Kim Alvefur <zash@zash.se>
parents:
7053
diff
changeset
|
28 local zone; |
23de70d19e77
util.ip: Support zone id syntax in IPv6 addresses
Kim Alvefur <zash@zash.se>
parents:
7053
diff
changeset
|
29 if proto == "IPv6" and ipStr:find('%', 1, true) then |
23de70d19e77
util.ip: Support zone id syntax in IPv6 addresses
Kim Alvefur <zash@zash.se>
parents:
7053
diff
changeset
|
30 ipStr, zone = ipStr:match("^(.-)%%(.*)"); |
23de70d19e77
util.ip: Support zone id syntax in IPv6 addresses
Kim Alvefur <zash@zash.se>
parents:
7053
diff
changeset
|
31 end |
5597
6fe09707c73b
util.ip: Convert IPv4 mapped addresses to hex.
Kim Alvefur <zash@zash.se>
parents:
5552
diff
changeset
|
32 if proto == "IPv6" and ipStr:find('.', 1, true) then |
6fe09707c73b
util.ip: Convert IPv4 mapped addresses to hex.
Kim Alvefur <zash@zash.se>
parents:
5552
diff
changeset
|
33 local changed; |
6fe09707c73b
util.ip: Convert IPv4 mapped addresses to hex.
Kim Alvefur <zash@zash.se>
parents:
5552
diff
changeset
|
34 ipStr, changed = ipStr:gsub(":(%d+)%.(%d+)%.(%d+)%.(%d+)$", function(a,b,c,d) |
6fe09707c73b
util.ip: Convert IPv4 mapped addresses to hex.
Kim Alvefur <zash@zash.se>
parents:
5552
diff
changeset
|
35 return (":%04X:%04X"):format(a*256+b,c*256+d); |
6fe09707c73b
util.ip: Convert IPv4 mapped addresses to hex.
Kim Alvefur <zash@zash.se>
parents:
5552
diff
changeset
|
36 end); |
6fe09707c73b
util.ip: Convert IPv4 mapped addresses to hex.
Kim Alvefur <zash@zash.se>
parents:
5552
diff
changeset
|
37 if changed ~= 1 then return nil, "invalid-address"; end |
6fe09707c73b
util.ip: Convert IPv4 mapped addresses to hex.
Kim Alvefur <zash@zash.se>
parents:
5552
diff
changeset
|
38 end |
4419
b1e49cc314cb
util.ip: New module containing IP related functions
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff
changeset
|
39 |
7055
23de70d19e77
util.ip: Support zone id syntax in IPv6 addresses
Kim Alvefur <zash@zash.se>
parents:
7053
diff
changeset
|
40 return setmetatable({ addr = ipStr, proto = proto, zone = zone }, ip_mt); |
4419
b1e49cc314cb
util.ip: New module containing IP related functions
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff
changeset
|
41 end |
b1e49cc314cb
util.ip: New module containing IP related functions
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff
changeset
|
42 |
b1e49cc314cb
util.ip: New module containing IP related functions
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff
changeset
|
43 local function toBits(ip) |
b1e49cc314cb
util.ip: New module containing IP related functions
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff
changeset
|
44 local result = ""; |
b1e49cc314cb
util.ip: New module containing IP related functions
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff
changeset
|
45 local fields = {}; |
b1e49cc314cb
util.ip: New module containing IP related functions
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff
changeset
|
46 if ip.proto == "IPv4" then |
b1e49cc314cb
util.ip: New module containing IP related functions
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff
changeset
|
47 ip = ip.toV4mapped; |
b1e49cc314cb
util.ip: New module containing IP related functions
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff
changeset
|
48 end |
b1e49cc314cb
util.ip: New module containing IP related functions
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff
changeset
|
49 ip = (ip.addr):upper(); |
b1e49cc314cb
util.ip: New module containing IP related functions
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff
changeset
|
50 ip:gsub("([^:]*):?", function (c) fields[#fields + 1] = c end); |
b1e49cc314cb
util.ip: New module containing IP related functions
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff
changeset
|
51 if not ip:match(":$") then fields[#fields] = nil; end |
b1e49cc314cb
util.ip: New module containing IP related functions
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff
changeset
|
52 for i, field in ipairs(fields) do |
b1e49cc314cb
util.ip: New module containing IP related functions
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff
changeset
|
53 if field:len() == 0 and i ~= 1 and i ~= #fields then |
7481
b3a864df32ef
util.ip: remove unused one-letter loop variables [luacheck]
Anton Shestakov <av6@dwimlabs.net>
parents:
7061
diff
changeset
|
54 for _ = 1, 16 * (9 - #fields) do |
4419
b1e49cc314cb
util.ip: New module containing IP related functions
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff
changeset
|
55 result = result .. "0"; |
b1e49cc314cb
util.ip: New module containing IP related functions
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff
changeset
|
56 end |
b1e49cc314cb
util.ip: New module containing IP related functions
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff
changeset
|
57 else |
7481
b3a864df32ef
util.ip: remove unused one-letter loop variables [luacheck]
Anton Shestakov <av6@dwimlabs.net>
parents:
7061
diff
changeset
|
58 for _ = 1, 4 - field:len() do |
4419
b1e49cc314cb
util.ip: New module containing IP related functions
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff
changeset
|
59 result = result .. "0000"; |
b1e49cc314cb
util.ip: New module containing IP related functions
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff
changeset
|
60 end |
7486
c415a3fd4485
util.ip: rename variable (i is already defined) [luacheck]
Anton Shestakov <av6@dwimlabs.net>
parents:
7481
diff
changeset
|
61 for j = 1, field:len() do |
c415a3fd4485
util.ip: rename variable (i is already defined) [luacheck]
Anton Shestakov <av6@dwimlabs.net>
parents:
7481
diff
changeset
|
62 result = result .. hex2bits[field:sub(j, j)]; |
4419
b1e49cc314cb
util.ip: New module containing IP related functions
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff
changeset
|
63 end |
b1e49cc314cb
util.ip: New module containing IP related functions
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff
changeset
|
64 end |
b1e49cc314cb
util.ip: New module containing IP related functions
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff
changeset
|
65 end |
b1e49cc314cb
util.ip: New module containing IP related functions
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff
changeset
|
66 return result; |
b1e49cc314cb
util.ip: New module containing IP related functions
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff
changeset
|
67 end |
b1e49cc314cb
util.ip: New module containing IP related functions
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff
changeset
|
68 |
b1e49cc314cb
util.ip: New module containing IP related functions
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff
changeset
|
69 local function commonPrefixLength(ipA, ipB) |
b1e49cc314cb
util.ip: New module containing IP related functions
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff
changeset
|
70 ipA, ipB = toBits(ipA), toBits(ipB); |
b1e49cc314cb
util.ip: New module containing IP related functions
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff
changeset
|
71 for i = 1, 128 do |
b1e49cc314cb
util.ip: New module containing IP related functions
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff
changeset
|
72 if ipA:sub(i,i) ~= ipB:sub(i,i) then |
b1e49cc314cb
util.ip: New module containing IP related functions
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff
changeset
|
73 return i-1; |
b1e49cc314cb
util.ip: New module containing IP related functions
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff
changeset
|
74 end |
b1e49cc314cb
util.ip: New module containing IP related functions
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff
changeset
|
75 end |
b1e49cc314cb
util.ip: New module containing IP related functions
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff
changeset
|
76 return 128; |
b1e49cc314cb
util.ip: New module containing IP related functions
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff
changeset
|
77 end |
b1e49cc314cb
util.ip: New module containing IP related functions
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff
changeset
|
78 |
b1e49cc314cb
util.ip: New module containing IP related functions
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff
changeset
|
79 local function v4scope(ip) |
b1e49cc314cb
util.ip: New module containing IP related functions
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff
changeset
|
80 local fields = {}; |
b1e49cc314cb
util.ip: New module containing IP related functions
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff
changeset
|
81 ip:gsub("([^.]*).?", function (c) fields[#fields + 1] = tonumber(c) end); |
b1e49cc314cb
util.ip: New module containing IP related functions
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff
changeset
|
82 -- Loopback: |
b1e49cc314cb
util.ip: New module containing IP related functions
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff
changeset
|
83 if fields[1] == 127 then |
b1e49cc314cb
util.ip: New module containing IP related functions
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff
changeset
|
84 return 0x2; |
b1e49cc314cb
util.ip: New module containing IP related functions
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff
changeset
|
85 -- Link-local unicast: |
b1e49cc314cb
util.ip: New module containing IP related functions
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff
changeset
|
86 elseif fields[1] == 169 and fields[2] == 254 then |
b1e49cc314cb
util.ip: New module containing IP related functions
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff
changeset
|
87 return 0x2; |
b1e49cc314cb
util.ip: New module containing IP related functions
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff
changeset
|
88 -- Global unicast: |
b1e49cc314cb
util.ip: New module containing IP related functions
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff
changeset
|
89 else |
b1e49cc314cb
util.ip: New module containing IP related functions
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff
changeset
|
90 return 0xE; |
b1e49cc314cb
util.ip: New module containing IP related functions
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff
changeset
|
91 end |
b1e49cc314cb
util.ip: New module containing IP related functions
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff
changeset
|
92 end |
b1e49cc314cb
util.ip: New module containing IP related functions
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff
changeset
|
93 |
b1e49cc314cb
util.ip: New module containing IP related functions
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff
changeset
|
94 local function v6scope(ip) |
b1e49cc314cb
util.ip: New module containing IP related functions
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff
changeset
|
95 -- Loopback: |
b1e49cc314cb
util.ip: New module containing IP related functions
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff
changeset
|
96 if ip:match("^[0:]*1$") then |
b1e49cc314cb
util.ip: New module containing IP related functions
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff
changeset
|
97 return 0x2; |
b1e49cc314cb
util.ip: New module containing IP related functions
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff
changeset
|
98 -- Link-local unicast: |
5776
bd0ff8ae98a8
Remove all trailing whitespace
Florian Zeitz <florob@babelmonkeys.de>
parents:
5608
diff
changeset
|
99 elseif ip:match("^[Ff][Ee][89ABab]") then |
4419
b1e49cc314cb
util.ip: New module containing IP related functions
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff
changeset
|
100 return 0x2; |
b1e49cc314cb
util.ip: New module containing IP related functions
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff
changeset
|
101 -- Site-local unicast: |
b1e49cc314cb
util.ip: New module containing IP related functions
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff
changeset
|
102 elseif ip:match("^[Ff][Ee][CcDdEeFf]") then |
b1e49cc314cb
util.ip: New module containing IP related functions
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff
changeset
|
103 return 0x5; |
b1e49cc314cb
util.ip: New module containing IP related functions
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff
changeset
|
104 -- Multicast: |
b1e49cc314cb
util.ip: New module containing IP related functions
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff
changeset
|
105 elseif ip:match("^[Ff][Ff]") then |
b1e49cc314cb
util.ip: New module containing IP related functions
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff
changeset
|
106 return tonumber("0x"..ip:sub(4,4)); |
b1e49cc314cb
util.ip: New module containing IP related functions
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff
changeset
|
107 -- Global unicast: |
b1e49cc314cb
util.ip: New module containing IP related functions
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff
changeset
|
108 else |
b1e49cc314cb
util.ip: New module containing IP related functions
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff
changeset
|
109 return 0xE; |
b1e49cc314cb
util.ip: New module containing IP related functions
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff
changeset
|
110 end |
b1e49cc314cb
util.ip: New module containing IP related functions
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff
changeset
|
111 end |
b1e49cc314cb
util.ip: New module containing IP related functions
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff
changeset
|
112 |
b1e49cc314cb
util.ip: New module containing IP related functions
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff
changeset
|
113 local function label(ip) |
b1e49cc314cb
util.ip: New module containing IP related functions
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff
changeset
|
114 if commonPrefixLength(ip, new_ip("::1", "IPv6")) == 128 then |
b1e49cc314cb
util.ip: New module containing IP related functions
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff
changeset
|
115 return 0; |
b1e49cc314cb
util.ip: New module containing IP related functions
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff
changeset
|
116 elseif commonPrefixLength(ip, new_ip("2002::", "IPv6")) >= 16 then |
b1e49cc314cb
util.ip: New module containing IP related functions
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff
changeset
|
117 return 2; |
5552
40e7a6cf15ff
util.rfc{3484,6724}: Update to RFC 6724
Florian Zeitz <florob@babelmonkeys.de>
parents:
4433
diff
changeset
|
118 elseif commonPrefixLength(ip, new_ip("2001::", "IPv6")) >= 32 then |
40e7a6cf15ff
util.rfc{3484,6724}: Update to RFC 6724
Florian Zeitz <florob@babelmonkeys.de>
parents:
4433
diff
changeset
|
119 return 5; |
40e7a6cf15ff
util.rfc{3484,6724}: Update to RFC 6724
Florian Zeitz <florob@babelmonkeys.de>
parents:
4433
diff
changeset
|
120 elseif commonPrefixLength(ip, new_ip("fc00::", "IPv6")) >= 7 then |
40e7a6cf15ff
util.rfc{3484,6724}: Update to RFC 6724
Florian Zeitz <florob@babelmonkeys.de>
parents:
4433
diff
changeset
|
121 return 13; |
40e7a6cf15ff
util.rfc{3484,6724}: Update to RFC 6724
Florian Zeitz <florob@babelmonkeys.de>
parents:
4433
diff
changeset
|
122 elseif commonPrefixLength(ip, new_ip("fec0::", "IPv6")) >= 10 then |
40e7a6cf15ff
util.rfc{3484,6724}: Update to RFC 6724
Florian Zeitz <florob@babelmonkeys.de>
parents:
4433
diff
changeset
|
123 return 11; |
40e7a6cf15ff
util.rfc{3484,6724}: Update to RFC 6724
Florian Zeitz <florob@babelmonkeys.de>
parents:
4433
diff
changeset
|
124 elseif commonPrefixLength(ip, new_ip("3ffe::", "IPv6")) >= 16 then |
40e7a6cf15ff
util.rfc{3484,6724}: Update to RFC 6724
Florian Zeitz <florob@babelmonkeys.de>
parents:
4433
diff
changeset
|
125 return 12; |
4419
b1e49cc314cb
util.ip: New module containing IP related functions
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff
changeset
|
126 elseif commonPrefixLength(ip, new_ip("::", "IPv6")) >= 96 then |
b1e49cc314cb
util.ip: New module containing IP related functions
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff
changeset
|
127 return 3; |
b1e49cc314cb
util.ip: New module containing IP related functions
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff
changeset
|
128 elseif commonPrefixLength(ip, new_ip("::ffff:0:0", "IPv6")) >= 96 then |
b1e49cc314cb
util.ip: New module containing IP related functions
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff
changeset
|
129 return 4; |
b1e49cc314cb
util.ip: New module containing IP related functions
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff
changeset
|
130 else |
b1e49cc314cb
util.ip: New module containing IP related functions
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff
changeset
|
131 return 1; |
b1e49cc314cb
util.ip: New module containing IP related functions
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff
changeset
|
132 end |
b1e49cc314cb
util.ip: New module containing IP related functions
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff
changeset
|
133 end |
b1e49cc314cb
util.ip: New module containing IP related functions
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff
changeset
|
134 |
b1e49cc314cb
util.ip: New module containing IP related functions
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff
changeset
|
135 local function precedence(ip) |
b1e49cc314cb
util.ip: New module containing IP related functions
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff
changeset
|
136 if commonPrefixLength(ip, new_ip("::1", "IPv6")) == 128 then |
b1e49cc314cb
util.ip: New module containing IP related functions
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff
changeset
|
137 return 50; |
b1e49cc314cb
util.ip: New module containing IP related functions
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff
changeset
|
138 elseif commonPrefixLength(ip, new_ip("2002::", "IPv6")) >= 16 then |
b1e49cc314cb
util.ip: New module containing IP related functions
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff
changeset
|
139 return 30; |
5552
40e7a6cf15ff
util.rfc{3484,6724}: Update to RFC 6724
Florian Zeitz <florob@babelmonkeys.de>
parents:
4433
diff
changeset
|
140 elseif commonPrefixLength(ip, new_ip("2001::", "IPv6")) >= 32 then |
40e7a6cf15ff
util.rfc{3484,6724}: Update to RFC 6724
Florian Zeitz <florob@babelmonkeys.de>
parents:
4433
diff
changeset
|
141 return 5; |
40e7a6cf15ff
util.rfc{3484,6724}: Update to RFC 6724
Florian Zeitz <florob@babelmonkeys.de>
parents:
4433
diff
changeset
|
142 elseif commonPrefixLength(ip, new_ip("fc00::", "IPv6")) >= 7 then |
40e7a6cf15ff
util.rfc{3484,6724}: Update to RFC 6724
Florian Zeitz <florob@babelmonkeys.de>
parents:
4433
diff
changeset
|
143 return 3; |
40e7a6cf15ff
util.rfc{3484,6724}: Update to RFC 6724
Florian Zeitz <florob@babelmonkeys.de>
parents:
4433
diff
changeset
|
144 elseif commonPrefixLength(ip, new_ip("fec0::", "IPv6")) >= 10 then |
40e7a6cf15ff
util.rfc{3484,6724}: Update to RFC 6724
Florian Zeitz <florob@babelmonkeys.de>
parents:
4433
diff
changeset
|
145 return 1; |
40e7a6cf15ff
util.rfc{3484,6724}: Update to RFC 6724
Florian Zeitz <florob@babelmonkeys.de>
parents:
4433
diff
changeset
|
146 elseif commonPrefixLength(ip, new_ip("3ffe::", "IPv6")) >= 16 then |
40e7a6cf15ff
util.rfc{3484,6724}: Update to RFC 6724
Florian Zeitz <florob@babelmonkeys.de>
parents:
4433
diff
changeset
|
147 return 1; |
4419
b1e49cc314cb
util.ip: New module containing IP related functions
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff
changeset
|
148 elseif commonPrefixLength(ip, new_ip("::", "IPv6")) >= 96 then |
5552
40e7a6cf15ff
util.rfc{3484,6724}: Update to RFC 6724
Florian Zeitz <florob@babelmonkeys.de>
parents:
4433
diff
changeset
|
149 return 1; |
4419
b1e49cc314cb
util.ip: New module containing IP related functions
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff
changeset
|
150 elseif commonPrefixLength(ip, new_ip("::ffff:0:0", "IPv6")) >= 96 then |
5552
40e7a6cf15ff
util.rfc{3484,6724}: Update to RFC 6724
Florian Zeitz <florob@babelmonkeys.de>
parents:
4433
diff
changeset
|
151 return 35; |
4419
b1e49cc314cb
util.ip: New module containing IP related functions
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff
changeset
|
152 else |
b1e49cc314cb
util.ip: New module containing IP related functions
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff
changeset
|
153 return 40; |
b1e49cc314cb
util.ip: New module containing IP related functions
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff
changeset
|
154 end |
b1e49cc314cb
util.ip: New module containing IP related functions
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff
changeset
|
155 end |
b1e49cc314cb
util.ip: New module containing IP related functions
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff
changeset
|
156 |
b1e49cc314cb
util.ip: New module containing IP related functions
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff
changeset
|
157 local function toV4mapped(ip) |
b1e49cc314cb
util.ip: New module containing IP related functions
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff
changeset
|
158 local fields = {}; |
b1e49cc314cb
util.ip: New module containing IP related functions
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff
changeset
|
159 local ret = "::ffff:"; |
b1e49cc314cb
util.ip: New module containing IP related functions
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff
changeset
|
160 ip:gsub("([^.]*).?", function (c) fields[#fields + 1] = tonumber(c) end); |
b1e49cc314cb
util.ip: New module containing IP related functions
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff
changeset
|
161 ret = ret .. ("%02x"):format(fields[1]); |
b1e49cc314cb
util.ip: New module containing IP related functions
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff
changeset
|
162 ret = ret .. ("%02x"):format(fields[2]); |
b1e49cc314cb
util.ip: New module containing IP related functions
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff
changeset
|
163 ret = ret .. ":" |
b1e49cc314cb
util.ip: New module containing IP related functions
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff
changeset
|
164 ret = ret .. ("%02x"):format(fields[3]); |
b1e49cc314cb
util.ip: New module containing IP related functions
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff
changeset
|
165 ret = ret .. ("%02x"):format(fields[4]); |
b1e49cc314cb
util.ip: New module containing IP related functions
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff
changeset
|
166 return new_ip(ret, "IPv6"); |
b1e49cc314cb
util.ip: New module containing IP related functions
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff
changeset
|
167 end |
b1e49cc314cb
util.ip: New module containing IP related functions
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff
changeset
|
168 |
b1e49cc314cb
util.ip: New module containing IP related functions
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff
changeset
|
169 function ip_methods:toV4mapped() |
b1e49cc314cb
util.ip: New module containing IP related functions
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff
changeset
|
170 if self.proto ~= "IPv4" then return nil, "No IPv4 address" end |
b1e49cc314cb
util.ip: New module containing IP related functions
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff
changeset
|
171 local value = toV4mapped(self.addr); |
b1e49cc314cb
util.ip: New module containing IP related functions
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff
changeset
|
172 self.toV4mapped = value; |
b1e49cc314cb
util.ip: New module containing IP related functions
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff
changeset
|
173 return value; |
b1e49cc314cb
util.ip: New module containing IP related functions
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff
changeset
|
174 end |
b1e49cc314cb
util.ip: New module containing IP related functions
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff
changeset
|
175 |
b1e49cc314cb
util.ip: New module containing IP related functions
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff
changeset
|
176 function ip_methods:label() |
b1e49cc314cb
util.ip: New module containing IP related functions
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff
changeset
|
177 local value; |
b1e49cc314cb
util.ip: New module containing IP related functions
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff
changeset
|
178 if self.proto == "IPv4" then |
b1e49cc314cb
util.ip: New module containing IP related functions
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff
changeset
|
179 value = label(self.toV4mapped); |
b1e49cc314cb
util.ip: New module containing IP related functions
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff
changeset
|
180 else |
b1e49cc314cb
util.ip: New module containing IP related functions
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff
changeset
|
181 value = label(self); |
b1e49cc314cb
util.ip: New module containing IP related functions
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff
changeset
|
182 end |
b1e49cc314cb
util.ip: New module containing IP related functions
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff
changeset
|
183 self.label = value; |
b1e49cc314cb
util.ip: New module containing IP related functions
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff
changeset
|
184 return value; |
b1e49cc314cb
util.ip: New module containing IP related functions
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff
changeset
|
185 end |
b1e49cc314cb
util.ip: New module containing IP related functions
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff
changeset
|
186 |
b1e49cc314cb
util.ip: New module containing IP related functions
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff
changeset
|
187 function ip_methods:precedence() |
b1e49cc314cb
util.ip: New module containing IP related functions
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff
changeset
|
188 local value; |
b1e49cc314cb
util.ip: New module containing IP related functions
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff
changeset
|
189 if self.proto == "IPv4" then |
b1e49cc314cb
util.ip: New module containing IP related functions
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff
changeset
|
190 value = precedence(self.toV4mapped); |
b1e49cc314cb
util.ip: New module containing IP related functions
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff
changeset
|
191 else |
b1e49cc314cb
util.ip: New module containing IP related functions
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff
changeset
|
192 value = precedence(self); |
b1e49cc314cb
util.ip: New module containing IP related functions
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff
changeset
|
193 end |
b1e49cc314cb
util.ip: New module containing IP related functions
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff
changeset
|
194 self.precedence = value; |
b1e49cc314cb
util.ip: New module containing IP related functions
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff
changeset
|
195 return value; |
b1e49cc314cb
util.ip: New module containing IP related functions
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff
changeset
|
196 end |
b1e49cc314cb
util.ip: New module containing IP related functions
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff
changeset
|
197 |
b1e49cc314cb
util.ip: New module containing IP related functions
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff
changeset
|
198 function ip_methods:scope() |
b1e49cc314cb
util.ip: New module containing IP related functions
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff
changeset
|
199 local value; |
b1e49cc314cb
util.ip: New module containing IP related functions
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff
changeset
|
200 if self.proto == "IPv4" then |
b1e49cc314cb
util.ip: New module containing IP related functions
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff
changeset
|
201 value = v4scope(self.addr); |
b1e49cc314cb
util.ip: New module containing IP related functions
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff
changeset
|
202 else |
b1e49cc314cb
util.ip: New module containing IP related functions
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff
changeset
|
203 value = v6scope(self.addr); |
b1e49cc314cb
util.ip: New module containing IP related functions
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff
changeset
|
204 end |
b1e49cc314cb
util.ip: New module containing IP related functions
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff
changeset
|
205 self.scope = value; |
b1e49cc314cb
util.ip: New module containing IP related functions
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff
changeset
|
206 return value; |
b1e49cc314cb
util.ip: New module containing IP related functions
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff
changeset
|
207 end |
b1e49cc314cb
util.ip: New module containing IP related functions
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff
changeset
|
208 |
5588
8c1a3243d16f
util.ip: Add 'private' method/property to determine whether an IP address is generally expected to be internet-routeable (YMMV)
Matthew Wild <mwild1@gmail.com>
parents:
5587
diff
changeset
|
209 function ip_methods:private() |
8c1a3243d16f
util.ip: Add 'private' method/property to determine whether an IP address is generally expected to be internet-routeable (YMMV)
Matthew Wild <mwild1@gmail.com>
parents:
5587
diff
changeset
|
210 local private = self.scope ~= 0xE; |
8c1a3243d16f
util.ip: Add 'private' method/property to determine whether an IP address is generally expected to be internet-routeable (YMMV)
Matthew Wild <mwild1@gmail.com>
parents:
5587
diff
changeset
|
211 if not private and self.proto == "IPv4" then |
8c1a3243d16f
util.ip: Add 'private' method/property to determine whether an IP address is generally expected to be internet-routeable (YMMV)
Matthew Wild <mwild1@gmail.com>
parents:
5587
diff
changeset
|
212 local ip = self.addr; |
8c1a3243d16f
util.ip: Add 'private' method/property to determine whether an IP address is generally expected to be internet-routeable (YMMV)
Matthew Wild <mwild1@gmail.com>
parents:
5587
diff
changeset
|
213 local fields = {}; |
8c1a3243d16f
util.ip: Add 'private' method/property to determine whether an IP address is generally expected to be internet-routeable (YMMV)
Matthew Wild <mwild1@gmail.com>
parents:
5587
diff
changeset
|
214 ip:gsub("([^.]*).?", function (c) fields[#fields + 1] = tonumber(c) end); |
8c1a3243d16f
util.ip: Add 'private' method/property to determine whether an IP address is generally expected to be internet-routeable (YMMV)
Matthew Wild <mwild1@gmail.com>
parents:
5587
diff
changeset
|
215 if fields[1] == 127 or fields[1] == 10 or (fields[1] == 192 and fields[2] == 168) |
8c1a3243d16f
util.ip: Add 'private' method/property to determine whether an IP address is generally expected to be internet-routeable (YMMV)
Matthew Wild <mwild1@gmail.com>
parents:
5587
diff
changeset
|
216 or (fields[1] == 172 and (fields[2] >= 16 or fields[2] <= 32)) then |
8c1a3243d16f
util.ip: Add 'private' method/property to determine whether an IP address is generally expected to be internet-routeable (YMMV)
Matthew Wild <mwild1@gmail.com>
parents:
5587
diff
changeset
|
217 private = true; |
8c1a3243d16f
util.ip: Add 'private' method/property to determine whether an IP address is generally expected to be internet-routeable (YMMV)
Matthew Wild <mwild1@gmail.com>
parents:
5587
diff
changeset
|
218 end |
8c1a3243d16f
util.ip: Add 'private' method/property to determine whether an IP address is generally expected to be internet-routeable (YMMV)
Matthew Wild <mwild1@gmail.com>
parents:
5587
diff
changeset
|
219 end |
8c1a3243d16f
util.ip: Add 'private' method/property to determine whether an IP address is generally expected to be internet-routeable (YMMV)
Matthew Wild <mwild1@gmail.com>
parents:
5587
diff
changeset
|
220 self.private = private; |
8c1a3243d16f
util.ip: Add 'private' method/property to determine whether an IP address is generally expected to be internet-routeable (YMMV)
Matthew Wild <mwild1@gmail.com>
parents:
5587
diff
changeset
|
221 return private; |
8c1a3243d16f
util.ip: Add 'private' method/property to determine whether an IP address is generally expected to be internet-routeable (YMMV)
Matthew Wild <mwild1@gmail.com>
parents:
5587
diff
changeset
|
222 end |
8c1a3243d16f
util.ip: Add 'private' method/property to determine whether an IP address is generally expected to be internet-routeable (YMMV)
Matthew Wild <mwild1@gmail.com>
parents:
5587
diff
changeset
|
223 |
5603
e07f4f02e4f9
util.ip: Add CIDR notation parsing and matching
Matthew Wild <mwild1@gmail.com>
parents:
5599
diff
changeset
|
224 local function parse_cidr(cidr) |
e07f4f02e4f9
util.ip: Add CIDR notation parsing and matching
Matthew Wild <mwild1@gmail.com>
parents:
5599
diff
changeset
|
225 local bits; |
e07f4f02e4f9
util.ip: Add CIDR notation parsing and matching
Matthew Wild <mwild1@gmail.com>
parents:
5599
diff
changeset
|
226 local ip_len = cidr:find("/", 1, true); |
e07f4f02e4f9
util.ip: Add CIDR notation parsing and matching
Matthew Wild <mwild1@gmail.com>
parents:
5599
diff
changeset
|
227 if ip_len then |
e07f4f02e4f9
util.ip: Add CIDR notation parsing and matching
Matthew Wild <mwild1@gmail.com>
parents:
5599
diff
changeset
|
228 bits = tonumber(cidr:sub(ip_len+1, -1)); |
e07f4f02e4f9
util.ip: Add CIDR notation parsing and matching
Matthew Wild <mwild1@gmail.com>
parents:
5599
diff
changeset
|
229 cidr = cidr:sub(1, ip_len-1); |
e07f4f02e4f9
util.ip: Add CIDR notation parsing and matching
Matthew Wild <mwild1@gmail.com>
parents:
5599
diff
changeset
|
230 end |
e07f4f02e4f9
util.ip: Add CIDR notation parsing and matching
Matthew Wild <mwild1@gmail.com>
parents:
5599
diff
changeset
|
231 return new_ip(cidr), bits; |
e07f4f02e4f9
util.ip: Add CIDR notation parsing and matching
Matthew Wild <mwild1@gmail.com>
parents:
5599
diff
changeset
|
232 end |
e07f4f02e4f9
util.ip: Add CIDR notation parsing and matching
Matthew Wild <mwild1@gmail.com>
parents:
5599
diff
changeset
|
233 |
e07f4f02e4f9
util.ip: Add CIDR notation parsing and matching
Matthew Wild <mwild1@gmail.com>
parents:
5599
diff
changeset
|
234 local function match(ipA, ipB, bits) |
e07f4f02e4f9
util.ip: Add CIDR notation parsing and matching
Matthew Wild <mwild1@gmail.com>
parents:
5599
diff
changeset
|
235 local common_bits = commonPrefixLength(ipA, ipB); |
e07f4f02e4f9
util.ip: Add CIDR notation parsing and matching
Matthew Wild <mwild1@gmail.com>
parents:
5599
diff
changeset
|
236 if bits and ipB.proto == "IPv4" then |
e07f4f02e4f9
util.ip: Add CIDR notation parsing and matching
Matthew Wild <mwild1@gmail.com>
parents:
5599
diff
changeset
|
237 common_bits = common_bits - 96; -- v6 mapped addresses always share these bits |
e07f4f02e4f9
util.ip: Add CIDR notation parsing and matching
Matthew Wild <mwild1@gmail.com>
parents:
5599
diff
changeset
|
238 end |
6926
d96b2aa7a11d
util.ip: Improve comparison, == doesn't necessarily handle IPv6 addresses correctly if they aren't normalized (case, ::, etc.)
Matthew Wild <mwild1@gmail.com>
parents:
5776
diff
changeset
|
239 return common_bits >= (bits or 128); |
5603
e07f4f02e4f9
util.ip: Add CIDR notation parsing and matching
Matthew Wild <mwild1@gmail.com>
parents:
5599
diff
changeset
|
240 end |
e07f4f02e4f9
util.ip: Add CIDR notation parsing and matching
Matthew Wild <mwild1@gmail.com>
parents:
5599
diff
changeset
|
241 |
4419
b1e49cc314cb
util.ip: New module containing IP related functions
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff
changeset
|
242 return {new_ip = new_ip, |
5603
e07f4f02e4f9
util.ip: Add CIDR notation parsing and matching
Matthew Wild <mwild1@gmail.com>
parents:
5599
diff
changeset
|
243 commonPrefixLength = commonPrefixLength, |
e07f4f02e4f9
util.ip: Add CIDR notation parsing and matching
Matthew Wild <mwild1@gmail.com>
parents:
5599
diff
changeset
|
244 parse_cidr = parse_cidr, |
e07f4f02e4f9
util.ip: Add CIDR notation parsing and matching
Matthew Wild <mwild1@gmail.com>
parents:
5599
diff
changeset
|
245 match=match}; |