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 )