version bump TypeKey
[catagits/Catalyst-Authentication-Credential-HTTP-Proxy.git] / lib / Catalyst / Plugin / Authentication / Credential / TypeKey.pm
index 4e6ecd2..cb74ae5 100644 (file)
@@ -4,13 +4,13 @@ use strict;
 use warnings;
 
 use Authen::TypeKey;
-use Carp ();
 use File::Spec;
 use Catalyst::Utils ();
 use NEXT;
 use UNIVERSAL::require;
+use Scalar::Util ();
 
-our $VERSION = '0.1';
+our $VERSION = '0.3';
 
 sub setup {
     my $c = shift;
@@ -19,7 +19,7 @@ sub setup {
 
     $config->{typekey_object} ||= do {
         ( $config->{user_class} ||=
-          "Catalyst::Plugin::Authentication::User::Hash" )->require;
+              "Catalyst::Plugin::Authentication::User::Hash" )->require;
 
         $config->{key_cache} ||=
           File::Spec->catfile( Catalyst::Utils::class2tempdir( $c, 1 ),
@@ -27,7 +27,9 @@ sub setup {
 
         my $typekey = Authen::TypeKey->new;
 
-        for (grep { exists $config->{$_} } qw/expires key_cache key_url token version skip_expiry_check/) {
+        for ( grep { exists $config->{$_} }
+            qw/expires key_cache key_url token version skip_expiry_check/ )
+        {
             $typekey->$_( $config->{$_} );
         }
 
@@ -39,29 +41,44 @@ sub setup {
 
 sub authenticate_typekey {
     my ( $c, @p ) = @_;
-       my $p = @p ? { @p } : undef;
+
+    my ( $user, $p );
+    if ( @p == 1 ) {
+        if ( Scalar::Util::blessed( $p[0] ) ) {
+            $user = $p[0];
+            Catalyst::Exception->throw(
+                    "Attempted to authenticate user object, but "
+                  . "user doesnt't support 'typekey_credentials'" )
+              unless $user->supports(qw/typekey_credentials/);
+            $p = $user->typekey_credentials;
+        }
+        else {
+            $p = $p[0];
+        }
+    }
+    else {
+        $p = @p ? {@p} : undef;
+    }
 
     my $config = $c->config->{authentication}{typekey};
 
     my $typekey = $p && delete( $p->{typekey_object} )
       || $config->{typekey_object};
 
-       $p ||= $c->req;
-         
-    if ( my $res = $typekey->verify( $p ) ) {
+    $p ||= $c->req;
+
+    if ( my $res = $typekey->verify($p) ) {
         $c->log->debug("Successfully authenticated user '$res->{name}'.")
           if $c->debug;
 
-        my $user;
-
-        if ( my $store = $config->{auth_store} ) {
+        if ( !$user and my $store = $config->{auth_store} ) {
             $store = $c->get_auth_store($store) unless ref $store;
-            $user = $store->get_user( $p, $res );
+            $user = $store->get_user( $res->{name}, $p, $res );
         }
 
-               if ( !$user ) {
+        if ( !$user ) {
             my $user_class = $config->{user_class};
-            $user = $user_class->new( $res );
+            $user = $user_class->new($res);
         }
 
         $c->set_authenticated($user);
@@ -71,7 +88,9 @@ sub authenticate_typekey {
     else {
         $c->log->debug(
             sprintf "Failed to authenticate user '%s'. Reason: '%s'",
-            $p->{name} || $p->param("name"), $typekey->errstr )
+            $p->{name} || $p->param("name"),
+            $typekey->errstr
+          )
           if $c->debug;
 
         return;
@@ -121,25 +140,6 @@ for Catalyst.
                return 1;
        }
 
-=head1 TYPEKEY BROKED-NESS
-
-Please watch:
-
-       http://rt.cpan.org/NoAuth/Bugs.html?Dist=Authen-TypeKey
-
-I could only get this to properly work with TypeKey version 1 (not 1.1).
-
-To get around this problem configure the plugin to use version 1:
-
-       __PACKAGE__->config(
-               authentication => {
-                       typekey => {
-                               version => 1,
-                               token => ..., # doesn't really matter in version 1
-                       },
-               },
-       );
-
 =head1 DESCRIPTION
 
 This module integrates L<Authen::TypeKey> with
@@ -147,13 +147,13 @@ L<Catalyst::Plugin::Authentication>.
 
 =head1 METHODS
 
-=item authenticate_typekey %parameters
+=head3 authenticate_typekey %parameters
 
-=item authenticate_typekey
+=head3 authenticate_typekey
 
-=item EXTENDED METHODS
+=head3 EXTENDED METHODS
 
-=item setup
+=head3 setup
 
 Fills the config with defaults.
 
@@ -192,7 +192,7 @@ A store (or store name) to retrieve the user from.
 
 When a user is successfully authenticated it will call this:
 
-       $store->get_user( $parameters, $result_of_verify );
+       $store->get_user( $name, $parameters, $result_of_verify );
 
 Where C<$parameters> is a the hash reference passed to
 L<Authen::TypeKey/verify>, and C<$result_of_verify> is the value returned by