]> wagnertech.de Git - mfinanz.git/commitdiff
Login: Callback setzen und berücksichtigen, wenn abgemeldet
authorBernd Bleßmann <bernd@kivitendo-premium.de>
Mon, 7 Oct 2019 13:30:11 +0000 (15:30 +0200)
committerBernd Bleßmann <bernd@kivitendo-premium.de>
Fri, 6 Dec 2019 15:26:58 +0000 (16:26 +0100)
Wenn ein Ziel innerhalb des Programms aufgerufen wird (z.B. aus einem
Link, den man zugschickt bekommt) und man nicht eingeloggt ist, so
wird man zu dem Ziel weitergeleitet, nachdem man sich eingeloggt hat.

SL/Controller/LoginScreen.pm
SL/Dispatcher.pm
SL/Dispatcher/AuthHandler/User.pm
templates/webpages/login_screen/user_login.html

index 6d59a9933f57fff96c4ed2dba4626371be9c482a..59fabb245759f64174c433e05086f06da3353a16 100644 (file)
@@ -58,7 +58,7 @@ sub action_login {
 
   %::myconfig      = $login ? $::auth->read_user(login => $login) : ();
   $::locale        = Locale->new($::myconfig{countrycode}) if $::myconfig{countrycode};
-  my $auth_result  = SL::Dispatcher::AuthHandler::User->new->handle;
+  my $auth_result  = SL::Dispatcher::AuthHandler::User->new->handle(callback => $::form->{callback});
 
   $::dispatcher->end_request unless $auth_result;
 
@@ -181,7 +181,7 @@ sub init_default_client_id {
 sub show_login_form {
   my ($self, %params) = @_;
 
-  $self->render('login_screen/user_login', %params, version => SL::Version->get_version );
+  $self->render('login_screen/user_login', %params, version => SL::Version->get_version, callback => $::form->{callback});
 }
 
 1;
index 4efcdf6923f3d60d89f150ed3297ac577c8a0518..af9bdc052bb900410a4e6be17d9e2c9d2236e189 100644 (file)
@@ -30,6 +30,7 @@ use SL::Common;
 use SL::Form;
 use SL::Helper::DateTime;
 use SL::InstanceConfiguration;
+use SL::MoreCommon qw(uri_encode);
 use SL::Template::Plugin::HTMLFixes;
 use SL::User;
 
@@ -291,8 +292,11 @@ sub handle_request {
     if (   (($script eq 'login') && !$action)
         || ($script eq 'admin')
         || (SL::Auth::SESSION_EXPIRED() == $session_result)) {
-      $self->handle_login_error(script => $script, error => 'session');
-
+      $self->handle_login_error(routing_type => $routing_type,
+                                script       => $script,
+                                controller   => $script_name,
+                                action       => $action,
+                                error        => 'session');
     }
 
     my %auth_result = $self->{auth_handler}->handle(
@@ -393,7 +397,19 @@ sub handle_login_error {
   my $action          = ($params{script} // '') =~ m/^admin/i ? 'Admin/login' : 'LoginScreen/user_login';
   $action            .= '&error=' . $params{error} if $params{error};
 
-  print $::request->cgi->redirect("controller.pl?action=${action}");
+  my $redirect_url = "controller.pl?action=${action}";
+
+  if ($action =~ m/LoginScreen\/user_login/) {
+    require SL::Controller::Base;
+    my $controller = SL::Controller::Base->new;
+
+    delete $params{error};
+    delete @{ $::form }{ grep { m/^\{AUTH\}/ } keys %{ $::form } };
+    my $callback   = $controller->url_for(%params, %{$::form});
+    $redirect_url .= '&callback=' . uri_encode($callback);
+  }
+
+  print $::request->cgi->redirect($redirect_url);
   $self->end_request;
 }
 
index 3748dc1107d85b970484c64391760aa49f3dd998..bd3d29e2161c29493a9d796e714506005551ec40 100644 (file)
@@ -43,10 +43,10 @@ sub handle {
 }
 
 sub _error {
-  my $self = shift;
+  my ($self, %param) = @_;
 
   $::auth->punish_wrong_login;
-  $::dispatcher->handle_login_error(error => 'password');
+  $::dispatcher->handle_login_error(%param, error => 'password');
 
   return 0;
 }
index 7ae4c2b7bad807b72634a448a1c371e251372ccf..20c63f1e7f8d05a57093a7e832141033db0c1c00 100644 (file)
@@ -24,6 +24,7 @@
       <form method="post" name="loginscreen" action="controller.pl" target="_top">
 
        <input type="hidden" name="show_dbupdate_warning" value="1">
+       [% L.hidden_tag("callback", callback) %]
 
        <table width="100%">
         <tr>