diff --git a/zones.php b/zones.php index 6d31002..440bf63 100644 --- a/zones.php +++ b/zones.php @@ -24,115 +24,6 @@ function _valid_label($name) { return is_ascii($name) && ( bool ) preg_match("/^([-.a-z0-9_\/\*]+)?$/i", $name ); } -function make_record($zone, $input) { - global $defaults; - - $name = isset($input['name']) ? $input['name'] : ''; - - if ('' == $name) { - $name = $zone['name']; - } elseif (string_ends_with($name, '.')) { - # "absolute" name, shouldn't append zone[name] - but check. - $name = substr($name, 0, -1); - if (!string_ends_with($name, $zone['name'])) { - jtable_respond(null, 'error', "Name $name not in zone ".$zone['name']); - } - } else if (!string_ends_with($name, $zone['name'])) { - $name = $name . '.' . $zone['name']; - } - - $ttl = (int) ((isset($input['ttl']) && $input['ttl']) ? $input['ttl'] : $defaults['ttl']); - $type = isset($input['type']) ? $input['type'] : ''; - $disabled = (bool) (isset($input['disabled']) && $input['disabled']); - - $content = isset($input['content']) ? $input['content'] : ''; - - if ($type === 'TXT') { - # empty TXT records are ok, otherwise require surrounding quotes: "..." - if (strlen($content) == 1 || substr($content, 0, 1) !== '"' || substr($content, -1) !== '"') { - # fix quoting: first escape all \, then all ", then surround with quotes. - $content = '"'.str_replace('"', '\\"', str_replace('\\', '\\\\', $content)).'"'; - } - } - - if (!_valid_label($name)) { - jtable_respond(null, 'error', "Please only use [a-z0-9_/.-]"); - } - if (!$type) { - jtable_respond(null, 'error', "Require a type"); - } - if (!is_ascii($content)) { - jtable_respond(null, 'error', "Please only use ASCII-characters in your fields"); - } - - return array( - 'disabled' => $disabled, - 'type' => $type, - 'name' => $name, - 'ttl' => $ttl, - 'content' => $content); -} - -function update_records($zone, $name_and_type, $inputs) { - # need one "record" to extract name and type, in case we have no inputs - # (deletion of all records) - $name_and_type = make_record($zone, $name_and_type); - $name = $name_and_type['name']; - $type = $name_and_type['type']; - - $records = array(); - foreach ($inputs as $input) { - $record = make_record($zone, $input); - if ($record['name'] !== $name || $record['type'] !== $type) { - jtable_respond(null, 'error', "Records not matching"); - } - - array_push($records, $record); - } - - if (!_valid_label($name)) { - jtable_respond(null, 'error', "Please only use [a-z0-9_/.-]"); - } - - $patch = array( - 'rrsets' => array(array( - 'name' => $name, - 'type' => $type, - 'changetype' => count($records) ? 'REPLACE' : 'DELETE', - 'records' => $records))); - - api_request($zone['url'], $patch, 'PATCH'); -} - -function create_record($zone, $input) { - $record = make_record($zone, $input); - $records = get_records_by_name_type($zone, $record['name'], $record['type']); - array_push($records, $record); - - $patch = array( - 'rrsets' => array(array( - 'name' => $record['name'], - 'type' => $record['type'], - 'changetype' => 'REPLACE', - 'records' => $records))); - - api_request($zone['url'], $patch, 'PATCH'); - - return $record; -} - -function get_records_by_name_type($zone, $name, $type) { - $zone = api_request($zone['url']); - $records = array(); - foreach ($zone['records'] as $record) { - if ($record['name'] == $name and $record['type'] == $type) { - array_push($records, $record); - } - } - - return $records; -} - function decode_record_id($id) { $record = json_decode($id, 1); if (!$record @@ -146,39 +37,6 @@ function decode_record_id($id) { return $record; } -# get all records with same name and type but different id (content) -# requires records with id to be present -# SOA records match always, regardless of content. -function get_records_except($zone, $exclude) { - $is_soa = ($exclude['type'] == 'SOA'); - - $found = false; - $zone = api_request($zone['url']); - $records = array(); - foreach ($zone['records'] as $record) { - if ($record['name'] == $exclude['name'] and $record['type'] == $exclude['type']) { - if ($is_soa) { - # SOA changes all the time (serial); we can't match it in a sane way. - # OTOH we know it is unique anyway - just pretend we found a match. - $found = true; - } elseif ($record['content'] != $exclude['content'] - or $record['ttl'] != $exclude['ttl'] - or $record['disabled'] != $exclude['disabled']) { - array_push($records, $record); - } else { - $found = true; - } - } - } - - if (!$found) { - header("Status: 404 Not Found"); - jtable_respond(null, 'error', "Didn't find record with id"); - } - - return $records; -} - function compareName($a, $b) { $a = array_reverse(explode('.', $a)); $b = array_reverse(explode('.', $b));