On Thu, 2005-02-03 at 09:49 -0800, Bill Shupp wrote:
> Logan Michels wrote:
>
> > I also uploaded the patch for vegadns to my webserver at
> > http://www.stfunoob.com/ipv6-dns/.
>
>
>
> This site is not working right now, and I'm ready to test the patch.
> Can you send it directly to me? Or does anyone else have a copy?
>
> Regards,
>
> Bill
>
diff -aur ../vegadns-0.9.8/index.php ./index.php
--- ../vegadns-0.9.8/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 @@
+<?php
+//
+// +----------------------------------------------------------------------+
+// | PHP Version 4 |
+// +----------------------------------------------------------------------+
+// | Copyright (c) 1997-2003 The PHP Group |
+// +----------------------------------------------------------------------+
+// | This source file is subject to version 2.0 of the PHP license, |
+// | that is bundled with this package in the file LICENSE, and is |
+// | available at through the world-wide-web at |
+// | http://www.php.net/license/2_02.txt. |
+// | If you did not receive a copy of the PHP license and are unable to |
+// | obtain it through the world-wide-web, please send a note to |
+// | [EMAIL PROTECTED] so we can mail you a copy immediately. |
+// +----------------------------------------------------------------------+
+// | Authors: Alexander Merz <[EMAIL PROTECTED]> |
+// +----------------------------------------------------------------------+
+//
+// $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; $i<count($ipp); $i++) {
+ $ipp[$i] = $ipp[$i];
+ if(hexdec($ipp[$i])>0) {
+ $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='".