--- ./index.php 2004-09-18 17:45:18.000000000 -0600 +++ ./index.php 2004-12-27 00:01:25.244845920 -0700 @@ -62,6 +62,9 @@ // Get functions require('src/functions.php'); +// Get IPv6 Functions +require('src/ipv6.php'); + // Connect to database require('src/connect.php'); diff -aur ../vegadns-0.9.8/src/add_record_form.php ./src/add_record_form.php --- ../vegadns-0.9.8/src/add_record_form.php 2004-09-23 09:17:20.000000000 -0600 +++ ./src/add_record_form.php 2004-12-27 00:04:06.361352488 -0700 @@ -31,9 +31,9 @@ } if($_REQUEST['mode'] == 'records') { - $smarty->assign('typearray', array('A','NS','MX','PTR','TXT','CNAME')); + $smarty->assign('typearray', array('A','AAAA','AAAA+PTR','NS','MX','PTR','TXT','CNAME')); } else if ($_REQUEST['mode'] == 'default_records') { - $smarty->assign('typearray', array('A','NS','MX','TXT','CNAME')); + $smarty->assign('typearray', array('A','AAAA','AAAA+PTR','NS','MX','TXT','CNAME')); } if(isset($_REQUEST['type'])) $smarty->assign('type_selected', $_REQUEST['type']); diff -aur ../vegadns-0.9.8/src/functions.php ./src/functions.php --- ../vegadns-0.9.8/src/functions.php 2004-12-08 14:19:15.000000000 -0700 +++ ./src/functions.php 2004-12-27 00:01:23.060178040 -0700 @@ -180,6 +180,8 @@ if($type == 'S') return 'SOA'; if($type == 'N') return 'NS'; if($type == 'A') return 'A'; + if($type == '3') return 'AAAA'; + if($type == '6') return 'AAAA+PTR'; if($type == 'M') return 'MX'; if($type == 'P') return 'PTR'; if($type == 'T') return 'TXT'; @@ -192,6 +194,8 @@ if($type == 'SOA') return 'S'; if($type == 'NS') return 'N'; if($type == 'A') return 'A'; + if($type == 'AAAA') return '3'; + if($type == 'AAAA+PTR') return '6'; if($type == 'MX') return 'M'; if($type == 'PTR') return 'P'; if($type == 'TXT') return 'T'; @@ -221,6 +225,28 @@ return $return; } +function validate_ipv6($ip) { + $class = new Net_IPv6; + return $class->checkIPv6($ip); +} + +function uncompress_ipv6($ip) { + $class = new Net_IPv6; + $ip = $class->uncompress($ip); + $splitip = explode(":", $ip); + for ($i=0, $max=sizeOf($splitip); $i<$max; $i++) { + $chunk =& $splitip[$i]; + $length = strlen($chunk); + if ($length<4) { + $filler=""; + for ($i=0; $i<(4-$length); $i++) $filler .= "0"; + $chunk = $filler.$chunk; + } + } + $ip = implode(":", $splitip); + return $ip; +} + function verify_record($name,$type,$address,$distance,$ttl) { // convert type to single character format @@ -240,6 +266,26 @@ } } + // verify AAAA record + if($type == 'AAAA') { + if(validate_ipv6ip($address) == FALSE) { + return "\"$address\" is not a valid AAAA record address"; + } + if(check_domain_name_format($name) == FALSE) { + return "\"$name\" is not a valid AAAA record name"; + } + } + + // verify AAAA+PTR record + if($type == 'AAAA+PTR') { + if(validate_ipv6ip($address) == FALSE) { + return "\"$address\" is not a valid AAAA+PTR record address"; + } + if(check_domain_name_format($name) == FALSE) { + return "\"$name\" is not a valid AAAA+PTR record name"; + } + } + // verify NS record if($type == 'N') { if(validate_ip($address) != FALSE) { diff -aur ../vegadns-0.9.8/src/ipv6.php ./src/ipv6.php --- ../vegadns-0.9.8/src/ipv6.php 2004-12-27 00:02:48.954120176 -0700 +++ ./src/ipv6.php 2004-12-27 00:01:23.067176976 -0700 @@ -0,0 +1,228 @@ + | +// +----------------------------------------------------------------------+ +// +// $Id: IPv6.php,v 1.8 2004/11/24 23:23:35 alexmerz Exp $ + +/** +* Class to validate and to work with IPv6 +* +* Todo: some optimizations for checkIPv6() +* +* @author Alexander Merz <[EMAIL PROTECTED]> +* @package Net_IPv6 +* @version $Id: IPv6.php,v 1.8 2004/11/24 23:23:35 alexmerz Exp $ +* @access public +*/ +class Net_IPv6 { + + // {{{ Uncompress() + + /** + * Uncompresses an IPv6 adress + * + * RFC 2373 allows you to compress zeros in an adress to '::'. This + * function expects an valid IPv6 adress and expands the '::' to + * the required zeros. + * + * Example: FF01::101 -> FF01:0:0:0:0:0:0:101 + * ::1 -> 0:0:0:0:0:0:0:1 + * + * @access public + * @see Compress() + * @static + * @param string $ip a valid IPv6-adress (hex format) + * @return string the uncompressed IPv6-adress (hex format) + */ + function Uncompress($ip) { + $uip = $ip; + $c1 = -1; + $c2 = -1; + if (false !== strpos($ip, '::') ) { + list($ip1, $ip2) = explode('::', $ip); + if(""==$ip1) { + $c1 = -1; + } else { + $pos = 0; + if(0 < ($pos = substr_count($ip1, ':'))) { + $c1 = $pos; + } else { + $c1 = 0; + } + } + if(""==$ip2) { + $c2 = -1; + } else { + $pos = 0; + if(0 < ($pos = substr_count($ip2, ':'))) { + $c2 = $pos; + } else { + $c2 = 0; + } + } + if(-1 == $c1 && -1 == $c2) { // :: + $uip = "0:0:0:0:0:0:0:0"; + } else if(-1==$c1) { // ::xxx + $fill = str_repeat('0:', 7-$c2); + $uip = str_replace('::', $fill, $uip); + } else if(-1==$c2) { // xxx:: + $fill = str_repeat(':0', 7-$c1); + $uip = str_replace('::', $fill, $uip); + } else { // xxx::xxx + $fill = str_repeat(':0:', 6-$c2-$c1); + $uip = str_replace('::', $fill, $uip); + $uip = str_replace('::', ':', $uip); + } + } + return $uip; + } + + // }}} + // {{{ Compress() + + /** + * Compresses an IPv6 adress + * + * RFC 2373 allows you to compress zeros in an adress to '::'. This + * function expects an valid IPv6 adress and compresses successive zeros + * to '::' + * + * Example: FF01:0:0:0:0:0:0:101 -> FF01::101 + * 0:0:0:0:0:0:0:1 -> ::1 + * + * @access public + * @see Uncompress() + * @static + * @param string $ip a valid IPv6-adress (hex format) + * @return string the compressed IPv6-adress (hex format) + */ + function Compress($ip) { + $cip = $ip; + if (!strstr($ip, "::")) { + $ipp = explode(':',$ip); + + for($i=0; $i0) { + $ipp[$i]=$ipp[$i].'_'; + } + } + $cip = join(':',$ipp); + $stop = false; + $pattern = "0:0"; + $pos=-1; + + while(!$stop) { + $pos = strpos($cip, $pattern); + if($pos === false) { + $stop = true; + $pos = -1; + } else { + $pattern = $pattern.":0"; + } + } + $cip = preg_replace("/".substr($pattern,0,-2)."/", ':', $cip,1); + if(1!=strlen($cip)) { + $cip = str_replace(':::', '::', $cip); + $cip = str_replace('_', '', $cip); + } else { + $cip = "::"; + } + + } + return $cip; + + } + + // }}} + // {{{ SplitV64() + + /** + * Splits an IPv6 adress into the IPv6 and a possible IPv4 part + * + * RFC 2373 allows you to note the last two parts of an IPv6 adress as + * an IPv4 compatible adress + * + * Example: 0:0:0:0:0:0:13.1.68.3 + * 0:0:0:0:0:FFFF:129.144.52.38 + * + * @access public + * @static + * @param string $ip a valid IPv6-adress (hex format) + * @return array [0] contains the IPv6 part, [1] the IPv4 part (hex format) + */ + function SplitV64($ip) { + $ip = Net_IPv6::Uncompress($ip); + if (strstr($ip, '.')) { + $pos = strrpos($ip, ':'); + $ip{$pos} = '_'; + $ipPart = explode('_', $ip); + return $ipPart; + } else { + return array($ip, ""); + } + } + + // }}} + // {{{ checkIPv6 + + /** + * Checks an IPv6 adress + * + * Checks if the given IP is IPv6-compatible + * + * @access public + * @static + * @param string $ip a valid IPv6-adress + * @return boolean true if $ip is an IPv6 adress + */ + function checkIPv6($ip) { + + $ipPart = Net_IPv6::SplitV64($ip); + $count = 0; + if (!empty($ipPart[0])) { + $ipv6 = explode(':', $ipPart[0]); + for ($i = 0; $i < count($ipv6); $i++) { + $dec = hexdec($ipv6[$i]); + if ($ipv6[$i] >= 0 && $dec <= 65535 && $ipv6[$i] == strtoupper(dechex($dec))) { + $count++; + } + } + if (8 == $count) { + return true; + } elseif (6 == $count and !empty($ipPart[1])) { + $ipv4 = explode('.',$ipPart[1]); + $count = 0; + for ($i = 0; $i < count($ipv4); $i++) { + if ($ipv4[$i] >= 0 && (integer)$ipv4[$i] <= 255 && preg_match("/^\d{1,3}$/", $ipv4[$i])) { + $count++; + } + } + if (4 == $count) { + return true; + } + } else { + return false; + } + + } else { + return false; + } + } + // }}} +} +?> diff -aur ../vegadns-0.9.8/src/records.php ./src/records.php --- ../vegadns-0.9.8/src/records.php 2004-10-15 16:23:57.000000000 -0600 +++ ./src/records.php 2004-12-27 00:01:23.094172872 -0700 @@ -303,6 +303,26 @@ '".set_type($_REQUEST['type'])."', '".mysql_escape_string($_REQUEST['address'])."', '".$_REQUEST['ttl']."')"; + } else if($_REQUEST['type'] == 'AAAA') { + $ipv6 = new Net_IPv6; + $address = uncompress_ipv6($_REQUEST['address']); + $q = "insert into records + (domain_id,host,type,val,ttl) values( + '".get_dom_id($domain)."', + '$name', + '".set_type($_REQUEST['type'])."', + '".mysql_escape_string($address)."', + '".$_REQUEST['ttl']."')"; + } else if($_REQUEST['type'] == 'AAAA+PTR') { + $ipv6 = new Net_IPv6; + $address = uncompress_ipv6($_REQUEST['address']); + $q = "insert into records + (domain_id,host,type,val,ttl) values( + '".get_dom_id($domain)."', + '$name', + '".set_type($_REQUEST['type'])."', + '".mysql_escape_string($address)."', + '".$_REQUEST['ttl']."')"; } else if($_REQUEST['type'] == 'MX') { if(!ereg("\..+$", $_REQUEST['address'])) { $mxaddress = $_REQUEST['address'].".".$domain; @@ -521,9 +541,15 @@ // Update record + if ($_REQUEST['type']=='AAAA' || $_REQUEST['type']=='AAAA+PTR') { + $address = uncompress_ipv6($_REQUEST['address']); + } else { + $address = $_REQUEST['address']; + } + $q = "update records set ". "host='$name',". - "val='".$_REQUEST['address']."',". + "val='".$address."',". "distance='".$_REQUEST['distance']."',". "ttl='".$_REQUEST['ttl']."' ". "where record_id='".$_REQUEST['record_id']."' and domain_id='".