Apache-DnsZone
view release on metacpan or search on metacpan
lib/Apache/DnsZone.pm view on Meta::CPAN
if ($cache != 0) {
$r->header_out("Pragma", "no-cache");
$r->header_out("Cache-control", "no-cache");
$r->no_cache(1);
}
if ($length != 0) {
$r->header_out("Content-Length", $length);
}
$r->send_http_header();
}
##########################################
# output_redirect($r, $cache, $location) #
# output redirect, w w/o cache, location #
##########################################
sub output_redirect {
my $r = shift || Apache->request();
my $cache = shift || 0;
my $location = shift || 0;
Debug(5, qq{output_redirect(\$r, $cache, $location) called\n});
$r->content_type('text/html');
if ($cache != 0) {
$r->header_out("Pragma", "no-cache");
$r->header_out("Cache-control", "no-cache");
$r->no_cache(1);
}
$r->header_out(Location => $location);
}
sub is_updated_SOA {
my $dom_id = shift;
my $new_email = shift;
my $new_refresh = shift;
my $new_retry = shift;
my $new_expire = shift;
my $new_ttl = shift;
my ($old_auth_ns, $old_email, $old_serial, $old_refresh, $old_retry, $old_expire, $old_ttl, $rec_lock) = $dbh->soa_lookup($dom_id);
return 0 if $old_email eq $new_email && $old_refresh == $new_refresh && $old_retry == $new_retry && $old_expire == $new_expire && $old_ttl == $new_ttl;
return 1;
}
sub check_before_add_A {
my $dom_id = shift;
my $host = shift;
my $address = shift;
Debug(5, qq{check_before_add_A($dom_id, $host, $address) called});
if ($dbh->is_duplicate_A($dom_id, $host, $address)) {
return 0;
}
if ($dbh->does_CNAME_exist($dom_id, $host)) {
return 0;
}
# no A record exists that has the same address, no CNAME record exists with the same name
return 1;
}
sub check_before_edit_A {
my $dom_id = shift;
my $a_id = shift;
my $new_host = shift;
my $new_address = shift;
Debug(5, qq{check_before_edit_A($dom_id, $a_id, $new_host, $new_address) called});
my ($old_name, $old_address, $old_ttl) = $dbh->a_lookup($dom_id, $a_id);
return 1 if $old_name eq $new_host && $old_address eq $new_address;
if ($dbh->is_duplicate_A($dom_id, $new_host, $new_address)) {
return 0;
}
if ($dbh->does_CNAME_exist($dom_id, $new_host)) {
return 0;
}
return 1;
}
sub is_updated_A {
my $dom_id = shift;
my $a_id = shift;
my $new_host = shift;
my $new_address = shift;
my $new_ttl = shift;
my ($old_name, $old_address, $old_ttl) = $dbh->a_lookup($dom_id, $a_id);
return 0 if $old_name eq $new_host && $old_address eq $new_address && $old_ttl == $new_ttl;
return 1;
}
sub check_before_add_AAAA {
my $dom_id = shift;
my $host = shift;
my $address = shift;
Debug(5, qq{check_before_add_AAA($dom_id, $host, $address) called});
if ($dbh->is_duplicate_AAAA($dom_id, $host, $address)) {
return 0;
}
if ($dbh->does_CNAME_exist($dom_id, $host)) {
return 0;
}
# no A record exists that has the same address, no CNAME record exists with the same name
return 1;
}
sub check_before_edit_AAAA {
my $dom_id = shift;
my $a_id = shift;
my $new_host = shift;
my $new_address = shift;
Debug(5, qq{check_before_edit_AAAA($dom_id, $a_id, $new_host, $new_address) called});
my ($old_name, $old_address, $old_ttl) = $dbh->aaaa_lookup($dom_id, $a_id);
return 1 if $old_name eq $new_host && $old_address eq $new_address;
if ($dbh->is_duplicate_AAAA($dom_id, $new_host, $new_address)) {
return 0;
}
if ($dbh->does_CNAME_exist($dom_id, $new_host)) {
return 0;
}
return 1;
}
sub is_updated_AAAA {
my $dom_id = shift;
my $a_id = shift;
my $new_host = shift;
my $new_address = shift;
my $new_ttl = shift;
my ($old_name, $old_address, $old_ttl) = $dbh->aaaa_lookup($dom_id, $a_id);
return 0 if $old_name eq $new_host && $old_address eq $new_address && $old_ttl == $new_ttl;
return 1;
}
sub check_before_add_CNAME {
my $dom_id = shift;
my $host = shift;
Debug(5, qq{check_before_add_CNAME($dom_id, $host) called});
if ($dbh->does_A_exist($dom_id, $host)) {
return 0;
}
if ($dbh->does_CNAME_exist($dom_id, $host)) {
return 0;
}
if ($dbh->does_MX_exist($dom_id, $host)) {
return 0;
}
if ($dbh->does_NS_exist($dom_id, $host)) {
return 0;
}
if ($dbh->does_TXT_exist($dom_id, $host)) {
return 0;
}
return 1;
}
sub check_before_edit_CNAME {
my $dom_id = shift;
my $cname_id = shift;
my $new_host = shift;
my $new_cname = shift;
Debug(5, qq{check_before_edit_CNAME($dom_id, $cname_id, $new_host, $new_cname) called});
my ($old_host, $old_cname, $old_ttl) = $dbh->cname_lookup($dom_id, $cname_id);
return 1 if $old_host eq $new_host && $old_cname eq $new_cname;
return 1 if $old_host eq $new_host;
if ($dbh->does_A_exist($dom_id, $new_host)) {
return 0;
}
if ($dbh->does_CNAME_exist($dom_id, $new_host)) {
return 0;
}
if ($dbh->does_MX_exist($dom_id, $new_host)) {
return 0;
}
if ($dbh->does_NS_exist($dom_id, $new_host)) {
return 0;
}
if ($dbh->does_TXT_exist($dom_id, $new_host)) {
return 0;
}
return 1;
}
sub is_updated_CNAME {
my $dom_id = shift;
my $cname_id = shift;
my $new_host = shift;
my $new_cname = shift;
my $new_ttl = shift;
my ($old_host, $old_cname, $old_ttl) = $dbh->cname_lookup($dom_id, $cname_id);
return 0 if $old_host eq $new_host && $old_cname eq $new_cname && $old_ttl == $new_ttl;
return 1;
}
sub check_before_add_MX {
my $dom_id = shift;
my $host = shift;
my $exchanger = shift;
my $preference = shift;
Debug(5, qq{check_before_add_MX($dom_id, $host, $exchanger, $preference) called});
if ($dbh->is_duplicate_MX($dom_id, $host, $preference)) {
return 0;
}
if ($dbh->does_CNAME_exist($dom_id, $host)) {
return 0;
}
return 1;
}
sub check_before_edit_MX {
my $dom_id = shift;
my $mx_id = shift;
my $new_host = shift;
my $new_exchanger = shift;
my $new_preference = shift;
Debug(5, qq{check_before_edit_MX($dom_id, $mx_id, $new_host, $new_exchanger, $new_preference) called});
my ($old_name, $old_exchanger, $old_preference, $old_ttl) = $dbh->mx_lookup($dom_id, $mx_id);
return 1 if $old_name eq $new_host && $old_preference eq $new_preference;
if ($dbh->is_duplicate_MX($dom_id, $new_host, $new_preference)) {
return 0;
}
if ($dbh->does_CNAME_exist($dom_id, $new_host)) {
return 0;
}
return 1;
}
sub is_updated_MX {
my $dom_id = shift;
my $mx_id = shift;
my $new_host = shift;
my $new_exchanger = shift;
my $new_preference = shift;
my $new_ttl = shift;
my ($old_name, $old_exchanger, $old_preference, $old_ttl) = $dbh->mx_lookup($dom_id, $mx_id);
return 0 if $old_name eq $new_host && $old_preference == $new_preference && $old_exchanger eq $new_exchanger && $old_ttl == $new_ttl;
return 1;
}
sub check_before_add_NS {
my $dom_id = shift;
my $host = shift;
my $nsdname = shift;
Debug(5, qq{check_before_add_NS($dom_id, $host, $nsdname) called});
if ($dbh->is_duplicate_NS($dom_id, $host, $nsdname)) {
return 0;
}
if ($dbh->does_CNAME_exist($dom_id, $host)) {
return 0;
}
return 1;
}
sub check_before_edit_NS {
my $dom_id = shift;
my $ns_id = shift;
my $new_host = shift;
my $new_ns = shift;
Debug(5, qq{check_before_edit_NS($dom_id, $ns_id, $new_host, $new_ns) called});
my ($old_name, $old_nameserver, $old_ttl) = $dbh->ns_lookup($dom_id, $ns_id);
return 1 if $old_name eq $new_host && $old_nameserver eq $new_ns;
if ($dbh->is_duplicate_NS($dom_id, $new_host, $new_ns)) {
return 0;
}
if ($dbh->does_CNAME_exist($dom_id, $new_host)) {
return 0;
}
return 1;
}
sub is_updated_NS {
my $dom_id = shift;
my $ns_id = shift;
my $new_host = shift;
my $new_ns = shift;
my $new_ttl = shift;
my ($old_name, $old_nameserver, $old_ttl) = $dbh->ns_lookup($dom_id, $ns_id);
return 0 if $old_name eq $new_host && $old_nameserver eq $new_ns && $old_ttl == $new_ttl;
return 1;
}
sub check_before_add_PTR {
my $dom_id = shift;
my $host = shift;
my $reverse = shift;
Debug(5, qq{check_before_add_PTR($dom_id, $host, $reverse) called});
if ($dbh->is_duplicate_PTR($dom_id, $host, $reverse)) {
return 0;
}
# no PTR record exists that has the same address
return 1;
}
sub check_before_edit_PTR {
my $dom_id = shift;
my $ptr_id = shift;
my $new_host = shift;
my $new_reverse = shift;
Debug(5, qq{check_before_edit_PTR($dom_id, $ptr_id, $new_host, $new_reverse) called});
my ($old_name, $old_reverse, $old_ttl) = $dbh->ptr_lookup($dom_id, $ptr_id);
return 1 if $old_name eq $new_host && $old_reverse eq $new_reverse;
if ($dbh->is_duplicate_PTR($dom_id, $new_host, $new_reverse)) {
return 0;
}
return 1;
}
sub is_updated_PTR {
my $dom_id = shift;
my $ptr_id = shift;
my $new_host = shift;
my $new_reverse = shift;
my $new_ttl = shift;
my ($old_name, $old_reverse, $old_ttl) = $dbh->ptr_lookup($dom_id, $ptr_id);
return 0 if $old_name eq $new_host && $old_reverse eq $new_reverse && $old_ttl == $new_ttl;
return 1;
}
sub check_before_add_TXT {
my $dom_id = shift;
my $host = shift;
my $txt = shift;
Debug(5, qq{check_before_add_TXT($dom_id, $host, $txt) called});
if ($dbh->is_duplicate_TXT($dom_id, $host, $txt)) {
return 0;
}
if ($dbh->does_CNAME_exist($dom_id, $host)) {
return 0;
}
return 1;
}
sub check_before_edit_TXT {
my $dom_id = shift;
my $txt_id = shift;
my $new_host = shift;
my $new_txt = shift;
Debug(5, qq{check_before_edit_TXT($dom_id, $txt_id, $new_host, $new_txt) called});
my ($old_name, $old_txt, $old_ttl) = $dbh->txt_lookup($dom_id, $txt_id);
return 1 if $old_name eq $new_host && $old_txt eq $new_txt;
if ($dbh->is_duplicate_TXT($dom_id, $new_host, $new_txt)) {
return 0;
}
if ($dbh->does_CNAME_exist($dom_id, $new_host)) {
return 0;
}
return 1;
}
sub is_updated_TXT {
my $dom_id = shift;
my $txt_id = shift;
my $new_host = shift;
my $new_txt = shift;
my $new_ttl = shift;
my ($old_name, $old_txt, $old_ttl) = $dbh->txt_lookup($dom_id, $txt_id);
return 0 if $old_name eq $new_host && $old_txt eq $new_txt && $old_ttl == $new_ttl;
return 1;
}
sub handler {
my $r = shift || Apache->request();
Debug(2, qq{Apache::DnsZone::handler called});
if ($r->header_only) {
$r->send_http_header;
return OK;
}
init($r);
# lang is setup for the whole process of the script here
my $user = $r->connection->user;
my ($lang) = $dbh->get_user_lang($user);
%lang = lang($lang);
my $uri = $r->uri;
if ($uri !~ m|^/admin|) {
return DECLINED;
}
# Internal dispatch based on parameters to the url
if (apr()->param('action')) {
my $action = lc(apr()->param('action'));
my $button = "";
if (apr->param('button')) {
$button = lc(apr()->param('button'));
if ($button eq lc($lang{'CANCEL'})) {
Debug(3, qq{pushing cancel() to PerlHandler (called from a pushed button)});
$r->push_handlers(PerlHandler => \&cancel);
return OK;
# } elsif ($button eq lc($lang{'HELP'})) {
# DnsZone::Debug(3, qq{pushing help() to PerlHandler (called from a pushed button)});
# $r->push_handlers(PerlHandler => \&help);
# return OK;
}
}
if ($action eq 'view') {
Debug(3, qq{pushing view_domain() to PerlHandler});
$r->push_handlers(PerlHandler => \&view_domain);
} elsif ($action eq 'edit') {
Debug(3, qq{pushing edit_record() to PerlHandler});
$r->push_handlers(PerlHandler => \&edit_record);
} elsif ($action eq 'add') {
Debug(3, qq{pushing add_record() to PerlHandler});
$r->push_handlers(PerlHandler => \&add_record);
} elsif ($action eq 'delete') {
Debug(3, qq{pushing delete_record() to PerlHandler});
$r->push_handlers(PerlHandler => \&delete_record);
} elsif ($action eq 'settings') {
Debug(3, qq{pushing settings() to PerlHandler});
$r->push_handlers(PerlHandler => \&settings);
} elsif ($action eq 'logout') {
Debug(3, qq{pushing logout() to PerlHandler});
$r->push_handlers(PerlHandler => \&logout);
} else {
Debug(3, qq{pushing default_page_handler() to PerlHandler});
$r->push_handlers(PerlHandler => \&default_page_handler);
}
} else {
Debug(3, qq{pushing default_page_handler() to PerlHandler});
$r->push_handlers(PerlHandler => \&default_page_handler);
}
return OK;
}
sub default_page_handler {
my $r = shift || Apache->request();
Debug(3, qq{calling default_page_handler()});
init($r);
my $user = $r->connection->user;
my ($uid, $email, $lang_id, $lang) = $dbh->get_user_info($user);
my $dom_count = $dbh->get_domain_count($uid);
if ($dom_count == 1) {
# In case the user only has one domain we redirect to his admin page right away
my $dom_id = $dbh->get_one_domain_id($uid);
output_redirect($r, 1, qq{/admin?action=view&dom_id=$dom_id});
$dbh->close();
return REDIRECT;
} else {
# make a list of domains to manage
$r->push_handlers(PerlHandler => \&list_domains);
}
$dbh->close();
return OK;
}
sub logout {
my $r = shift || Apache->request();
Debug(3, qq{calling logout()});
init($r);
output_redirect($r, 1, $cfg->{'cfg'}->{DnsZoneLogoutHandler});
# $r->push_handlers(PerlHandler => sub {
# Apache::DnsZone::AuthCookie->logout(Apache->request);
# });
$dbh->close();
return REDIRECT;
}
sub list_domains {
my $r = shift || Apache->request();
Debug(3, qq{calling list_domains()});
init($r);
lib/Apache/DnsZone.pm view on Meta::CPAN
$tpl->assign(DEBUG => '');
$tpl->assign(LANG_VALUE => $dbh->lang_select_box($uid, $lang_id));
$tpl->assign(EMAIL_VALUE => $user_email);
if ($dbh->get_domain_count($uid) == 1) {
$tpl->assign(ADDITIONAL_MENU => '');
} else {
$tpl->assign(ADDITIONAL_MENU => qq{<a href="/admin?action=default">$lang{LIST_DOMAIN}</a> | });
}
$tpl->assign(NEW_PASSWORD_VALUE => '');
$tpl->assign(CONFIRM_PASSWORD_VALUE => '');
$tpl->parse(MENU => "menu");
$tpl->parse(MAIN => ["settings", "layout"]);
my $content_ref = $tpl->fetch("MAIN");
output_headers($r, 1, length(${$content_ref}));
$r->print(${$content_ref});
$dbh->close();
return OK;
}
}
sub delete_record {
my $r = shift || Apache->request();
Debug(3, qq{calling delete_record()});
init($r);
my $user = $r->connection->user;
my ($uid, $email, $lang_id, $lang) = $dbh->get_user_info($user);
# same as in view_domain() maybe a function should be built for this?
if (!apr()->param('dom_id')) {
$r->log_reason("No dom_id for this request: aborting");
output_redirect($r, 1, '/admin');
$dbh->close();
return REDIRECT;
}
# check dom_id
my $dom_id = apr()->param('dom_id');
($dom_id) = ($dom_id =~ /(\d+)/)[0];
if ($dom_id !~ /^\d+$/) {
$r->log_reason("User didn't supply a domain id for this request or tried to fake it");
output_redirect($r, 1, '/admin');
$dbh->close();
return REDIRECT;
}
# is uid owner of dom_id
my ($domain, $domain_owner_id) = $dbh->domain_stat($dom_id);
unless (defined($domain_owner_id) && $uid == $domain_owner_id) {
$r->log_reason("User trying to hijack another domain");
output_redirect($r, 1, '/admin');
$dbh->close();
return REDIRECT;
}
# check for record_id & type
unless (apr()->param('type')) {
$r->log_reason("No type specified for edit");
output_redirect($r, 1, '/admin');
$dbh->close();
return REDIRECT;
}
my $type = uc apr()->param('type');
($type) = ($type =~ /(\w+)/)[0];
if ($type !~ /^\w+$/ || $type =~ /^SOA$/i) {
$r->log_reason("User tried to supply bogus type data");
output_redirect($r, 1, '/admin');
$dbh->close();
return REDIRECT;
}
my $record_id = apr()->param('record_id') if apr()->param('record_id');
($record_id) = ($record_id =~ /(\d+)/)[0];
if ($record_id !~ /^\d+$/) {
$r->log_reason("User didn't supply a record id for this request or tried to fake it");
output_redirect($r, 1, '/admin');
$dbh->close();
return REDIRECT;
}
# check for rec_lock
# and at the same time if UID = owner of record
my $rec_lock = 0;
for ($type) {
if (/^A$/) { ($rec_lock) = $dbh->get_lock_A($dom_id, $record_id); }
elsif (/^AAAA$/) { ($rec_lock) = $dbh->get_lock_AAAA($dom_id, $record_id); }
elsif (/^CNAME$/) { ($rec_lock) = $dbh->get_lock_CNAME($dom_id, $record_id); }
elsif (/^MX$/) { ($rec_lock) = $dbh->get_lock_MX($dom_id, $record_id); }
elsif (/^NS$/) { ($rec_lock) = $dbh->get_lock_NS($dom_id, $record_id); }
elsif (/^PTR$/) { ($rec_lock) = $dbh->get_lock_PTR($dom_id, $record_id); }
elsif (/^TXT$/) { ($rec_lock) = $dbh->get_lock_TXT($dom_id, $record_id); }
else { $rec_lock = 1; }
}
if ($rec_lock) {
$r->log_reason("User tried to delete a locked record");
output_redirect($r, 1, '/admin');
$dbh->close();
return REDIRECT;
}
if (apr()->param('button') && lc(apr()->param('button')) eq lc($lang{'SUBMIT'})) {
Debug(5, qq{This is a submit of delete_record request});
for ($type) {
if (/^A$/) {
if (dns_del_A($dom_id, $record_id)) {
Debug(5, qq{dns_delete_A succeded\n});
} else {
Debug(5, qq{dns_delete_A failed\n});
}
}
elsif (/^AAAA$/) {
if (dns_del_AAAA($dom_id, $record_id)) {
Debug(5, qq{dns_delete_AAAA succeded\n});
} else {
Debug(5, qq{dns_delete_AAAA failed\n});
}
}
elsif (/^CNAME$/) {
lib/Apache/DnsZone.pm view on Meta::CPAN
}
elsif (/^TXT$/) {
my ($name, $txtdata, $ttl) = $dbh->txt_lookup($dom_id, $record_id);
$tpl->define(record => 'txt/remove.tpl');
$tpl->assign(HOST_VALUE => $name);
$tpl->assign(TXT_VALUE => $txtdata);
$tpl->assign(TTL_VALUE => $ttl);
}
}
$tpl->assign(RECORD_ID => $record_id);
$tpl->assign(DOM_ID => $dom_id);
$tpl->parse(MENU => "menu");
$tpl->parse(MAIN => ["record", "layout"]);
my $content_ref = $tpl->fetch("MAIN");
output_headers($r, 1, length(${$content_ref}));
$r->print(${$content_ref});
$dbh->close();
return OK;
}
}
sub add_record {
my $r = shift || Apache->request();
Debug(3, qq{calling add_record()});
init($r);
my $user = $r->connection->user;
my ($uid, $email, $lang_id, $lang) = $dbh->get_user_info($user);
# same as in view_domain() maybe a function should be built for this?
if (!apr()->param('dom_id')) {
$r->log_reason("No dom_id for this request: aborting");
output_redirect($r, 1, '/admin');
$dbh->close();
return REDIRECT;
}
# check dom_id
my $dom_id = apr()->param('dom_id');
($dom_id) = ($dom_id =~ /(\d+)/)[0];
if ($dom_id !~ /^\d+$/) {
$r->log_reason("User didn't supply a domain id for this request or tried to fake it");
output_redirect($r, 1, '/admin');
$dbh->close();
return REDIRECT;
}
# is uid owner of dom_id
my ($domain, $domain_owner_id) = $dbh->domain_stat($dom_id);
unless (defined($domain_owner_id) && $uid == $domain_owner_id) {
$r->log_reason("User trying to hijack another domain");
output_redirect($r, 1, '/admin');
$dbh->close();
return REDIRECT;
}
# check for record_id & type
unless (apr()->param('type')) {
$r->log_reason("No type specified for edit");
output_redirect($r, 1, '/admin');
$dbh->close();
return REDIRECT;
}
my $type = uc apr()->param('type');
($type) = ($type =~ /(\w+)/)[0];
if ($type !~ /^\w+$/) {
$r->log_reason("User tried to supply bogus type data");
output_redirect($r, 1, '/admin');
$dbh->close();
return REDIRECT;
}
my $no_records_left = 0;
my ($A_max, $AAAA_max, $CNAME_max, $MX_max, $NS_max, $PTR_max, $TXT_max) = $dbh->get_max_record_count($dom_id);
for ($type) {
if (/^A$/) {
my ($a_count) = $dbh->get_a_count($dom_id);
if ($A_max <= $a_count) {
$no_records_left = 1;
}
}
elsif (/^AAAA$/) {
my ($aaaa_count) = $dbh->get_aaaa_count($dom_id);
if ($AAAA_max <= $aaaa_count) {
$no_records_left = 1;
}
}
elsif (/^CNAME$/) {
my ($cname_count) = $dbh->get_cname_count($dom_id);
if ($CNAME_max <= $cname_count) {
$no_records_left = 1;
}
}
elsif (/^MX$/) {
my ($mx_count) = $dbh->get_mx_count($dom_id);
if ($MX_max <= $mx_count) {
$no_records_left = 1;
}
}
elsif (/^NS$/) {
my ($ns_count) = $dbh->get_ns_count($dom_id);
if ($NS_max <= $ns_count) {
$no_records_left = 1;
}
}
elsif (/^PTR$/) {
my ($ptr_count) = $dbh->get_ptr_count($dom_id);
if ($PTR_max <= $ptr_count) {
$no_records_left = 1;
}
}
elsif (/^TXT$/) {
my ($txt_count) = $dbh->get_txt_count($dom_id);
if ($TXT_max <= $txt_count) {
$no_records_left = 1;
}
}
}
if ($no_records_left) {
lib/Apache/DnsZone.pm view on Meta::CPAN
$tpl->define(record => 'a/add.tpl');
$tpl->assign(HOST_VALUE => '');
$tpl->assign(IP_ADDRESS_VALUE => '');
$tpl->assign(TTL_VALUE => '');
}
elsif (/^AAAA$/) {
$tpl->define(record => 'aaaa/add.tpl');
$tpl->assign(HOST_VALUE => '');
$tpl->assign(IPV6_ADDRESS_VALUE => '');
$tpl->assign(TTL_VALUE => '');
}
elsif (/^CNAME$/) {
$tpl->define(record => 'cname/add.tpl');
$tpl->assign(HOST_VALUE => '');
$tpl->assign(CNAME_VALUE => '');
$tpl->assign(TTL_VALUE => '');
}
elsif (/^MX$/) {
$tpl->define(record => 'mx/add.tpl');
$tpl->assign(HOST_VALUE => '');
$tpl->assign(MX_VALUE => '');
$tpl->assign(PREFERENCE_VALUE => '');
$tpl->assign(TTL_VALUE => '');
}
elsif (/^NS$/) {
$tpl->define(record => 'ns/add.tpl');
$tpl->assign(ZONE_VALUE => '');
$tpl->assign(NS_VALUE => '');
$tpl->assign(TTL_VALUE => '');
}
if (/^PTR$/) {
$tpl->define(record => 'ptr/add.tpl');
$tpl->assign(HOST_VALUE => '');
$tpl->assign(REVERSE_HOST_VALUE => '');
$tpl->assign(TTL_VALUE => '');
}
elsif (/^TXT$/) {
$tpl->define(record => 'txt/add.tpl');
$tpl->assign(HOST_VALUE => '');
$tpl->assign(TXT_VALUE => '');
$tpl->assign(TTL_VALUE => '');
}
}
$tpl->assign(DOM_ID => $dom_id);
$tpl->parse(MENU => "menu");
$tpl->parse(MAIN => ["record", "layout"]);
my $content_ref = $tpl->fetch("MAIN");
output_headers($r, 1, length(${$content_ref}));
$r->print(${$content_ref});
$dbh->close();
return OK;
}
}
sub edit_record {
my $r = shift || Apache->request();
Debug(3, qq{calling edit_record()});
init($r);
my $user = $r->connection->user;
my ($uid, $email, $lang_id, $lang) = $dbh->get_user_info($user);
# same as in view_domain() maybe a function should be built for this?
if (!apr()->param('dom_id')) {
$r->log_reason("No dom_id for this request: aborting");
output_redirect($r, 1, '/admin');
$dbh->close();
return REDIRECT;
}
# check dom_id
my $dom_id = apr()->param('dom_id');
($dom_id) = ($dom_id =~ /(\d+)/)[0];
if ($dom_id !~ /^\d+$/) {
$r->log_reason("User didn't supply a domain id for this request or tried to fake it");
output_redirect($r, 1, '/admin');
$dbh->close();
return REDIRECT;
}
# is uid owner of dom_id
my ($domain, $domain_owner_id) = $dbh->domain_stat($dom_id);
unless (defined($domain_owner_id) && $uid == $domain_owner_id) {
$r->log_reason("User trying to hijack another domain");
output_redirect($r, 1, '/admin');
$dbh->close();
return REDIRECT;
}
# check for record_id & type
unless (apr()->param('type')) {
$r->log_reason("No type specified for edit");
output_redirect($r, 1, '/admin');
$dbh->close();
return REDIRECT;
}
my $type = uc apr()->param('type');
($type) = ($type =~ /(\w+)/)[0];
if ($type !~ /^\w+$/) {
$r->log_reason("User tried to supply bogus type data");
output_redirect($r, 1, '/admin');
$dbh->close();
return REDIRECT;
}
# now only if it's a SOA it's okay not to have a record_id - record_id is equal to dom_id
my $record_id = apr()->param('record_id') if apr()->param('record_id');
$record_id = $dom_id if $type eq 'SOA';
($record_id) = ($record_id =~ /(\d+)/)[0];
if ($record_id !~ /^\d+$/) {
$r->log_reason("User didn't supply a record id for this request or tried to fake it");
output_redirect($r, 1, '/admin');
$dbh->close();
return REDIRECT;
}
# check for rec_lock
# and at the same time if UID = owner of record
my $rec_lock = 0;
for ($type) {
if (/^SOA$/) { ($rec_lock) = $dbh->get_lock_SOA($dom_id); }
elsif (/^A$/) { ($rec_lock) = $dbh->get_lock_A($dom_id, $record_id); }
elsif (/^AAAA$/) { ($rec_lock) = $dbh->get_lock_AAAA($dom_id, $record_id); }
elsif (/^CNAME$/) { ($rec_lock) = $dbh->get_lock_CNAME($dom_id, $record_id); }
elsif (/^MX$/) { ($rec_lock) = $dbh->get_lock_MX($dom_id, $record_id); }
elsif (/^NS$/) { ($rec_lock) = $dbh->get_lock_NS($dom_id, $record_id); }
elsif (/^PTR$/) { ($rec_lock) = $dbh->get_lock_PTR($dom_id, $record_id); }
elsif (/^TXT$/) { ($rec_lock) = $dbh->get_lock_TXT($dom_id, $record_id); }
else { $rec_lock = 1; }
}
if ($rec_lock) {
$r->log_reason("User tried to change a locked record");
output_redirect($r, 1, '/admin');
$dbh->close();
return REDIRECT;
}
if (apr()->param('button') && lc(apr()->param('button')) eq lc($lang{'SUBMIT'})) {
Debug(5, qq{This is a submit of edit_record request});
for ($type) {
if (/^SOA$/) {
my $soa_email = apr()->param('soa_email');
my $refresh = apr()->param('refresh');
my $retry = apr()->param('retry');
my $expire = apr()->param('expire');
my $default_ttl = apr()->param('default_ttl');
my $all_set = 1;
if (!(check_ttl($refresh) && check_ttl($retry) && check_ttl($expire) && check_ttl($default_ttl))) {
$all_set = 0;
}
if (!($soa_email = check_email($soa_email))) {
$all_set = 0;
}
if ($soa_email =~ /\..*?\@/) {
# is there a dot before the @ => invalid for a soa email
$all_set = 0;
}
if ($all_set) {
my $serial = get_serial_from_zone($dom_id);
$serial++;
$soa_email =~ s/\@/\./;
if (is_updated_SOA($dom_id, $soa_email, $refresh, $retry, $expire, $default_ttl)) {
if (dns_update_SOA($dom_id, $serial, $soa_email, $refresh, $retry, $expire, $default_ttl)) {
Debug(2, qq{dns_update_SOA succeded\n});
} else {
Debug(2, qq{dns_update_SOA failed\n});
}
} else {
Debug(2, qq{Dns record not changed so not updated\n});
}
} else {
my $tpl = new CGI::FastTemplate($cfg->{'cfg'}->{DnsZoneTemplateDir});
$tpl->define(layout => 'layout.tpl', menu => 'menu.tpl');
$tpl->assign(%lang);
$tpl->assign(DEBUG => '');
if ($dbh->get_domain_count($uid) == 1) {
$tpl->assign(ADDITIONAL_MENU => '');
} else {
$tpl->assign(ADDITIONAL_MENU => qq{<a href="/admin?action=default">$lang{LIST_DOMAIN}</a> | });
}
my $page_title = $lang{PAGE_EDIT};
$page_title =~ s/\$record/$type/;
$page_title =~ s/\$domain/$domain/;
$tpl->assign(TITLE => $page_title);
$tpl->define(record => 'soa/edit.tpl');
$tpl->assign(ADMIN_EMAIL_VALUE => encode_entities(apr()->param('soa_email')));
$tpl->assign(REFRESH_VALUE => encode_entities(apr()->param('refresh')));
$tpl->assign(RETRY_VALUE => encode_entities(apr()->param('retry')));
$tpl->assign(EXPIRE_VALUE => encode_entities(apr()->param('expire')));
$tpl->assign(TTL_VALUE => encode_entities(apr()->param('default_ttl')));
my ($auth_ns, $serial) = $dbh->get_authns_serial($dom_id);
$tpl->assign(AUTH_NS_VALUE => $auth_ns);
$tpl->assign(SERIAL_VALUE => $serial);
my $error_text = $lang{ERROR_CORRECT};
if (!check_ttl($refresh)) {
$tpl->assign(REFRESH => qq{<font color="red">} . $lang{REFRESH} . qq{</font>});
$error_text .= qq{<br>$lang{ERROR_REFRESH}};
}
if (!check_ttl($retry)) {
$tpl->assign(RETRY => qq{<font color="red">} . $lang{RETRY} . qq{</font>});
$error_text .= qq{<br>$lang{ERROR_RETRY}};
}
if (!check_ttl($expire)) {
$tpl->assign(EXPIRE => qq{<font color="red">} . $lang{EXPIRE} . qq{</font>});
$error_text .= qq{<br>$lang{ERROR_EXPIRE}};
}
if (!check_ttl($default_ttl)) {
$tpl->assign(TTL => qq{<font color="red">} . $lang{TTL} . qq{</font>});
$error_text .= qq{<br>$lang{ERROR_TTL}};
}
if (!($soa_email = check_email($soa_email))) {
$tpl->assign(ADMIN_EMAIL => qq{<font color="red">} . $lang{ADMIN_EMAIL} . qq{</font>});
$error_text .= qq{<br>$lang{ERROR_ADMIN_EMAIL}};
}
if ($soa_email =~ /\..*?\@/) {
# is there a dot before the @ => invalid for a soa email
$tpl->assign(ADMIN_EMAIL => qq{<font color="red">} . $lang{ADMIN_EMAIL} . qq{</font>});
$error_text .= qq{<br>$lang{ERROR_ADMIN_EMAIL}};
}
$tpl->assign(EXPLANATION => $error_text);
$tpl->assign(DOM_ID => $dom_id);
$tpl->assign(RECORD_ID => $record_id);
$tpl->parse(MENU => "menu");
$tpl->parse(MAIN => ["record", "layout"]);
my $content_ref = $tpl->fetch("MAIN");
output_headers($r, 1, length(${$content_ref}));
$r->print(${$content_ref});
$dbh->close();
return OK;
}
}
elsif (/^A$/) {
# actually there needs to be another check to see if they really exists the parameters maybe up in the checking of the rec_lock
my $all_set = 1;
my $ip = apr()->param('ip');
if (!($ip = check_ip($ip))) {
$all_set = 0;
}
my $host = "";
if (!($host = check_fqdn(apr()->param('host'), $domain))) {
$all_set = 0;
}
my $ttl = apr()->param('ttl');
if (!check_ttl($ttl)) {
$all_set = 0;
}
if ($all_set && check_before_edit_A($dom_id, $record_id, $host, $ip)) {
# update dns! and sql
# check wheter name is the same? so no need for update?
# check wheter an excact copy exists in dns to avoid errors
if (is_updated_A($dom_id, $record_id, $host, $ip, $ttl)) {
if (dns_update_A($dom_id, $record_id, $host, $ip, $ttl)) {
Debug(2, qq{dns_update_A succeded\n});
} else {
Debug(2, qq{dns_update_A failed\n});
}
} else {
Debug(2, qq{Dns record not changed so not updated\n});
}
} else {
my $tpl = new CGI::FastTemplate($cfg->{'cfg'}->{DnsZoneTemplateDir});
$tpl->define(layout => 'layout.tpl', menu => 'menu.tpl');
$tpl->assign(%lang);
$tpl->assign(DEBUG => '');
if ($dbh->get_domain_count($uid) == 1) {
$tpl->assign(ADDITIONAL_MENU => '');
} else {
$tpl->assign(ADDITIONAL_MENU => qq{<a href="/admin?action=default">$lang{LIST_DOMAIN}</a> | });
}
my $page_title = $lang{PAGE_EDIT};
$page_title =~ s/\$record/$type/;
$page_title =~ s/\$domain/$domain/;
$tpl->assign(TITLE => $page_title);
$tpl->define(record => 'a/edit.tpl');
$tpl->assign(HOST_VALUE => encode_entities(apr()->param('host'))); # maybe it needs to fully qualify it if it was okay?
$tpl->assign(IP_ADDRESS_VALUE => encode_entities(apr()->param('ip')));
$tpl->assign(TTL_VALUE => encode_entities(apr()->param('ttl')));
# do the red-marker assignment
my $error_text = $lang{ERROR_CORRECT};
if (!($ip = check_ip(apr()->param('ip')))) {
$tpl->assign(IP_ADDRESS => qq{<font color="red">} . $lang{IP_ADDRESS} . qq{</font>});
$error_text .= qq{<br>$lang{ERROR_IP}};
}
if (!($host = check_fqdn(apr()->param('host'), $domain))) {
$tpl->assign(HOST => qq{<font color="red">} . $lang{HOST} . qq{</font>});
$error_text .= qq{<br>$lang{ERROR_HOST}};
}
if (!check_ttl($ttl)) {
$tpl->assign(TTL => qq{<font color="red">} . $lang{TTL} . qq{</font>});
$error_text .= qq{<br>$lang{ERROR_TTL}};
}
if ($all_set) {
$tpl->assign(IP_ADDRESS => qq{<font color="red">} . $lang{IP_ADDRESS} . qq{</font>});
$tpl->assign(HOST => qq{<font color="red">} . $lang{HOST} . qq{</font>});
$error_text .= qq{<br>$lang{ERROR_DUPLICATE}};
}
$tpl->assign(EXPLANATION => $error_text);
$tpl->assign(DOM_ID => $dom_id);
$tpl->assign(RECORD_ID => $record_id);
$tpl->parse(MENU => "menu");
$tpl->parse(MAIN => ["record", "layout"]);
my $content_ref = $tpl->fetch("MAIN");
output_headers($r, 1, length(${$content_ref}));
$r->print(${$content_ref});
$dbh->close();
return OK;
}
}
elsif (/^AAAA$/) {
# actually there needs to be another check to see if they really exists the parameters maybe up in the checking of the rec_lock
my $all_set = 1;
my $ipv6 = apr()->param('ipv6');
if (ip_is_ipv6($ipv6)) {
$ipv6 = ip_expand_address($ipv6, 6); # to always have the correct full address to match against
} else {
$all_set = 0;
}
my $host = "";
if (!($host = check_fqdn(apr()->param('host'), $domain))) {
$all_set = 0;
}
my $ttl = apr()->param('ttl');
if (!check_ttl($ttl)) {
$all_set = 0;
}
if ($all_set && check_before_edit_AAAA($dom_id, $record_id, $host, $ipv6)) {
# update dns! and sql
# check wheter name is the same? so no need for update?
# check wheter an excact copy exists in dns to avoid errors
if (is_updated_AAAA($dom_id, $record_id, $host, $ipv6, $ttl)) {
if (dns_update_AAAA($dom_id, $record_id, $host, $ipv6, $ttl)) {
Debug(2, qq{dns_update_AAAA succeded\n});
} else {
Debug(2, qq{dns_update_AAAA failed\n});
}
} else {
Debug(2, qq{Dns record not changed so not updated\n});
}
} else {
my $tpl = new CGI::FastTemplate($cfg->{'cfg'}->{DnsZoneTemplateDir});
$tpl->define(layout => 'layout.tpl', menu => 'menu.tpl');
$tpl->assign(%lang);
$tpl->assign(DEBUG => '');
if ($dbh->get_domain_count($uid) == 1) {
$tpl->assign(ADDITIONAL_MENU => '');
} else {
$tpl->assign(ADDITIONAL_MENU => qq{<a href="/admin?action=default">$lang{LIST_DOMAIN}</a> | });
}
my $page_title = $lang{PAGE_EDIT};
$page_title =~ s/\$record/$type/;
$page_title =~ s/\$domain/$domain/;
$tpl->assign(TITLE => $page_title);
$tpl->define(record => 'aaaa/edit.tpl');
$tpl->assign(HOST_VALUE => encode_entities(apr()->param('host'))); # maybe it needs to fully qualify it if it was okay?
$tpl->assign(IPV6_ADDRESS_VALUE => encode_entities(apr()->param('ipv6')));
$tpl->assign(TTL_VALUE => encode_entities(apr()->param('ttl')));
# do the red-marker assignment
my $error_text = $lang{ERROR_CORRECT};
if (!ip_is_ipv6($ipv6)) {
$tpl->assign(IPV6_ADDRESS => qq{<font color="red">} . $lang{IPV6_ADDRESS} . qq{</font>});
$error_text .= qq{<br>$lang{ERROR_IPV6}};
}
if (!($host = check_fqdn(apr()->param('host'), $domain))) {
$tpl->assign(HOST => qq{<font color="red">} . $lang{HOST} . qq{</font>});
$error_text .= qq{<br>$lang{ERROR_HOST}};
}
if (!check_ttl($ttl)) {
$tpl->assign(TTL => qq{<font color="red">} . $lang{TTL} . qq{</font>});
$error_text .= qq{<br>$lang{ERROR_TTL}};
}
if ($all_set) {
$tpl->assign(IPV6_ADDRESS => qq{<font color="red">} . $lang{IPV6_ADDRESS} . qq{</font>});
$tpl->assign(HOST => qq{<font color="red">} . $lang{HOST} . qq{</font>});
$error_text .= qq{<br>$lang{ERROR_DUPLICATE}};
}
$tpl->assign(EXPLANATION => $error_text);
$tpl->assign(DOM_ID => $dom_id);
$tpl->assign(RECORD_ID => $record_id);
$tpl->parse(MENU => "menu");
$tpl->parse(MAIN => ["record", "layout"]);
my $content_ref = $tpl->fetch("MAIN");
output_headers($r, 1, length(${$content_ref}));
$r->print(${$content_ref});
$dbh->close();
return OK;
}
}
elsif (/^CNAME$/) {
my $all_set = 1;
my $host = "";
if (!($host = check_fqdn(apr()->param('host'), $domain))) {
$all_set = 0;
}
my $cname = apr()->param('cname');
if (!check_cname_host($cname)) {
$all_set = 0;
}
my $ttl = apr()->param('ttl');
if (!check_ttl($ttl)) {
$all_set = 0;
}
# do the update dance!
if ($all_set && check_before_edit_CNAME($dom_id, $record_id, $host, $cname)) {
# update dns! and sql
# check wheter name is the same? so no need for update?
# check wheter an excact copy exists in dns to avoid errors
if (is_updated_CNAME($dom_id, $record_id, $host, $cname, $ttl)) {
if (dns_update_CNAME($dom_id, $record_id, $host, $cname, $ttl)) {
Debug(2, qq{dns_update_CNAME succeded\n});
} else {
Debug(2, qq{dns_update_CNAME failed\n});
}
} else {
Debug(2, qq{Dns record not changed so not updated\n});
}
} else {
my $tpl = new CGI::FastTemplate($cfg->{'cfg'}->{DnsZoneTemplateDir});
$tpl->define(layout => 'layout.tpl', menu => 'menu.tpl');
$tpl->assign(%lang);
$tpl->assign(DEBUG => '');
if ($dbh->get_domain_count($uid) == 1) {
$tpl->assign(ADDITIONAL_MENU => '');
} else {
$tpl->assign(ADDITIONAL_MENU => qq{<a href="/admin?action=default">$lang{LIST_DOMAIN}</a> | });
}
my $page_title = $lang{PAGE_EDIT};
$page_title =~ s/\$record/$type/;
$page_title =~ s/\$domain/$domain/;
$tpl->assign(TITLE => $page_title);
$tpl->define(record => 'cname/edit.tpl');
$tpl->assign(HOST_VALUE => encode_entities(apr()->param('host')));
$tpl->assign(CNAME_VALUE => encode_entities(apr()->param('cname')));
$tpl->assign(TTL_VALUE => encode_entities(apr()->param('ttl')));
my $error_text = $lang{ERROR_CORRECT};
if (!check_cname_host($cname)) {
$tpl->assign(CNAME => qq{<font color="red">} . $lang{CNAME} . qq{</font>});
$error_text .= qq{<br>$lang{ERROR_CNAME}};
}
if (!($host = check_fqdn(apr()->param('host'), $domain))) {
$tpl->assign(HOST => qq{<font color="red">} . $lang{HOST} . qq{</font>});
$error_text .= qq{<br>$lang{ERROR_HOST}};
}
if (!check_ttl($ttl)) {
$tpl->assign(TTL => qq{<font color="red">} . $lang{TTL} . qq{</font>});
$error_text .= qq{<br>$lang{ERROR_TTL}};
}
if ($all_set) {
$tpl->assign(CNAME => qq{<font color="red">} . $lang{CNAME} . qq{</font>});
$tpl->assign(HOST => qq{<font color="red">} . $lang{HOST} . qq{</font>});
$error_text .= qq{<br>$lang{ERROR_DUPLICATE}};
}
$tpl->assign(EXPLANATION => $error_text);
$tpl->assign(DOM_ID => $dom_id);
$tpl->assign(RECORD_ID => $record_id);
$tpl->parse(MENU => "menu");
$tpl->parse(MAIN => ["record", "layout"]);
my $content_ref = $tpl->fetch("MAIN");
output_headers($r, 1, length(${$content_ref}));
$r->print(${$content_ref});
$dbh->close();
return OK;
}
}
elsif (/^MX$/) {
my $all_set = 1;
my $host = "";
if (!($host = check_fqdn(apr()->param('host'), $domain))) {
$all_set = 0;
}
my $exchanger = apr()->param('exchanger');
if (!check_exchanger($exchanger)) {
$all_set = 0;
}
my $preference = apr()->param('preference');
if (!check_preference($preference)) {
$all_set = 0;
}
my $ttl = apr()->param('ttl');
if (!check_ttl($ttl)) {
$all_set = 0;
}
if ($all_set && check_before_edit_MX($dom_id, $record_id, $host, $exchanger, $preference)) {
if (is_updated_MX($dom_id, $record_id, $host, $exchanger, $preference, $ttl)) {
if (dns_update_MX($dom_id, $record_id, $host, $exchanger, $preference, $ttl)) {
Debug(2, qq{dns_update_MX succeded\n});
} else {
Debug(2, qq{dns_update_MX failed\n});
}
} else {
Debug(2, qq{Dns record not changed so not updated\n});
}
} else {
my $tpl = new CGI::FastTemplate($cfg->{'cfg'}->{DnsZoneTemplateDir});
$tpl->define(layout => 'layout.tpl', menu => 'menu.tpl');
$tpl->assign(%lang);
$tpl->assign(DEBUG => '');
if ($dbh->get_domain_count($uid) == 1) {
$tpl->assign(ADDITIONAL_MENU => '');
} else {
$tpl->assign(ADDITIONAL_MENU => qq{<a href="/admin?action=default">$lang{LIST_DOMAIN}</a> | });
}
my $page_title = $lang{PAGE_EDIT};
$page_title =~ s/\$record/$type/;
$page_title =~ s/\$domain/$domain/;
$tpl->assign(TITLE => $page_title);
$tpl->define(record => 'mx/edit.tpl');
$tpl->assign(HOST_VALUE => encode_entities(apr()->param('host')));
$tpl->assign(MX_VALUE => encode_entities(apr()->param('exchanger')));
$tpl->assign(PREFERENCE_VALUE => encode_entities(apr()->param('preference')));
$tpl->assign(TTL_VALUE => encode_entities(apr()->param('ttl')));
my $error_text = $lang{ERROR_CORRECT};
if (!($host = check_fqdn(apr()->param('host'), $domain))) {
$tpl->assign(HOST => qq{<font color="red">} . $lang{HOST} . qq{</font>});
$error_text .= qq{<br>$lang{ERROR_HOST}};
}
if (!check_exchanger($exchanger)) {
$tpl->assign(MX => qq{<font color="red">} . $lang{MX} . qq{</font>});
$error_text .= qq{<br>$lang{ERROR_MX}};
}
if (!check_preference($preference)) {
$tpl->assign(PREFERENCE => qq{<font color="red">} . $lang{PREFERENCE} . qq{</font>});
$error_text .= qq{<br>$lang{ERROR_PREFERENCE}};
}
if (!check_ttl($ttl)) {
$tpl->assign(TTL => qq{<font color="red">} . $lang{TTL} . qq{</font>});
$error_text .= qq{<br>$lang{ERROR_TTL}};
}
if ($all_set) {
$tpl->assign(HOST => qq{<font color="red">} . $lang{HOST} . qq{</font>});
$tpl->assign(PREFERENCE => qq{<font color="red">} . $lang{PREFERENCE} . qq{</font>});
$error_text .= qq{<br>$lang{ERROR_DUPLICATE}};
}
$tpl->assign(EXPLANATION => $error_text);
$tpl->assign(DOM_ID => $dom_id);
$tpl->assign(RECORD_ID => $record_id);
$tpl->parse(MENU => "menu");
$tpl->parse(MAIN => ["record", "layout"]);
my $content_ref = $tpl->fetch("MAIN");
output_headers($r, 1, length(${$content_ref}));
$r->print(${$tpl->fetch("MAIN")});
$dbh->close();
return OK;
}
}
elsif (/^NS$/) {
my $all_set = 1;
my $zone = "";
if (!($zone = check_fqdn_ns(apr()->param('zone'), $domain))) {
$all_set = 0;
}
my $nameserver = apr()->param('nsdname');
if (!check_nameserver($nameserver)) {
$all_set = 0;
}
my $ttl = apr()->param('ttl');
if (!check_ttl($ttl)) {
$all_set = 0;
}
if ($all_set && check_before_edit_NS($dom_id, $record_id, $zone, $nameserver)) {
if (is_updated_NS($dom_id, $record_id, $zone, $nameserver, $ttl)) {
if (dns_update_NS($dom_id, $record_id, $zone, $nameserver, $ttl)) {
Debug(2, qq{dns_update_NS succeded\n});
} else {
Debug(2, qq{dns_update_NS failed\n});
}
} else {
Debug(2, qq{Dns record not changed so not updating\n});
}
} else {
my $tpl = new CGI::FastTemplate($cfg->{'cfg'}->{DnsZoneTemplateDir});
$tpl->define(layout => 'layout.tpl', menu => 'menu.tpl');
$tpl->assign(%lang);
$tpl->assign(DEBUG => '');
if ($dbh->get_domain_count($uid) == 1) {
$tpl->assign(ADDITIONAL_MENU => '');
} else {
$tpl->assign(ADDITIONAL_MENU => qq{<a href="/admin?action=default">$lang{LIST_DOMAIN}</a> | });
}
my $page_title = $lang{PAGE_EDIT};
$page_title =~ s/\$record/$type/;
$page_title =~ s/\$domain/$domain/;
$tpl->assign(TITLE => $page_title);
$tpl->define(record => 'ns/edit.tpl');
$tpl->assign(HOST_VALUE => encode_entities(apr()->param('zone')));
$tpl->assign(NS_VALUE => encode_entities(apr()->param('nsdname')));
$tpl->assign(TTL_VALUE => encode_entities(apr()->param('ttl')));
my $error_text = $lang{ERROR_CORRECT};
if (!($zone = check_fqdn_ns(apr()->param('zone'), $domain))) {
$tpl->assign(ZONE => qq{<font color="red">} . $lang{ZONE} . qq{</font>});
$error_text .= qq{<br>$lang{ERROR_ZONE}};
}
if (!check_nameserver($nameserver)) {
$tpl->assign(NS => qq{<font color="red">} . $lang{NS} . qq{</font>});
$error_text .= qq{<br>$lang{ERROR_NS}};
}
if (!check_ttl($ttl)) {
$tpl->assign(TTL => qq{<font color="red">} . $lang{TTL} . qq{</font>});
$error_text .= qq{<br>$lang{ERROR_TTL}};
}
if ($all_set) {
$tpl->assign(ZONE => qq{<font color="red">} . $lang{ZONE} . qq{</font>});
$tpl->assign(NS => qq{<font color="red">} . $lang{NS} . qq{</font>});
$error_text .= qq{<br>$lang{ERROR_DUPLICATE}};
}
$tpl->assign(EXPLANATION => $error_text);
$tpl->assign(DOM_ID => $dom_id);
$tpl->assign(RECORD_ID => $record_id);
$tpl->parse(MENU => "menu");
$tpl->parse(MAIN => ["record", "layout"]);
my $content_ref = $tpl->fetch("MAIN");
output_headers($r, 1, length(${$content_ref}));
$r->print(${$content_ref});
$dbh->close();
return OK;
}
}
elsif (/^PTR$/) {
# actually there needs to be another check to see if they really exists the parameters maybe up in the checking of the rec_lock
my $all_set = 1;
my $reverse = apr()->param('host');
if (!(check_host($reverse))) {
$all_set = 0;
}
my $host = "";
if (!($host = check_reverse(apr()->param('reverse'), $domain))) {
$all_set = 0;
}
my $ttl = apr()->param('ttl');
if (!check_ttl($ttl)) {
$all_set = 0;
}
if ($all_set && check_before_edit_PTR($dom_id, $record_id, $host, $reverse)) {
# update dns! and sql
# check wheter name is the same? so no need for update?
# check wheter an excact copy exists in dns to avoid errors
if (is_updated_PTR($dom_id, $record_id, $host, $reverse, $ttl)) {
if (dns_update_PTR($dom_id, $record_id, $host, $reverse, $ttl)) {
Debug(2, qq{dns_update_PTR succeded\n});
} else {
Debug(2, qq{dns_update_PTR failed\n});
}
} else {
Debug(2, qq{Dns record not changed so not updated\n});
}
} else {
my $tpl = new CGI::FastTemplate($cfg->{'cfg'}->{DnsZoneTemplateDir});
$tpl->define(layout => 'layout.tpl', menu => 'menu.tpl');
$tpl->assign(%lang);
$tpl->assign(DEBUG => '');
if ($dbh->get_domain_count($uid) == 1) {
$tpl->assign(ADDITIONAL_MENU => '');
} else {
$tpl->assign(ADDITIONAL_MENU => qq{<a href="/admin?action=default">$lang{LIST_DOMAIN}</a> | });
}
my $page_title = $lang{PAGE_EDIT};
$page_title =~ s/\$record/$type/;
$page_title =~ s/\$domain/$domain/;
$tpl->assign(TITLE => $page_title);
$tpl->define(record => 'ptr/edit.tpl');
$tpl->assign(HOST_VALUE => encode_entities(apr()->param('host'))); # maybe it needs to fully qualify it if it was okay?
$tpl->assign(REVERSE_HOST_VALUE => encode_entities(apr()->param('reverse')));
$tpl->assign(TTL_VALUE => encode_entities(apr()->param('ttl')));
# do the red-marker assignment
my $error_text = $lang{ERROR_CORRECT};
if (!(check_host(apr()->param('host')))) {
$tpl->assign(HOST => qq{<font color="red">} . $lang{HOST} . qq{</font>});
$error_text .= qq{<br>$lang{ERROR_IP}};
}
if (!($host = check_reverse(apr()->param('reverse'), $domain))) {
$tpl->assign(REVERSE_HOST => qq{<font color="red">} . $lang{REVERSE_HOST} . qq{</font>});
$error_text .= qq{<br>$lang{ERROR_REVERSE}};
}
if (!check_ttl($ttl)) {
$tpl->assign(TTL => qq{<font color="red">} . $lang{TTL} . qq{</font>});
$error_text .= qq{<br>$lang{ERROR_TTL}};
}
if ($all_set) {
$tpl->assign(REVERSE_HOST => qq{<font color="red">} . $lang{REVERSE_HOST} . qq{</font>});
$tpl->assign(HOST => qq{<font color="red">} . $lang{HOST} . qq{</font>});
$error_text .= qq{<br>$lang{ERROR_DUPLICATE}};
}
$tpl->assign(EXPLANATION => $error_text);
$tpl->assign(DOM_ID => $dom_id);
$tpl->assign(RECORD_ID => $record_id);
$tpl->parse(MENU => "menu");
$tpl->parse(MAIN => ["record", "layout"]);
my $content_ref = $tpl->fetch("MAIN");
output_headers($r, 1, length(${$content_ref}));
$r->print(${$content_ref});
$dbh->close();
return OK;
}
}
elsif (/^TXT$/) {
my $all_set = 1;
my $host = "";
if (!($host = check_fqdn(apr()->param('host'), $domain))) {
$all_set = 0;
}
my $txtdata = apr()->param('txtdata');
if (!check_txt($txtdata)) {
$all_set = 0;
}
my $ttl = apr()->param('ttl');
if (!check_ttl($ttl)) {
$all_set = 0;
}
if ($all_set && check_before_edit_TXT($dom_id, $record_id, $host, $txtdata)) {
if (is_updated_TXT($dom_id, $record_id, $host, $txtdata, $ttl)) {
if (dns_update_TXT($dom_id, $record_id, $host, $txtdata, $ttl)) {
Debug(2, qq{dns_update_TXT succeded\n});
} else {
Debug(2, qq{dns_update_TXT failed\n});
}
} else {
Debug(2, qq{Dns record not changed so not updating\n});
}
} else {
my $tpl = new CGI::FastTemplate($cfg->{'cfg'}->{DnsZoneTemplateDir});
$tpl->define(layout => 'layout.tpl', menu => 'menu.tpl');
$tpl->assign(%lang);
$tpl->assign(DEBUG => '');
if ($dbh->get_domain_count($uid) == 1) {
$tpl->assign(ADDITIONAL_MENU => '');
} else {
$tpl->assign(ADDITIONAL_MENU => qq{<a href="/admin?action=default">$lang{LIST_DOMAIN}</a> | });
}
my $page_title = $lang{PAGE_EDIT};
$page_title =~ s/\$record/$type/;
$page_title =~ s/\$domain/$domain/;
$tpl->assign(TITLE => $page_title);
$tpl->define(record => 'txt/edit.tpl');
$tpl->assign(HOST_VALUE => encode_entities(apr()->param('host')));
$tpl->assign(TXT_VALUE => encode_entities(apr()->param('txtdata')));
$tpl->assign(TTL_VALUE => encode_entities(apr()->param('ttl')));
my $error_text = $lang{ERROR_CORRECT};
if (!($host = check_fqdn(apr()->param('host'), $domain))) {
$tpl->assign(HOST => qq{<font color="red">} . $lang{HOST} . qq{</font>});
$error_text .= qq{<br>$lang{ERROR_HOST}};
}
if (!check_txt($txtdata)) {
$tpl->assign(TXT => qq{<font color="red">} . $lang{TXT} . qq{</font>});
$error_text .= qq{<br>$lang{ERROR_TXT}};
}
if (!check_ttl($ttl)) {
$tpl->assign(TTL => qq{<font color="red">} . $lang{TTL} . qq{</font>});
$error_text .= qq{<br>$lang{ERROR_TTL}};
}
if ($all_set) {
$tpl->assign(HOST => qq{<font color="red">} . $lang{HOST} . qq{</font>});
$tpl->assign(TXT => qq{<font color="red">} . $lang{TXT} . qq{</font>});
$error_text .= qq{<br>$lang{ERROR_DUPLICATE}};
}
$tpl->assign(EXPLANATION => $error_text);
$tpl->assign(DOM_ID => $dom_id);
$tpl->assign(RECORD_ID => $record_id);
$tpl->parse(MENU => "menu");
$tpl->parse(MAIN => ["record", "layout"]);
my $content_ref = $tpl->fetch("MAIN");
output_headers($r, 1, length(${$content_ref}));
$r->print(${$content_ref});
$dbh->close();
return OK;
}
}
else {
Debug(1, qq{User trying to update an unexsisting type: $type\n});
}
}
output_redirect($r, 1, qq{/admin?action=view&dom_id=$dom_id});
$dbh->close();
return REDIRECT;
} else {
# is view
Debug(5, qq{This is a view of edit_record request});
my $tpl = new CGI::FastTemplate($cfg->{'cfg'}->{DnsZoneTemplateDir});
$tpl->define(layout => 'layout.tpl', menu => 'menu.tpl');
$tpl->assign(%lang);
$tpl->assign(DEBUG => '');
if ($dbh->get_domain_count($uid) == 1) {
$tpl->assign(ADDITIONAL_MENU => '');
} else {
$tpl->assign(ADDITIONAL_MENU => qq{<a href="/admin?action=default">$lang{LIST_DOMAIN}</a> | });
}
my $page_title = $lang{PAGE_EDIT};
$page_title =~ s/\$record/$type/;
$page_title =~ s/\$domain/$domain/;
$tpl->assign(TITLE => $page_title);
$tpl->assign(EXPLANATION => $lang{EDIT_FIELDS});
for ($type) {
if (/^SOA$/) {
my ($auth_ns, $soa_email, $serial, $refresh, $retry, $expire, $default_ttl) = $dbh->soa_lookup($dom_id);
$soa_email =~ s/\./\@/;
$tpl->define(record => 'soa/edit.tpl');
$tpl->assign(AUTH_NS_VALUE => $auth_ns);
$tpl->assign(SERIAL_VALUE => $serial);
$tpl->assign(ADMIN_EMAIL_VALUE => $soa_email);
$tpl->assign(REFRESH_VALUE => $refresh);
$tpl->assign(RETRY_VALUE => $retry);
$tpl->assign(EXPIRE_VALUE => $expire);
$tpl->assign(TTL_VALUE => $default_ttl);
}
elsif (/^A$/) {
my ($name, $address, $ttl) = $dbh->a_lookup($dom_id, $record_id);
$tpl->define(record => 'a/edit.tpl');
$tpl->assign(HOST_VALUE => $name);
$tpl->assign(IP_ADDRESS_VALUE => $address);
$tpl->assign(TTL_VALUE => $ttl);
}
elsif (/^AAAA$/) {
my ($name, $address, $ttl) = $dbh->aaaa_lookup($dom_id, $record_id);
$tpl->define(record => 'aaaa/edit.tpl');
$tpl->assign(HOST_VALUE => $name);
$tpl->assign(IPV6_ADDRESS_VALUE => $address);
$tpl->assign(TTL_VALUE => $ttl);
}
elsif (/^CNAME$/) {
my ($name, $cname, $ttl) = $dbh->cname_lookup($dom_id, $record_id);
$tpl->define(record => 'cname/edit.tpl');
$tpl->assign(HOST_VALUE => $name);
$tpl->assign(CNAME_VALUE => $cname);
$tpl->assign(TTL_VALUE => $ttl);
}
elsif (/^MX$/) {
my ($name, $exchanger, $preference, $ttl) = $dbh->mx_lookup($dom_id, $record_id);
$tpl->define(record => 'mx/edit.tpl');
$tpl->assign(HOST_VALUE => $name);
$tpl->assign(MX_VALUE => $exchanger);
$tpl->assign(PREFERENCE_VALUE => $preference);
$tpl->assign(TTL_VALUE => $ttl);
}
elsif (/^NS$/) {
my ($name, $nsdname, $ttl) = $dbh->ns_lookup($dom_id, $record_id);
$tpl->define(record => 'ns/edit.tpl');
$tpl->assign(ZONE_VALUE => $name);
$tpl->assign(NS_VALUE => $nsdname);
$tpl->assign(TTL_VALUE => $ttl);
}
elsif (/^PTR$/) {
my ($name, $ptrdname, $ttl) = $dbh->ptr_lookup($dom_id, $record_id);
$tpl->define(record => 'ptr/edit.tpl');
$tpl->assign(HOST_VALUE => $ptrdname);
$tpl->assign(REVERSE_HOST_VALUE => $name);
$tpl->assign(TTL_VALUE => $ttl);
}
elsif (/^TXT$/) {
my ($name, $txtdata, $ttl) = $dbh->txt_lookup($dom_id, $record_id);
$txtdata = encode_entities($txtdata);
$tpl->define(record => 'txt/edit.tpl');
$tpl->assign(HOST_VALUE => $name);
$tpl->assign(TXT_VALUE => $txtdata);
$tpl->assign(TTL_VALUE => $ttl);
}
}
$tpl->assign(RECORD_ID => $record_id);
$tpl->assign(DOM_ID => $dom_id);
$tpl->parse(MENU => "menu");
$tpl->parse(MAIN => ["record", "layout"]);
my $content_ref = $tpl->fetch("MAIN");
output_headers($r, 1, length(${$content_ref}));
$r->print(${$content_ref});
$dbh->close();
return OK;
}
}
sub view_domain {
my $r = shift || Apache->request();
Debug(3, qq{calling view_domain()});
init($r);
my $user = $r->connection->user;
my ($uid, $user_email, $lang_id, $lang) = $dbh->get_user_info($user);
if (!apr()->param('dom_id')) {
$r->log_reason("No dom_id for this request: aborting");
output_redirect($r, 1, '/admin');
$dbh->close();
return REDIRECT;
}
# check dom_id
my $dom_id = apr()->param('dom_id');
($dom_id) = ($dom_id =~ /(\d+)/)[0];
if ($dom_id !~ /^\d+$/) {
$r->log_reason("User didn't supply a domain id for this request or tried to fake it");
output_redirect($r, 1, '/admin');
$dbh->close();
return REDIRECT;
}
# is uid owner of dom_id
my ($domain, $domain_owner_id) = $dbh->domain_stat($dom_id);
unless (defined($domain_owner_id) && $uid == $domain_owner_id) {
$r->log_reason("User trying to hijack another domain");
output_redirect($r, 1, '/admin');
$dbh->close();
return REDIRECT;
}
# actually it should be pretty safe to go on now!
my $tpl = new CGI::FastTemplate($cfg->{'cfg'}->{DnsZoneTemplateDir});
$tpl->define(
layout => "layout.tpl",
menu => "menu.tpl",
view_domain => "view_domain.tpl",
view_domain_soa => "view_domain/soa.tpl",
view_domain_a => "view_domain/a.tpl",
view_domain_a_record => "view_domain/a_record.tpl",
view_domain_aaaa => "view_domain/aaaa.tpl",
view_domain_aaaa_record => "view_domain/aaaa_record.tpl",
view_domain_cname => "view_domain/cname.tpl",
view_domain_cname_record => "view_domain/cname_record.tpl",
view_domain_mx => "view_domain/mx.tpl",
view_domain_mx_record => "view_domain/mx_record.tpl",
view_domain_ns => "view_domain/ns.tpl",
view_domain_ns_record => "view_domain/ns_record.tpl",
view_domain_ptr => "view_domain/ptr.tpl",
view_domain_ptr_record => "view_domain/ptr_record.tpl",
view_domain_txt => "view_domain/txt.tpl",
view_domain_txt_record => "view_domain/txt_record.tpl"
);
$tpl->assign(%lang);
my $page_title = $lang{PAGE_VIEW_DOMAIN};
$page_title =~ s/\$domain/$domain/;
$tpl->assign(TITLE => $page_title);
$tpl->assign(DOM_ID => $dom_id);
$tpl->assign(DEBUG => '');
if ($dbh->get_domain_count($uid) == 1) {
$tpl->assign(ADDITIONAL_MENU => '');
} else {
$tpl->assign(ADDITIONAL_MENU => qq{<a href="/admin?action=default">$lang{LIST_DOMAIN}</a> | });
}
my ($A_max, $AAAA_max, $CNAME_max, $MX_max, $NS_max, $PTR_max, $TXT_max) = $dbh->get_max_record_count($dom_id);
my ($auth_ns, $email, $serial, $refresh, $retry, $expire, $default_ttl, $rec_lock) = $dbh->soa_lookup($dom_id);
$email =~ s/\./\@/;
$tpl->assign(SOA_SERIAL_VALUE => $serial);
$tpl->assign(SOA_ADMIN_EMAIL_VALUE => $email);
$tpl->assign(SOA_AUTH_NS_VALUE => $auth_ns);
$tpl->assign(SOA_REFRESH_VALUE => $refresh);
$tpl->assign(SOA_RETRY_VALUE => $retry);
$tpl->assign(SOA_EXPIRE_VALUE => $expire);
$tpl->assign(SOA_TTL_VALUE => $default_ttl);
if ($rec_lock == 0) {
$tpl->assign(SOA_EDIT => qq{[ <a href="/admin?action=edit&dom_id=$dom_id&type=SOA">$lang{EDIT}</a> ]});
} else {
$tpl->assign(SOA_EDIT => qq{<i>$lang{LOCKED}</i>});
}
$tpl->parse(SOA_RR => "view_domain_soa");
if ($A_max != 0) {
my ($a_count) = $dbh->get_a_count($dom_id);
if ($A_max > $a_count) {
$tpl->assign(A_ADD => qq{[ <a href="/admin?action=add&dom_id=$dom_id&type=A">$lang{ADD}</a> ]});
} else {
$tpl->assign(A_ADD => qq{\ });
}
if ($a_count != 0) {
my $sth_A = $dbh->view_domain_A_prepare($dom_id);
my $count = 0;
while (my ($A_id, $A_name, $A_address, $A_ttl, $A_rec_lock) = $sth_A->fetchrow_array()) {
$count++;
my $bgcolor = "";
if ($count % 2 != 1) {
$tpl->assign(A_RR_BGCOLOR => $cfg->{'cfg'}->{DnsZoneTableEvenColor});
} else {
$tpl->assign(A_RR_BGCOLOR => $cfg->{'cfg'}->{DnsZoneTableOddColor});
}
$tpl->assign(A_HOST_VALUE => $A_name);
$tpl->assign(A_IP_VALUE => $A_address);
$tpl->assign(A_TTL_VALUE => $A_ttl);
if ($A_rec_lock == 0) {
$tpl->assign(A_CHANGE => qq{[ <a href="/admin?action=edit&dom_id=$dom_id&type=A&record_id=$A_id">$lang{EDIT}</a> | <a href="/admin?action=delete&dom_id=$dom_id&type=A&record_id=$A_id">$lang{REMOVE}</a> ]});
} else {
$tpl->assign(A_CHANGE => qq{<i>$lang{LOCKED}</i>});
}
$tpl->parse(A_RECORD => ".view_domain_a_record");
}
$sth_A->finish();
$tpl->parse(A_RR => "view_domain_a");
} else {
$tpl->assign(A_RECORD => '');
$tpl->parse(A_RR => "view_domain_a");
}
} else {
$tpl->assign(A_ADD => '');
$tpl->assign(A_RECORD => '');
$tpl->assign(A_RR => '');
}
if ($AAAA_max != 0) {
my ($aaaa_count) = $dbh->get_aaaa_count($dom_id);
if ($AAAA_max > $aaaa_count) {
$tpl->assign(AAAA_ADD => qq{[ <a href="/admin?action=add&dom_id=$dom_id&type=AAAA">$lang{ADD}</a> ]});
} else {
$tpl->assign(AAAA_ADD => qq{\ });
}
if ($aaaa_count != 0) {
my $sth_AAAA = $dbh->view_domain_AAAA_prepare($dom_id);
my $count = 0;
while (my ($AAAA_id, $AAAA_name, $AAAA_address, $AAAA_ttl, $AAAA_rec_lock) = $sth_AAAA->fetchrow_array()) {
$count++;
my $bgcolor = "";
if ($count % 2 != 1) {
$tpl->assign(AAAA_RR_BGCOLOR => $cfg->{'cfg'}->{DnsZoneTableEvenColor});
} else {
$tpl->assign(AAAA_RR_BGCOLOR => $cfg->{'cfg'}->{DnsZoneTableOddColor});
}
$tpl->assign(AAAA_HOST_VALUE => $AAAA_name);
$tpl->assign(AAAA_IPV6_VALUE => $AAAA_address);
$tpl->assign(AAAA_TTL_VALUE => $AAAA_ttl);
if ($AAAA_rec_lock == 0) {
$tpl->assign(AAAA_CHANGE => qq{[ <a href="/admin?action=edit&dom_id=$dom_id&type=AAAA&record_id=$AAAA_id">$lang{EDIT}</a> | <a href="/admin?action=delete&dom_id=$dom_id&type=AAAA&record_id=$AAAA_id">$lang{REMOVE}</a> ]});
} else {
$tpl->assign(AAAA_CHANGE => qq{<i>$lang{LOCKED}</i>});
}
$tpl->parse(AAAA_RECORD => ".view_domain_aaaa_record");
}
$sth_AAAA->finish();
$tpl->parse(AAAA_RR => "view_domain_aaaa");
} else {
$tpl->assign(AAAA_RECORD => '');
$tpl->parse(AAAA_RR => "view_domain_aaaa");
}
} else {
$tpl->assign(AAAA_ADD => '');
$tpl->assign(AAAA_RECORD => '');
$tpl->assign(AAAA_RR => '');
}
if ($CNAME_max != 0) {
my ($cname_count) = $dbh->get_cname_count($dom_id);
if ($CNAME_max > $cname_count) {
$tpl->assign(CNAME_ADD => qq{[ <a href="/admin?action=add&dom_id=$dom_id&type=CNAME">$lang{ADD}</a> ]});
} else {
$tpl->assign(CNAME_ADD => '');
}
if ($cname_count != 0) {
my $sth_CNAME = $dbh->view_domain_CNAME_prepare($dom_id);
my $count = 0;
while (my ($CNAME_id, $CNAME_name, $CNAME_cname, $CNAME_ttl, $CNAME_rec_lock) = $sth_CNAME->fetchrow_array()) {
$count++;
if ($count % 2 != 1) {
$tpl->assign(CNAME_RR_BGCOLOR => $cfg->{'cfg'}->{DnsZoneTableEvenColor});
} else {
$tpl->assign(CNAME_RR_BGCOLOR => $cfg->{'cfg'}->{DnsZoneTableOddColor});
}
$tpl->assign(CNAME_HOST_VALUE => $CNAME_name);
$tpl->assign(CNAME_CNAME_VALUE => $CNAME_cname);
$tpl->assign(CNAME_TTL_VALUE => $CNAME_ttl);
if ($CNAME_rec_lock == 0) {
$tpl->assign(CNAME_CHANGE => qq{[ <a href="/admin?action=edit&dom_id=$dom_id&type=CNAME&record_id=$CNAME_id">$lang{EDIT}</a> | <a href="/admin?action=delete&dom_id=$dom_id&type=CNAME&record_id=$CNAME_id">$lang{REMOVE}</a> ]});
} else {
$tpl->assign(CNAME_CHANGE => qq{<i>$lang{LOCKED}</i>});
}
$tpl->parse(CNAME_RECORD => ".view_domain_cname_record");
}
$tpl->parse(CNAME_RR => "view_domain_cname");
$sth_CNAME->finish();
} else {
$tpl->assign(CNAME_RECORD => '');
$tpl->parse(CNAME_RR => "view_domain_cname");
}
} else {
$tpl->assign(CNAME_ADD => '');
$tpl->assign(CNAME_RECORD => '');
$tpl->assign(CNAME_RR => '');
}
if ($MX_max != 0) {
my ($mx_count) = $dbh->get_mx_count($dom_id);
if ($MX_max > $mx_count) {
$tpl->assign(MX_ADD => qq{[ <a href="/admin?action=add&dom_id=$dom_id&type=MX">$lang{ADD}</a> ]});
} else {
$tpl->assign(MX_ADD => '');
}
if ($mx_count != 0) {
my $sth_MX = $dbh->view_domain_MX_prepare($dom_id);
my $count = 0;
while (my ($MX_id, $MX_name, $MX_exchanger, $MX_preference, $MX_ttl, $MX_rec_lock) = $sth_MX->fetchrow_array()) {
$count++;
if ($count % 2 != 1) {
$tpl->assign(MX_RR_BGCOLOR => $cfg->{'cfg'}->{DnsZoneTableEvenColor});
} else {
$tpl->assign(MX_RR_BGCOLOR => $cfg->{'cfg'}->{DnsZoneTableOddColor});
}
$tpl->assign(MX_HOST_VALUE => $MX_name);
$tpl->assign(MX_MX_VALUE => $MX_exchanger);
$tpl->assign(MX_PREFERENCE_VALUE => $MX_preference);
$tpl->assign(MX_TTL_VALUE => $MX_ttl);
if ($MX_rec_lock == 0) {
$tpl->assign(MX_CHANGE => qq{[ <a href="/admin?action=edit&dom_id=$dom_id&type=MX&record_id=$MX_id">$lang{EDIT}</a> | <a href="/admin?action=delete&dom_id=$dom_id&type=MX&record_id=$MX_id">$lang{REMOVE}</a> ]});
} else {
$tpl->assign(MX_CHANGE => qq{<i>$lang{LOCKED}</i>});
}
$tpl->parse(MX_RECORD => ".view_domain_mx_record");
}
$tpl->parse(MX_RR => "view_domain_mx");
$sth_MX->finish();
} else {
$tpl->assign(MX_RECORD => '');
$tpl->parse(MX_RR => "view_domain_mx");
}
} else {
$tpl->assign(MX_ADD => '');
$tpl->assign(MX_RECORD => '');
$tpl->assign(MX_RR => '');
}
if ($NS_max != 0) {
my ($ns_count) = $dbh->get_ns_count($dom_id);
if ($NS_max > $ns_count) {
$tpl->assign(NS_ADD => qq{[ <a href="/admin?action=add&dom_id=$dom_id&type=NS">$lang{ADD}</a> ]});
} else {
$tpl->assign(NS_ADD => '');
}
if ($ns_count != 0) {
my $sth_NS = $dbh->view_domain_NS_prepare($dom_id);
my $count = 0;
while (my ($NS_id, $NS_name, $NS_nsdname, $NS_ttl, $NS_rec_lock) = $sth_NS->fetchrow_array()) {
$count++;
if ($count % 2 != 1) {
$tpl->assign(NS_RR_BGCOLOR => $cfg->{'cfg'}->{DnsZoneTableEvenColor});
} else {
$tpl->assign(NS_RR_BGCOLOR => $cfg->{'cfg'}->{DnsZoneTableOddColor});
}
$tpl->assign(NS_ZONE_VALUE => $NS_name);
$tpl->assign(NS_NS_VALUE => $NS_nsdname);
$tpl->assign(NS_TTL_VALUE => $NS_ttl);
if ($NS_rec_lock == 0) {
$tpl->assign(NS_CHANGE => qq{[ <a href="/admin?action=edit&dom_id=$dom_id&type=NS&record_id=$NS_id">$lang{EDIT}</a> | <a href="/admin?action=delete&dom_id=$dom_id&type=NS&record_id=$NS_id">$lang{REMOVE}</a> ]});
} else {
$tpl->assign(NS_CHANGE => qq{<i>$lang{LOCKED}</i>});
}
$tpl->parse(NS_RECORD => ".view_domain_ns_record");
}
$tpl->parse(NS_RR => "view_domain_ns");
$sth_NS->finish();
} else {
$tpl->assign(NS_RECORD => '');
$tpl->parse(NS_RR => "view_domain_ns");
}
} else {
$tpl->assign(NS_ADD => '');
$tpl->assign(NS_RECORD => '');
$tpl->assign(NS_RR => '');
}
if ($PTR_max != 0) {
my ($ptr_count) = $dbh->get_ptr_count($dom_id);
if ($PTR_max > $ptr_count) {
$tpl->assign(PTR_ADD => qq{[ <a href="/admin?action=add&dom_id=$dom_id&type=PTR">$lang{ADD}</a> ]});
} else {
$tpl->assign(PTR_ADD => '');
}
if ($ptr_count != 0) {
my $sth_PTR = $dbh->view_domain_PTR_prepare($dom_id);
my $count = 0;
while (my ($PTR_id, $PTR_name, $PTR_ptrdname, $PTR_ttl, $PTR_rec_lock) = $sth_PTR->fetchrow_array()) {
$count++;
if ($count % 2 != 1) {
$tpl->assign(PTR_RR_BGCOLOR => $cfg->{'cfg'}->{DnsZoneTableEvenColor});
} else {
$tpl->assign(PTR_RR_BGCOLOR => $cfg->{'cfg'}->{DnsZoneTableOddColor});
}
$tpl->assign(PTR_REVERSE_HOST_VALUE => $PTR_name);
$tpl->assign(PTR_HOST_VALUE => $PTR_ptrdname);
$tpl->assign(PTR_TTL_VALUE => $PTR_ttl);
if ($PTR_rec_lock == 0) {
$tpl->assign(PTR_CHANGE => qq{[ <a href="/admin?action=edit&dom_id=$dom_id&type=PTR&record_id=$PTR_id">$lang{EDIT}</a> | <a href="/admin?action=delete&dom_id=$dom_id&type=PTR&record_id=$PTR_id">$lang{REMOVE}</a> ]});
} else {
$tpl->assign(PTR_CHANGE => qq{<i>$lang{LOCKED}</i>});
}
$tpl->parse(PTR_RECORD => ".view_domain_ptr_record");
}
$tpl->parse(PTR_RR => "view_domain_ptr");
$sth_PTR->finish();
} else {
$tpl->assign(PTR_RECORD => '');
$tpl->parse(PTR_RR => "view_domain_ptr");
}
} else {
$tpl->assign(PTR_ADD => '');
$tpl->assign(PTR_RECORD => '');
$tpl->assign(PTR_RR => '');
}
if ($TXT_max != 0) {
my ($txt_count) = $dbh->get_txt_count($dom_id);
if ($TXT_max > $txt_count) {
$tpl->assign(TXT_ADD => qq{[ <a href="/admin?action=add&dom_id=$dom_id&type=TXT">$lang{ADD}</a> ]});
} else {
$tpl->assign(TXT_ADD => '');
}
if ($txt_count != 0) {
my $sth_TXT = $dbh->view_domain_TXT_prepare($dom_id);
my $count = 0;
while (my ($TXT_id, $TXT_name, $TXT_txt, $TXT_ttl, $TXT_rec_lock) = $sth_TXT->fetchrow_array()) {
$count++;
if ($count % 2 != 1) {
$tpl->assign(TXT_RR_BGCOLOR => $cfg->{'cfg'}->{DnsZoneTableEvenColor});
} else {
$tpl->assign(TXT_RR_BGCOLOR => $cfg->{'cfg'}->{DnsZoneTableOddColor});
}
$tpl->assign(TXT_HOST_VALUE => $TXT_name);
$tpl->assign(TXT_TXT_VALUE => $TXT_txt);
$tpl->assign(TXT_TTL_VALUE => $TXT_ttl);
if ($TXT_rec_lock == 0) {
$tpl->assign(TXT_CHANGE => qq{[ <a href="/admin?action=edit&dom_id=$dom_id&type=TXT&record_id=$TXT_id">$lang{EDIT}</a> | <a href="/admin?action=delete&dom_id=$dom_id&type=TXT&record_id=$TXT_id">$lang{REMOVE}</a> ]});
} else {
$tpl->assign(TXT_CHANGE => qq{<i>$lang{LOCKED}</i>});
}
$tpl->parse(TXT_RECORD => ".view_domain_txt_record");
}
$tpl->parse(TXT_RR => "view_domain_txt");
$sth_TXT->finish();
} else {
$tpl->assign(TXT_RECORD => '');
$tpl->parse(TXT_RR => "view_domain_txt");
}
} else {
$tpl->assign(TXT_ADD => '');
$tpl->assign(TXT_RECORD => '');
$tpl->assign(TXT_RR => '');
}
$tpl->parse(MENU => "menu");
$tpl->parse(MAIN => ["view_domain", "layout"]);
my $content_ref = $tpl->fetch("MAIN");
output_headers($r, 1, length(${$content_ref}));
$r->print(${$content_ref});
$dbh->close();
return OK;
}
sub dns_update_SOA {
my $domain_id = shift;
my $serial = shift;
my $soa_email = shift;
my $refresh = shift;
my $retry = shift;
my $expire = shift;
my $default_ttl = shift;
my $auth_ns = $dbh->get_auth_ns($domain_id);
my $domain = $dbh->id2domain($domain_id);
my $update = new Net::DNS::Update($domain);
resolver_setup($domain_id);
Debug(5, qq{dns_update_SOA: (del) $domain SOA $auth_ns\n});
$update->push("update", rr_del(qq{$domain SOA $auth_ns}));
Debug(5, qq{dns_update_SOA: (set) $domain $default_ttl SOA $auth_ns $soa_email ($serial $refresh $retry $expire $default_ttl)});
$update->push("update", rr_add(qq{$domain $default_ttl SOA $auth_ns $soa_email ($serial $refresh $retry $expire $default_ttl)}));
my $ans = $res->res->send($update);
Debug(5, qq{Apache::DnsZone::dns_update_SOA (result): } . $ans->header->rcode);
unless ($ans->header->rcode eq "NOERROR") { return 0; }
return $dbh->update_SOA($domain_id, $serial, $soa_email, $refresh, $retry, $expire, $default_ttl);
}
sub dns_set_A {
my $domain_id = shift;
my $name = shift;
my $ip = shift;
my $ttl = shift || 86400;
my $domain = $dbh->id2domain($domain_id);
my $update = new Net::DNS::Update($domain);
Debug(5, qq{dns_set_A: $name $ttl A $ip});
( run in 0.690 second using v1.01-cache-2.11-cpan-f56aa216473 )