Line data Source code
1 : /**
2 : * @file
3 : *
4 : * @brief Tests for ipaddr plugin
5 : *
6 : * @copyright BSD License (see doc/LICENSE.md or https://www.libelektra.org)
7 : *
8 : */
9 :
10 : #include <stdio.h>
11 :
12 : #include <tests_plugin.h>
13 :
14 : #include <kdbconfig.h>
15 :
16 : #ifdef HAVE_FEATURES_H
17 :
18 : #include <features.h>
19 : // The function `getaddrinfo` used in the `network` plugin leaks memory, if we use the default value for `ai_flags` on systems that use
20 : // `glibc` 2.19.
21 : // See also: https://travis-ci.org/ElektraInitiative/libelektra/builds/428298531
22 : #if defined(__GLIBC__) && defined(__GLIBC_PREREQ)
23 : #if !(__GLIBC_PREREQ(2, 20))
24 : #include <string.h>
25 : #define PLUGIN_LEAKS_MEMORY (strcmp (PLUGIN_NAME, "network") == 0)
26 : #endif
27 : #endif
28 :
29 : #endif // HAVE_FEATURES_H
30 :
31 : #ifndef PLUGIN_LEAKS_MEMORY
32 : #define PLUGIN_LEAKS_MEMORY 0
33 : #endif
34 :
35 1076 : static void testIP (char const * const ip, const int ret, char const * const version)
36 : {
37 1076 : Key * parentKey = keyNew ("user/tests/ipaddr", KEY_VALUE, "", KEY_END);
38 1076 : KeySet * conf = ksNew (0, KS_END);
39 1076 : KeySet * ks = ksNew (10, keyNew ("user/test/ipaddr/totest", KEY_VALUE, ip, KEY_META, "check/ipaddr", version, KEY_END), KS_END);
40 1076 : PLUGIN_OPEN (PLUGIN_NAME);
41 1076 : const int pluginStatus = plugin->kdbSet (plugin, ks, parentKey);
42 : char message[200];
43 1076 : (void) snprintf (message, 200, "validation of %s address ā%sā returned %d instead of %d", version[0] == '\0' ? "IP" : version, ip,
44 : pluginStatus, ret);
45 1076 : succeed_if (pluginStatus == ret, message);
46 1076 : ksDel (ks);
47 1076 : keyDel (parentKey);
48 1076 : PLUGIN_CLOSE ();
49 1076 : }
50 :
51 : static inline void testIPv6 (char const * const ip, int ret)
52 : {
53 1018 : testIP (ip, ret, "ipv6");
54 : }
55 :
56 : static inline void testIPv4 (char const * const ip, int ret)
57 : {
58 30 : testIP (ip, ret, "ipv4");
59 : }
60 :
61 : static inline void testIPAny (char const * const ip, int ret)
62 : {
63 28 : testIP (ip, ret, "");
64 : }
65 :
66 4 : static void testIPAll (void)
67 : {
68 4 : testIPv4 ("192.168.0.1", 1);
69 4 : testIPv4 ("192.168.1.1", 1);
70 4 : testIPv4 ("0.0.0.0", 1);
71 :
72 4 : testIPv4 ("192.168.0.x", -1);
73 4 : testIPv4 ("300.168.1.1", -1);
74 4 : testIPv4 ("192.168.a.1", -1);
75 4 : testIPv4 ("localhost", -1);
76 :
77 4 : testIPv6 ("2001:0db8:85a3:0000:0000:8a2e:0370:7334", 1);
78 4 : testIPv6 ("2001:0db8:85a3:0:0:8a2e:0370:7334", 1);
79 4 : testIPv6 ("2001:0db8:85a3::8a2e:0370:7334", 1);
80 4 : testIPv6 ("::1", 1);
81 4 : testIPv6 ("2001::7334", 1);
82 4 : testIPv6 ("::ffff:192.0.2.128", 1);
83 :
84 4 : testIPv6 (":::", -1);
85 4 : testIPv6 ("2001:0db8:85a3:1234:0000:0000:8a2e:0370:7334", -1);
86 4 : testIPv6 ("2001:0db8:85a3:0:0:z:0370:7334", -1);
87 4 : testIPv6 ("0db8:85a3:0370:7334", -1);
88 4 : testIPv6 (":0db8:85a3:0000:0000:1234:8a2e:0370:7334", -1);
89 4 : testIPv6 ("::ffff:192.0.128", -1);
90 4 : testIPv6 ("localhost", -1);
91 :
92 : if (strncmp (PLUGIN_NAME, "network", sizeof ("ipaddr") - 1) == 0)
93 : {
94 : // Tested with
95 : // - http://formvalidation.io/validators/ip/
96 : // - https://www.helpsystems.com/intermapper/ipv6-test-address-validation
97 2 : testIPv6 (":0db8:85a3:0000:0000:8a2e:0370:7334", -1); // Invalid
98 2 : testIPv6 ("::", 1); // Valid
99 2 : testIPAny ("should_not_exist", -1);
100 2 : testIPAny ("www.google.com", 1);
101 2 : testIPAny ("should_not_exist", -1);
102 2 : testIPAny ("www.google.com", 1);
103 2 : testIPv6 ("", -1); // empty string
104 2 : testIPv6 ("::1", 1); // loopback, compressed, non-routable
105 2 : testIPv6 ("::", 1); // unspecified, compressed, non-routable
106 2 : testIPv6 ("0:0:0:0:0:0:0:1", 1); // loopback, full
107 2 : testIPv6 ("0:0:0:0:0:0:0:0", 1); // unspecified, full
108 2 : testIPv6 ("2001:DB8:0:0:8:800:200C:417A", 1); // unicast, full
109 2 : testIPv6 ("FF01:0:0:0:0:0:0:101", 1); // multicast, full
110 2 : testIPv6 ("2001:DB8::8:800:200C:417A", 1); // unicast, compressed
111 2 : testIPv6 ("FF01::101", 1); // multicast, compressed
112 2 : testIPv6 ("2001:DB8:0:0:8:800:200C:417A:221", -1); // unicast, full
113 2 : testIPv6 ("FF01::101::2", -1); // multicast, compressed
114 2 : testIPv6 ("fe80::217:f2ff:fe07:ed62", 1);
115 :
116 2 : testIPv6 ("2001:0000:1234:0000:0000:C1C0:ABCD:0876", 1);
117 2 : testIPv6 ("3ffe:0b00:0000:0000:0001:0000:0000:000a", 1);
118 2 : testIPv6 ("FF02:0000:0000:0000:0000:0000:0000:0001", 1);
119 2 : testIPv6 ("0000:0000:0000:0000:0000:0000:0000:0001", 1);
120 2 : testIPv6 ("0000:0000:0000:0000:0000:0000:0000:0000", 1);
121 :
122 : // TODO: These two tests actually fail.
123 : // testIPv6("02001:0000:1234:0000:0000:C1C0:ABCD:0876", -1);// extra 0 not allowed!
124 : // testIPv6("2001:0000:1234:0000:00001:C1C0:ABCD:0876", -1);// extra 0 not allowed!
125 :
126 :
127 : // testIPv6(" 2001:0000:1234:0000:0000:C1C0:ABCD:0876", 1);// leading space
128 : // testIPv6("2001:0000:1234:0000:0000:C1C0:ABCD:0876", 1);// trailing space
129 : // testIPv6(" 2001:0000:1234:0000:0000:C1C0:ABCD:0876 ", 1);// leading and trailing space
130 2 : testIPv6 ("2001:0000:1234:0000:0000:C1C0:ABCD:0876 0", -1); // junk after valid address
131 2 : testIPv6 ("2001:0000:1234: 0000:0000:C1C0:ABCD:0876", -1); // internal space
132 :
133 2 : testIPv6 ("3ffe:0b00:0000:0001:0000:0000:000a", -1); // seven segments
134 2 : testIPv6 ("FF02:0000:0000:0000:0000:0000:0000:0000:0001", -1); // nine segments
135 2 : testIPv6 ("3ffe:b00::1::a", -1); // double "::"
136 2 : testIPv6 ("::1111:2222:3333:4444:5555:6666::", -1); // double "::"
137 2 : testIPv6 ("2::10", 1);
138 2 : testIPv6 ("ff02::1", 1);
139 2 : testIPv6 ("fe80::", 1);
140 2 : testIPv6 ("2002::", 1);
141 2 : testIPv6 ("2001:db8::", 1);
142 2 : testIPv6 ("2001:0db8:1234::", 1);
143 2 : testIPv6 ("::ffff:0:0", 1);
144 2 : testIPv6 ("::1", 1);
145 2 : testIPv6 ("1:2:3:4:5:6:7:8", 1);
146 2 : testIPv6 ("1:2:3:4:5:6::8", 1);
147 2 : testIPv6 ("1:2:3:4:5::8", 1);
148 2 : testIPv6 ("1:2:3:4::8", 1);
149 2 : testIPv6 ("1:2:3::8", 1);
150 2 : testIPv6 ("1:2::8", 1);
151 2 : testIPv6 ("1::8", 1);
152 2 : testIPv6 ("1::2:3:4:5:6:7", 1);
153 2 : testIPv6 ("1::2:3:4:5:6", 1);
154 2 : testIPv6 ("1::2:3:4:5", 1);
155 2 : testIPv6 ("1::2:3:4", 1);
156 2 : testIPv6 ("1::2:3", 1);
157 2 : testIPv6 ("1::8", 1);
158 2 : testIPv6 ("::2:3:4:5:6:7:8", 1);
159 2 : testIPv6 ("::2:3:4:5:6:7", 1);
160 2 : testIPv6 ("::2:3:4:5:6", 1);
161 2 : testIPv6 ("::2:3:4:5", 1);
162 2 : testIPv6 ("::2:3:4", 1);
163 2 : testIPv6 ("::2:3", 1);
164 2 : testIPv6 ("::8", 1);
165 2 : testIPv6 ("1:2:3:4:5:6::", 1);
166 2 : testIPv6 ("1:2:3:4:5::", 1);
167 2 : testIPv6 ("1:2:3:4::", 1);
168 2 : testIPv6 ("1:2:3::", 1);
169 2 : testIPv6 ("1:2::", 1);
170 2 : testIPv6 ("1::", 1);
171 2 : testIPv6 ("1:2:3:4:5::7:8", 1);
172 2 : testIPv6 ("1:2:3::4:5::7:8", -1); // Double "::"
173 2 : testIPv6 ("12345::6:7:8", -1);
174 2 : testIPv6 ("1:2:3:4::7:8", 1);
175 2 : testIPv6 ("1:2:3::7:8", 1);
176 2 : testIPv6 ("1:2::7:8", 1);
177 2 : testIPv6 ("1::7:8", 1);
178 :
179 : // IPv4 addresses as dotted-quads
180 2 : testIPv6 ("1:2:3:4:5:6:1.2.3.4", 1);
181 2 : testIPv6 ("1:2:3:4:5::1.2.3.4", 1);
182 2 : testIPv6 ("1:2:3:4::1.2.3.4", 1);
183 2 : testIPv6 ("1:2:3::1.2.3.4", 1);
184 2 : testIPv6 ("1:2::1.2.3.4", 1);
185 2 : testIPv6 ("1::1.2.3.4", 1);
186 2 : testIPv6 ("1:2:3:4::5:1.2.3.4", 1);
187 2 : testIPv6 ("1:2:3::5:1.2.3.4", 1);
188 2 : testIPv6 ("1:2::5:1.2.3.4", 1);
189 2 : testIPv6 ("1::5:1.2.3.4", 1);
190 2 : testIPv6 ("1::5:11.22.33.44", 1);
191 2 : testIPv6 ("1::5:400.2.3.4", -1);
192 2 : testIPv6 ("1::5:260.2.3.4", -1);
193 2 : testIPv6 ("1::5:256.2.3.4", -1);
194 2 : testIPv6 ("1::5:1.256.3.4", -1);
195 2 : testIPv6 ("1::5:1.2.256.4", -1);
196 2 : testIPv6 ("1::5:1.2.3.256", -1);
197 2 : testIPv6 ("1::5:300.2.3.4", -1);
198 2 : testIPv6 ("1::5:1.300.3.4", -1);
199 2 : testIPv6 ("1::5:1.2.300.4", -1);
200 2 : testIPv6 ("1::5:1.2.3.300", -1);
201 2 : testIPv6 ("1::5:900.2.3.4", -1);
202 2 : testIPv6 ("1::5:1.900.3.4", -1);
203 2 : testIPv6 ("1::5:1.2.900.4", -1);
204 2 : testIPv6 ("1::5:1.2.3.900", -1);
205 2 : testIPv6 ("1::5:300.300.300.300", -1);
206 2 : testIPv6 ("1::5:3000.30.30.30", -1);
207 2 : testIPv6 ("1::400.2.3.4", -1);
208 2 : testIPv6 ("1::260.2.3.4", -1);
209 2 : testIPv6 ("1::256.2.3.4", -1);
210 2 : testIPv6 ("1::1.256.3.4", -1);
211 2 : testIPv6 ("1::1.2.256.4", -1);
212 2 : testIPv6 ("1::1.2.3.256", -1);
213 2 : testIPv6 ("1::300.2.3.4", -1);
214 2 : testIPv6 ("1::1.300.3.4", -1);
215 2 : testIPv6 ("1::1.2.300.4", -1);
216 2 : testIPv6 ("1::1.2.3.300", -1);
217 2 : testIPv6 ("1::900.2.3.4", -1);
218 2 : testIPv6 ("1::1.900.3.4", -1);
219 2 : testIPv6 ("1::1.2.900.4", -1);
220 2 : testIPv6 ("1::1.2.3.900", -1);
221 2 : testIPv6 ("1::300.300.300.300", -1);
222 2 : testIPv6 ("1::3000.30.30.30", -1);
223 2 : testIPv6 ("::400.2.3.4", -1);
224 2 : testIPv6 ("::260.2.3.4", -1);
225 2 : testIPv6 ("::256.2.3.4", -1);
226 2 : testIPv6 ("::1.256.3.4", -1);
227 2 : testIPv6 ("::1.2.256.4", -1);
228 2 : testIPv6 ("::1.2.3.256", -1);
229 2 : testIPv6 ("::300.2.3.4", -1);
230 2 : testIPv6 ("::1.300.3.4", -1);
231 2 : testIPv6 ("::1.2.300.4", -1);
232 2 : testIPv6 ("::1.2.3.300", -1);
233 2 : testIPv6 ("::900.2.3.4", -1);
234 2 : testIPv6 ("::1.900.3.4", -1);
235 2 : testIPv6 ("::1.2.900.4", -1);
236 2 : testIPv6 ("::1.2.3.900", -1);
237 2 : testIPv6 ("::300.300.300.300", -1);
238 2 : testIPv6 ("::3000.30.30.30", -1);
239 2 : testIPv6 ("fe80::217:f2ff:254.7.237.98", 1);
240 2 : testIPv6 ("::ffff:192.168.1.26", 1);
241 2 : testIPv6 ("2001:1:1:1:1:1:255Z255X255Y255", -1); // garbage instead of "." in IPv4
242 2 : testIPv6 ("::ffff:192x168.1.26", -1); // ditto
243 2 : testIPv6 ("::ffff:192.168.1.1", 1);
244 2 : testIPv6 ("0:0:0:0:0:0:13.1.68.3", 1); // IPv4-compatible IPv6 address, full, deprecated
245 2 : testIPv6 ("0:0:0:0:0:FFFF:129.144.52.38", 1); // IPv4-mapped IPv6 address, full
246 2 : testIPv6 ("::13.1.68.3", 1); // IPv4-compatible IPv6 address, compressed, deprecated
247 2 : testIPv6 ("::FFFF:129.144.52.38", 1); // IPv4-mapped IPv6 address, compressed
248 2 : testIPv6 ("fe80:0:0:0:204:61ff:254.157.241.86", 1);
249 2 : testIPv6 ("fe80::204:61ff:254.157.241.86", 1);
250 2 : testIPv6 ("::ffff:12.34.56.78", 1);
251 2 : testIPv6 ("::ffff:2.3.4", -1);
252 2 : testIPv6 ("::ffff:257.1.2.3", -1);
253 2 : testIPv6 ("1.2.3.4", -1);
254 :
255 2 : testIPv6 ("1.2.3.4:1111:2222:3333:4444::5555", -1); // Aeron
256 2 : testIPv6 ("1.2.3.4:1111:2222:3333::5555", -1);
257 2 : testIPv6 ("1.2.3.4:1111:2222::5555", -1);
258 2 : testIPv6 ("1.2.3.4:1111::5555", -1);
259 2 : testIPv6 ("1.2.3.4::5555", -1);
260 2 : testIPv6 ("1.2.3.4::", -1);
261 :
262 : // Testing IPv4 addresses represented as dotted-quads
263 : // Leading zero's in IPv4 addresses not allowed: some systems treat the leading "0" in ".086" as the start of an octal
264 : // number Update: The BNF in RFC-3986 explicitly defines the dec-octet (for IPv4 addresses) not to have a leading zero
265 2 : testIPv6 ("::ffff:192.0.2.128", 1); // but this is OK, since there's a single digit
266 2 : testIPv6 ("XXXX:XXXX:XXXX:XXXX:XXXX:XXXX:1.2.3.4", -1);
267 :
268 : // TODO: These tests also fail on some systems
269 : // testIPv6("fe80:0000:0000:0000:0204:61ff:254.157.241.086", -1);
270 : // testIPv6("1111:2222:3333:4444:5555:6666:00.00.00.00", -1);
271 : // testIPv6("1111:2222:3333:4444:5555:6666:000.000.000.000", -1);
272 :
273 2 : testIPv6 ("1111:2222:3333:4444:5555:6666:256.256.256.256", -1);
274 :
275 : // Not testing address with subnet mask
276 : // testIPv6("2001:0DB8:0000:CD30:0000:0000:0000:0000/60", 1);// full, with prefix
277 : // testIPv6("2001:0DB8::CD30:0:0:0:0/60", 1);// compressed, with prefix
278 : // testIPv6("2001:0DB8:0:CD30::/60", 1);// compressed, with prefix //2
279 : // testIPv6("::/128", 1);// compressed, unspecified address type, non-routable
280 : // testIPv6("::1/128", 1);// compressed, loopback address type, non-routable
281 : // testIPv6("FF00::/8", 1);// compressed, multicast address type
282 : // testIPv6("FE80::/10", 1);// compressed, link-local unicast, non-routable
283 : // testIPv6("FEC0::/10", 1);// compressed, site-local unicast, deprecated
284 : // testIPv6("124.15.6.89/60", -1);// standard IPv4, prefix not allowed
285 :
286 2 : testIPv6 ("fe80:0000:0000:0000:0204:61ff:fe9d:f156", 1);
287 2 : testIPv6 ("fe80:0:0:0:204:61ff:fe9d:f156", 1);
288 2 : testIPv6 ("fe80::204:61ff:fe9d:f156", 1);
289 2 : testIPv6 ("::1", 1);
290 2 : testIPv6 ("fe80::", 1);
291 2 : testIPv6 ("fe80::1", 1);
292 2 : testIPv6 (":", -1);
293 2 : testIPv6 ("::ffff:c000:280", 1);
294 :
295 : // Aeron supplied these test cases
296 2 : testIPv6 ("1111:2222:3333:4444::5555:", -1);
297 2 : testIPv6 ("1111:2222:3333::5555:", -1);
298 2 : testIPv6 ("1111:2222::5555:", -1);
299 2 : testIPv6 ("1111::5555:", -1);
300 2 : testIPv6 ("::5555:", -1);
301 2 : testIPv6 (":::", -1);
302 2 : testIPv6 ("1111:", -1);
303 2 : testIPv6 (":", -1);
304 :
305 2 : testIPv6 (":1111:2222:3333:4444::5555", -1);
306 2 : testIPv6 (":1111:2222:3333::5555", -1);
307 2 : testIPv6 (":1111:2222::5555", -1);
308 2 : testIPv6 (":1111::5555", -1);
309 2 : testIPv6 (":::5555", -1);
310 2 : testIPv6 (":::", -1);
311 :
312 :
313 : // Additional test cases
314 : // from http://rt.cpan.org/Public/Bug/Display.html?id=50693
315 2 : testIPv6 ("2001:0db8:85a3:0000:0000:8a2e:0370:7334", 1);
316 2 : testIPv6 ("2001:db8:85a3:0:0:8a2e:370:7334", 1);
317 2 : testIPv6 ("2001:db8:85a3::8a2e:370:7334", 1);
318 2 : testIPv6 ("2001:0db8:0000:0000:0000:0000:1428:57ab", 1);
319 2 : testIPv6 ("2001:0db8:0000:0000:0000::1428:57ab", 1);
320 2 : testIPv6 ("2001:0db8:0:0:0:0:1428:57ab", 1);
321 2 : testIPv6 ("2001:0db8:0:0::1428:57ab", 1);
322 2 : testIPv6 ("2001:0db8::1428:57ab", 1);
323 2 : testIPv6 ("2001:db8::1428:57ab", 1);
324 2 : testIPv6 ("0000:0000:0000:0000:0000:0000:0000:0001", 1);
325 2 : testIPv6 ("::1", 1);
326 2 : testIPv6 ("::ffff:0c22:384e", 1);
327 2 : testIPv6 ("2001:0db8:1234:0000:0000:0000:0000:0000", 1);
328 2 : testIPv6 ("2001:0db8:1234:ffff:ffff:ffff:ffff:ffff", 1);
329 2 : testIPv6 ("2001:db8:a::123", 1);
330 2 : testIPv6 ("fe80::", 1);
331 :
332 2 : testIPv6 ("123", -1);
333 2 : testIPv6 ("ldkfj", -1);
334 2 : testIPv6 ("2001::FFD3::57ab", -1);
335 2 : testIPv6 ("2001:db8:85a3::8a2e:37023:7334", -1);
336 2 : testIPv6 ("2001:db8:85a3::8a2e:370k:7334", -1);
337 2 : testIPv6 ("1:2:3:4:5:6:7:8:9", -1);
338 2 : testIPv6 ("1::2::3", -1);
339 2 : testIPv6 ("1:::3:4:5", -1);
340 2 : testIPv6 ("1:2:3::4:5:6:7:8:9", -1);
341 :
342 : // New from Aeron
343 2 : testIPv6 ("1111:2222:3333:4444:5555:6666:7777:8888", 1);
344 2 : testIPv6 ("1111:2222:3333:4444:5555:6666:7777::", 1);
345 2 : testIPv6 ("1111:2222:3333:4444:5555:6666::", 1);
346 2 : testIPv6 ("1111:2222:3333:4444:5555::", 1);
347 2 : testIPv6 ("1111:2222:3333:4444::", 1);
348 2 : testIPv6 ("1111:2222:3333::", 1);
349 2 : testIPv6 ("1111:2222::", 1);
350 2 : testIPv6 ("1111::", 1);
351 : // testIPv6("::", 1); //duplicate
352 2 : testIPv6 ("1111:2222:3333:4444:5555:6666::8888", 1);
353 2 : testIPv6 ("1111:2222:3333:4444:5555::8888", 1);
354 2 : testIPv6 ("1111:2222:3333:4444::8888", 1);
355 2 : testIPv6 ("1111:2222:3333::8888", 1);
356 2 : testIPv6 ("1111:2222::8888", 1);
357 2 : testIPv6 ("1111::8888", 1);
358 2 : testIPv6 ("::8888", 1);
359 2 : testIPv6 ("1111:2222:3333:4444:5555::7777:8888", 1);
360 2 : testIPv6 ("1111:2222:3333:4444::7777:8888", 1);
361 2 : testIPv6 ("1111:2222:3333::7777:8888", 1);
362 2 : testIPv6 ("1111:2222::7777:8888", 1);
363 2 : testIPv6 ("1111::7777:8888", 1);
364 2 : testIPv6 ("::7777:8888", 1);
365 2 : testIPv6 ("1111:2222:3333:4444::6666:7777:8888", 1);
366 2 : testIPv6 ("1111:2222:3333::6666:7777:8888", 1);
367 2 : testIPv6 ("1111:2222::6666:7777:8888", 1);
368 2 : testIPv6 ("1111::6666:7777:8888", 1);
369 2 : testIPv6 ("::6666:7777:8888", 1);
370 2 : testIPv6 ("1111:2222:3333::5555:6666:7777:8888", 1);
371 2 : testIPv6 ("1111:2222::5555:6666:7777:8888", 1);
372 2 : testIPv6 ("1111::5555:6666:7777:8888", 1);
373 2 : testIPv6 ("::5555:6666:7777:8888", 1);
374 2 : testIPv6 ("1111:2222::4444:5555:6666:7777:8888", 1);
375 2 : testIPv6 ("1111::4444:5555:6666:7777:8888", 1);
376 2 : testIPv6 ("::4444:5555:6666:7777:8888", 1);
377 2 : testIPv6 ("1111::3333:4444:5555:6666:7777:8888", 1);
378 2 : testIPv6 ("::3333:4444:5555:6666:7777:8888", 1);
379 2 : testIPv6 ("::2222:3333:4444:5555:6666:7777:8888", 1);
380 2 : testIPv6 ("1111:2222:3333:4444:5555:6666:123.123.123.123", 1);
381 2 : testIPv6 ("1111:2222:3333:4444:5555::123.123.123.123", 1);
382 2 : testIPv6 ("1111:2222:3333:4444::123.123.123.123", 1);
383 2 : testIPv6 ("1111:2222:3333::123.123.123.123", 1);
384 2 : testIPv6 ("1111:2222::123.123.123.123", 1);
385 2 : testIPv6 ("1111::123.123.123.123", 1);
386 2 : testIPv6 ("::123.123.123.123", 1);
387 2 : testIPv6 ("1111:2222:3333:4444::6666:123.123.123.123", 1);
388 2 : testIPv6 ("1111:2222:3333::6666:123.123.123.123", 1);
389 2 : testIPv6 ("1111:2222::6666:123.123.123.123", 1);
390 2 : testIPv6 ("1111::6666:123.123.123.123", 1);
391 2 : testIPv6 ("::6666:123.123.123.123", 1);
392 2 : testIPv6 ("1111:2222:3333::5555:6666:123.123.123.123", 1);
393 2 : testIPv6 ("1111:2222::5555:6666:123.123.123.123", 1);
394 2 : testIPv6 ("1111::5555:6666:123.123.123.123", 1);
395 2 : testIPv6 ("::5555:6666:123.123.123.123", 1);
396 2 : testIPv6 ("1111:2222::4444:5555:6666:123.123.123.123", 1);
397 2 : testIPv6 ("1111::4444:5555:6666:123.123.123.123", 1);
398 2 : testIPv6 ("::4444:5555:6666:123.123.123.123", 1);
399 2 : testIPv6 ("1111::3333:4444:5555:6666:123.123.123.123", 1);
400 2 : testIPv6 ("::2222:3333:4444:5555:6666:123.123.123.123", 1);
401 :
402 : // Playing with combinations of "0" and "::"
403 : // NB: these are all sytactically correct, but are bad form
404 : // because "0" adjacent to "::" should be combined into "::"
405 2 : testIPv6 ("::0:0:0:0:0:0:0", 1);
406 2 : testIPv6 ("::0:0:0:0:0:0", 1);
407 2 : testIPv6 ("::0:0:0:0:0", 1);
408 2 : testIPv6 ("::0:0:0:0", 1);
409 2 : testIPv6 ("::0:0:0", 1);
410 2 : testIPv6 ("::0:0", 1);
411 2 : testIPv6 ("::0", 1);
412 2 : testIPv6 ("0:0:0:0:0:0:0::", 1);
413 2 : testIPv6 ("0:0:0:0:0:0::", 1);
414 2 : testIPv6 ("0:0:0:0:0::", 1);
415 2 : testIPv6 ("0:0:0:0::", 1);
416 2 : testIPv6 ("0:0:0::", 1);
417 2 : testIPv6 ("0:0::", 1);
418 2 : testIPv6 ("0::", 1);
419 :
420 : // New invalid from Aeron
421 : // Invalid data
422 2 : testIPv6 ("XXXX:XXXX:XXXX:XXXX:XXXX:XXXX:XXXX:XXXX", -1);
423 :
424 : // Too many components
425 2 : testIPv6 ("1111:2222:3333:4444:5555:6666:7777:8888:9999", -1);
426 2 : testIPv6 ("1111:2222:3333:4444:5555:6666:7777:8888::", -1);
427 2 : testIPv6 ("::2222:3333:4444:5555:6666:7777:8888:9999", -1);
428 :
429 : // Too few components
430 2 : testIPv6 ("1111:2222:3333:4444:5555:6666:7777", -1);
431 2 : testIPv6 ("1111:2222:3333:4444:5555:6666", -1);
432 2 : testIPv6 ("1111:2222:3333:4444:5555", -1);
433 2 : testIPv6 ("1111:2222:3333:4444", -1);
434 2 : testIPv6 ("1111:2222:3333", -1);
435 2 : testIPv6 ("1111:2222", -1);
436 2 : testIPv6 ("1111", -1);
437 :
438 : // Missing :
439 2 : testIPv6 ("11112222:3333:4444:5555:6666:7777:8888", -1);
440 2 : testIPv6 ("1111:22223333:4444:5555:6666:7777:8888", -1);
441 2 : testIPv6 ("1111:2222:33334444:5555:6666:7777:8888", -1);
442 2 : testIPv6 ("1111:2222:3333:44445555:6666:7777:8888", -1);
443 2 : testIPv6 ("1111:2222:3333:4444:55556666:7777:8888", -1);
444 2 : testIPv6 ("1111:2222:3333:4444:5555:66667777:8888", -1);
445 2 : testIPv6 ("1111:2222:3333:4444:5555:6666:77778888", -1);
446 :
447 : // Missing : intended for ::
448 2 : testIPv6 ("1111:2222:3333:4444:5555:6666:7777:8888:", -1);
449 2 : testIPv6 ("1111:2222:3333:4444:5555:6666:7777:", -1);
450 2 : testIPv6 ("1111:2222:3333:4444:5555:6666:", -1);
451 2 : testIPv6 ("1111:2222:3333:4444:5555:", -1);
452 2 : testIPv6 ("1111:2222:3333:4444:", -1);
453 2 : testIPv6 ("1111:2222:3333:", -1);
454 2 : testIPv6 ("1111:2222:", -1);
455 2 : testIPv6 ("1111:", -1);
456 2 : testIPv6 (":", -1);
457 2 : testIPv6 (":8888", -1);
458 2 : testIPv6 (":7777:8888", -1);
459 2 : testIPv6 (":6666:7777:8888", -1);
460 2 : testIPv6 (":5555:6666:7777:8888", -1);
461 2 : testIPv6 (":4444:5555:6666:7777:8888", -1);
462 2 : testIPv6 (":3333:4444:5555:6666:7777:8888", -1);
463 2 : testIPv6 (":2222:3333:4444:5555:6666:7777:8888", -1);
464 2 : testIPv6 (":1111:2222:3333:4444:5555:6666:7777:8888", -1);
465 :
466 : // :::
467 2 : testIPv6 (":::2222:3333:4444:5555:6666:7777:8888", -1);
468 2 : testIPv6 ("1111:::3333:4444:5555:6666:7777:8888", -1);
469 2 : testIPv6 ("1111:2222:::4444:5555:6666:7777:8888", -1);
470 2 : testIPv6 ("1111:2222:3333:::5555:6666:7777:8888", -1);
471 2 : testIPv6 ("1111:2222:3333:4444:::6666:7777:8888", -1);
472 2 : testIPv6 ("1111:2222:3333:4444:5555:::7777:8888", -1);
473 2 : testIPv6 ("1111:2222:3333:4444:5555:6666:::8888", -1);
474 2 : testIPv6 ("1111:2222:3333:4444:5555:6666:7777:::", -1);
475 :
476 : // Double ::");
477 2 : testIPv6 ("::2222::4444:5555:6666:7777:8888", -1);
478 2 : testIPv6 ("::2222:3333::5555:6666:7777:8888", -1);
479 2 : testIPv6 ("::2222:3333:4444::6666:7777:8888", -1);
480 2 : testIPv6 ("::2222:3333:4444:5555::7777:8888", -1);
481 2 : testIPv6 ("::2222:3333:4444:5555:7777::8888", -1);
482 2 : testIPv6 ("::2222:3333:4444:5555:7777:8888::", -1);
483 :
484 2 : testIPv6 ("1111::3333::5555:6666:7777:8888", -1);
485 2 : testIPv6 ("1111::3333:4444::6666:7777:8888", -1);
486 2 : testIPv6 ("1111::3333:4444:5555::7777:8888", -1);
487 2 : testIPv6 ("1111::3333:4444:5555:6666::8888", -1);
488 2 : testIPv6 ("1111::3333:4444:5555:6666:7777::", -1);
489 :
490 2 : testIPv6 ("1111:2222::4444::6666:7777:8888", -1);
491 2 : testIPv6 ("1111:2222::4444:5555::7777:8888", -1);
492 2 : testIPv6 ("1111:2222::4444:5555:6666::8888", -1);
493 2 : testIPv6 ("1111:2222::4444:5555:6666:7777::", -1);
494 :
495 2 : testIPv6 ("1111:2222:3333::5555::7777:8888", -1);
496 2 : testIPv6 ("1111:2222:3333::5555:6666::8888", -1);
497 2 : testIPv6 ("1111:2222:3333::5555:6666:7777::", -1);
498 :
499 2 : testIPv6 ("1111:2222:3333:4444::6666::8888", -1);
500 2 : testIPv6 ("1111:2222:3333:4444::6666:7777::", -1);
501 :
502 2 : testIPv6 ("1111:2222:3333:4444:5555::7777::", -1);
503 :
504 :
505 : // Too many components"
506 2 : testIPv6 ("1111:2222:3333:4444:5555:6666:7777:8888:1.2.3.4", -1);
507 2 : testIPv6 ("1111:2222:3333:4444:5555:6666:7777:1.2.3.4", -1);
508 2 : testIPv6 ("1111:2222:3333:4444:5555:6666::1.2.3.4", -1);
509 2 : testIPv6 ("::2222:3333:4444:5555:6666:7777:1.2.3.4", -1);
510 2 : testIPv6 ("1111:2222:3333:4444:5555:6666:1.2.3.4.5", -1);
511 :
512 : // Too few components
513 2 : testIPv6 ("1111:2222:3333:4444:5555:1.2.3.4", -1);
514 2 : testIPv6 ("1111:2222:3333:4444:1.2.3.4", -1);
515 2 : testIPv6 ("1111:2222:3333:1.2.3.4", -1);
516 2 : testIPv6 ("1111:2222:1.2.3.4", -1);
517 2 : testIPv6 ("1111:1.2.3.4", -1);
518 2 : testIPv6 ("1.2.3.4", -1);
519 :
520 : // Missing :
521 2 : testIPv6 ("11112222:3333:4444:5555:6666:1.2.3.4", -1);
522 2 : testIPv6 ("1111:22223333:4444:5555:6666:1.2.3.4", -1);
523 2 : testIPv6 ("1111:2222:33334444:5555:6666:1.2.3.4", -1);
524 2 : testIPv6 ("1111:2222:3333:44445555:6666:1.2.3.4", -1);
525 2 : testIPv6 ("1111:2222:3333:4444:55556666:1.2.3.4", -1);
526 2 : testIPv6 ("1111:2222:3333:4444:5555:66661.2.3.4", -1);
527 :
528 : // Missing .
529 2 : testIPv6 ("1111:2222:3333:4444:5555:6666:255255.255.255", -1);
530 2 : testIPv6 ("1111:2222:3333:4444:5555:6666:255.255255.255", -1);
531 2 : testIPv6 ("1111:2222:3333:4444:5555:6666:255.255.255255", -1);
532 :
533 : // Missing : intended for ::
534 2 : testIPv6 (":1.2.3.4", -1);
535 2 : testIPv6 (":6666:1.2.3.4", -1);
536 2 : testIPv6 (":5555:6666:1.2.3.4", -1);
537 2 : testIPv6 (":4444:5555:6666:1.2.3.4", -1);
538 2 : testIPv6 (":3333:4444:5555:6666:1.2.3.4", -1);
539 2 : testIPv6 (":2222:3333:4444:5555:6666:1.2.3.4", -1);
540 2 : testIPv6 (":1111:2222:3333:4444:5555:6666:1.2.3.4", -1);
541 :
542 : // :::
543 2 : testIPv6 (":::2222:3333:4444:5555:6666:1.2.3.4", -1);
544 2 : testIPv6 ("1111:::3333:4444:5555:6666:1.2.3.4", -1);
545 2 : testIPv6 ("1111:2222:::4444:5555:6666:1.2.3.4", -1);
546 2 : testIPv6 ("1111:2222:3333:::5555:6666:1.2.3.4", -1);
547 2 : testIPv6 ("1111:2222:3333:4444:::6666:1.2.3.4", -1);
548 2 : testIPv6 ("1111:2222:3333:4444:5555:::1.2.3.4", -1);
549 :
550 : // Double ::
551 2 : testIPv6 ("::2222::4444:5555:6666:1.2.3.4", -1);
552 2 : testIPv6 ("::2222:3333::5555:6666:1.2.3.4", -1);
553 2 : testIPv6 ("::2222:3333:4444::6666:1.2.3.4", -1);
554 2 : testIPv6 ("::2222:3333:4444:5555::1.2.3.4", -1);
555 :
556 2 : testIPv6 ("1111::3333::5555:6666:1.2.3.4", -1);
557 2 : testIPv6 ("1111::3333:4444::6666:1.2.3.4", -1);
558 2 : testIPv6 ("1111::3333:4444:5555::1.2.3.4", -1);
559 :
560 2 : testIPv6 ("1111:2222::4444::6666:1.2.3.4", -1);
561 2 : testIPv6 ("1111:2222::4444:5555::1.2.3.4", -1);
562 :
563 2 : testIPv6 ("1111:2222:3333::5555::1.2.3.4", -1);
564 :
565 : // Missing parts
566 2 : testIPv6 ("::.", -1);
567 2 : testIPv6 ("::..", -1);
568 2 : testIPv6 ("::...", -1);
569 2 : testIPv6 ("::1...", -1);
570 2 : testIPv6 ("::1.2..", -1);
571 2 : testIPv6 ("::1.2.3.", -1);
572 2 : testIPv6 ("::.2..", -1);
573 2 : testIPv6 ("::.2.3.", -1);
574 2 : testIPv6 ("::.2.3.4", -1);
575 2 : testIPv6 ("::..3.", -1);
576 2 : testIPv6 ("::..3.4", -1);
577 2 : testIPv6 ("::...4", -1);
578 :
579 : // Extra : in front
580 2 : testIPv6 (":1111:2222:3333:4444:5555:6666:7777::", -1);
581 2 : testIPv6 (":1111:2222:3333:4444:5555:6666::", -1);
582 2 : testIPv6 (":1111:2222:3333:4444:5555::", -1);
583 2 : testIPv6 (":1111:2222:3333:4444::", -1);
584 2 : testIPv6 (":1111:2222:3333::", -1);
585 2 : testIPv6 (":1111:2222::", -1);
586 2 : testIPv6 (":1111::", -1);
587 2 : testIPv6 (":::", -1);
588 2 : testIPv6 (":1111:2222:3333:4444:5555:6666::8888", -1);
589 2 : testIPv6 (":1111:2222:3333:4444:5555::8888", -1);
590 2 : testIPv6 (":1111:2222:3333:4444::8888", -1);
591 2 : testIPv6 (":1111:2222:3333::8888", -1);
592 2 : testIPv6 (":1111:2222::8888", -1);
593 2 : testIPv6 (":1111::8888", -1);
594 2 : testIPv6 (":::8888", -1);
595 2 : testIPv6 (":1111:2222:3333:4444:5555::7777:8888", -1);
596 2 : testIPv6 (":1111:2222:3333:4444::7777:8888", -1);
597 2 : testIPv6 (":1111:2222:3333::7777:8888", -1);
598 2 : testIPv6 (":1111:2222::7777:8888", -1);
599 2 : testIPv6 (":1111::7777:8888", -1);
600 2 : testIPv6 (":::7777:8888", -1);
601 2 : testIPv6 (":1111:2222:3333:4444::6666:7777:8888", -1);
602 2 : testIPv6 (":1111:2222:3333::6666:7777:8888", -1);
603 2 : testIPv6 (":1111:2222::6666:7777:8888", -1);
604 2 : testIPv6 (":1111::6666:7777:8888", -1);
605 2 : testIPv6 (":::6666:7777:8888", -1);
606 2 : testIPv6 (":1111:2222:3333::5555:6666:7777:8888", -1);
607 2 : testIPv6 (":1111:2222::5555:6666:7777:8888", -1);
608 2 : testIPv6 (":1111::5555:6666:7777:8888", -1);
609 2 : testIPv6 (":::5555:6666:7777:8888", -1);
610 2 : testIPv6 (":1111:2222::4444:5555:6666:7777:8888", -1);
611 2 : testIPv6 (":1111::4444:5555:6666:7777:8888", -1);
612 2 : testIPv6 (":::4444:5555:6666:7777:8888", -1);
613 2 : testIPv6 (":1111::3333:4444:5555:6666:7777:8888", -1);
614 2 : testIPv6 (":::3333:4444:5555:6666:7777:8888", -1);
615 2 : testIPv6 (":::2222:3333:4444:5555:6666:7777:8888", -1);
616 2 : testIPv6 (":1111:2222:3333:4444:5555:6666:1.2.3.4", -1);
617 2 : testIPv6 (":1111:2222:3333:4444:5555::1.2.3.4", -1);
618 2 : testIPv6 (":1111:2222:3333:4444::1.2.3.4", -1);
619 2 : testIPv6 (":1111:2222:3333::1.2.3.4", -1);
620 2 : testIPv6 (":1111:2222::1.2.3.4", -1);
621 2 : testIPv6 (":1111::1.2.3.4", -1);
622 2 : testIPv6 (":::1.2.3.4", -1);
623 2 : testIPv6 (":1111:2222:3333:4444::6666:1.2.3.4", -1);
624 2 : testIPv6 (":1111:2222:3333::6666:1.2.3.4", -1);
625 2 : testIPv6 (":1111:2222::6666:1.2.3.4", -1);
626 2 : testIPv6 (":1111::6666:1.2.3.4", -1);
627 2 : testIPv6 (":::6666:1.2.3.4", -1);
628 2 : testIPv6 (":1111:2222:3333::5555:6666:1.2.3.4", -1);
629 2 : testIPv6 (":1111:2222::5555:6666:1.2.3.4", -1);
630 2 : testIPv6 (":1111::5555:6666:1.2.3.4", -1);
631 2 : testIPv6 (":::5555:6666:1.2.3.4", -1);
632 2 : testIPv6 (":1111:2222::4444:5555:6666:1.2.3.4", -1);
633 2 : testIPv6 (":1111::4444:5555:6666:1.2.3.4", -1);
634 2 : testIPv6 (":::4444:5555:6666:1.2.3.4", -1);
635 2 : testIPv6 (":1111::3333:4444:5555:6666:1.2.3.4", -1);
636 2 : testIPv6 (":::2222:3333:4444:5555:6666:1.2.3.4", -1);
637 :
638 : // Extra : at end
639 2 : testIPv6 ("1111:2222:3333:4444:5555:6666:7777:::", -1);
640 2 : testIPv6 ("1111:2222:3333:4444:5555:6666:::", -1);
641 2 : testIPv6 ("1111:2222:3333:4444:5555:::", -1);
642 2 : testIPv6 ("1111:2222:3333:4444:::", -1);
643 2 : testIPv6 ("1111:2222:3333:::", -1);
644 2 : testIPv6 ("1111:2222:::", -1);
645 2 : testIPv6 ("1111:::", -1);
646 2 : testIPv6 (":::", -1);
647 2 : testIPv6 ("1111:2222:3333:4444:5555:6666::8888:", -1);
648 2 : testIPv6 ("1111:2222:3333:4444:5555::8888:", -1);
649 2 : testIPv6 ("1111:2222:3333:4444::8888:", -1);
650 2 : testIPv6 ("1111:2222:3333::8888:", -1);
651 2 : testIPv6 ("1111:2222::8888:", -1);
652 2 : testIPv6 ("1111::8888:", -1);
653 2 : testIPv6 ("::8888:", -1);
654 2 : testIPv6 ("1111:2222:3333:4444:5555::7777:8888:", -1);
655 2 : testIPv6 ("1111:2222:3333:4444::7777:8888:", -1);
656 2 : testIPv6 ("1111:2222:3333::7777:8888:", -1);
657 2 : testIPv6 ("1111:2222::7777:8888:", -1);
658 2 : testIPv6 ("1111::7777:8888:", -1);
659 2 : testIPv6 ("::7777:8888:", -1);
660 2 : testIPv6 ("1111:2222:3333:4444::6666:7777:8888:", -1);
661 2 : testIPv6 ("1111:2222:3333::6666:7777:8888:", -1);
662 2 : testIPv6 ("1111:2222::6666:7777:8888:", -1);
663 2 : testIPv6 ("1111::6666:7777:8888:", -1);
664 2 : testIPv6 ("::6666:7777:8888:", -1);
665 2 : testIPv6 ("1111:2222:3333::5555:6666:7777:8888:", -1);
666 2 : testIPv6 ("1111:2222::5555:6666:7777:8888:", -1);
667 2 : testIPv6 ("1111::5555:6666:7777:8888:", -1);
668 2 : testIPv6 ("::5555:6666:7777:8888:", -1);
669 2 : testIPv6 ("1111:2222::4444:5555:6666:7777:8888:", -1);
670 2 : testIPv6 ("1111::4444:5555:6666:7777:8888:", -1);
671 2 : testIPv6 ("::4444:5555:6666:7777:8888:", -1);
672 2 : testIPv6 ("1111::3333:4444:5555:6666:7777:8888:", -1);
673 2 : testIPv6 ("::3333:4444:5555:6666:7777:8888:", -1);
674 2 : testIPv6 ("::2222:3333:4444:5555:6666:7777:8888:", -1);
675 :
676 : // Additional cases: http://crisp.tweakblogs.net/blog/2031/ipv6-validation-%28and-caveats%29.html
677 2 : testIPv6 ("0:a:b:c:d:e:f::", 1);
678 2 : testIPv6 ("::0:a:b:c:d:e:f", 1); // syntactically correct, but bad form (::0:... could be combined)
679 2 : testIPv6 ("a:b:c:d:e:f:0::", 1);
680 2 : testIPv6 ("':10.0.0.1", -1);
681 : }
682 : else
683 : {
684 : // Tested with
685 : // - http://formvalidation.io/validators/ip/
686 : // - http://www.csgnetwork.com/directipverify.html?IPvalue=192.168.1
687 2 : testIPv4 ("192.168.1", -1); // Invalid
688 : }
689 :
690 : if (!PLUGIN_LEAKS_MEMORY)
691 : {
692 4 : testIPAny ("::1", 1);
693 4 : testIPAny ("192.168.0.1", 1);
694 4 : testIPAny ("42.42.42.42", 1);
695 :
696 4 : testIPAny ("::ffff:192.0.128", -1);
697 4 : testIPAny ("x", -1);
698 : }
699 4 : }
|