package HTML::FormHandler::Field::Captcha; # ABSTRACT: captcha field with GD::SecurityImage $HTML::FormHandler::Field::Captcha::VERSION = '0.40068'; use Moose; extends 'HTML::FormHandler::Field'; use HTTP::Date; has 'height' => ( isa => 'Int', is => 'rw', default => '20' ); has 'width' => ( isa => 'Int', is => 'rw', default => '80' ); has 'scramble' => ( isa => 'Int', is => 'rw', default => '0' ); has 'lines' => ( isa => 'Int', is => 'rw', default => '2' ); has 'gd_font' => ( isa => 'Str', is => 'rw', default => 'Large' ); has 'image' => ( is => 'rw' ); has '+wrapper_class' => ( default => 'captcha' ); has '+widget' => ( default => 'Captcha' ); has '+noupdate' => ( default => 1 ); our $class_messages = { 'captcha_verify_failed' => 'Verification incorrect. Try again.', }; sub get_class_messages { my $self = shift; return { %{ $self->next::method }, %$class_messages, } } sub get_default_value { my $self = shift; my $captcha = $self->form->get_captcha; # setting the widget after the field is instantiated # doesn't actually work. The Captcha widget checks for # this setting though. if ($captcha) { if ( $captcha->{validated} ) { $self->required(0); $self->widget('NoRender'); } else { $self->required(1); $self->widget('Captcha'); $self->image( $captcha->{image} ); } } else { $self->required(1); $self->widget('Captcha'); $self->gen_captcha; } return; } sub validate { my $self = shift; my $captcha = $self->form->get_captcha; unless ( $captcha->{rnd} eq $self->value ) { $self->add_error($self->get_message('captcha_verify_failed')); $self->gen_captcha; } else { $captcha->{validated} = 1; } return !$self->has_errors; } sub fif { } sub gen_captcha { my $self = shift; require GD::SecurityImage; my ( $image, $type, $rnd ) = GD::SecurityImage->new( height => $self->height, width => $self->width, scramble => $self->scramble, lines => $self->lines, gd_font => $self->gd_font, )->random->create->out; my $captcha = { image => $image, type => $type, rnd => $rnd, validated => 0, }; $self->image($image); $self->form->set_captcha($captcha); } __PACKAGE__->meta->make_immutable; use namespace::autoclean; 1; __END__ =pod =encoding UTF-8 =head1 NAME HTML::FormHandler::Field::Captcha - captcha field with GD::SecurityImage =head1 VERSION version 0.40068 =head1 SYNOPSIS A Captcha class using GD::SecurityImage. Requires that three methods be available from a form object: $self->form->get_captcha; $self->form->set_captcha; Using Catalyst and the Catalyst session plugin this field can be used in a form by using L. package MyApp::Form::Post; use HTML::FormHandler::Moose; with 'HTML::FormHandler::TraitFor::Captcha'; You can set the following attributes on the 'captcha' field: height, width, scramble, lines, gd_font Example: has 'captcha' => ( height => '24', width => '70' ); =head1 AUTHOR FormHandler Contributors - see HTML::FormHandler =head1 COPYRIGHT AND LICENSE This software is copyright (c) 2017 by Gerda Shank. This is free software; you can redistribute it and/or modify it under the same terms as the Perl 5 programming language system itself. =cut