From 04c902a23e092129c320155d5667be6582dc94c2 Mon Sep 17 00:00:00 2001 From: Colin Kuskie Date: Fri, 24 Feb 2012 23:07:15 -0800 Subject: [PATCH] Add feature, redirect after logout. --- docs/changelog/8.x.x.txt | 1 + lib/WebGUI/Auth.pm | 11 ++++-- lib/WebGUI/Operation/Settings.pm | 8 ++++ lib/WebGUI/Session/Response.pm | 3 +- lib/WebGUI/i18n/English/WebGUI.pm | 14 ++++++- .../7.10.24-8.0.0/redirectOnLogout.pl | 4 ++ t/Auth/RedirectAfterLogoutUrl.t | 38 +++++++++++++++++++ 7 files changed, 73 insertions(+), 6 deletions(-) create mode 100644 share/upgrades/7.10.24-8.0.0/redirectOnLogout.pl create mode 100644 t/Auth/RedirectAfterLogoutUrl.t diff --git a/docs/changelog/8.x.x.txt b/docs/changelog/8.x.x.txt index 90ea1dae5..e407b0b47 100644 --- a/docs/changelog/8.x.x.txt +++ b/docs/changelog/8.x.x.txt @@ -6,4 +6,5 @@ - Added Facebook Auth and FacebookLogin macro. - Removed the WebGUI statistics program and code. - Prevent Env Macro from being used to access objects in the environment - Thanks to Haarg + - added: Redirect on Logout setting diff --git a/lib/WebGUI/Auth.pm b/lib/WebGUI/Auth.pm index bdf8bc311..f66f6b03e 100644 --- a/lib/WebGUI/Auth.pm +++ b/lib/WebGUI/Auth.pm @@ -1001,12 +1001,12 @@ sub www_createAccountSave { return $self->showMessageOnLogin; } elsif ($self->session->form->get('returnUrl')) { - $self->session->response->setRedirect( $self->session->form->get('returnUrl') ); + $self->session->response->redirect( $self->session->form->get('returnUrl') ); $self->session->scratch->delete("redirectAfterLogin"); } elsif ($self->session->scratch->get("redirectAfterLogin")) { my $url = $self->session->scratch->delete("redirectAfterLogin"); - $self->session->response->setRedirect($url); + $self->session->response->redirect($url); return undef; } else { @@ -1283,7 +1283,12 @@ sub www_logout { # Do not allow caching of the logout page (to ensure the page gets requested) $self->session->response->setCacheControl( "none" ); - + + if ( $self->session->setting->get("redirectAfterLogoutUrl") ) { + $self->session->log->warn("redirecting to: ".$self->session->setting->get("redirectAfterLogoutUrl")); + $self->session->response->setRedirect($self->session->setting->get("redirectAfterLogoutUrl")); + } + return undef; } diff --git a/lib/WebGUI/Operation/Settings.pm b/lib/WebGUI/Operation/Settings.pm index 856dc5c0d..bc416eb91 100644 --- a/lib/WebGUI/Operation/Settings.pm +++ b/lib/WebGUI/Operation/Settings.pm @@ -495,6 +495,14 @@ sub definition { label => $i18n->get( 'redirectAfterLoginUrl label' ), hoverHelp => $i18n->get( 'redirectAfterLoginUrl description' ), }; + push @fields, { + tab => "user", + name => "redirectAfterLogoutUrl", + fieldType => "url", + defaultValue => $setting->get('redirectAfterLogoutUrl'), + label => $i18n->get( 'redirectAfterLogoutUrl label' ), + hoverHelp => $i18n->get( 'redirectAfterLogoutUrl description' ), + }; push @fields, { tab => "user", name => "showMessageOnLogin", diff --git a/lib/WebGUI/Session/Response.pm b/lib/WebGUI/Session/Response.pm index 31ba18744..245503286 100644 --- a/lib/WebGUI/Session/Response.pm +++ b/lib/WebGUI/Session/Response.pm @@ -176,8 +176,7 @@ sub setRedirect { my @params = $self->session->form->param; return undef if ($url eq $self->session->url->page() && scalar(@params) < 1); # prevent redirecting to self $self->session->log->info("Redirecting to $url"); - $self->location($url); - $self->status($type); + $self->redirect($url, $type); $self->session->style->setMeta({"http-equiv"=>"refresh",content=>"0; URL=".$url}); } diff --git a/lib/WebGUI/i18n/English/WebGUI.pm b/lib/WebGUI/i18n/English/WebGUI.pm index 5e8844156..60662ef7b 100644 --- a/lib/WebGUI/i18n/English/WebGUI.pm +++ b/lib/WebGUI/i18n/English/WebGUI.pm @@ -4214,12 +4214,24 @@ LongTruncOk=1

context => q{Label for site setting}, }, - 'showMessageOnLogin description' => { + 'redirectAfterLoginUrl description' => { message => q{Users will be redirected to this url after logging in.}, lastUpdated => 0, context => q{Description for site setting}, }, + 'redirectAfterLogoutUrl label' => { + message => q{Redirect After Logout Url}, + lastUpdated => 0, + context => q{Label for site setting}, + }, + + 'redirectAfterLogoutUrl description' => { + message => q{Users will be redirected to this url after logging out.}, + lastUpdated => 0, + context => q{Description for site setting}, + }, + 'showMessageOnLogin label' => { message => q{Show Message On Login?}, lastUpdated => 0, diff --git a/share/upgrades/7.10.24-8.0.0/redirectOnLogout.pl b/share/upgrades/7.10.24-8.0.0/redirectOnLogout.pl new file mode 100644 index 000000000..96c041490 --- /dev/null +++ b/share/upgrades/7.10.24-8.0.0/redirectOnLogout.pl @@ -0,0 +1,4 @@ +use WebGUI::Upgrade::Script; +start_step "Adding Redirect After Logout setting"; +session->setting->add('redirectAfterLogoutUrl'); +done; diff --git a/t/Auth/RedirectAfterLogoutUrl.t b/t/Auth/RedirectAfterLogoutUrl.t new file mode 100644 index 000000000..cde89346a --- /dev/null +++ b/t/Auth/RedirectAfterLogoutUrl.t @@ -0,0 +1,38 @@ +# vim:syntax=perl +#------------------------------------------------------------------- +# WebGUI is Copyright 2001-2009 Plain Black Corporation. +#------------------------------------------------------------------- +# Please read the legal notices (docs/legal.txt) and the license +# (docs/license.txt) that came with this distribution before using +# this software. +#------------------------------------------------------------------ +# http://www.plainblack.com info@plainblack.com +#------------------------------------------------------------------ + +# Test Auth::LDAP to make sure it works with both ldap and ldaps +# +# + +use FindBin; +use strict; +use lib "$FindBin::Bin/../lib"; +use Test::More; +use WebGUI::Test; # Must use this before any other WebGUI modules +use WebGUI::Session; + +#---------------------------------------------------------------------------- +# Init +my $session = WebGUI::Test->session; + +my $user = WebGUI::User->create($session); +WebGUI::Test->addToCleanup($user); + +$session->setting->set('redirectAfterLogoutUrl'); +$user->authInstance->www_logout; +is $session->response->redirect, undef, 'no redirect set on logout'; + +$session->setting->set('redirectAfterLogoutUrl', '/other_page'); +$user->authInstance->www_logout; +is $session->response->redirect, '/other_page', 'redirect set on logout'; + +done_testing;