Apache-DnsZone
view release on metacpan or search on metacpan
lib/Apache/DnsZone.pm view on Meta::CPAN
return REDIRECT;
} else {
Debug(5, qq{This is a view of settings request});
my ($uid, $user_email, $lang_id, $lang) = $dbh->get_user_info($user);
my $tpl = new CGI::FastTemplate($cfg->{'cfg'}->{DnsZoneTemplateDir});
$tpl->define(layout => 'layout.tpl', settings => 'settings.tpl', menu => 'menu.tpl');
$tpl->assign(%lang);
$tpl->assign(TITLE => $lang{'PAGE_SETTINGS'});
$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});
}
lib/Apache/DnsZone.pm view on Meta::CPAN
$tpl->assign(NS_VALUE => $nsdname);
$tpl->assign(TTL_VALUE => $ttl);
}
if (/^PTR$/) {
my ($name, $ptrdname, $ttl) = $dbh->ptr_lookup($dom_id, $record_id);
$tpl->define(record => 'ptr/remove.tpl');
$tpl->assign(HOST_VALUE => $name);
$tpl->assign(REVERSE_HOST_VALUE => $ptrdname);
$tpl->assign(TTL_VALUE => $ttl);
}
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;
}
lib/Apache/DnsZone.pm view on Meta::CPAN
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');
lib/Apache/DnsZone.pm view on Meta::CPAN
$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 {
( run in 1.653 second using v1.01-cache-2.11-cpan-8f98c5d2c55 )