diff --git a/install/ui/Makefile.am b/install/ui/Makefile.am index 835888d94..8d6abf7f7 100644 --- a/install/ui/Makefile.am +++ b/install/ui/Makefile.am @@ -38,6 +38,7 @@ app_DATA = \ jquery.ordered-map.js \ json2.js \ navigation.js \ + net.js \ netgroup.js \ overpass_bold-web.eot \ overpass_bold-web.svg \ diff --git a/install/ui/jsl.conf b/install/ui/jsl.conf index d4bbf770f..f8a4f5e05 100644 --- a/install/ui/jsl.conf +++ b/install/ui/jsl.conf @@ -129,6 +129,7 @@ +process ipa.js +process widget.js +process field.js ++process net.js +process dialog.js +process search.js +process details.js diff --git a/install/ui/net.js b/install/ui/net.js new file mode 100644 index 000000000..6b4b20cfa --- /dev/null +++ b/install/ui/net.js @@ -0,0 +1,389 @@ +/* Authors: + * Petr Vobornik + * + * Copyright (C) 2010 Red Hat + * see file 'COPYING' for use and warranty information + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +var NET = {}; + +NET.ip_address = function(spec) { + + spec = spec || {}; + + if (typeof spec === 'string') { + spec = { + address: spec + }; + } + + var that = {}; + + that.input = spec.address; + + that.type = spec.type; + that.parts = spec.parts; + that.reverse_address = ''; + that.only_decimal = spec.only_decimal !== undefined? spec.only_decimal : + false; //for parsing IPv4 address + + that.parse = function() { + + if (!that.input && !that.parts) { + that.set_error('no input'); + return false; + } + + if (!that.type) { + that.type = that.detect_type(); + } + + if (that.type === 'v4-quads') { + return that.parse_v4_quads(); + } else if (that.type === 'v4-int') { + return that.parse_v4_int(); + } else if (that.type === 'v6') { + return that.parse_v6(); + } + + that.set_error('not an ip address'); + return false; + }; + + that.detect_type = function() { + + var type; + + if (!that.input) return null; + + if (that.input.indexOf(':') > -1) type = 'v6'; + else if (that.input.indexOf('.') > -1) type = 'v4-quads'; + else type = 'v4-int'; + + return type; + }; + + that.parse_v4_int = function() { + + var part = { value: that.input }; + if(!that.is_part_valid_v4(part, 32, that.only_decimal)) return false; + + that.parts = []; + that.make_quads(part.decimal_value, that.parts); + + that.valid = true; + return true; + }; + + that.parse_v4_quads = function() { + + if (!that.parts) { + that.parts = that.input.split('.'); + } + + if (that.parts.length !== 4) { + return that.set_error('invalid number of parts'); + } + + for (var i=0; i<4; i++) { + + var part = { value: that.parts[i] }; + + if (!that.is_part_valid_v4(part, 8, that.only_decimal)) { + return false; + } + that.parts[i] = part.decimal_value.toString(10); + } + + that.valid = true; + return true; + }; + + that.parse_v6 = function() { + + if (!that.parts) { + that.parts = that.input.split(':'); + } + + var total_parts = that.parts.length; + var ipv4_present = false; + var double_colon = false; + var double_colon_position; + + var i; + + for (i=0; i -1) { + ipv4_present = true; + total_parts++; //ipv4 part consists of 4 octects (two parts) + } + + //checking for :: + if (part.length === 0) { + + if (!double_colon || //first occurance + (double_colon && i === 1) || //still at the beginning + (double_colon && i === that.parts.length - 1 && + double_colon_position === i -1)) { //still at the end + + part = '0000'; + that.parts[i] = part; + double_colon = true; + double_colon_position = i; + } else { //second occurance of :: + return that.set_error('invalid format: mupltiple ::'); + } + } + + //add missing zeros for not empty parts + if (part.length !== 0 && part.length < 4) { + part = add_trailing_zeros(part, 4 - part.length); + that.parts[i] = part; + } + } + + //add missing empty parts + if (double_colon) { + var parts_to_add = 8 - total_parts; + + for (i=0; i=0; i--) { + that.reverse_parts.push(that.parts[i]); + } + + that.reverse_parts.push('in-addr'); + that.reverse_parts.push('arpa'); + + return that.reverse_parts.join('.'); + }; + + that.get_v6_reverse = function() { + + that.reverse_parts = []; + + var address = that.parts.join(''); + + for (var i=31; i>=0; i--) { + that.reverse_parts.push(address[i]); + } + + that.reverse_parts.push('ip6'); + that.reverse_parts.push('arpa'); + + return that.reverse_parts.join('.'); + }; + + that.set_error = function(msg) { + that.valid = false; + that.error = msg; + return false; + }; + + that.is_part_valid_v6 = function(str) { + + if (str.length === 0) { + return that.set_error('not a number'); + } + + if (str.length > 4) { + return that.set_error('wrong format - too long'); + } + + for (var i=0; i 1) { + return that.set_error('invalid format: trailing zeros'); + } + } + + var max_value = Math.pow(2, bits) - 1; + + part.decimal_value = parseInt(part.value, radix); + + if (part.decimal_value > max_value) { + return that.set_error('value out of range'); + } + + return true; + }; + + that.get_radix = function(str) { + + var normalized = str.toLowerCase(); + + if (normalized.length > 2 && + normalized[0] === '0' && + normalized[1] === 'x') { + return 16; + + } else if (normalized.length > 1 && normalized[0] === '0') { + return 8; + } + + return 10; + }; + + that.make_quads = function(integer, quads) { + + var hex_str = integer.toString(16); + if (hex_str.length < 8) { + hex_str = add_trailing_zeros(hex_str, 8 - hex_str.length); + } + + for (var i=0; i 2 && + normalized[0] === '0' && + normalized[1] === 'x') { + return 16; + + } else if (normalized.length > 1 && normalized[0] === '0') { + return 8; + } + + return 10; + }; + + that.parse(); + + return that; +}; \ No newline at end of file diff --git a/install/ui/test/all_tests.html b/install/ui/test/all_tests.html index a62210ec9..5a5eae54b 100644 --- a/install/ui/test/all_tests.html +++ b/install/ui/test/all_tests.html @@ -8,6 +8,7 @@ + @@ -30,6 +31,7 @@ +

Complete Test Suite

@@ -39,4 +41,4 @@
    - + \ No newline at end of file diff --git a/install/ui/test/details_tests.js b/install/ui/test/details_tests.js index 353fb3ea1..60c899e60 100644 --- a/install/ui/test/details_tests.js +++ b/install/ui/test/details_tests.js @@ -121,7 +121,6 @@ test("Testing details lifecycle: create, load.", function(){ method: 'show', args: ['kfrog'], on_success: function(data, text_status, xhr) { - result = data.result.result; ok(true, "IPA.command() succeeded."); }, on_error: function(xhr, text_status, error_thrown) { diff --git a/install/ui/test/index.html b/install/ui/test/index.html index 3552cc77e..1b623d40f 100644 --- a/install/ui/test/index.html +++ b/install/ui/test/index.html @@ -33,7 +33,7 @@
  1. Certificate Test Suite
  2. Access Control Interface Test Suite
  3. Widget Test Suite - +
  4. IP Addresses Test Suite diff --git a/install/ui/test/ip_tests.html b/install/ui/test/ip_tests.html new file mode 100644 index 000000000..76ba2a590 --- /dev/null +++ b/install/ui/test/ip_tests.html @@ -0,0 +1,18 @@ + + + + IP addresses test suite + + + + + + +

    IP addresses test suite

    +

    +
    +

    +
      +
      + + \ No newline at end of file diff --git a/install/ui/test/ip_tests.js b/install/ui/test/ip_tests.js new file mode 100644 index 000000000..8bac3a6ad --- /dev/null +++ b/install/ui/test/ip_tests.js @@ -0,0 +1,300 @@ +/* Authors: + * Petr Vobornik + * + * Copyright (C) 2010 Red Hat + * see file 'COPYING' for use and warranty information + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +module('ip-addresses',{ + setup: function() { + }, + teardown: function() { + } +}); + +var get_reverse = function(str) { + var address = NET.ip_address(str); + return address.get_reverse(); +}; + +test('Testing correct IPv4 addresses', function() { + + var address = NET.ip_address('255.0.173.1'); + ok(address.valid, 'Dotted decimal - 255.0.173.1'); + same(address.parts, ['255', '0', '173', '1'], 'Checking parts'); + + address = NET.ip_address('0377.0.0255.01'); + ok(address.valid, 'Dotted octal - 0377.0.0255.01'); + same(address.parts, ['255', '0', '173', '1'], 'Checking parts'); + + address = NET.ip_address('0xFF.0x0.0xAD.0x1'); + ok(address.valid, 'Dotted hexadecimal - 0xFF.0x.0xAD.0x1'); + same(address.parts, ['255', '0', '173', '1'], 'Checking parts'); + + address = NET.ip_address('4294967295'); + ok(address.valid, 'Max decimal - 4294967295'); + same(address.parts, ['255', '255', '255', '255'], 'Checking parts'); + + address = NET.ip_address('037777777777'); + ok(address.valid, 'Max octal - 037777777777'); + same(address.parts, ['255', '255', '255', '255'], 'Checking parts'); + + address = NET.ip_address('0xFFFFFFFF'); + ok(address.valid, 'Max hexadecimal - 0xFFFFFFFF'); + same(address.parts, ['255', '255', '255', '255'], 'Checking parts'); + + address = NET.ip_address('255.0.0xAD.01'); + ok(address.valid, 'Dotted mixed - 255.0.0xAD.01'); + same(address.parts, ['255', '0', '173', '1'], 'Checking parts'); + + address = NET.ip_address('0'); + ok(address.valid, 'Zero decimal - 0'); + same(address.parts, ['0', '0', '0', '0'], 'Checking parts'); + + address = NET.ip_address('00'); + ok(address.valid, 'Zero octal - 00'); + same(address.parts, ['0', '0', '0', '0'], 'Checking parts'); + + address = NET.ip_address('0X0'); + ok(address.valid, 'Zero hexa - 0X0'); + same(address.parts, ['0', '0', '0', '0'], 'Checking parts'); +}); + +test('Testing incorrect IPv4 addresses', function() { + + var address = NET.ip_address('256.0.0.1'); + ok(!address.valid, 'Out of range - 256.0.0.1'); + + address = NET.ip_address('0x100.0.0.1'); + ok(!address.valid, 'Out of range - 0x100.0.0.1'); + + address = NET.ip_address('0400.0.0.1'); + ok(!address.valid, 'Out of range - 0400.0.0.1'); + + + address = NET.ip_address('0x100000000'); + ok(!address.valid, 'Out of range - 0x100000000'); + + address = NET.ip_address('040000000000'); + ok(!address.valid, 'Out of range - 040000000000'); + + address = NET.ip_address('4294967296'); + ok(!address.valid, 'Out of range - 4294967296'); + + address = NET.ip_address('250.0.173'); + ok(!address.valid, '3 parts - 250.0.173'); + + address = NET.ip_address('250.0.173.21.21'); + ok(!address.valid, '5 parts - 250.0.173.21.21'); + + address = NET.ip_address('250.001.173.21'); + ok(!address.valid, 'Trailing zeros - 250.001.173.21'); + + address = NET.ip_address('250.001.173.FF'); + ok(!address.valid, 'Bad hexapart - 250.01.173.FF'); + + address = NET.ip_address('abcd'); + ok(!address.valid, 'Word - abcd'); + + address = NET.ip_address('192.168 .0.21'); + ok(!address.valid, 'With space - 192.168 .0.21'); + + address = NET.ip_address(' 192.168.0.21'); + ok(!address.valid, 'With space - " 192.168.0.21"'); +}); + +test('Testing correct IPv6 addresses', function() { + + var address = NET.ip_address('2001:0db8:85a3:0000:0000:8a2e:0370:7334'); + ok(address.valid, 'Address - 2001:0db8:85a3:0000:0000:8a2e:0370:7334'); + same(address.parts, ['2001', '0db8', '85a3', '0000','0000','8a2e','0370','7334'], 'Checking parts'); + + address = NET.ip_address('2001:db8:85a3:0:0:8a2e:370:7334'); + ok(address.valid, 'Without trailing zeros - 2001:db8:85a3:0:0:8a2e:370:7334'); + same(address.parts, ['2001', '0db8', '85a3', '0000','0000','8a2e','0370','7334'], 'Checking parts'); + + address = NET.ip_address('2001:db8::1:0:0:1'); + ok(address.valid, 'With :: - 2001:db8::1:0:0:1'); + same(address.parts, ['2001', '0db8', '0000', '0000','0001','0000','0000','0001'], 'Checking parts'); + + address = NET.ip_address('::1'); + ok(address.valid, 'Address - ::1'); + same(address.parts, ['0000', '0000', '0000', '0000','0000','0000','0000','0001'], 'Checking parts'); + + address = NET.ip_address('::'); + ok(address.valid, 'Address - ::'); + same(address.parts, ['0000', '0000', '0000', '0000','0000','0000','0000','0000'], 'Checking parts'); + + address = NET.ip_address('1::'); + ok(address.valid, 'Address - 1::'); + same(address.parts, ['0001', '0000', '0000', '0000','0000','0000','0000','0000'], 'Checking parts'); + + address = NET.ip_address('::ffff:192.0.2.128'); + ok(address.valid, 'With IPv4 part - ::ffff:192.0.2.128'); + same(address.parts, ['0000', '0000', '0000', '0000','0000','ffff','c000','0280'], 'Checking parts'); + +}); + +test('Testing incorrect IPv6 addresses', function() { + + var address = NET.ip_address('02001:0db8:85a3:0000:0000:8a2e:0370:7334'); + ok(!address.valid, 'Too long part- 02001:0db8:85a3:0000:0000:8a2e:0370:7334'); + + address = NET.ip_address('2001:db8:85a3:0:0:8a2e:370'); + ok(!address.valid, 'Missing part - 2001:db8:85a3:0:0:8a2e:370'); + + address = NET.ip_address('::1::'); + ok(!address.valid, 'Address - ::1::'); + + address = NET.ip_address(':::'); + ok(!address.valid, 'Address - :::'); + + address = NET.ip_address('1::1::1'); + ok(!address.valid, 'Address - 1::1::1'); + + address = NET.ip_address('::ffff:192.0.0x2.128'); + ok(!address.valid, 'With IPv4 hex part - ::ffff:192.0.0x2.128'); + + address = NET.ip_address('::ffff:192.0.02.128'); + ok(!address.valid, 'With IPv4 oct part - ::ffff:192.0.02.128'); + + address = NET.ip_address('aa:rt::'); + ok(!address.valid, 'Invalid chars - aa:rt::'); +}); + + +test('Testing reverse addresses', function() { + + var reverse_valid = '4.3.3.7.0.7.3.0.e.2.a.8.0.0.0.0.0.0.0.0.3.a.5.8.8.b.d.0.1.0.0.2.ip6.arpa'; + + var reverse = get_reverse('2001:0db8:85a3:0000:0000:8a2e:0370:7334'); + same(reverse, reverse_valid, '2001:0db8:85a3:0000:0000:8a2e:0370:7334'); + + reverse = get_reverse('2001:db8:85a3::8a2e:370:7334'); + same(reverse, reverse_valid, '2001:db8:85a3::8a2e:370:7334'); + + reverse_valid = '1.0.168.192.in-addr.arpa'; + reverse = get_reverse('192.168.0.1'); + same(reverse, reverse_valid, '192.168.0.1'); + + reverse_valid = '0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.ip6.arpa'; + reverse = get_reverse('::'); + same(reverse, reverse_valid, '::'); + + reverse_valid = '1.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.ip6.arpa'; + reverse = get_reverse('::1'); + same(reverse, reverse_valid, '::1'); + + reverse_valid = '0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.1.0.0.0.ip6.arpa'; + reverse = get_reverse('1::'); + same(reverse, reverse_valid, '1::'); + + reverse_valid = '5.1.0.0.8.a.0.c.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.ip6.arpa'; + reverse = get_reverse('::192.168.0.21'); + same(reverse, reverse_valid, '::192.168.0.21'); + + reverse_valid = '255.254.253.252.in-addr.arpa'; + reverse = get_reverse('0xFCFDFEFF'); + same(reverse, reverse_valid, '0xFCFDFEFF'); + + reverse = get_reverse('4244504319'); + same(reverse, reverse_valid, '4244504319'); + + reverse = get_reverse('037477377377'); + same(reverse, reverse_valid, '037477377377'); + + reverse_valid = '0.0.0.0.in-addr.arpa'; + reverse = get_reverse('0'); + same(reverse, reverse_valid, '0'); + + reverse = get_reverse('00'); + same(reverse, reverse_valid, '00'); + + reverse = get_reverse('0x0'); + same(reverse, reverse_valid, '0x0'); +}); + +test('Usage - constructor direct input', function() { + + var address = NET.ip_address('0xC0A80001'); + ok(address.valid, 'Valid'); + same(address.type, 'v4-int', 'Checking type'); + same(address.parts, ['192', '168', '0', '1'], 'Checking parts'); + var reverse_valid = '1.0.168.192.in-addr.arpa'; + same(address.get_reverse(), reverse_valid, 'Checking reverse address'); +}); + +test('Usage - constructor spec object', function() { + + var address = NET.ip_address({ address: '0xC0A80001' }); + ok(address.valid, 'Valid'); + same(address.type, 'v4-int', 'Checking type'); + same(address.parts, ['192', '168', '0', '1'], 'Checking parts'); + var reverse_valid = '1.0.168.192.in-addr.arpa'; + same(address.get_reverse(), reverse_valid, 'Checking reverse address'); +}); + +test('Usage - constructor spec object - by parts', function() { + + var address = NET.ip_address({ + parts: ['0xC0', '168', '00', '1'], + type: 'v4-quads' + }); + ok(address.valid, 'Valid'); + same(address.type, 'v4-quads', 'Checking type'); + same(address.parts, ['192', '168', '0', '1'], 'Checking parts'); + var reverse_valid = '1.0.168.192.in-addr.arpa'; + same(address.get_reverse(), reverse_valid, 'Checking reverse address'); +}); + +test('Usage - constructor spec object - by parts - IPv6', function() { + + var address = NET.ip_address({ + parts: ['2001','db8','85a3','0','0','8a2e','370','7334'], + type: 'v6' + }); + ok(address.valid, 'Valid'); + same(address.type, 'v6', 'Checking type'); + same(address.parts, ['2001','0db8','85a3','0000','0000','8a2e','0370','7334'], 'Checking parts'); + var reverse_valid = '4.3.3.7.0.7.3.0.e.2.a.8.0.0.0.0.0.0.0.0.3.a.5.8.8.b.d.0.1.0.0.2.ip6.arpa'; + same(address.get_reverse(), reverse_valid, 'Checking reverse address'); +}); + + +test('Usage - set address.input', function() { + + var address = NET.ip_address(); + + ok(!address.valid, 'No input - invalid'); + address.input = '192.168.0.1'; + address.parse(); + ok(address.valid, 'Valid'); + same(address.type, 'v4-quads', 'Checking type'); + same(address.parts, ['192', '168', '0', '1'], 'Checking parts'); + var reverse_valid = '1.0.168.192.in-addr.arpa'; + same(address.get_reverse(), reverse_valid, 'Checking reverse address'); +}); + +test('Usage - set address.parts, no type', function() { + + var address = NET.ip_address(); + + ok(!address.valid, 'No input - invalid'); + address.parts = ['192', '168', '0', '1']; + address.parse(); + ok(!address.valid, 'Still invalid'); + same(address.type, null, 'Checking type'); +}); \ No newline at end of file diff --git a/install/ui/test/jsl.conf b/install/ui/test/jsl.conf index 470d92896..4654b714f 100644 --- a/install/ui/test/jsl.conf +++ b/install/ui/test/jsl.conf @@ -128,6 +128,7 @@ +define equals +define IPA +define expect ++define NET ### Files @@ -144,4 +145,5 @@ +process details_tests.js +process ipa_tests.js +process ordered_map_tests.js -+process widget_tests.js \ No newline at end of file ++process widget_tests.js ++process ip_tests.js \ No newline at end of file