Signed-off-by: Damien PIQUET <piqu...@gmail.com>
---
 data/PVE/JSONSchema.pm |   45 +++++++++++++++++++++++++++++++++++++++------
 1 file changed, 39 insertions(+), 6 deletions(-)

diff --git a/data/PVE/JSONSchema.pm b/data/PVE/JSONSchema.pm
index 4b33646..d0d11f8 100644
--- a/data/PVE/JSONSchema.pm
+++ b/data/PVE/JSONSchema.pm
@@ -140,14 +140,47 @@ register_format('ipv4', \&pve_verify_ipv4);
 sub pve_verify_ipv4 {
     my ($ipv4, $noerr) = @_;
 
-   if ($ipv4 !~ m/^(\d{1,3})\.(\d{1,3})\.(\d{1,3})\.(\d{1,3})$/ ||
-       !(($1 > 0) && ($1 < 255) &&
-        ($2 <= 255) && ($3 <= 255) && 
-        ($4 > 0) && ($4 < 255)))  {
-          return undef if $noerr;
+    my $valid = 0;
+
+    if ($ipv4 =~ m/^(\d{1,3})\.(\d{1,3})\.(\d{1,3})\.(\d{1,3})$/) {
+       # got a class A address
+       if ($1 < 128) { 
+          if (($1 > 0)&&
+             ($2 <= 255)&&($2 >= 0) &&
+             ($3 <= 255)&&($3 >= 0) &&
+             ($4 <= 255)&&($4 >= 0) &&
+             ($2+$3+$4 > 0)&&($2+$3+$4 < 765)) {
+                 $valid = 1;
+          }
+       }
+       # got a class B address
+       elsif ($1 < 192) {
+          if (($1 > 0)&&
+             ($2 <= 255)&&($2 >= 0) &&
+             ($3 <= 255)&&($3 >= 0) &&
+             ($4 < 255)&&($4 > 0) &&
+             ($3+$4 > 0)&&($3+$4 < 510)) {
+                 $valid = 1;
+          }
+       }
+       # got a class C address
+       else {
+          if (($1 > 0)&&
+             ($2 <= 255)&&($2 >= 0) &&
+             ($3 <= 255)&&($3 >= 0) &&
+             ($4 < 255)&&($4 > 0)) {
+                 $valid = 1;
+          }
+       }
+    }
+
+    if($valid) {
+       return $ipv4;
+    }
+    else {
+       return undef if $noerr;
        die "value does not look like a valid IP address\n";
     }
-    return $ipv4;
 }
 
 my $ipv4_mask_hash = {
-- 
1.7.10.4

_______________________________________________
pve-devel mailing list
pve-devel@pve.proxmox.com
http://pve.proxmox.com/cgi-bin/mailman/listinfo/pve-devel

Reply via email to