Tag the old version before converting to the new auth. Convert to new auth, add live...
[catagits/Catalyst-Authentication-Store-Htpasswd.git] / lib / Catalyst / Authentication / Store / Htpasswd.pm
diff --git a/lib/Catalyst/Authentication/Store/Htpasswd.pm b/lib/Catalyst/Authentication/Store/Htpasswd.pm
new file mode 100644 (file)
index 0000000..0ad445f
--- /dev/null
@@ -0,0 +1,140 @@
+#!/usr/bin/perl
+
+package Catalyst::Authentication::Store::Htpasswd;
+use base qw/Class::Accessor::Fast/;
+use strict;
+use warnings;
+
+use Authen::Htpasswd;
+use Catalyst::Authentication::Store::Htpasswd::User;
+use Scalar::Util qw/blessed/;
+
+our $VERSION = '0.03';
+
+BEGIN { __PACKAGE__->mk_accessors(qw/file/) }
+
+sub new {
+    my ($class, $config, $app, $realm) = @_;
+    
+    my $file = delete $config->{file};
+    unless (ref $file) { # FIXME - file not in app..
+        my $filename = $app->path_to($file)->stringify;
+        die("Cannot find htpasswd file: $filename\n") unless (-r $filename);
+        $file = Authen::Htpasswd->new($filename);
+    }
+    $config->{file} = $file;
+    
+    bless { %$config }, $class;
+}
+
+sub find_user {
+    my ($self, $authinfo, $c) = @_;
+    # FIXME - change username
+    my $htpasswd_user = $self->file->lookup_user($authinfo->{username});
+    Catalyst::Authentication::Store::Htpasswd::User->new( $self, $htpasswd_user );
+}
+
+sub user_supports {
+    my $self = shift;
+
+    # this can work as a class method
+    Catalyst::Authentication::Store::Htpasswd::User->supports(@_);
+}
+
+sub from_session {
+       my ( $self, $c, $id ) = @_;
+       $self->find_user( { username => $id } );
+}
+
+1;
+
+__END__
+
+=pod
+
+=head1 NAME
+
+Catalyst::Authentication::Store::Htpasswd - L<Authen::Htpasswd> based
+user storage/authentication.
+
+=head1 SYNOPSIS
+
+    use Catalyst qw/
+      Authentication
+    /;
+
+    __PACKAGE__->config(
+        authentication => {
+            default_realm => 'test',
+            realms => {
+                test => {
+                    credential => {
+                        class          => 'Password',
+                        password_field => 'password',
+                        password_type  => 'self_check',
+                    },
+                    store => {
+                        class => 'Htpasswd',
+                        file => 'htpasswd',
+                    },
+                },
+            },
+        },   
+    );
+
+    sub login : Global {
+        my ( $self, $c ) = @_;
+
+        $c->authenticate({ username => $c->req->param("login"), password => $c->req->param("password") });
+    }
+
+=head1 DESCRIPTION
+
+This plugin uses C<Authen::Htpasswd> to let your application use C<.htpasswd>
+files for it's authentication storage.
+
+=head1 METHODS
+
+=head2 new
+
+Simple constructor, dies if the htpassword file can't be found
+
+=head2 find_user
+
+Looks up the user, and returns a Catalyst::Authentication::Store::Htpasswd::User object.
+
+=head2 user_supports
+
+Delegates to L<Catalyst::Authentication::Store::Htpasswd::User->user_supports|Catalyst::Authentication::Store::Htpasswd::User#user_supports>
+
+=head2 from_session
+
+Delegates the user lookup to C< find_user >
+
+=head1 CONFIGURATION
+
+=head2 file
+
+The path to the htpasswd file, this is taken from the application root.
+
+=head1 AUTHORS
+
+Yuval Kogman C<nothingmuch@woobling.org>
+
+David Kamholz C<dkamholz@cpan.org>
+
+Tomas Doran C<bobtfish@bobtfish.net>
+
+=head1 SEE ALSO
+
+L<Authen::Htpasswd>.
+
+=head1 COPYRIGHT & LICENSE
+
+       Copyright (c) 2005-2008 the aforementioned authors. All rights
+       reserved. This program is free software; you can redistribute
+       it and/or modify it under the same terms as Perl itself.
+
+=cut
+
+