[cgiapp] CAP::Authentication not working properly with
CAP::Session
Richard Jones
ra.jones at dpw.clara.co.uk
Fri Nov 21 10:37:04 EST 2008
Rhesa Rozendaal wrote:
> Richard Jones wrote:
>> A circular ref sounds like an interesting possibility though - how
>> would I track something like that down?
>
> Have a look at Devel::Cycle.
Rhesa,
Yes, that's done it - looks like I had at least 2, possibly 3, separate
problems. The CAP::ErrorPage & CAP::DebugScreen plugins were interfering
with flash message handling somewhere in my request cycle.
But even after removing these 2 plugins I still had problems with login
failure (no entry in the sessions table), which only manifested itself
after I removed DebugScreen. Thanks to an idea inspired by Bradley C
Bailey in a private communication, I inserted a
'Devel::Cycle::find_cycle($self)' in my cgiapp_init, and it identified a
problem in Log::Dispatch LOG_DISPATCH_OPTIONS (I think):
Cycle (1):
$LIMS::Controller::Search::A->{'__CFG'} => \%B
$B->{'log_dispatch'} => \%C
$C->{'LOG_DISPATCH_OPTIONS'} => \%D
$D->{'callbacks'} => \&E
$E variable $self => \$F
$$F => \%LIMS::Controller::Search::A
Cycle (2):
$LIMS::Controller::Search::A->{'__LOG_CONFIG'} => \%G
$G->{'LOG_DISPATCH_OPTIONS'} => \%D
$D->{'callbacks'} => \&E
$E variable $self => \$F
$$F => \%LIMS::Controller::Search::A
I'm not sure how to interpret Devel::Cycle output, but I think the item
it's referring to is this:
LOG_DISPATCH_OPTIONS => {
callbacks => sub {
my %h = @_; chomp $h{message};
my $timestamp = strftime "[%d-%b-%Y %H:%M:%S]", localtime;
return sprintf "%s %s %s [%.4f sec]\n",
$timestamp,
uc $self->authen->username,
$h{message},
tv_interval $self->param('t0'), [gettimeofday];
}
I'll have to play around with this (can anyone see the problem here?),
but I suspect the callbacks sub has something to do with it. I took the
general idea from the CAP::LogDispatch pod. Removal of
LOG_DISPATCH_OPTIONS makes the Devel::Cycle message go away, flash
messages start to work properly using CAP::Flash (at last!!) and my app
returns to normal, except for one remaining issue - when I use a
$self->redirect call, I get the following error message:
prerun_mode() can only be called within cgiapp_prerun()! Error at
/home/raj/perl5/lib/perl5/CGI/Application/Plugin/Redirect.pm line 24
This does not happen if CAP::DebugScreen is loaded. It turned out that a
$SIG{__DIE__} error handler I was using in Dispatch was responsible (yet
to identify why), but its malign effect was 'masked' if DebugScreen was
also loaded, so I wonder whether DebugScreen is in general responsible
for suppressing bugs in cgiapp applications, as that's 2 issues in my
app that it apparently masked.
--
Richard Jones
More information about the cgiapp
mailing list