2014-01-20 01:08:03 +01:00
|
|
|
|
package DNSManager;
|
|
|
|
|
|
|
|
|
|
use Dancer ':syntax';
|
|
|
|
|
use strict;
|
|
|
|
|
use warnings;
|
|
|
|
|
use v5.14;
|
|
|
|
|
use Modern::Perl;
|
|
|
|
|
use Data::Dump qw( dump );
|
|
|
|
|
use Data::Structure::Util qw ( unbless );
|
|
|
|
|
use File::Basename;
|
|
|
|
|
use Config::Simple;
|
|
|
|
|
use Storable qw( freeze thaw );
|
|
|
|
|
$Storable::Deparse = true;
|
|
|
|
|
$Storable::Eval=true;
|
|
|
|
|
|
|
|
|
|
# Include other libs relative to current path
|
2014-01-20 22:58:30 +01:00
|
|
|
|
use Find::Lib '../../'; # TODO remove it when it won't be usefull anymore
|
2014-01-20 01:08:03 +01:00
|
|
|
|
use app::app;
|
|
|
|
|
|
|
|
|
|
our $VERSION = '0.1';
|
|
|
|
|
|
2014-01-20 22:58:30 +01:00
|
|
|
|
# eventually change place
|
|
|
|
|
sub initco {
|
|
|
|
|
|
|
|
|
|
my $cfg = new Config::Simple(dirname(__FILE__).'/../conf/config.ini');
|
|
|
|
|
my $app = app->new( zdir => $cfg->param('zones_path'),
|
|
|
|
|
dbname => $cfg->param('dbname'),
|
|
|
|
|
dbhost => $cfg->param('host'),
|
|
|
|
|
dbport => $cfg->param('port'),
|
|
|
|
|
dbuser => $cfg->param('user'),
|
|
|
|
|
dbpass => $cfg->param('passwd'),
|
|
|
|
|
sgbd => $cfg->param('sgbd'),
|
|
|
|
|
dnsapp => $cfg->param('dnsapp') );
|
|
|
|
|
|
|
|
|
|
$app->init();
|
|
|
|
|
|
|
|
|
|
return $app;
|
|
|
|
|
}
|
|
|
|
|
|
2014-01-20 01:08:03 +01:00
|
|
|
|
get '/' => sub {
|
|
|
|
|
if( session('login') )
|
|
|
|
|
{
|
2014-01-20 22:58:30 +01:00
|
|
|
|
my $app = initco();
|
2014-01-22 17:01:34 +01:00
|
|
|
|
my ($success, @domains) = $app->get_domains( session('login') );
|
|
|
|
|
|
|
|
|
|
if( $success ) {
|
|
|
|
|
|
|
|
|
|
template index => {
|
2014-01-23 00:25:33 +01:00
|
|
|
|
login => session('login')
|
2014-01-22 17:01:34 +01:00
|
|
|
|
, admin => session('admin')
|
|
|
|
|
, domains => [ @domains ] };
|
|
|
|
|
}
|
|
|
|
|
else {
|
|
|
|
|
session->destroy;
|
|
|
|
|
template 'index';
|
|
|
|
|
}
|
2014-01-20 01:08:03 +01:00
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
template 'index';
|
|
|
|
|
}
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
2014-01-21 20:06:10 +01:00
|
|
|
|
get '/home' => sub {
|
2014-01-20 01:08:03 +01:00
|
|
|
|
|
|
|
|
|
unless( session('login') )
|
|
|
|
|
{
|
|
|
|
|
redirect '/';
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
2014-01-20 22:58:30 +01:00
|
|
|
|
my $app = initco();
|
2014-01-20 01:08:03 +01:00
|
|
|
|
|
2014-01-22 17:01:34 +01:00
|
|
|
|
my ($success, @domains) = $app->get_domains( session('login') );
|
2014-01-20 01:08:03 +01:00
|
|
|
|
|
2014-01-22 17:01:34 +01:00
|
|
|
|
if( $success ) {
|
|
|
|
|
|
|
|
|
|
my (%zone_properties, %domains);
|
2014-01-21 00:16:26 +01:00
|
|
|
|
my $cs = session('creationSuccess');
|
|
|
|
|
my $cf = session('creationFailure');
|
|
|
|
|
my $dn = session('domainName');
|
2014-01-22 17:01:34 +01:00
|
|
|
|
|
2014-01-22 23:04:54 +01:00
|
|
|
|
session creationSuccess => '';
|
|
|
|
|
session creationFailure => '';
|
|
|
|
|
session domainName => '';
|
2014-01-22 17:01:34 +01:00
|
|
|
|
|
|
|
|
|
template home => {
|
|
|
|
|
login => session('login')
|
|
|
|
|
, admin => session('admin')
|
|
|
|
|
, domains => [@domains]
|
|
|
|
|
, zones_domains => \%domains
|
|
|
|
|
, zone_properties => \%zone_properties
|
|
|
|
|
, creationSuccess => $cs
|
|
|
|
|
, creationFailure => $cf
|
|
|
|
|
, domainName => $dn };
|
|
|
|
|
|
2014-01-21 00:16:26 +01:00
|
|
|
|
}
|
2014-01-22 17:01:34 +01:00
|
|
|
|
else {
|
|
|
|
|
session->destroy;
|
|
|
|
|
redirect '/ ';
|
2014-01-21 00:16:26 +01:00
|
|
|
|
}
|
2014-01-22 17:01:34 +01:00
|
|
|
|
|
2014-01-20 22:58:30 +01:00
|
|
|
|
}
|
2014-01-20 01:08:03 +01:00
|
|
|
|
};
|
|
|
|
|
|
2014-01-21 20:06:10 +01:00
|
|
|
|
prefix '/domain' => sub {
|
2014-01-21 01:33:17 +01:00
|
|
|
|
|
2014-01-21 20:06:10 +01:00
|
|
|
|
any ['post', 'get'] => '/update/:domain' => sub {
|
2014-01-20 22:58:30 +01:00
|
|
|
|
|
2014-01-21 20:06:10 +01:00
|
|
|
|
# check if user is logged & if domain parameter is set
|
|
|
|
|
unless( session('login') && param('domain'))
|
|
|
|
|
{
|
|
|
|
|
redirect '/';
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
my $app = initco();
|
|
|
|
|
my ($auth_ok, $user, $isadmin) = $app->auth(param('login'),
|
|
|
|
|
param('password') );
|
2014-01-20 22:58:30 +01:00
|
|
|
|
|
2014-01-21 20:06:10 +01:00
|
|
|
|
$app->update_domain_raw(session('login')
|
|
|
|
|
, param('zoneupdated')
|
|
|
|
|
, param('domain'));
|
2014-01-20 22:58:30 +01:00
|
|
|
|
|
2014-01-21 20:06:10 +01:00
|
|
|
|
redirect '/domain/details/' . param('domain');
|
|
|
|
|
}
|
2014-01-21 01:33:17 +01:00
|
|
|
|
|
2014-01-21 20:06:10 +01:00
|
|
|
|
};
|
2014-01-20 22:58:30 +01:00
|
|
|
|
|
2014-01-21 20:06:10 +01:00
|
|
|
|
get '/details/:domain' => sub {
|
|
|
|
|
|
|
|
|
|
# check if user is logged & if domain parameter is set
|
|
|
|
|
unless( session('login') && param('domain'))
|
|
|
|
|
{
|
|
|
|
|
redirect '/';
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
my $app = initco();
|
|
|
|
|
my ($auth_ok, $user, $isadmin) = $app->auth(param('login'),
|
|
|
|
|
param('password') );
|
2014-01-21 01:33:17 +01:00
|
|
|
|
|
2014-01-21 20:06:10 +01:00
|
|
|
|
my $zone = $app->get_domain(session('login') , param('domain'));
|
2014-01-21 01:33:17 +01:00
|
|
|
|
|
2014-01-24 20:18:49 +01:00
|
|
|
|
if( param( 'expert' ) )
|
|
|
|
|
{
|
|
|
|
|
template details => {
|
|
|
|
|
login => session('login')
|
|
|
|
|
, domain => param('domain')
|
|
|
|
|
, domain_zone => $zone->output()
|
|
|
|
|
, expert => true };
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
# say dump( $zone->cname());
|
|
|
|
|
template details => {
|
|
|
|
|
login => session('login')
|
|
|
|
|
, domain => param('domain')
|
|
|
|
|
, domain_zone => $zone->output()
|
|
|
|
|
, a => $zone->a()
|
|
|
|
|
, aaaa => $zone->aaaa()
|
|
|
|
|
, cname => $zone->cname()
|
|
|
|
|
, ptr => $zone->ptr()
|
|
|
|
|
, mx => $zone->mx()
|
|
|
|
|
, ns => $zone->ns() };
|
|
|
|
|
}
|
2014-01-21 20:06:10 +01:00
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
post '/add/' => sub {
|
|
|
|
|
|
|
|
|
|
# check if user is logged & if domain parameter is set
|
|
|
|
|
unless( session('login') && param('domain'))
|
|
|
|
|
{
|
|
|
|
|
redirect '/';
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
|
2014-01-21 00:16:26 +01:00
|
|
|
|
my $creationSuccess = false;
|
|
|
|
|
my $creationFailure = false;
|
|
|
|
|
if( param('domain') =~ /^[a-zA-Z0-9]+[a-zA-Z0-9-]+[a-zA-Z0-9]+$|^[a-zA-Z0-9]+$/ )
|
|
|
|
|
{
|
|
|
|
|
|
2014-01-22 17:01:34 +01:00
|
|
|
|
my $cfg = new Config::Simple(dirname(__FILE__).'/../conf/config.ini');
|
2014-01-21 00:16:26 +01:00
|
|
|
|
my $domain = param('domain').$cfg->param('tld');
|
|
|
|
|
# $domain =~ s/\.{2,}/\./g;
|
|
|
|
|
# say "domain after sed : $domain";
|
|
|
|
|
# create domain
|
2014-01-22 17:01:34 +01:00
|
|
|
|
my $app = initco();
|
|
|
|
|
# Add tld
|
|
|
|
|
# create domain
|
2014-01-21 00:16:26 +01:00
|
|
|
|
$app->add_domain( session('login'), $domain );
|
|
|
|
|
$creationSuccess = true;
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
# say param('domain')." contains a char not valid";
|
|
|
|
|
$creationFailure = true;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
session 'creationSuccess' => $creationSuccess;
|
|
|
|
|
session 'creationFailure' => $creationFailure;
|
|
|
|
|
session 'domainName' => param('domain');
|
2014-01-21 20:06:10 +01:00
|
|
|
|
redirect '/home';
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
get '/del/:domain' => sub {
|
|
|
|
|
|
|
|
|
|
my $app = initco();
|
2014-01-22 17:01:34 +01:00
|
|
|
|
|
2014-01-23 02:46:16 +01:00
|
|
|
|
# TODO tests des droits
|
|
|
|
|
if( session('login') ) {
|
|
|
|
|
|
|
|
|
|
$app->delete_domain(session('login'), param('domain'));
|
|
|
|
|
|
|
|
|
|
if( request->referer =~ "/domain/details" ) {
|
|
|
|
|
redirect '/home';
|
|
|
|
|
}
|
|
|
|
|
else {
|
|
|
|
|
redirect request->referer;
|
|
|
|
|
}
|
|
|
|
|
}
|
2014-01-21 20:06:10 +01:00
|
|
|
|
|
|
|
|
|
};
|
2014-01-21 01:33:17 +01:00
|
|
|
|
|
2014-01-20 01:08:03 +01:00
|
|
|
|
|
|
|
|
|
};
|
|
|
|
|
|
2014-01-21 20:06:10 +01:00
|
|
|
|
any ['get', 'post'] => '/admin' => sub {
|
2014-01-22 17:01:34 +01:00
|
|
|
|
|
2014-01-20 01:08:03 +01:00
|
|
|
|
unless( session('login') )
|
|
|
|
|
{
|
|
|
|
|
redirect '/';
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
2014-01-22 17:01:34 +01:00
|
|
|
|
my $app = initco();
|
|
|
|
|
my ($auth_ok, $user, $isadmin) = $app->auth(session('login'),
|
|
|
|
|
session('password') );
|
|
|
|
|
|
|
|
|
|
unless ( $auth_ok && $isadmin ) {
|
|
|
|
|
redirect '/ ';
|
|
|
|
|
}
|
|
|
|
|
else {
|
|
|
|
|
|
|
|
|
|
my %alldomains = $app->get_all_domains;
|
2014-01-23 21:30:52 +01:00
|
|
|
|
my %allusers = $app->get_all_users;
|
2014-01-22 17:01:34 +01:00
|
|
|
|
my ($success, @domains) = $app->get_domains( session('login') );
|
|
|
|
|
|
|
|
|
|
template administration => {
|
|
|
|
|
login => session('login')
|
|
|
|
|
, admin => session('admin')
|
|
|
|
|
, domains => [ @domains ]
|
2014-01-23 21:30:52 +01:00
|
|
|
|
, alldomains => { %alldomains }
|
|
|
|
|
, allusers => { %allusers } };
|
2014-01-22 17:01:34 +01:00
|
|
|
|
}
|
2014-01-20 01:08:03 +01:00
|
|
|
|
}
|
|
|
|
|
};
|
|
|
|
|
|
2014-01-21 20:06:10 +01:00
|
|
|
|
prefix '/user' => sub {
|
2014-01-20 01:08:03 +01:00
|
|
|
|
|
2014-01-21 20:06:10 +01:00
|
|
|
|
get '/logout' => sub {
|
|
|
|
|
session->destroy;
|
2014-01-20 22:58:30 +01:00
|
|
|
|
redirect '/';
|
2014-01-21 20:06:10 +01:00
|
|
|
|
};
|
2014-01-20 22:58:30 +01:00
|
|
|
|
|
2014-01-22 23:04:54 +01:00
|
|
|
|
post '/add/' => sub {
|
|
|
|
|
|
|
|
|
|
if ( param('login') && param('password') )
|
|
|
|
|
{
|
|
|
|
|
|
|
|
|
|
my $app = initco();
|
|
|
|
|
$app->register_user(param('login'), param('password'));
|
|
|
|
|
session login => param('login');
|
|
|
|
|
session password => param('password');
|
|
|
|
|
redirect '/home';
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
else {
|
|
|
|
|
session errmsg => q/login ou password non renseignés/;
|
|
|
|
|
redirect '/user/subscribe';
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
get '/subscribe' => sub {
|
|
|
|
|
|
|
|
|
|
if( defined session('login') )
|
|
|
|
|
{
|
|
|
|
|
redirect '/home';
|
|
|
|
|
}
|
|
|
|
|
else {
|
|
|
|
|
|
|
|
|
|
my $errmsg = session 'errmsg' ;
|
|
|
|
|
session errmsg => '';
|
|
|
|
|
|
|
|
|
|
template subscribe => {
|
|
|
|
|
errmsg => $errmsg
|
|
|
|
|
};
|
|
|
|
|
}
|
|
|
|
|
|
2014-01-23 21:30:52 +01:00
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
get '/unsetadmin/:user' => sub {
|
|
|
|
|
|
|
|
|
|
unless( defined param('user') )
|
|
|
|
|
{
|
|
|
|
|
|
|
|
|
|
# TODO ajouter une erreur à afficher
|
|
|
|
|
redirect request->referer;
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
elsif(! defined session('login') )
|
|
|
|
|
{
|
|
|
|
|
|
|
|
|
|
redirect '/';
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
else {
|
|
|
|
|
|
|
|
|
|
my $app = initco();
|
|
|
|
|
|
|
|
|
|
my ($auth_ok, $user, $isadmin) = $app->auth(session('login'),
|
|
|
|
|
session('password') );
|
|
|
|
|
|
|
|
|
|
if ( $auth_ok && $isadmin ) {
|
|
|
|
|
$app->set_admin(param('user'), 0);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
redirect request->referer;
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
get '/setadmin/:user' => sub {
|
|
|
|
|
|
|
|
|
|
unless( defined param('user') )
|
|
|
|
|
{
|
|
|
|
|
|
|
|
|
|
# TODO ajouter une erreur à afficher
|
|
|
|
|
redirect request->referer;
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
elsif(! defined session('login') )
|
|
|
|
|
{
|
|
|
|
|
|
|
|
|
|
redirect '/';
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
else {
|
|
|
|
|
|
|
|
|
|
my $app = initco();
|
|
|
|
|
|
|
|
|
|
my ($auth_ok, $user, $isadmin) = $app->auth(session('login'),
|
|
|
|
|
session('password') );
|
|
|
|
|
|
|
|
|
|
if ( $auth_ok && $isadmin ) {
|
|
|
|
|
$app->set_admin(param('user'), 1);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
redirect request->referer;
|
|
|
|
|
|
|
|
|
|
}
|
2014-01-22 23:04:54 +01:00
|
|
|
|
|
|
|
|
|
};
|
|
|
|
|
|
2014-01-22 17:01:34 +01:00
|
|
|
|
get '/del/:user' => sub {
|
|
|
|
|
|
|
|
|
|
my $app = initco();
|
|
|
|
|
|
|
|
|
|
my ($auth_ok, $user, $isadmin) = $app->auth(session('login'),
|
|
|
|
|
session('password') );
|
|
|
|
|
|
|
|
|
|
if ( $auth_ok && $isadmin || session('login') eq param('user')) {
|
|
|
|
|
$app->delete_user(param('user'));
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
redirect request->referer;
|
|
|
|
|
|
|
|
|
|
};
|
|
|
|
|
|
2014-01-21 20:06:10 +01:00
|
|
|
|
post '/login' => sub {
|
2014-01-20 01:08:03 +01:00
|
|
|
|
|
2014-01-21 20:06:10 +01:00
|
|
|
|
# Check if user is already logged
|
|
|
|
|
unless ( session('login') )
|
2014-01-20 01:08:03 +01:00
|
|
|
|
{
|
2014-01-21 20:06:10 +01:00
|
|
|
|
# Check user login and password
|
|
|
|
|
if ( param('login') && param('password') )
|
|
|
|
|
{
|
|
|
|
|
|
|
|
|
|
my $app = initco();
|
|
|
|
|
my ($auth_ok, $user, $isadmin) = $app->auth(param('login'),
|
|
|
|
|
param('password') );
|
2014-01-22 17:01:34 +01:00
|
|
|
|
|
2014-01-21 20:06:10 +01:00
|
|
|
|
if( $auth_ok )
|
|
|
|
|
{
|
|
|
|
|
|
|
|
|
|
session login => param('login');
|
|
|
|
|
# TODO : change password storage…
|
|
|
|
|
session password => param('password');
|
|
|
|
|
session user => freeze( $user );
|
|
|
|
|
session admin => $isadmin;
|
|
|
|
|
|
2014-01-22 17:01:34 +01:00
|
|
|
|
if( $isadmin ) {
|
|
|
|
|
redirect '/admin';
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
|
2014-01-21 20:06:10 +01:00
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
# User login and/or password are incorrect
|
2014-01-22 17:01:34 +01:00
|
|
|
|
redirect '/';
|
2014-01-21 20:06:10 +01:00
|
|
|
|
}
|
|
|
|
|
}
|
2014-01-20 01:08:03 +01:00
|
|
|
|
}
|
|
|
|
|
|
2014-01-21 20:06:10 +01:00
|
|
|
|
redirect '/home';
|
2014-01-20 01:08:03 +01:00
|
|
|
|
|
2014-01-21 20:06:10 +01:00
|
|
|
|
};
|
2014-01-20 01:08:03 +01:00
|
|
|
|
|
2014-01-21 20:06:10 +01:00
|
|
|
|
};
|