package Apache2::TicketMaster;
use strict;
use Apache2::RequestRec ();
use Apache2::Const qw(:common);
use Apache2::URI qw(prev uri parse);
use Apache2::TicketTool ();
use CGI '-autoload';
# This module prints out a log-in screen that provides
# authentication cookies.
# There should already be a cookie named "request_uri" that
# tells the login screen where the original request came from
sub handler
{
my $r = shift;
my($user, $pass) = map { param($_) } qw(user password);
my $request_uri = param('request_uri') || ($r->prev ? $r->prev->uri : cookie('request_uri'));
unless ($request_uri)
{
no_cookie_error();
return OK;
}
my $ticketTool = Apache2::TicketTool->new($r);
my($result, $msg);
if ($user and $pass)
{
($result, $msg) = $ticketTool->authenticate($user, $pass);
if ($result)
{
my $ticket = $ticketTool->make_ticket($r, $user);
unless ($ticket)
{
$r->log_error("Couldn't make ticket -- missing secret?");
return SERVER_ERROR;
}
go_to_uri($r, $request_uri, $ticket);
return OK;
}
}
make_login_screen($msg, $request_uri);
return OK;
}
sub go_to_uri
{
my($r, $requested_uri, $ticket) = @_;
print header(-refresh => "1; URL=$requested_uri", -cookie => $ticket),
start_html(-title => 'Successfully Authenticated', -bgcolor => 'white'),
h1('Congratulations'),
h2('You have successfully authenticated'),
h3("Please stand by..."),
end_html();
}
sub make_login_screen
{
my($msg, $request_uri) = @_;
print header(),
start_html(-title => 'Log In', -bgcolor => 'white'),
h1('Please Log In');
print h2(font({color => 'red'}, "Error: $msg")) if $msg;
print start_form(-action => script_name()),
table(
Tr(td(['Name', textfield(-name => 'user')])),
Tr(td(['Password', password_field(-name => 'password')]))
),
hidden(-name => 'request_uri', -value => $request_uri),
submit('Log In'), p(),
end_form(),
em('Note: '),
"You must set your browser to accept cookies in order for login to succeed.",
"You will be asked to log in again after some period of time has elapsed.";
}
# called when the user tries to log in without a cookie
sub no_cookie_error
{
print header(),
start_html(-title => 'Unable to Log In', -bgcolor => 'white'),
h1('Unable to Log In'),
"This site uses cookies for its own security. Your browser must be capable ",
"of processing cookies ", em('and'), " cookies must be activated. ",
"Please set your browser to accept cookies, then press the ",
strong('reload'), " button.", hr();
}
1;
__END__