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 6d59a99..59fabb2 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 4efcdf6..af9bdc0 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 3748dc1..bd3d29e 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 7ae4c2b..20c63f1 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>