# HG changeset patch # User Ivo Smits # Date 1415920104 -3600 # Node ID f6954b464d2fc2454267a7274dd156ee911ed17f # Parent caa68b5023134ec767cea8c4bcb7897d5d99409a Small fixes and improvements in MARC NameServer diff -r caa68b502313 -r f6954b464d2f marns.php --- 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),