You are viewing a plain text version of this content. The canonical link for it is here.
Posted to modperl@perl.apache.org by Jon Robison <jr...@uniphied.com> on 2002/01/01 16:32:31 UTC
PushHandler and Cookies
I'm having some troubles with a system I am writing. The system uses
the Ticket system from the Eagle book, with some minor modifications.
I have also created a "logout" module, which SHOULD delete the person's
cookie and redirect them to the main page (where they should be
re-directed by the Ticket system to a login screen as the cookie is
gone).
Currently, it isn't working. I had it "working" (click "Log Out" and
you got sent to the login screen), but I noticed that the cookie wasn't
deleted, and that I could type the correct URL (non Ticket redir url)
into the browser and I was back in! This is obviously not a good thing!
I placed a bunch of "print STDERR" statements in it and what I see now
in the log (after editing to try and make it correctly delete the
cookie) is the logout module processes correctly, the "action" does get
re-set to "view". . . and then it re-runs the logout module! Maybe I'm
not using the correct Apache return name (DONE, OK, DECLINED, etc.)? or
maybe I'm just totally screwing up the cookie re-make.
Can anyone take a moment and review this code to see what this beginner
has fouled up?
Modified TicketAccess.pm:
#######################################################
package FES::Apache::TicketAccess;
use strict;
use Apache::Constants qw(:common);
use FES::Apache::TicketTool ();
sub handler {
my $r = shift;
my %input = $r->args; # for checking input items
my $ticketTool = FES::Apache::TicketTool->new($r);
my($result, $msg) = $ticketTool->verify_ticket($r);
unless ($result) {
$r->log_reason($msg, $r->filename);
my $cookie = $ticketTool->make_return_address($r);
$r->err_headers_out->add('Set-Cookie' => $cookie);
return FORBIDDEN;
}
## Here is where I added a push_handler insert.
my $action = defined $input{'act'} ? $input{'act'} : 'view';
if ($action eq 'logout') {
$r->push_handlers('PerlHandler' => 'FES::Control::Logout');
return OK;
} elsif ($action eq 'view') {
$r->push_handlers('PerlHandler' => 'FES::Control::View');
return OK;
} else {
$r->push_handlers('PerlHandler' => 'FES::Control::View');
return OK;
}
}
1;
##################################################
And the Logout module hit by clicking a link built as
<a href="/fes?act=logout">Log Out</a>
################################################
package FES::Control::Logout;
use strict;
use Apache;
use Apache::Constants qw(:common);
use CGI::Cookie;
sub handler {
my $r = shift;
my $q = new CGI;
my $ticket = _get_ticket('r' => $r);
## These next two lines are to re-make the two cookies set
## by the Ticket system from the Eagle book to expiration dates
## from before today, thus deleting them (I wish!)
my $cookie1 = new
CGI::Cookie(-name=>'Ticket',-value=>undef,
-expires=>'-100m');
my $cookie2 = new
CGI::Cookie(-name=>'request_uri',-value=>undef,
-expires=>'-100m');
$r->header_out('Set-Cookie',[$cookie1,$cookie2]);
$r->internal_redirect("/fes");
return OK;
}
sub _get_ticket {
my $args = {
'r' => undef,
@_
};
my $r = $args->{'r'};
my %cookies = fetch CGI::Cookie;
my %ticket = $cookies{'Ticket'}->value;
return \%ticket;
}
1;
##############################################3
I have tried switching from CGI::Cookie to Apache::Cookie (and modifying
the commands to suit) - no luck. Same thing.
Can anyone see something obvious that I am doing wrong? I realized that
this is probably a "newbie" question, but I could use the help. I have
re-written the Logout.pm a dozen times, to no avail.
--Jon Robison