The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
use warnings;
use strict;

=head1 NAME

Jifty::Plugin::AuthCASOnly::Action::CASLogin

=cut

package Jifty::Plugin::AuthCASOnly::Action::CASLogin;
use base qw/Jifty::Action Jifty::Plugin::AuthCASOnly/;
#use AuthCAS;


=head2 arguments

Return the ticket form field

=cut

sub arguments {
    return (
        {
            ticket => {
                label          => 'cas ticket',
           #     mandatory      => 1,
                ajax_validates => 1,
            },

        }
    );

}

=head2 validate_ticket ST

for ajax_validates
Makes sure that the ticket submitted is legal.


=cut

sub validate_ticket {
    my $self  = shift;
    my $ticket = shift;

    unless ( $ticket && $ticket !~ /^[A-Za-z0-9-]+$/ ) {
        return $self->validation_error(
            ticket => _("That doesn't look like a valid ticket.") );
    }


    return $self->validation_ok('ticket');
}


=head2 take_action

Actually check the user's password. If it's right, log them in.
Otherwise, throw an error.


=cut

sub take_action {
    my $self = shift;
    my $ticket = $self->argument_value('ticket');

    my $service_url = ($ENV{SERVER_PORT} == 443)?'https://':'http://'.
    	$ENV{HTTP_HOST}.'/caslogin';

    if (! $ticket) {
        my $login_url = $self->CAS->getServerLoginURL($service_url);
        Jifty->web->_redirect($login_url);
        return 1;
      }
      
    my $username = $self->CAS->validateST($service_url,$ticket);
    my $error = &AuthCAS::get_errors();
    if ($error) {
      Jifty->log->info("CAS error: $ticket $username : $error");
      return;
    }
      
    my $CASUser = $self->AuthCASUserClass();
    my $CurrentUser = $self->CurrentCASUserClass();
    my $u = $CASUser->new( current_user => $CurrentUser->superuser );

    $u->load_by_cols( name => $username);
    my $id = $u->id;
    if (!$id) { 
   	($id) = $u->create(name => $username, created_on => DateTime->now); 
	}
    Jifty->log->debug("Login user id: $id"); 

    # Actually do the signin thing.
     Jifty->web->current_user( $CurrentUser->new( id => $u->id ) );

    return 1;
}

1;