LIMS-Controller

 view release on metacpan or  search on metacpan

lib/LIMS/Controller.pm  view on Meta::CPAN

		$self->print_footer;
		$self->disconnect_dbh;
		$self->close_log;
	}
	### login/session methods ###
	
	sub check_login {
		my $self = shift;
		my $q = $self->get_cgi;
		if (my $db_user_name = $q->param('user_name')){
			if (my $db_user_pass = $q->param('password')){
				$self->check_user_pass;
			} elsif (my $personnel_id = $q->param('personnel_id')){
				$self->check_session;
			} else {
				$self->db_error('No password was entered');
			}
		} else {
			$self->db_error('No user name was entered');
		}
		if ($self->db_error){
			$self->print_errors;
			$self->print_footer;
			return undef;	# bad login
		} else {
			return 1;	# login OK
		}
	}
	sub check_session {
		my $self = shift;
		my $epoch_time = Date::EzDate->new()->{'epoch second'};
		my $sess_start_secs;
		my $session_length = $self->session_length;
		# get session information from db
		if (my $user_session = $self->get_user_session) {
			# check time since last session activity
	  		$sess_start_secs = Date::EzDate->new( $self->session_time )->{'epoch second'};
			my $session_duration = $epoch_time - $sess_start_secs;  			
			if ( $session_duration > $session_length ) {
				$self->db_error('session timed out');
			}
			#Êcheck the user's ip address matches that in the db
			if ( $self->session_ip ne $self->current_ip ) {
				$self->db_error('ip error');
			}	
		} else {
			$self->db_error('session closed');
		}
		# so long as there aren't any errors, update the session to NOW()
		unless( $self->db_error ){
			# compare session time in db with that from cgi
			if (( $sess_start_secs > Date::EzDate->new( $self->current_sess_time )->{'epoch second'}) &&
				( $self->back_sensitive)) {	# is an 'old' session
					$self->standard_error("Data from this page has already been entered into the database.","Please don't use the browser's 'back' button after submitting a form");
					$self->kill_pipeline;
			} else {
				$self->update_session;
			}
		}
	}
	sub update_session {
		my $self = shift;
		$self->alter_session_id(1);
	}
	sub close_session {
    	my $self = shift;		
    	$self->alter_session_id(0);
	}
	sub log_out {
		my $self = shift;
		$self->close_session;
		my $q = $self->get_cgi;
		$q->delete_all();
		$q->param(-name=>'logout',-value=>1);
	}
	sub alter_session_id {
   		my $self = shift;
   		if (@_) {
		   	my $state = shift;
	     	my $date = Date::EzDate->new();
	     	my $mysql_time = $date->{'{year}/{%m}/{%d} %T'};	# unix style %Y actually returns 2-digit year
		   	my $ip_address = $self->current_ip;
		   	my $usr_info_obj = $self->get_user_info;
	     	my $session_id = ($state) ? $ip_address.",".$mysql_time : '';
	     	$usr_info_obj->session_id($session_id);
			$usr_info_obj->update();
			$usr_info_obj->dbi_commit;
			$self->session_id($usr_info_obj->session_id); 
	 	}
  	}
	sub current_ip {
	    my $self = shift;
	    if(defined $ENV{'HTTP_PC_REMOTE_ADDR'}){	# is mac os x server
	    	return $ENV{'HTTP_PC_REMOTE_ADDR'};
	    } else {	# use standard cgi remote host call
	    	my $q = $self->get_cgi;
	    	return $q->remote_host();
	    }
	}
	sub system_ip {
		use Net::Address::IPv4::Local;
		my $ip = Net::Address::IPv4::Local->public;
		return $ip;
	}
	sub current_sess_time {	# from cgi
		my $self = shift;
      	$self->session_arry($self->session_id,1);
	} 
	sub session_ip {	# from db
      	my $self = shift;
      	$self->session_arry($self->get_user_session,0);
  	}
	sub session_id {
		my $self = shift;
		my $q = $self->get_cgi;
		if (@_) {
			$q->param('session_id',shift);
		} else {
			$q->param('session_id');
		}
	}



( run in 0.558 second using v1.01-cache-2.11-cpan-39bf76dae61 )