Bug 16818: External auth redirect broken under Plack

Test plan:

0) Have either CAS or Shibboleth authentication enabled under Plack.
1) Hover over the authentication link on the staff client or OPAC, and
   notice that it has either '.../opac/...' or '.../intranet/...' instead
   of '.../cgi-bin/koha/...'. (This will be a complete dealbreaker for CAS
   authentication.)
2) Apply patch.
3) Check links again; they should now have the correct paths.

Signed-off-by: Matthias Meusburger <matthias.meusburger@biblibre.com>

Signed-off-by: Jonathan Druart <jonathan.druart@bugs.koha-community.org>
Did not test CAS or Shibboleth, but no regression found.

Signed-off-by: Brendan Gallagher <brendan@bywatersolutions.com>
This commit is contained in:
Jesse Weaver 2016-07-08 16:01:19 -06:00 committed by Brendan Gallagher
parent 6122b8fe6e
commit d475dae773
4 changed files with 28 additions and 24 deletions

View File

@ -32,7 +32,7 @@ use C4::Languages;
use C4::Branch; # GetBranches
use C4::Search::History;
use Koha;
use Koha::AuthUtils qw(hash_password);
use Koha::AuthUtils qw(get_script_name hash_password);
use Koha::LibraryCategories;
use Koha::Libraries;
use POSIX qw/strftime/;
@ -194,7 +194,7 @@ sub get_template_and_user {
$template->param(
loginprompt => 1,
script_name => _get_script_name(),
script_name => get_script_name(),
);
print $in->{query}->header(
{ type => 'text/html',
@ -1211,7 +1211,7 @@ sub checkauth {
opaclayoutstylesheet => C4::Context->preference("opaclayoutstylesheet"),
login => 1,
INPUTS => \@inputs,
script_name => _get_script_name(),
script_name => get_script_name(),
casAuthentication => C4::Context->preference("casAuthentication"),
shibbolethAuthentication => $shib,
SessionRestrictionByIP => C4::Context->preference("SessionRestrictionByIP"),
@ -2050,24 +2050,6 @@ sub getborrowernumber {
return 0;
}
=head2 _get_script_name
This returns the correct script name, for use in redirecting back to the correct page after showing
the login screen. It depends on details of the package Plack configuration, and should not be used
outside this context.
=cut
sub _get_script_name {
# This is the method about.pl uses to detect Plack; now that two places use it, it MUST be
# right.
if ( ( any { /(^psgi\.|^plack\.)/i } keys %ENV ) && $ENV{SCRIPT_NAME} =~ m,^/(intranet|opac)(.*), ) {
return '/cgi-bin/koha' . $2;
} else {
return $ENV{SCRIPT_NAME};
}
}
END { } # module clean-up code here (global destructor)
1;
__END__

View File

@ -22,6 +22,7 @@ use warnings;
use C4::Debug;
use C4::Context;
use Koha::AuthUtils qw(get_script_name);
use Authen::CAS::Client;
use CGI qw ( -utf8 );
use FindBin;
@ -203,7 +204,7 @@ sub _url_with_get_params {
my $type = shift;
my $uri_base_part = ($type eq 'opac') ?
C4::Context->preference('OPACBaseURL') . $query->script_name():
C4::Context->preference('OPACBaseURL') . get_script_name() :
C4::Context->preference('staffClientBaseURL');
my $uri_params_part = '';

View File

@ -21,6 +21,7 @@ use Modern::Perl;
use C4::Debug;
use C4::Context;
use Koha::AuthUtils qw(get_script_name);
use Koha::Database;
use Carp;
use CGI;
@ -57,7 +58,7 @@ sub logout_shib {
sub login_shib_url {
my ($query) = @_;
my $param = _get_uri() . $query->script_name();
my $param = _get_uri() . get_script_name();
if ( $query->query_string() ) {
$param = $param . '%3F' . $query->query_string();
}

View File

@ -21,10 +21,11 @@ use Modern::Perl;
use Crypt::Eksblowfish::Bcrypt qw(bcrypt en_base64);
use Encode qw( encode is_utf8 );
use Fcntl qw/O_RDONLY/; # O_RDONLY is used in generate_salt
use List::MoreUtils qw/ any /;
use base 'Exporter';
our @EXPORT_OK = qw(hash_password);
our @EXPORT_OK = qw(hash_password get_script_name);
=head1 NAME
@ -132,6 +133,25 @@ sub generate_salt {
close SOURCE;
return $string;
}
=head2 get_script_name
This returns the correct script name, for use in redirecting back to the correct page after showing
the login screen. It depends on details of the package Plack configuration, and should not be used
outside this context.
=cut
sub get_script_name {
# This is the method about.pl uses to detect Plack; now that two places use it, it MUST be
# right.
if ( ( any { /(^psgi\.|^plack\.)/i } keys %ENV ) && $ENV{SCRIPT_NAME} =~ m,^/(intranet|opac)(.*), ) {
return '/cgi-bin/koha' . $2;
} else {
return $ENV{SCRIPT_NAME};
}
}
1;
__END__