comparison marns.php @ 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
comparison
equal deleted inserted replaced
1:caa68b502313 2:f6954b464d2f
45 } 45 }
46 46
47 function dns_process($reqbuffer, $remoteaddr) { 47 function dns_process($reqbuffer, $remoteaddr) {
48 $req = dns_decode($reqbuffer); 48 $req = dns_decode($reqbuffer);
49 if ($req['isresponse']) return; 49 if ($req['isresponse']) return;
50 $res = array('id' => $req['id'], 'isresponse' => true, 'opcode' => $req['opcode'], 'question' => $req['question'], 'responsecode' => 'NOERROR', 'answer' => array(), 'authority' => array(), 'additional' => array()); 50 $res = array('id' => $req['id'], 'isresponse' => true, 'opcode' => $req['opcode'], 'responsecode' => 'NOERROR', 'recursiondesired' => $req['recursiondesired'], 'question' => $req['question'], 'answer' => array(), 'authority' => array(), 'additional' => array());
51 if ($req['opcode'] != 'QUERY') { 51 if ($req['opcode'] != 'QUERY') {
52 $res['responsecode'] = 'NOTIMPL'; 52 $res['responsecode'] = 'NOTIMPL';
53 } else { 53 } else {
54 foreach ($req['question'] as $q) { 54 foreach ($req['question'] as $q) {
55 if ($q['class'] == 'IN') { 55 if ($q['class'] == 'IN') {
56 if (!dns_get_response($res, $q)) $res['responsecode'] = 'NXDOMAIN'; 56 if (dns_get_response($res, $q)) {
57 $res['authoritative'] = true;
58 } else {
59 $res['responsecode'] = 'NXDOMAIN';
60 }
57 } else if ($q['class'] == 'CH' && $q['type'] == 'TXT') { 61 } else if ($q['class'] == 'CH' && $q['type'] == 'TXT') {
58 switch ($q['name']) { 62 switch ($q['name']) {
59 case 'version.bind': $res['answer'][] = array('name' => $q['name'], 'class' => $q['class'], 'type' => $q['type'], 'value' => 'UCIS MARNS - http://www.ucis.nl'); break; 63 case 'version.bind': $res['answer'][] = array('name' => $q['name'], 'class' => $q['class'], 'type' => $q['type'], 'value' => 'UCIS MARNS - http://www.ucis.nl'); break;
60 case 'reload.marns': 64 case 'reload.marns':
61 if ($remoteaddr == '127.0.0.1' || $remoteaddr == '::1' || $remoteaddr == $GLOBALS['listenaddress']) { 65 if ($remoteaddr == '127.0.0.1' || $remoteaddr == '::1' || $remoteaddr == $GLOBALS['listenaddress']) {
154 if (dns_find_ns_records($res, $dbzone, '*.'.implode('.', array_slice($nameparts, $i + 1)), $realname, $zone)) return TRUE; 158 if (dns_find_ns_records($res, $dbzone, '*.'.implode('.', array_slice($nameparts, $i + 1)), $realname, $zone)) return TRUE;
155 } 159 }
156 return dns_find_records_realwild($res['answer'], $dbzone, $name, $zone, $qtype); 160 return dns_find_records_realwild($res['answer'], $dbzone, $name, $zone, $qtype);
157 } 161 }
158 function dns_find_authority(&$res, $dbzone, $zone, $nsquery = FALSE) { 162 function dns_find_authority(&$res, $dbzone, $zone, $nsquery = FALSE) {
159 if (!isset($dbzone->value['ns']) || !is_array($dbzone->value['ns'])) return; 163 if (!isset($dbzone->value['ns']) || !is_array($dbzone->value['ns'])) return FALSE;
160 foreach ($dbzone->value['ns'] as $nsname => $nsglues) { 164 foreach ($dbzone->value['ns'] as $nsname => $nsglues) {
161 $rr = array('name' => $zone, 'type' => 'NS', 'ttl' => 3600, 'target' => (strlen($nsname) && $nsname[strlen($nsname) - 1] != '.') ? $nsname.'.'.$zone : $nsname); 165 $rr = array('name' => $zone, 'type' => 'NS', 'ttl' => 3600, 'target' => (strlen($nsname) && $nsname[strlen($nsname) - 1] != '.') ? $nsname.'.'.$zone : $nsname);
162 if ($nsquery) $res['answer'][] = $rr; 166 if ($nsquery) $res['answer'][] = $rr;
163 else $res['authority'][] = $rr; 167 else $res['authority'][] = $rr;
164 if (is_array($nsglues)) { 168 if (is_array($nsglues)) {
167 if (!strlen($glue)) continue; 171 if (!strlen($glue)) continue;
168 $res['additional'][] = array('name' => $rr['target'], 'ttl' => 3600, 'type' => strlen($glue) == 4 ? 'A' : 'AAAA', 'data' => $glue); 172 $res['additional'][] = array('name' => $rr['target'], 'ttl' => 3600, 'type' => strlen($glue) == 4 ? 'A' : 'AAAA', 'data' => $glue);
169 } 173 }
170 } 174 }
171 } 175 }
176 return TRUE;
172 } 177 }
173 178
174 function dns_get_response(&$res, $q) { 179 function dns_get_response(&$res, $q) {
175 $name = $q['name']; 180 $name = $q['name'];
176 $zone = ''; 181 $zone = '';
177 $dbzone = dns_find_zone($name, $zone); 182 $dbzone = dns_find_zone($name, $zone);
178 if ($dbzone == NULL) return; 183 if ($dbzone == NULL) return FALSE;
179 dns_find_records($res, $dbzone, $name, $zone, $q['type']); 184 return dns_find_records($res, $dbzone, $name, $zone, $q['type']);
180 //dns_find_authority($res, $dbzone, $zone, $q['type'] == 'NS'); 185 //return dns_find_authority($res, $dbzone, $zone, $q['type'] == 'NS');
181 } 186 }
182 187
183 function dns_decode_uint16be($data, $i = 0) { return (ord($data[$i+0]) << 8) | ord($data[$i+1]); } 188 function dns_decode_uint16be($data, $i = 0) { return (ord($data[$i+0]) << 8) | ord($data[$i+1]); }
184 function dns_decode_uint32be($data, $i = 0) { return (ord($data[$i]) << 24) | (ord($data[$i+1]) << 16) | (ord($data[$i+2]) << 8) | ord($data[$i+3]); } 189 function dns_decode_uint32be($data, $i = 0) { return (ord($data[$i]) << 24) | (ord($data[$i+1]) << 16) | (ord($data[$i+2]) << 8) | ord($data[$i+3]); }
185 function dns_encode_uint32be($v) { return pack("N", $v); } 190 function dns_encode_uint32be($v) { return pack("N", $v); }
186 function dns_encode_uint16be($v) { return pack("n", $v); } 191 function dns_encode_uint16be($v) { return pack("n", $v); }
187 192
188 function dns_decode($packet) { 193 function dns_decode($packet) {
189 global $dns_opcode, $dns_responsecode; 194 global $dns_opcode, $dns_responsecode;
195 $flags1 = ord($packet[2]);
196 $flags2 = ord($packet[3]);
190 $dp = array( 197 $dp = array(
191 'id' => dns_decode_uint16be($packet, 0), 198 'id' => dns_decode_uint16be($packet, 0),
192 'isresponse' => ($packet[2] & 128) != 0, 199 'isresponse' => ($flags1 & 128) != 0,
193 'opcode' => ($packet[2] >> 3) & 0x0F, 200 'opcode' => ($flags1 >> 3) & 0x0F,
194 'authoritative' => ($packet[2] & 4) != 0, 201 'authoritative' => ($flags1 & 4) != 0,
195 'truncation' => ($packet[2] & 2) != 0, 202 'truncation' => ($flags1 & 2) != 0,
196 'recursiondesired' => ($packet[2] & 1) != 0, 203 'recursiondesired' => ($flags1 & 1) != 0,
197 'recursionavailable' => ($packet[3] & 128) != 0, 204 'recursionavailable' => ($flags2 & 128) != 0,
198 'responsecode' => ($packet[3] & 0x0F), 205 'responsecode' => ($flags2 & 0x0F),
199 'qdcount' => dns_decode_uint16be($packet, 4), 206 'qdcount' => dns_decode_uint16be($packet, 4),
200 'ancount' => dns_decode_uint16be($packet, 6), 207 'ancount' => dns_decode_uint16be($packet, 6),
201 'nscount' => dns_decode_uint16be($packet, 8), 208 'nscount' => dns_decode_uint16be($packet, 8),
202 'arcount' => dns_decode_uint16be($packet, 10), 209 'arcount' => dns_decode_uint16be($packet, 10),
203 ); 210 );