package IdPAccountManager::TestAccount; ## Copyright (c) GEANT ## This software was developed by RENATER. The research leading to these results has received funding ## from the European Community¹s Seventh Framework Programme (FP7/2007-2013) under grant agreement nº 238875 (GÉANT). use strict; use IdPAccountManager::Data::Testaccount; use IdPAccountManager::Data::Testaccount::Manager; use IdPAccountManager::Tools; use Conf; require Exporter; my @ISA = qw(Exporter); my @EXPORT = qw(); use Carp; INIT { ## Set error mode to non fatal IdPAccountManager::Data::Testaccount::Manager->error_mode('return'); } sub new { my ($pkg) = shift; my %args = @_; my $self = {}; ## Bless Provider object bless $self, $pkg; ## Object may be created either with a hashref as argument or an IdPAccountManager::Data::Testaccount object ## Second case is usefull when fetching a set of IdPAccountManager::Data::Testaccount via IdPAccountManager::Data::Testaccount::Manager if (ref($_[0]) eq 'IdPAccountManager::Data::Testaccount') { $self->{'persistent'} = $_[0]; }else { $self->{'persistent'} = IdPAccountManager::Data::Testaccount->new(%args); } return $self; } sub get { my $self = shift; my $attribute_name = shift; ## User password is not stored in DB if ($attribute_name eq 'user_password') { return $self->{$attribute_name}; }else { return $self->{'persistent'}->$attribute_name; } } sub save { my $self = shift; ## If no id is defined, it is a new account unless (defined $self->{'persistent'}->id) { $self->{'persistent'}->creation_date(time); $self->{'persistent'}->expiration_date(time + ($Conf::global{'accounts_validity_period'} * 3600 * 24)); $self->{'user_password'} = &IdPAccountManager::Tools::generate_password(); $self->{'persistent'}->user_password_hash(&IdPAccountManager::Tools::sha256_hash($self->{'user_password'})); } unless ($self->{'persistent'}->save()) { IdPAccountManager::Tools::do_log('error', "Failed to save Test Account in DB"); return undef; } } ## Delete a test account sub delete { my $self = shift; unless ($self->{'persistent'}->delete()) { IdPAccountManager::Tools::do_log('error', "Failed to delete a test account in DB"); return undef; } } ## Print the content of a test account sub print { my $self = shift; my $fd = shift || \*STDOUT; printf $fd "Account ID=%s; password_hash=%s; sp_entityid=%s; account_profile=%s; creation_date=%s; expiration_date=%s\n", $self->get('id'), $self->get('user_password_hash'), $self->get('sp_entityid'), $self->get('account_profile'), &POSIX::strftime('%Y:%m:%d', localtime($self->get('creation_date'))), &POSIX::strftime('%Y:%m:%d', localtime($self->get('expiration_date'))); return 1. } ## list all test accounts ## Class method sub list_test_accounts { my %args = @_; my $persistent_accounts= IdPAccountManager::Data::Testaccount::Manager->get_testaccounts(%args); my $accounts; foreach my $persistent_account (@{$persistent_accounts}) { my $account = new IdPAccountManager::TestAccount($persistent_account); push @$accounts, $account; } return $accounts; } ## create test accounts for all active account profiles sub create_test_accounts_for_sp { my %args = @_; my @test_accounts; unless ($args{'sp_entityid'}) { IdPAccountManager::Tools::do_log('error',"Failed to create test account"); return undef; } foreach my $profile (@{$Conf::global{'account_profiles'}}) { my $test_account = new IdPAccountManager::TestAccount(account_profile => $profile, sp_entityid => $args{'sp_entityid'}); unless (defined $test_account) { IdPAccountManager::Tools::do_log('error',"Failed to create test account"); return undef; } unless ($test_account->save()) { IdPAccountManager::Tools::do_log('error',"Failed to create test account"); return undef; } push @test_accounts, $test_account; } return @test_accounts; } #before 'new' => sub { print "about to call new\n"; }; 1; # Magic true value required at end of module __END__ =head1 NAME IdPAccountManager::TestAccount - Manage test user accounts for the Test Identity Provider =head1 SYNOPSIS my $test_account = new IdPAccountManager::TestAccount(account_profile => 'student1', sp_entityid => 'https://test.federation.renater.fr/test/ressource'); unless (defined $test_account) { die "Failed to create test account"; } unless ($test_account->save()) { die "Failed to create test account"; } printf "Account created:\n\tuserid: user%d\n\tpassword: %s\n", $test_account->get('id'), $test_account->get('user_password'); =head1 DESCRIPTION The Test Account manager instanciates test accounts associated to a SAML Identity Provider. This module allows to manage the test accounts. =head1 SUBROUTINES/METHODS =over 8 =item C<new ARGS> Class method. Create a new IdPAccountManager::TestAccount object. Example: my $test_account = new IdPAccountManager::TestAccount(account_profile => 'student1', sp_entityid => 'https://test.federation.renater.fr/test/ressource'); Supported arguments include: =over 12 =item C<account_profile> ID of the account profile to be used. =item C<sp_entityid> EntityID (SAML ID) of the Service Provider associated to the test account. =back =item C<create_test_accounts_for_sp ARGS> Class method. Create test accounts for supported account profiles. Supported arguments include: =over 12 =item C<sp_entityid> EntityID (SAML ID) of the Service Provider associated to the test account. =back =item C<delete> Deletes the test account in the database. =item C<get> ATTR_NAME Returns the value of the specified ATTR_NAME attribute of the test account. =item C<list_test_accounts ARGS> Class method. List all test accounts in database. Supported arguments include: =over 12 =item C<sp_entityid> Entityid of a SAML Service Provider to list only test accounts linked to this Service Provider. =item C<account_profile> Test account profile to list only test accounts linked based on this profile. =back =item C<print FD> Dumps the content of the test account to the specified FD file handler (default to STDOUT) =item C<save> Save the test account in the database. =back =head1 AUTHOR Olivier Salaün (olivier.salaun@renater.fr) =head1 LICENSE Copyright (c) GEANT This software was developed by RENATER. The research leading to these results has received funding from the European Community¹s Seventh Framework Programme (FP7/2007-2013) under grant agreement nº 238875 (GÉANT).