Mercurial > hg > marc_php
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 ); |