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::AuthLDAPOnly::Action::LDAPLogin

=cut

package Jifty::Plugin::AuthLDAPOnly::Action::LDAPLogin;
use base qw/Jifty::Action Jifty::Plugin::AuthLDAPOnly/;


=head2 arguments

Return the ticket form field

=cut

sub arguments {
    return (
        {
            name => {
                label          => _('Login'),
                mandatory      => 1,
                ajax_validates => 1,
            },

            password => {
                type      => 'password',
                label     => _('Password'),
                mandatory => 1
            },

        }
    );

}

=head2 validate_name NAME

For ajax_validates.
Makes sure that the name submitted is a legal login.


=cut

sub validate_name {
    my $self  = shift;
    my $name = shift;

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


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


=head2 take_action

Bind on ldap to check the user's password. If it's right, log them in.
Otherwise, throw an error.


=cut

sub take_action {
    my $self = shift;
    my $dn = $self->uid().'='.$self->argument_value('name').','.
        $self->base();

    # Bind on ldap
    my $msg = $self->LDAP()->bind($dn ,'password' =>$self->argument_value('password'));
    
    unless (not $msg->code) {
        $self->result->error(
     _('You may have mistyped your login or password. Give it another shot?')
        );
        return;
    }

    my $LDAPUser = $self->AuthLDAPUserClass();
    my $CurrentUser = $self->CurrentLDAPUserClass();
    my $u = $LDAPUser->new( current_user => $CurrentUser->superuser );

    # Add user to LDAPUser model
    $u->load_by_cols( name => $self->argument_value('name'));
    my $id = $u->id;
    if (!$id) { 
   	($id) = $u->create(name => $self->argument_value('name'), 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;