From 9c3765fdb2f86487ded8192a4cb6df449627190d Mon Sep 17 00:00:00 2001 From: Philippe Pittoli Date: Wed, 22 Jan 2014 17:01:34 +0100 Subject: [PATCH] page d'admin, suppression utilisateur, quelques tests en plus --- app/app.pm | 36 +++++++---- app/bdd/management.pm | 105 +++++++++++++++++-------------- t/auth.pl | 40 ++++++++++++ t/config.ini | 11 ++++ t/get_all_domains.pl | 52 +++++++++++++++ t/get_domains.pl | 59 +++++++++++++++++ t/update_domains.pl | 55 ++++++++++++++++ www/conf/config.ini | 2 +- www/lib/DNSManager.pm | 122 +++++++++++++++++++++++++----------- www/views/administration.tt | 41 ++++++++++++ www/views/index.tt | 5 +- 11 files changed, 427 insertions(+), 101 deletions(-) create mode 100755 t/auth.pl create mode 100644 t/config.ini create mode 100755 t/get_all_domains.pl create mode 100755 t/get_domains.pl create mode 100755 t/update_domains.pl 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 %>

Bienvenue sur la page d'administration

+ +
+

Les sites en attente

+ + + + + + + + + + <% FOREACH pair IN alldomains.pairs %> + + + + + + + + + + <%END%> +
domaineutilisateursupprimer domainesupprimer utilisateur
<% pair.key %><% pair.value %> + sup. domaine + + sup. utilisateur +
+ +
+
diff --git a/www/views/index.tt b/www/views/index.tt index ed323ad..fc6eaba 100644 --- a/www/views/index.tt +++ b/www/views/index.tt @@ -7,7 +7,8 @@ Déconnexion
- Votre page de configuration
+ Ma page
+ <% IF admin == 1 %> Page d'administration
@@ -16,7 +17,7 @@ <% IF domains %> Liens rapides :
<% FOREACH domain IN domains %> - <% domain %>
+ <% domain %>
<% END %> <% END %>