* @copyright Copyright © 2005, Falko Timme
*/
class validate_dns {
function validate_field($field, $area, $zoneid, $wildcard_allowed = 1){
//$desc: Name, Data, RP mbox, RP txtref, SRV target, Zone origin, Name server, Admin email
global $app, $conf;
switch ($area) {
case "Name":
$desc = $app->tform->wordbook['name_txt'];
break;
case "Data":
$desc = $app->tform->wordbook['data_txt'];
break;
case "RP mbox":
$desc = $app->tform->wordbook['rp_mbox_txt'];
break;
case "RP txtref":
$desc = $app->tform->wordbook['rp_txtref_txt'];
break;
case "SRV target":
$desc = $app->tform->wordbook['srv_target_txt'];
break;
case "Zone origin":
$desc = $app->tform->wordbook['zone_origin_txt'];
break;
case "Name server":
$desc = $app->tform->wordbook['ns_txt'];
break;
case "Admin email":
$desc = $app->tform->wordbook['mbox_txt'];
break;
}
$error = '';
$valid_characters = "*ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz1234567890-_";
if(strlen($field) > 255) $error .= $desc." ".$app->tform->wordbook['error_255_characters']."
\r\n";
$parts = explode(".", $field);
$i = 0;
foreach ($parts as $part){
$i++;
if(strlen($part) > 63) $error .= $desc." ".$app->tform->wordbook['error_63_characters']."
\r\n";
if(strspn($part, $valid_characters) != strlen($part)) $error .= $desc." ".$app->tform->wordbook['error_invalid_characters']."
\r\n";
if(substr($part, 0, 1) == '-') $error .= $desc." ".$app->tform->wordbook['error_hyphen_begin']."
\r\n";
if(substr($part, -1) == '-') $error .= $desc." ".$app->tform->wordbook['error_hyphen_end']."
\r\n";
if(strstr($part, "*")){
if($wildcard_allowed){
if($i != 1) $error .= $desc." ".$app->tform->wordbook['error_wildcard_non_initial_part']."
\r\n";
if($part != "*") $error .= $desc." ".$app->tform->wordbook['error_wildcard_mix']."
\r\n";
} else {
$error .= $desc." ".$app->tform->wordbook['error_no_wildcard_allowed']."
\r\n";
}
}
}
if(substr($field, -1) == '.' && $area == 'Name'){
$soa = $app->db->queryOneRecord("SELECT * FROM soa WHERE id = ".$zoneid);
if(substr($field, (strlen($field) - strlen($soa['origin']))) != $soa['origin']) $error .= $desc." ".$app->tform->wordbook['error_out_of_zone']."
\r\n";
}
return $error;
}
function validate_rp_data(&$data, $zoneid){
global $app, $conf;
$error = '';
$fields = explode(" ", trim($data));
if(count($fields) != 2) return $error .= $app->tform->wordbook['data_txt']." ".$app->tform->wordbook['error_invalid_rp']."
\r\n";
$mbox = $fields[0];
$txtref = $fields[1];
$error .= $this->validate_field($mbox, 'RP mbox', $zoneid, 0);
$error .= $this->validate_field($txtref, 'RP txtref', $zoneid, 0);
$data = $mbox." ".$txtref;
return $error;
}
function validate_srv_data(&$data, $zoneid){
global $app, $conf;
$error = '';
$fields = explode(" ", trim($data));
if(count($fields) != 3) return $error .= $app->tform->wordbook['data_txt']." ".$app->tform->wordbook['error_invalid_srv']."
\r\n";
$weight = $fields[0];
$port = $fields[1];
$target = $fields[2];
if($weight < 0 || $weight > 65535) $error .= $app->tform->wordbook['weight_txt']." (\"" . htmlentities($weight)."\") ".$app->tform->wordbook['error_srv_out_of_range']."
\r\n";
if ($port < 0 || $port > 65535) $error .= $app->tform->wordbook['port_txt']." (\"".htmlentities($port)."\") ".$app->tform->wordbook['error_srv_out_of_range']."
\r\n";
$error .= $this->validate_field($target, "SRV target", $zoneid, 0);
$data = (int)$weight." ".(int)$port." ".$target;
return $error;
}
function is_integer($value, $fieldname, $zero_allowed = 0){
global $app, $conf;
$error = '';
if(intval($value) != $value || !is_numeric($value)) $error .= $fieldname." ".$app->tform->wordbook['error_must_be_integer']."
\r\n";
if($value > 2147483647) $error .= $fieldname." ".$app->tform->wordbook['error_must_not_be_greater_than_2147483647']."
\r\n";
if(!$zero_allowed){
if($value <= 0) $error .= $fieldname." ".$app->tform->wordbook['error_must_be_positive']."
\r\n";
} else {
if($value < 0) $error .= $fieldname." ".$app->tform->wordbook['error_must_not_be_negative']."
\r\n";
}
return $error;
}
function validate_rr(&$rr){
global $app, $conf;
$error = '';
$tmp_rr = $rr;
foreach($tmp_rr as $key => $val){
$rr[$key] = trim($val);
}
unset($tmp_rr);
$error .= $this->validate_field($rr['name'], 'Name', $rr['zone'], 1);
switch ($rr['type']) {
case "A":
$ip_parts = explode(".", $rr['data']);
if(count($ip_parts) != 4){
$error .= $app->tform->wordbook['data_txt']." ".$app->tform->wordbook['error_a']."
\r\n";
} else {
for($n = 0; $n < 4; $n++){
$q = $ip_parts[$n];
if(!is_numeric($q) || (int)$q < 0 || (int)$q > 255) $error .= $app->tform->wordbook['data_txt']." ".$app->tform->wordbook['error_a']."
\r\n";
}
}
$rr['data'] = (int)$ip_parts[0].".".(int)$ip_parts[1].".".(int)$ip_parts[2].".".(int)$ip_parts[3];
break;
case "AAAA":
$valid_chars = "ABCDEFabcdef1234567890:";
if(strspn($rr['data'], $valid_chars) != strlen($rr['data'])) $error .= $app->tform->wordbook['data_txt']." ".$app->tform->wordbook['error_aaaa']."
\r\n";
break;
case "ALIAS":
$error .= $this->validate_field($rr['data'], 'Data', $rr['zone'], 0);
break;
case "CNAME":
$error .= $this->validate_field($rr['data'], 'Data', $rr['zone'], 0);
break;
case "HINFO":
if(!strchr($rr['data'], ' ')) $error .= $app->tform->wordbook['data_txt']." ".$app->tform->wordbook['error_hinfo']."
\r\n";
break;
case "MX":
$error .= $this->validate_field($rr['data'], 'Data', $rr['zone'], 0);
break;
case "NS":
$error .= $this->validate_field($rr['data'], 'Data', $rr['zone'], 0);
break;
case "PTR":
$error .= $this->validate_field($rr['data'], 'Data', $rr['zone'], 0);
if(substr($rr['data'], -1) != '.') $error .= $app->tform->wordbook['data_txt']." ".$app->tform->wordbook['error_ptr']."
\r\n";
break;
case "RP":
$error .= $this->validate_rp_data($rr['data'], $rr['zone']);
break;
case "SRV":
$error .= $this->validate_srv_data($rr['data'], $rr['zone']);
break;
case "TXT":
break;
}
$error .= $this->is_integer($rr['aux'], $app->tform->wordbook['aux_txt'], 1);
$error .= $this->is_integer($rr['ttl'], $app->tform->wordbook['ttl_txt']);
return $error;
}
function validate_soa(&$soa){
global $app, $conf;
$error = '';
$tmp_soa = $soa;
foreach($tmp_soa as $key => $val){
if($key != 'active') $soa[$key] = trim($val);
}
unset($tmp_soa);
if($soa['origin'] == '') $error .= $app->tform->wordbook['origin_txt']." ".$app->tform->wordbook['error_empty']."
\r\n";
if(substr($soa['origin'], -1) != '.') $error .= $app->tform->wordbook['origin_txt']." ".$app->tform->wordbook['error_dot']."
\r\n";
$error .= $this->validate_field($soa['origin'], "Zone origin", $soa['id'], 0);
$error .= $this->is_integer($soa['ttl'], $app->tform->wordbook['ttl_txt']);
if($soa['ns'] == '') $error .= $app->tform->wordbook['ns_txt']." ".$app->tform->wordbook['error_empty']."
\r\n";
$error .= $this->validate_field($soa['ns'], "Name server", $soa['id'], 0);
if($soa['mbox'] == '') $error .= $app->tform->wordbook['mbox_txt']." ".$app->tform->wordbook['error_empty']."
\r\n";
$error .= $this->validate_field($soa['mbox'], "Admin email", $soa['id'], 0);
$error .= $this->is_integer($soa['refresh'], $app->tform->wordbook['refresh_txt']);
$error .= $this->is_integer($soa['retry'], $app->tform->wordbook['retry_txt']);
$error .= $this->is_integer($soa['expire'], $app->tform->wordbook['expire_txt']);
$error .= $this->is_integer($soa['minimum'], $app->tform->wordbook['minimum_txt']);
return $error;
}
}