package Catalyst::Controller::reCAPTCHA; use strict; use warnings; use base 'Catalyst::Controller'; use Captcha::reCAPTCHA; use Carp 'croak'; our $VERSION = '0.4'; sub captcha_get : Private { my ($self, $c) = @_; my $cap = Captcha::reCAPTCHA->new; $c->stash->{recaptcha} = $cap->get_html($c->config->{recaptcha}->{pub_key}); return; } sub captcha_check : Private { my ($self, $c) = @_; my $cap = Captcha::reCAPTCHA->new; my $challenge = $c->req->param('recaptcha_challenge_field'); my $response = $c->req->param('recaptcha_response_field'); unless ( $response && $challenge ) { $c->stash->{recaptcha_error} = 'User appears not to have submitted a recaptcha'; return; } my $key = $c->config->{recaptcha}->{priv_key} || croak 'must set recaptcha priv_key in config'; my $result = $cap->check_answer( $key, $c->req->address, $challenge, $response, ); croak 'Failed to get valid result from reCaptcha' unless ref $result eq 'HASH' && exists $result->{is_valid}; $c->stash->{recaptcha_error} = $result->{error} || 'Unknown error' unless $result->{is_valid}; $c->stash->{recaptcha_ok} = 1 if $result->{is_valid}; return ($result->{is_valid} == $result->{is_valid}); } =head1 NAME Catalyst::Controller::reCAPTCHA - authenticate people and read books! =head1 SUMMARY Catalyst::Controller wrapper around L. Provides a number of C methods that deal with the recaptcha. =head2 CONFIGURATION In MyApp.pm (or equivalent in config file): __PACKAGE__->config->{recaptcha}->{pub_key} = '6LcsbAAAAAAAAPDSlBaVGXjMo1kJHwUiHzO2TDze'; __PACKAGE__->config->{recaptcha}->{priv_key} = '6LcsbAAAAAAAANQQGqwsnkrTd7QTGRBKQQZwBH-L'; (the two keys above work for http://localhost unless someone hammers the reCAPTCHA server with failures, in which case the API keys get a temporary ban). =head2 METHOD captcha_get : Private Sets $c->stash->{recaptcha} to be the html form for the L reCAPTCHA service which can be included in your HTML form. =head2 METHOD captcha_check : Private Validates the reCaptcha using L. sets $c->stash->{recaptcha_ok} which will be 1 on success. The action also returns true if there is success. This means you can do: if ( $c->forward(captcha_check) ) { # do something based on the reCAPTCHA passing } or alternatively: if ( $c->stash->{recaptcha_ok} ) { # do something based on the reCAPTCHA passing } If there's an error, $c->stash->{recaptcha_error} is set with the error string provided by L. =head2 EXAMPLES See the t/lib/TestApp example in the L distribution. =head1 SEE ALSO L, L, L. =head1 AUTHOR and Copyright Kieren Diment L. =head1 LICENCE This library is free software, you can redistribute it and/or modify it under the same terms as Perl itself. =cut 1;