From a0312d24f829f41085684091fb1cb2c7135bd275 Mon Sep 17 00:00:00 2001 From: swaggboi Date: Sat, 5 Aug 2023 13:19:33 -0400 Subject: [PATCH] Implement moar CAPTCHA, need to revisit the tests... --- lib/PostText.pm | 2 +- lib/PostText/Controller/Page.pm | 43 +++++++++++++++++++++++++++++++-- templates/page/captcha.html.ep | 4 +-- 3 files changed, 44 insertions(+), 5 deletions(-) diff --git a/lib/PostText.pm b/lib/PostText.pm index ef4bf4d..471e0a6 100644 --- a/lib/PostText.pm +++ b/lib/PostText.pm @@ -135,7 +135,7 @@ sub startup($self) { $r->get('/rules')->to('page#rules')->name('rules_page'); - $r->get('/captcha/:return_url') + $r->any('/captcha/:return_url') ->to('page#captcha') ->name('captcha_page'); diff --git a/lib/PostText/Controller/Page.pm b/lib/PostText/Controller/Page.pm index eb52046..13f8994 100644 --- a/lib/PostText/Controller/Page.pm +++ b/lib/PostText/Controller/Page.pm @@ -1,11 +1,50 @@ package PostText::Controller::Page; use Mojo::Base 'Mojolicious::Controller', -signatures; +use Mojo::Util qw{b64_decode gunzip}; +use Roman::Unicode qw{to_roman to_perl}; sub about($self) { $self->render } sub rules($self) { $self->render } -sub captcha($self) { $self->render } +sub captcha($self) { + my $v; -'false'; + $v = $self->validation if $self->req->method eq 'POST'; + + if ($v && $v->has_data) { + $v->required('answer')->num(1, 9); + $v->required('number')->size(1, 4); + + if ($v->has_error) { + $self->stash(status => 400) + } + else { + my $answer = $v->param('answer'); + my $roman_numeral = $v->param('number'); + my $return_url = + gunzip b64_decode $self->param('return_url'); + + if ($answer == to_perl $roman_numeral) { + $self->session(is_human => 1); + + return $self->redirect_to($return_url); + } + else { + $self->stash( + error => 'Sounds like something a robot would say...' + ) + } + } + } + + my $random_int = 1 + int rand 9; + my $roman_numeral = to_roman $random_int; + + $self->stash(roman_numeral => $roman_numeral); + + $self->render; +} + +1; diff --git a/templates/page/captcha.html.ep b/templates/page/captcha.html.ep index 4c55326..2aff6e3 100644 --- a/templates/page/captcha.html.ep +++ b/templates/page/captcha.html.ep @@ -16,7 +16,7 @@

Must be between <%= $error->[2] %> and <%= $error->[3] %> characters.

<% } =%> - <%#= label_for answer => "What number is this?: $roman_number" %> + <%= label_for answer => "What roman numeral is this?: $roman_numeral" %> <%= text_field 'answer', ( id => 'answer', maxlength => 1, @@ -24,6 +24,6 @@ required => undef ) %> - <%= hidden_field url => $return_url, id => 'url' %> + <%= hidden_field number => $roman_numeral, id => 'number' %>