Auth-Kokolores

 view release on metacpan or  search on metacpan

lib/Auth/Kokolores/Plugin/FileRetrieve.pm  view on Meta::CPAN

package Auth::Kokolores::Plugin::FileRetrieve;

use Moose;
use DBI;

# ABSTRACT: kokolores plugin for retrieving users from a file
our $VERSION = '1.01'; # VERSION

extends 'Auth::Kokolores::Plugin';


has 'seperator' => ( is => 'ro', isa => 'Str', default => '\s+' );
has sep_regex => (
  is => 'ro', isa => 'RegexpRef', lazy => 1,
  default => sub {
    my $self = shift;
    my $str = $self->seperator;
    my $regex = eval { qr/$str/ };
    if( $@ ) { die("invalid regex in seperator: $@") }
    return $regex;
  },
);

has 'fields' => ( is => 'ro', isa => 'Str', default => 'username,password');
has '_fields' => (
  is => 'ro', isa => 'ArrayRef[Str]', lazy => 1,
  default => sub { [ split(/\s*,\s*/, shift->fields ) ] },
  traits => [ 'Array' ],
  handles => { 
    'num_fields' => 'count',
  }
);

has 'file' => ( is => 'ro', isa => 'Str', required => 1 );

has 'fh' => (
  is => 'ro', isa => 'IO::File', lazy => 1,
  default => sub {
    my $self = shift;
    my $fh = IO::File->new( $self->file, 'r',);
    if( ! defined $fh ) {
      die("could not open user file: $!");
    }
    return $fh;
  },
);

has 'comments' => ( is => 'ro', isa => 'Bool', default => 0 );

sub parse_line {
  my ( $self, $line, $ln ) = @_;
  my $data = {};
  if( $self->comments && $line =~ /^\s*#/ ) {
    return;
  }
  $line =~ s/[\r\n]*$//;
  my $sep = $self->sep_regex;
  my @values = split( $sep, $line );
  if( scalar @values < $self->num_fields ) {
    $self->server->log(2, "insufficient fields on line $ln");
    return;
  }
  foreach my $fieldname ( @{$self->_fields} ) {
    $data->{$fieldname} = shift( @values );
  }
  return $data;
}

has 'username_field' => ( is => 'rw', isa => 'Str', default => 'username' );

sub lookup_user {
  my ( $self, $key ) = @_;
  my $username_field = $self->username_field;
  my $ln = 0;
  $self->fh->setpos(0);
  while( my $line = $self->fh->getline ) {
    $ln++;
    my $user = $self->parse_line( $line, $ln );
    if( defined $user->{$username_field}
        && $user->{$username_field} eq $key) {
      $self->log(4, "found user on line $ln" );
      return $user;
    }
  }
  return;
}



( run in 0.538 second using v1.01-cache-2.11-cpan-5511b514fd6 )