Skip to content

Commit

Permalink
Merge pull request #61 from kobliha/master
Browse files Browse the repository at this point in the history
Added functionality for checking network with or without netmask
  • Loading branch information
mvidner committed May 3, 2013
2 parents 337cf6f + 7211182 commit a44dafa
Show file tree
Hide file tree
Showing 4 changed files with 208 additions and 0 deletions.
106 changes: 106 additions & 0 deletions library/types/src/IP.ycp
Expand Up @@ -34,6 +34,8 @@ you may find current contact information at www.novell.com
module "IP";
textdomain "base";

import "Netmask";

global string ValidChars = "0123456789abcdefABCDEF.:";
global string ValidChars4 = "0123456789.";
global string ValidChars6 = "0123456789abcdefABCDEF:";
Expand Down Expand Up @@ -287,5 +289,109 @@ global string BitsToIPv4 (string bits) {
return ipv4;
}

boolean CheckNetworkShared(string network) {
if (network == nil || network == "") {
return false;

// all networks
} else if (network == "0/0") {
return true;
}

return nil;
}

/**
* Checks the given IPv4 network entry.
*
* @see CheckNetwork for details.
* @see CheckNetwork6 for IPv6 version of the same function.
*
* @example
* CheckNetwork("192.168.0.0/255.255.255.0") -> true
* CheckNetwork("192.168.1.22") -> true
* CheckNetwork("172.55.0.0/33") -> false
*/
global boolean CheckNetwork4(string network) {
boolean generic_check = CheckNetworkShared(network);
if (generic_check != nil) {
return generic_check;

// 192.168.0.1, 0.8.55.999
} else if (Check4(network)) {
return true;

// 192.168.0.0/20, 0.8.55/158
} else if (regexpmatch(network, "^[" + IP::ValidChars4 + "]+/[0-9]+$")) {
list <string> net_parts = splitstring(network, "/");
return (Check4 (net_parts[0]:"") && Netmask::CheckPrefix4 (net_parts[1]:""));

// 192.168.0.0/255.255.255.0, 0.8.55/10.258.12
} else if (regexpmatch(network, "^[" + ValidChars4 + "]+/[" + ValidChars4 + "]+$")) {
list <string> net_parts = splitstring(network, "/");
return (IP::Check4 (net_parts[0]:"") && Netmask::Check4 (net_parts[1]:""));
}

return false;
}

/**
* Checks the given IPv6 network entry.
*
* @see CheckNetwork for details.
* @see CheckNetwork4 for IPv4 version of the same function.
*
* @example
* CheckNetwork("2001:db8:0::1/64") -> true
* CheckNetwork("2001:db8:0::1") -> true
* CheckNetwork("::1/257") -> false
*/
global boolean CheckNetwork6(string network) {
boolean generic_check = CheckNetworkShared(network);
if (generic_check != nil) {
return generic_check;

// 2001:db8:0::1
} else if (IP::Check6(network)) {
return true;

// 2001:db8:0::1/64
} else if (regexpmatch(network, "^[" + IP::ValidChars6 + "]+/[" + Netmask::ValidChars6 + "]+$")) {
list <string> net_parts = splitstring(network, "/");
return (IP::Check6 (net_parts[0]:"") && Netmask::Check6 (net_parts[1]:""));

// 2001:db8:0::1/ffff:ffff::0
} else if (regexpmatch(network, "^[" + IP::ValidChars6 + "]+/[" + IP::ValidChars6 + "]+$")) {
list <string> net_parts = splitstring(network, "/");
return (IP::Check6 (net_parts[0]:"") && IP::Check6 (net_parts[1]:""));
}

return false;
}

/**
* Checks the given network entry which can be defined in several formats:
* - Single IPv4 or IPv6, e.g., 192.168.0.1 or 2001:db8:0::1
* - IP/Netmask, e.g., 192.168.0.0/255.255.255.0 or 2001:db8:0::1/ffff:ffff::0
* - IP/CIDR, e.g., 192.168.0.0/20 or 2001:db8:0::1/56
*
* @example
* CheckNetwork("192.168.0.1") -> true
* CheckNetwork("192.168.0.0/20") -> true
* CheckNetwork("192.168.0.0/255.255.255.0") -> true
* CheckNetwork("0/0") -> true
* CheckNetwork("::1/128") -> true
* CheckNetwork("2001:db8:0::1") -> true
* CheckNetwork("2001:db8:0::1/64") -> true
* CheckNetwork("2001:db8:0::1/ffff:ffff::0") -> true
* CheckNetwork("2001:db8:0::xyz") -> false
* CheckNetwork("::1/257") -> false
* CheckNetwork("172.55.0.0/33") -> false
* CheckNetwork("172.55.0.0/125.85.5.5") -> false
*/
global boolean CheckNetwork(string network) {
return CheckNetwork4(network) || CheckNetwork6(network);
}

