From 856a66c0bea917af8c7efd907d2200c01bab382b Mon Sep 17 00:00:00 2001 From: Daniel Friesel Date: Sat, 2 Mar 2019 18:08:48 +0100 Subject: implement user/password/csrf checks for login form --- index.pl | 63 +++++++++++++++++++++++++++++++--------------- templates/login.html.ep | 52 ++++++++++++++++++++++++++++++++------ templates/register.html.ep | 16 ++++++++++++ 3 files changed, 103 insertions(+), 28 deletions(-) diff --git a/index.pl b/index.pl index ba9e338..1c32fcb 100755 --- a/index.pl +++ b/index.pl @@ -34,26 +34,28 @@ my %action_type = ( undo => 3, ); -app->plugin(authentication => { - autoload_user => 1, - session_key => 'foodor', - load_user => sub { - my ($app, $uid) = @_; - if ($uid == 1) { - return { - name => 'derf', - }; - } - return undef; - }, - validate_user => sub { - my ($c, $username, $password, $extradata) = @_; - if ($username eq 'derf' and $password eq 'hallo') { - return 1; - } - return undef; - }, -}); +app->plugin( + authentication => { + autoload_user => 1, + session_key => 'foodor', + load_user => sub { + my ( $app, $uid ) = @_; + if ( $uid == 1 ) { + return { + name => 'dev', + }; + } + return undef; + }, + validate_user => sub { + my ( $c, $username, $password, $extradata ) = @_; + if ( $username eq 'dev' and $password eq 'ohai' ) { + return 1; + } + return undef; + }, + } +); app->defaults( layout => 'default' ); @@ -799,6 +801,27 @@ get '/x/login' => sub { $self->render('login'); }; +post '/x/login' => sub { + my ($self) = @_; + my $user = $self->req->param('user'); + my $password = $self->req->param('password'); + + if ( $self->validation->csrf_protect->has_error('csrf_token') ) { + $self->render( + 'login', + invalid => 'csrf', + ); + } + else { + if ( $self->authenticate( $user, $password ) ) { + $self->redirect_to('/'); + } + else { + $self->render( 'login', invalid => 'credentials' ); + } + } +}; + get '/x/register' => sub { my ($self) = @_; $self->render('register'); diff --git a/templates/login.html.ep b/templates/login.html.ep index b9b79eb..74deaef 100644 --- a/templates/login.html.ep +++ b/templates/login.html.ep @@ -1,18 +1,54 @@ +% if (my $invalid = stash('invalid')) { +
+
+
+
+ % if ($invalid eq 'csrf') { + Ungültiger CSRF-Token +

Sind Cookies aktiviert? Ansonsten könnte es sich um einen + Fall von CSRF + handeln.

+ % } + % elsif ($invalid eq 'credentials') { + Ungültige Logindaten +

Falscher Account oder falsches Passwort.

+ % } + % else { + Unbekannter Fehler +

Das sollte nicht passieren™

+ % } +
+
+
+
+% }
-
+ %= form_for '/x/login' => (class => 'col s12', method => 'POST') => begin + %= csrf_field
account_circle - - + +
-
-
lock - - + + +
+
+
+
+
+
+ +
+
-
+ %= end
diff --git a/templates/register.html.ep b/templates/register.html.ep index 4431330..772d9af 100644 --- a/templates/register.html.ep +++ b/templates/register.html.ep @@ -36,3 +36,19 @@ %= end +
+
+

+ Die Mail-Adresse wird ausschließlich zur Bestätigung der Anmeldung + und für die "Passwort vergessen"-Funktionalität verwendet und nicht + an Dritte weitergegeben. Weitere erhobene Daten sowie deren Zweck + und Speicherfristen werden in der Datenschutzerklärung beschrieben. +

+

+ Für jeden Account wird das Datum der letzten Anmeldung gespeichert. + Accounts, die mehr als ein Jahr (12 Monate) nicht genutzt wurden, + werden automatisch und unwiderruflich gelöscht. +

+
+
-- cgit v1.2.3