package Gantry::Control::C::Users; use strict; use Gantry qw/-TemplateEngine=TT/; use Gantry::Utils::Validate; use Gantry::Control; use Gantry::Control::Model::auth_users; use Gantry::Control::Model::auth_group_members; use Gantry::Utils::CRUDHelp qw( form_profile ); use Gantry::Plugins::CRUD; my $crud = Gantry::Plugins::CRUD->new( add_action => \&_add, edit_action => \&_edit, delete_action => \&_delete, form => \&_form, template => 'form.tt', text_descr => 'user', use_clean_dates => 1, ); our @ISA = ( 'Gantry' ); my $AUTH_USERS = 'Gantry::Control::Model::auth_users'; my $AUTH_GROUP_MEMBERS = 'Gantry::Control::Model::auth_group_members'; ############################################################ # Functions # ############################################################ #------------------------------------------------- # $self->do_main( $order ) #------------------------------------------------- sub do_main { my ( $self, $order ) = @_; $order ||= 2; my $order_map = { 1 => 'active', 2 => 'user_id', 3 => 'user_name', 4 => 'last_name, first_name', 5 => 'email' }; # stash template name and page title $self->stash->view->template( 'results.tt' ); $self->stash->view->title( 'Users' ); my $retval = { headings => [ 'Active', 'User ID', 'User Name', 'Name', 'E-mail' ], header_options => [ { text => 'Add', link => $self->location() . "/add", }, ], }; my @rows = $AUTH_USERS->retrieve_all( { 'order_by' => $order_map->{$order} } ); foreach my $row ( @rows ) { my $id = $row->id; push( @{$$retval{rows}}, { data => [ ( $row->active ? 'yes' : 'no' ), $row->user_id, $row->user_name, ( $row->last_name . ", " . $row->first_name ), $row->email ], options => [ { text => 'Edit', link => ( $self->location . "/edit/$id" ) }, { text => 'Delete', link => ( $self->location . "/delete/$id" ), }, ] } ); } # stash view data $self->stash->view->data( $retval ); } # end do_main #------------------------------------------------- # $self->do_add( $r ) #------------------------------------------------- sub do_add { my ( $self ) = ( shift ); $crud->add( $self ); } # end do_add sub _add { my( $self, $params, $data ) = @_; my %param = %{ $params }; $param{'crypt'} = encrypt( $param{passwd} ); my $new_row = $AUTH_USERS->create( \%param ); $new_row->dbi_commit; } # end do_add #------------------------------------------------- # $self->do_edit( $id ) #------------------------------------------------- sub do_edit { my ( $self, $id ) = @_; # Load row values my $user = $AUTH_USERS->retrieve( $id ); $crud->edit( $self, { user => $user } ); } # end do_edit #------------------------------------------------- # $self->_edit( $param, $data ) #------------------------------------------------- sub _edit { my( $self, $params, $data ) = @_; my %param = %{ $params }; $param{'crypt'} = encrypt( $param{passwd} ); my $user = $data->{user}; # Make update $user->set( %param ); $user->update; $user->dbi_commit; } # end do_edit #------------------------------------------------- # $self->do_delete( $id, $yes ) #------------------------------------------------- sub do_delete { my ( $self, $id, $yes ) = @_; # Load row values my $user = $AUTH_USERS->retrieve( $id ); $crud->delete( $self, $yes, { user => $user } ); } # end do_delete #------------------------------------------------- # $self->_delete( $data ) #------------------------------------------------- sub _delete { my( $self, $data ) = @_; my $user = $data->{user}; my @mems = $AUTH_GROUP_MEMBERS->search( user_id => $user->user_id ); foreach ( @mems ) { $_->delete; } $AUTH_GROUP_MEMBERS->dbi_commit; $user->delete; $AUTH_USERS->dbi_commit(); } # end delete_page #------------------------------------------------- # _form( $row ? ) #------------------------------------------------- sub _form { my ( $self, $data ) = @_; my $row = $data->{user}; my ( @available_ids, %existing_ids ); my @users = $AUTH_USERS->retrieve_all(); foreach ( @users ) { ++$existing_ids{ $_->user_id }; } for ( my $i = 1; $i < 300; ++$i ) { push( @available_ids, { label => $i, value => $i } ) unless defined $existing_ids{ $i }; } my @fields; push( @fields, { name => 'user_id', is => 'int4', label => 'User ID', type => 'select', options => \@available_ids, } ) if $self->path_info =~ /add/i; push( @fields, { name => 'active', label => 'Active', type => 'select', is => 'boolean', options => [ { label => 'Yes', value => 't' }, { label => 'No', value => 'f' }, ], }, { name => 'user_name', label => 'User Name', type => 'text', is => 'varchar', }, { name => 'passwd', label => 'Password', is => 'varchar', type => 'password', }, { name => 'first_name', label => 'First Name', is => 'varchar', type => 'text', }, { name => 'last_name', label => 'Last Name', is => 'varchar', type => 'text', }, { optional => 1, name => 'email', is => 'varchar', label => 'E-mail', type => 'text', } ); my $form = { legend => $self->path_info =~ /edit/i ? 'Edit' : 'Add', width => 400, row => $row, fields => \@fields }; return( $form ); } # end _form sub site_links { my $self = shift; return( [ { link => ($self->app_rootp . '/users'), label => 'Users' }, { link => ($self->app_rootp . '/groups'), label => 'Groups' }, { link => ($self->app_rootp . '/pages'), label => 'Pages' }, ] ); } # EOF 1; __END__ =head1 NAME Gantry::Control::C::Users - User Management =head1 SYNOPSIS use Gantry::Control::C::Users; =head1 DESCRIPTION This Handler manages users in the database to facilitate the use of that information for authentication, autorization, and use in applications. This replaces the use of htpasswd for user management and puts more information at the finger tips of the application. =head1 APACHE SetHandler perl-script PerlSetVar title "User Management: " PerlSetVar dbconn "dbi:Pg:dbname=..." PerlSetVar dbuser "" PerlSetVar dbpass "" PerlSetVar dbcommit off PerlHandler Gantry::Control::C::Users =head1 DATABASE This is the auth_users table that is used by this module. It is also used by the Authentication modules to verify usernames and passwords. The passwords are ecrypted by the crypt(3) function in perl. create table "auth_users" ( "id" int4 default nextval('auth_users_seq') NOT NULL, "user_id" int4, "active" bool, "user_name" varchar, "passwd" varchar, "crypt" varchar, "first_name" varchar, "last_name" varchar, "email" varchar ); =head1 METHODS Most of the methods are mapped to urls. =over 4 =item do_add =item do_delete =item do_edit =item do_main =item redirect_to_main Decides where to go after a button press. =back One method is provided for templates to call. =over 4 =item site_links Provides the site nav links for use at the top and/or bottom of the page. =back =head1 SEE ALSO Gantry::Control(3), Gantry(3) =head1 LIMITATIONS The passwords for users are enrypted so they can not be seen at all. In some situations this could be a very big problem. =head1 AUTHOR Tim Keefer =head1 COPYRIGHT Copyright (c) 2005-6, Tim Keefer. This library is free software; you can redistribute it and/or modify it under the same terms as Perl itself, either Perl version 5.8.6 or, at your option, any later version of Perl 5 you may have available. =cut