Marcus Ramberg wrote:
Anyone implemented any form of Captcha support in HTML-FormFu?


Yes, and in testing appears to work well. As Carl mentions the image is rendered as an image block and the form processing checks to see that the captch block has been entered correctly.

The captcha sub creates the images and stores the expected text in the session for later processing by do_newsletter. It does mean that multiple screens of information are not supported as the captcha session info would be overridden, for the feedback forms I'm creating this is not considered an issue.

Enjoy,
Alan

sub captcha : Local {
  my ($self, $c) = @_;

  # Create a normal image
  my $your_random_str = 'random-string';
  my $image = GD::SecurityImage->new(
     width     => 300,
     height    => 70,
     lines     => 12,
     thickness => 4,
     ptsize    => 22,
     bgcolor   => '#7cc4c4',
     scramble  => 1,
     font      => '/usr/local/share/fonts/SQR721B.ttf',
     );
  $image->random($your_random_str);
  $image->create('ttf', 'ellipse', '#ffffff', '#b4ddc7');
  $image->particle;
  my($image_data, $mime_type, $random_number) = $image->out;
  $c->session->{captcha_string} = $random_number;
  $c->res->content_type('image/'.$mime_type);
  $c->res->body($image_data)
}

sub do_newsletter : Local : Form() {
  my ($self, $c) = @_;

  if ($c->req->param()) {
    my $form = $c->stash->{form};
    $form->load_config_file('feedback/newsletter.yaml');

my $captcha = $form->get_constraint({name => 'captcha', type => 'Range'});
    if ($c->session->{captcha_string}){
      $captcha->min($c->session->{captcha_string});
      $captcha->max($c->session->{captcha_string});
    }else{
      my $param_captcha = $c->req->param('captcha') || 'null';
$c->log->debug('There is no session captcha_string to match '.$param_captcha);
      $captcha->min(5);
      $captcha->max(4);
    }

    $form->process($c->req->params);

    if ($form->submitted_and_valid){
      # Do stuff
    }else{
      $c->response->redirect('newsletter');
    }
  }else{
    $c->response->redirect('newsletter');
  }
}

extract from newsletter.yaml
  - type: Block
    id: captcha_image
    tag: img
    attributes_xml: {src: /feedback/captcha}
  - type: Text
    name: captcha
    label_xml: <b>Security code</b>
    constraints:
      - type: Required
        message: Please enter the text from the image
      - type: Range
        message: Please enter the text from the image

_______________________________________________
HTML-FormFu mailing list
[email protected]
http://lists.scsys.co.uk/cgi-bin/mailman/listinfo/html-formfu

Reply via email to