/* EOF */
}
45 changes: 45 additions & 0 deletions library/types/testsuite/tests/IP.out
Expand Up @@ -75,3 +75,48 @@ Dump IP::ComputeBroadcast
Return 127.255.255.255
Return 192.168.110.255
Return 10.20.15.255
Dump IP::CheckNetwork4 -> true
Return true
Return true
Return true
Return true
Return true
Return true
Return true
Return true
Return true
Return true
Dump IP::CheckNetwork4 -> false
Return false
Return false
Return false
Return false
Return false
Return false
Dump IP::CheckNetwork6 -> true
Return true
Return true
Return true
Return true
Return true
Return true
Return true
Return true
Return true
Dump IP::CheckNetwork6 -> false
Return false
Return false
Return false
Return false
Return false
Return false
Dump IP::CheckNetwork -> true
Return true
Return true
Return true
Return true
Dump IP::CheckNetwork -> false
Return false
Return false
Return false
Return false
51 changes: 51 additions & 0 deletions library/types/testsuite/tests/IP.ycp
Expand Up @@ -114,4 +114,55 @@ TEST(``(IP::ComputeBroadcast("127.0.0.1","255.0.0.0")), [], nil);
TEST(``(IP::ComputeBroadcast("192.168.110.23","255.255.255.0")), [], nil);
TEST(``(IP::ComputeBroadcast("10.20.1.29","255.255.240.0")), [], nil);

DUMP("IP::CheckNetwork4 -> true");
TEST(``(IP::CheckNetwork4("192.168.0.1")), [], nil);
TEST(``(IP::CheckNetwork4("192.168.0.255")), [], nil);
TEST(``(IP::CheckNetwork4("192.168.0.1/20")), [], nil);
TEST(``(IP::CheckNetwork4("192.168.0.255/32")), [], nil);
TEST(``(IP::CheckNetwork4("192.168.0.1/255.240.0.0")), [], nil);
TEST(``(IP::CheckNetwork4("192.168.0.255/255.255.255.255")), [], nil);
TEST(``(IP::CheckNetwork4("192.168.0.1/0")), [], nil);
TEST(``(IP::CheckNetwork4("172.55.0.0/1")), [], nil);
TEST(``(IP::CheckNetwork4("0/0")), [], nil);
TEST(``(IP::CheckNetwork4("255.255.255.255/255.255.255.255")), [], nil);

DUMP("IP::CheckNetwork4 -> false");
TEST(``(IP::CheckNetwork4("")), [], nil);
TEST(``(IP::CheckNetwork4("172.55.0.0/33")), [], nil);
TEST(``(IP::CheckNetwork4("256.168.0.255")), [], nil);
TEST(``(IP::CheckNetwork4("172.55.0.0/125.85.5.5")), [], nil);
TEST(``(IP::CheckNetwork4("192.168.0.255/5.5.5")), [], nil);
TEST(``(IP::CheckNetwork4("192.168.0.255/255.255.0.255")), [], nil);

DUMP("IP::CheckNetwork6 -> true");
TEST(``(IP::CheckNetwork6("FE80:0000:0000:0000:0202:B3FF:FE1E:8329")), [], nil);
TEST(``(IP::CheckNetwork6("2001:db8:0::1")), [], nil);
TEST(``(IP::CheckNetwork6("2000::/3")), [], nil);
TEST(``(IP::CheckNetwork6("2001:db8:0::1/56")), [], nil);
TEST(``(IP::CheckNetwork6("2001:db8:0::1/64")), [], nil);
TEST(``(IP::CheckNetwork6("2001:db8:0::1/ffff::0")), [], nil);
TEST(``(IP::CheckNetwork6("2001:db8:0::1/ffff:ffff::0")), [], nil);
TEST(``(IP::CheckNetwork6("::1/128")), [], nil);
TEST(``(IP::CheckNetwork6("0/0")), [], nil);

DUMP("IP::CheckNetwork6 -> false");
TEST(``(IP::CheckNetwork6("")), [], nil);
TEST(``(IP::CheckNetwork6("FE80:0000:0000:0000:0202:B3FF:FE1E:8329:0000")), [], nil);
TEST(``(IP::CheckNetwork6("2001:db8:0::xyz")), [], nil);
TEST(``(IP::CheckNetwork6("::1/257")), [], nil);
TEST(``(IP::CheckNetwork6("::1/")), [], nil);
TEST(``(IP::CheckNetwork6("2001:db8:0::1/ffff:xyz::0")), [], nil);

DUMP("IP::CheckNetwork -> true");
TEST(``(IP::CheckNetwork("192.168.0.1")), [], nil);
TEST(``(IP::CheckNetwork("172.55.0.0/1")), [], nil);
TEST(``(IP::CheckNetwork("2001:db8:0::1")), [], nil);
TEST(``(IP::CheckNetwork("2001:db8:0::1/ffff::0")), [], nil);

DUMP("IP::CheckNetwork -> false");
TEST(``(IP::CheckNetwork("256.168.0.255")), [], nil);
TEST(``(IP::CheckNetwork("192.168.0.255/5.5.5")), [], nil);
TEST(``(IP::CheckNetwork("2001:db8:0::xyz")), [], nil);
TEST(``(IP::CheckNetwork("2001:db8:0::1/ffff:xyz::0")), [], nil);

}
6 changes: 6 additions & 0 deletions package/yast2.changes
@@ -1,3 +1,9 @@
-------------------------------------------------------------------
Fri May 3 17:04:22 UTC 2013 - locilka@suse.com

- Added functionality for checking network entry with optional
netmask in IP or CIDR format (bnc#800592).

-------------------------------------------------------------------
Thu May 2 10:32:13 UTC 2013 - locilka@suse.com

Expand Down

0 comments on commit a44dafa

Please sign in to comment.