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='".

Reply via email to