changeset 2:f6954b464d2f draft

Small fixes and improvements in MARC NameServer
author Ivo Smits <Ivo@UCIS.nl>
date Fri, 14 Nov 2014 00:08:24 +0100
parents caa68b502313
children 5c8c4fa95803
files marns.php
diffstat 1 files changed, 20 insertions(+), 13 deletions(-) [+]
line wrap: on
line diff
--- a/marns.php	Thu Nov 13 17:22:12 2014 +0100
+++ b/marns.php	Fri Nov 14 00:08:24 2014 +0100
@@ -47,13 +47,17 @@
 function dns_process($reqbuffer, $remoteaddr) {
 	$req = dns_decode($reqbuffer);
 	if ($req['isresponse']) return;
-	$res = array('id' => $req['id'], 'isresponse' => true, 'opcode' => $req['opcode'], 'question' => $req['question'], 'responsecode' => 'NOERROR', 'answer' => array(), 'authority' => array(), 'additional' => array());
+	$res = array('id' => $req['id'], 'isresponse' => true, 'opcode' => $req['opcode'], 'responsecode' => 'NOERROR', 'recursiondesired' => $req['recursiondesired'], 'question' => $req['question'], 'answer' => array(), 'authority' => array(), 'additional' => array());
 	if ($req['opcode'] != 'QUERY') {
 		$res['responsecode'] = 'NOTIMPL';
 	} else {
 		foreach ($req['question'] as $q) {
 			if ($q['class'] == 'IN') {
-				if (!dns_get_response($res, $q)) $res['responsecode'] = 'NXDOMAIN';
+				if (dns_get_response($res, $q)) {
+					$res['authoritative'] = true;
+				} else {
+					$res['responsecode'] = 'NXDOMAIN';
+				}
 			} else if ($q['class'] == 'CH' && $q['type'] == 'TXT') {
 				switch ($q['name']) {
 					case 'version.bind': $res['answer'][] = array('name' => $q['name'], 'class' => $q['class'], 'type' => $q['type'], 'value' => 'UCIS MARNS - http://www.ucis.nl'); break;
@@ -156,7 +160,7 @@
 	return dns_find_records_realwild($res['answer'], $dbzone, $name, $zone, $qtype);
 }
 function dns_find_authority(&$res, $dbzone, $zone, $nsquery = FALSE) {
-	if (!isset($dbzone->value['ns']) || !is_array($dbzone->value['ns'])) return;
+	if (!isset($dbzone->value['ns']) || !is_array($dbzone->value['ns'])) return FALSE;
 	foreach ($dbzone->value['ns'] as $nsname => $nsglues) {
 		$rr = array('name' => $zone, 'type' => 'NS', 'ttl' => 3600, 'target' => (strlen($nsname) && $nsname[strlen($nsname) - 1] != '.') ? $nsname.'.'.$zone : $nsname);
 		if ($nsquery) $res['answer'][] = $rr;
@@ -169,15 +173,16 @@
 			}
 		}
 	}
+	return TRUE;
 }
 
 function dns_get_response(&$res, $q) {
 	$name = $q['name'];
 	$zone = '';
 	$dbzone = dns_find_zone($name, $zone);
-	if ($dbzone == NULL) return;
-	dns_find_records($res, $dbzone, $name, $zone, $q['type']);
-	//dns_find_authority($res, $dbzone, $zone, $q['type'] == 'NS');
+	if ($dbzone == NULL) return FALSE;
+	return dns_find_records($res, $dbzone, $name, $zone, $q['type']);
+	//return dns_find_authority($res, $dbzone, $zone, $q['type'] == 'NS');
 }
 
 function dns_decode_uint16be($data, $i = 0) { return (ord($data[$i+0]) << 8) | ord($data[$i+1]); }
@@ -187,15 +192,17 @@
 
 function dns_decode($packet) {
 	global $dns_opcode, $dns_responsecode;
+	$flags1 = ord($packet[2]);
+	$flags2 = ord($packet[3]);
 	$dp = array(
 		'id' => dns_decode_uint16be($packet, 0),
-		'isresponse' => ($packet[2] & 128) != 0,
-		'opcode' => ($packet[2] >> 3) & 0x0F,
-		'authoritative' => ($packet[2] & 4) != 0,
-		'truncation' => ($packet[2] & 2) != 0,
-		'recursiondesired' => ($packet[2] & 1) != 0,
-		'recursionavailable' => ($packet[3] & 128) != 0,
-		'responsecode' => ($packet[3] & 0x0F),
+		'isresponse' => ($flags1 & 128) != 0,
+		'opcode' => ($flags1 >> 3) & 0x0F,
+		'authoritative' => ($flags1 & 4) != 0,
+		'truncation' => ($flags1 & 2) != 0,
+		'recursiondesired' => ($flags1 & 1) != 0,
+		'recursionavailable' => ($flags2 & 128) != 0,
+		'responsecode' => ($flags2 & 0x0F),
 		'qdcount' => dns_decode_uint16be($packet, 4),
 		'ancount' => dns_decode_uint16be($packet, 6),
 		'nscount' => dns_decode_uint16be($packet, 8),