diff --git a/app/app.pm b/app/app.pm
index 3ce50e2..a4b36b6 100644
--- a/app/app.pm
+++ b/app/app.pm
@@ -47,29 +47,34 @@ sub init {
sub auth {
my ($self, $login, $passwd) = @_;
- return ${$self->um}->auth($login, $passwd);
+ ${$self->um}->auth($login, $passwd);
}
sub register_user {
my ($self, $login, $passwd) = @_;
- return ${$self->um}->register_user($login, $passwd);
+ ${$self->um}->register_user($login, $passwd);
}
# TODO
sub set_admin {
my ($self, $login) = @_;
- return ${$self->um}->set_admin($login);
+ ${$self->um}->set_admin($login);
}
sub update_passwd {
my ($self, $login, $new) = @_;
- my $user = ${$self->um}->get_user($login);
- return $user->passwd($new);
+ my ($success, $user, $isadmin) = ${$self->um}->get_user($login);
+ $user->passwd($new);
}
sub delete_user {
my ($self, $login) = @_;
- return ${$self->um}->delete_user($login);
+ my ($success, @domains) = $self->get_domains($login);
+
+ if($success) {
+ $self->delete_domain($login, $_) foreach(@domains);
+ ${$self->um}->delete_user($login);
+ }
}
### domains
@@ -77,7 +82,12 @@ sub delete_user {
# return yes or no
sub add_domain {
my ($self, $login, $domain) = @_;
- my $user = ${$self->um}->get_user($login);
+ my ($success, $user, $isadmin) = ${$self->um}->get_user($login);
+
+ unless($success) {
+ return 0;
+ }
+
$user->add_domain($domain);
my $ze = app::zone::edit->new(zname => $domain, zdir => $self->zdir);
@@ -86,7 +96,7 @@ sub add_domain {
sub delete_domain {
my ($self, $login, $domain) = @_;
- my $user = ${$self->um}->get_user($login);
+ my ($success, $user, $isadmin) = ${$self->um}->get_user($login);
$user->delete_domain($domain);
my $ze = app::zone::edit->new(zname => $domain, zdir => $self->zdir);
$ze->del();
@@ -112,13 +122,13 @@ sub get_domain {
sub get_domains {
my ($self, $login) = @_;
-
- my $user = ${$self->um}->get_user($login);
- return $user->domains;
+ ${$self->um}->get_domains($login);
}
-sub activate_domain {
- my ($self, $domain) = @_;
+sub get_all_domains {
+ my ($self) = @_;
+ # % domain login
+ ${$self->um}->get_all_domains;
}
sub new_tmp {
diff --git a/app/bdd/management.pm b/app/bdd/management.pm
index 5557297..b4b0149 100644
--- a/app/bdd/management.pm
+++ b/app/bdd/management.pm
@@ -16,53 +16,24 @@ has [qw/dbh/] => qw/is rw required 1/;
# ($success, $user, $admin) auth_user($login, $passwd)
sub auth {
my ($self, $login, $passwd) = @_;
- my ($sth, $user, @domains);
+ my ($sth, $success, $user, $isadmin);
$sth = $self->dbh->prepare('SELECT * FROM user WHERE login=? and passwd=?');
- unless ( $sth->execute($login, $passwd)) {
+ unless ($sth->execute($login, $passwd)) {
$sth->finish();
return 0;
}
if (my $ref = $sth->fetchrow_arrayref) {
- $sth = $self->dbh->prepare('SELECT domain FROM domain WHERE login=?');
- unless ( $sth->execute($login)) {
- $sth->finish();
- return 0;
- }
-
- # get domains
- #push @domains, @$_[0] while($sth->fetchrow_arrayref);
-
- while(my $ref2 = $sth->fetchrow_arrayref) {
- push @domains, @$ref2[0];
- }
-
-
- # si admin
- if(@$ref[2]) {
-
- # TODO : the admin module
- $user = app::bdd::admin->new(login => @$ref[0]
- , passwd => @$ref[1]
- , dbh => $self->dbh
- , domains => [@domains]);
- $sth->finish();
- return 1, $user, 1;
-
- }
- else {
- $user = app::bdd::lambda->new(login => @$ref[0]
- , passwd => @$ref[1]
- , dbh => $self->dbh
- , domains => [@domains]);
- $sth->finish();
- return 1, $user, 0;
- }
+ # if this user exists and is auth
+ ($success, $user, $isadmin) = $self->get_user($login);
+ }
+ else {
+ $success = 0;
}
$sth->finish();
- return 0;
+ return ($success, $user, $isadmin);
}
# ($success) register_user
@@ -75,12 +46,14 @@ sub register_user {
return 0;
}
+ # if an user already exists
if (my $ref = $sth->fetchrow_arrayref) {
#say join (', ', @$ref);
$sth->finish();
return 0;
}
+ # if not
$sth = $self->dbh->prepare('insert into user VALUES(?,?,?)');
unless ($sth->execute($login, $pass, 0)) {
$sth->finish();
@@ -96,6 +69,14 @@ sub delete_user {
my ($self, $login) = @_;
my $sth;
+ # TODO non utile
+ $sth = $self->dbh->prepare('delete from domain where login=?');
+ unless ( $sth->execute($login) ) {
+ $sth->finish();
+ return 0;
+ }
+ $sth->finish();
+
$sth = $self->dbh->prepare('delete from user where login=?');
unless ( $sth->execute($login) ) {
$sth->finish();
@@ -103,12 +84,6 @@ sub delete_user {
}
$sth->finish();
- $sth = $self->dbh->prepare('delete from domain where login=?');
- unless ( $sth->execute($login) ) {
- $sth->finish();
- return 0;
- }
- $sth->finish();
return 1;
}
@@ -130,9 +105,6 @@ sub get_user {
return 0;
}
- # get domains
- #push @domains, @$_[0] while($sth->fetchrow_arrayref);
-
while(my $ref2 = $sth->fetchrow_arrayref) {
push @domains, @$ref2[0];
}
@@ -151,11 +123,50 @@ sub get_user {
, dbh => $self->dbh
, domains => [@domains]);
}
+
$sth->finish();
- return 1, $user;
+ return (1, $user, @$ref[2]);
}
$sth->finish();
+ return 0;
+}
+
+sub get_domains {
+ my ($self, $login) = @_;
+ my ($sth, @domains);
+
+ $sth = $self->dbh->prepare('SELECT domain FROM domain where login=?');
+ unless ($sth->execute($login)) {
+ $sth->finish();
+ return (0, @domains);
+ }
+
+ while(my $ref = $sth->fetchrow_arrayref) {
+ push @domains, @$ref[0];
+ }
+
+ $sth->finish();
+
+ return (1, @domains);
+}
+
+sub get_all_domains {
+ my ($self) = @_;
+ my ($sth, $user, %domains);
+
+ $sth = $self->dbh->prepare('SELECT domain, login FROM domain');
+ unless ( $sth->execute()) {
+ $sth->finish();
+ undef;
+ }
+
+ while( my $ref = $sth->fetchrow_arrayref) {
+ $domains{@$ref[0]} = @$ref[1];
+ }
+
+ $sth->finish();
+ %domains;
}
1;
diff --git a/t/auth.pl b/t/auth.pl
new file mode 100755
index 0000000..8e1ac76
--- /dev/null
+++ b/t/auth.pl
@@ -0,0 +1,40 @@
+#!/usr/bin/perl -w
+use strict;
+use warnings;
+use v5.14;
+use autodie;
+use Modern::Perl;
+use DNS::ZoneParse;
+use Config::Simple;
+use Data::Dump qw( dump );
+
+use lib '../';
+use app::app;
+
+sub initco {
+
+ my $cfg = new Config::Simple('./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;
+}
+
+if( @ARGV < 2) {
+ say "usage : ./auth.pl login mdp";
+ exit 1;
+}
+
+my $app = initco();
+my ($auth_ok, $user, $isadmin) = $app->auth($ARGV[0], $ARGV[1]);
+
+say "auth $auth_ok";
+say "isadmin $isadmin";
diff --git a/t/config.ini b/t/config.ini
new file mode 100644
index 0000000..f4d9df0
--- /dev/null
+++ b/t/config.ini
@@ -0,0 +1,11 @@
+dbname = dnsmanager
+host = localhost
+# other options : see DBI module
+sgbd = mysql
+# default port for mysql
+port = 3306
+user = bla
+passwd = HardPass4bla
+# possible options for dnsserver : bind rndc
+dnsapp = rndc
+zones_path = "/srv/named/"
diff --git a/t/get_all_domains.pl b/t/get_all_domains.pl
new file mode 100755
index 0000000..c105189
--- /dev/null
+++ b/t/get_all_domains.pl
@@ -0,0 +1,52 @@
+#!/usr/bin/perl -w
+use strict;
+use warnings;
+use v5.14;
+use autodie;
+use Modern::Perl;
+use DNS::ZoneParse;
+use Config::Simple;
+use Data::Dump qw( dump );
+
+use lib '../';
+use app::app;
+
+sub initco {
+
+ my $cfg = new Config::Simple('./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;
+}
+
+if( @ARGV != 0 ) {
+ say "usage : ./get_all_domains.pl";
+ exit 1;
+}
+
+my $app = initco();
+
+my %domains = $app->get_all_domains();
+
+dump(%domains);
+
+#if( $domains ) {
+# if( scalar(@$domains) != 0) {
+# say join ", ", @{$domains};
+# }
+# else {
+# say "tableau vide";
+# }
+#}
+#else {
+# say "domains undef";
+#}
diff --git a/t/get_domains.pl b/t/get_domains.pl
new file mode 100755
index 0000000..6cec119
--- /dev/null
+++ b/t/get_domains.pl
@@ -0,0 +1,59 @@
+#!/usr/bin/perl -w
+use strict;
+use warnings;
+use v5.14;
+use autodie;
+use Modern::Perl;
+use DNS::ZoneParse;
+use Config::Simple;
+use Data::Dump qw( dump );
+
+use lib '../';
+use app::app;
+
+sub initco {
+
+ my $cfg = new Config::Simple('./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;
+}
+
+if( @ARGV < 2) {
+ say "usage : ./auth.pl login mdp";
+ exit 1;
+}
+
+my $app = initco();
+my ($auth_ok, $user, $isadmin) = $app->auth($ARGV[0], $ARGV[1]);
+
+if($auth_ok) {
+ say "auth $auth_ok";
+ say "isadmin $isadmin";
+}
+
+my ($success, $domains) = $app->get_domains( $ARGV[0] );
+
+say "success $success";
+dump($domains);
+
+#if( $domains ) {
+# if( scalar(@$domains) != 0) {
+# say join ", ", @{$domains};
+# }
+# else {
+# say "tableau vide";
+# }
+#}
+#else {
+# say "domains undef";
+#}
diff --git a/t/update_domains.pl b/t/update_domains.pl
new file mode 100755
index 0000000..e86b788
--- /dev/null
+++ b/t/update_domains.pl
@@ -0,0 +1,55 @@
+#!/usr/bin/perl -w
+use strict;
+use warnings;
+use v5.14;
+use autodie;
+use Modern::Perl;
+use DNS::ZoneParse;
+use Config::Simple;
+use Data::Dump qw( dump );
+
+use lib '../';
+use app::app;
+
+sub initco {
+
+ my $cfg = new Config::Simple('./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;
+}
+
+if( @ARGV < 2) {
+ say "usage : ./auth.pl login domain";
+ exit 1;
+}
+
+my $app = initco();
+my ($auth_ok, $user, $isadmin) = $app->auth($ARGV[0], $ARGV[1]);
+
+if($auth_ok) {
+ say "auth $auth_ok";
+ say "isadmin $isadmin";
+}
+else {
+ say "erreur connexion";
+ exit(0);
+}
+
+# TODO
+my $zone = $app->get_domain($ARGV[0], $ARGV[1]);
+
+say "origin : " . $zone->origin;
+
+my $zcontent = $zone->output() . "\nwww IN A 10.0.0.2";
+
+$app->update_domain_raw( $ARGV[0], $zcontent , $ARGV[1] );
diff --git a/www/conf/config.ini b/www/conf/config.ini
index 3772c75..d4fa265 100644
--- a/www/conf/config.ini
+++ b/www/conf/config.ini
@@ -15,4 +15,4 @@ passwd = HardPass4bla
# possible options for dnsserver : bind rndc
dnsapp = rndc
-zones_path = "/srv/named/"
+zones_path = "/etc/bind/named/"
diff --git a/www/lib/DNSManager.pm b/www/lib/DNSManager.pm
index ece6160..a3c3c23 100644
--- a/www/lib/DNSManager.pm
+++ b/www/lib/DNSManager.pm
@@ -41,12 +41,20 @@ get '/' => sub {
if( session('login') )
{
my $app = initco();
- $app->get_domains( session('login') );
- template index => {
- logged => true
- , login => session('login')
- , admin => session('admin')
- , domains => $app->get_domains(session('login')) };
+ my ($success, @domains) = $app->get_domains( session('login') );
+
+ if( $success ) {
+
+ template index => {
+ logged => true
+ , login => session('login')
+ , admin => session('admin')
+ , domains => [ @domains ] };
+ }
+ else {
+ session->destroy;
+ template 'index';
+ }
}
else
{
@@ -64,38 +72,36 @@ get '/home' => sub {
else
{
my $app = initco();
- my %domains = ();
- my %zone_properties = ();
- # my @d = @{$app->get_domains( session('login') )};
+ my ($success, @domains) = $app->get_domains( session('login') );
- if( session('creationSuccess') || session('creationFailure') )
- {
+ if( $success ) {
+
+ my (%zone_properties, %domains);
my $cs = session('creationSuccess');
- session 'creationSuccess' => '';
my $cf = session('creationFailure');
- session 'creationFailure' => '';
my $dn = session('domainName');
+
+ session 'creationSuccess' => '';
+ session 'creationFailure' => '';
session 'domainName' => '';
- template home =>
- { 'login' => session('login'),
- 'domains' => $app->get_domains(session('login')),
- 'zones_domains' => \%domains,
- 'zone_properties' => \%zone_properties,
- 'admin' => session('admin'),
- 'creationSuccess' => $cs,
- 'creationFailure' => $cf,
- 'domainName' => $dn };
+
+ template home => {
+ login => session('login')
+ , admin => session('admin')
+ , domains => [@domains]
+ , zones_domains => \%domains
+ , zone_properties => \%zone_properties
+ , creationSuccess => $cs
+ , creationFailure => $cf
+ , domainName => $dn };
+
}
- else
- {
- template home =>
- { 'login' => session('login'),
- 'domains' => $app->get_domains(session('login')),
- 'zones_domains' => \%domains,
- 'zone_properties' => \%zone_properties,
- 'admin' => session('admin') };
+ else {
+ session->destroy;
+ redirect '/ ';
}
+
}
};
@@ -162,14 +168,14 @@ prefix '/domain' => sub {
if( param('domain') =~ /^[a-zA-Z0-9]+[a-zA-Z0-9-]+[a-zA-Z0-9]+$|^[a-zA-Z0-9]+$/ )
{
- my $cfg = new Config::Simple(dirname(__FILE__).'/../conf/config.ini');
+ my $cfg = new Config::Simple(dirname(__FILE__).'/../conf/config.ini');
my $domain = param('domain').$cfg->param('tld');
# $domain =~ s/\.{2,}/\./g;
# say "domain after sed : $domain";
# create domain
- my $app = initco();
- # Add tld
- # create domain
+ my $app = initco();
+ # Add tld
+ # create domain
$app->add_domain( session('login'), $domain );
$creationSuccess = true;
@@ -194,7 +200,8 @@ prefix '/domain' => sub {
# TODO tests des droits
my $app = initco();
$app->delete_domain(session('login'), param('domain'));
- redirect '/home';
+
+ redirect request->referer;
};
@@ -202,15 +209,32 @@ prefix '/domain' => sub {
};
any ['get', 'post'] => '/admin' => sub {
+
unless( session('login') )
{
redirect '/';
}
else
{
- template administration => {
- login => session('login')
- , admin => session('admin') };
+ my $app = initco();
+ my ($auth_ok, $user, $isadmin) = $app->auth(session('login'),
+ session('password') );
+
+ unless ( $auth_ok && $isadmin ) {
+ redirect '/ ';
+ return;
+ }
+ else {
+
+ my %alldomains = $app->get_all_domains;
+ my ($success, @domains) = $app->get_domains( session('login') );
+
+ template administration => {
+ login => session('login')
+ , admin => session('admin')
+ , domains => [ @domains ]
+ , alldomains => { %alldomains } };
+ }
}
};
@@ -221,6 +245,21 @@ prefix '/user' => sub {
redirect '/';
};
+ 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;
+
+ };
+
post '/login' => sub {
# Check if user is already logged
@@ -233,6 +272,7 @@ prefix '/user' => sub {
my $app = initco();
my ($auth_ok, $user, $isadmin) = $app->auth(param('login'),
param('password') );
+
if( $auth_ok )
{
@@ -242,10 +282,16 @@ prefix '/user' => sub {
session user => freeze( $user );
session admin => $isadmin;
+ if( $isadmin ) {
+ redirect '/admin';
+ return;
+ }
+
}
else
{
# User login and/or password are incorrect
+ redirect '/';
}
}
}
diff --git a/www/views/administration.tt b/www/views/administration.tt
index 6e98d76..d57a138 100644
--- a/www/views/administration.tt
+++ b/www/views/administration.tt
@@ -2,16 +2,57 @@
Welcome <% login %> !
Déconnexion
+
+ Ma page
Page d'administration
Accueil
+
+
+ <% IF domains %>
+ Liens rapides :
+ <% FOREACH domain IN domains %>
+ <% domain %>
+ <% END %>
+ <% END %>
domaine | +utilisateur | +supprimer domaine | +supprimer utilisateur | +
---|---|---|---|
<% pair.key %> | +<% pair.value %> | + ++ sup. domaine + | + ++ sup. utilisateur + | + +