AxKit-XSP-Session

 view release on metacpan or  search on metacpan

lib/Apache/AxKit/Plugins/Session.pm  view on Meta::CPAN

package Apache::AxKit::Plugins::Session;
use Apache::Session::Flex;
use Apache::Request;
use constant DEBUG => 0;
use lib qw( $VERSION %session );

$VERSION = 0.11;

sub handler
{
    my $r = Apache::Request->instance(shift);

    # Session handling code
    %session = ();
    my $no_cookie = 0;
    my $opts = {};

    # Load the configuration parameters
    my $cfgDataStore = $r->dir_config( 'SessionDataStore' );
    my $cfgLock      = $r->dir_config( 'SessionLock' );
    my $cfgGenerate  = $r->dir_config( 'SessionGenerate' );
    my $cfgSerialize = $r->dir_config( 'SessionSerialize' );

    my %flex_options = 
    (
        Store     => $cfgDataStore || 'DB_File',
        Lock      => $cfgLock      || 'Null',
        Generate  => $cfgGenerate  || 'MD5',
        Serialize => $cfgSerialize || 'Storable'
    );

    # Load session-type specific parameters
    foreach my $arg ( split( /\s*,\s*/, $r->dir_config( 'SessionArgs' ) ) )
    {
        my ($key, $value) = split( /\s*=>\s*/, $arg );
        $flex_options{$key} = $value;
    }

    # Read in the cookie if this is an old session
    my $cookie = $r->header_in('Cookie');
    {
        # eliminate logging of Apache::Session warn messages
        local $^W = 0;

        $cookie =~ s/SESSION_ID=(\w*)/$1/;
        if ( $cookie ) {
            print STDERR "Loading existing session: \"$cookie\"\n" if DEBUG;
            my $res = tieHash( $cookie, \%flex_options );
            print STDERR "The tie returned $res\n" if DEBUG and $res;
        }
        unless ( $session{_session_id} )
        {
            print STDERR "Creating a new session, since \"$session{_session_id}\" didn't work.\n" if DEBUG;
            my $res = tieHash( undef, \%flex_options );
            $no_cookie = 1;
        }
    }

    # Might be a new session, so lets give them a cookie
    if (!defined($cookie) || $no_cookie)
    {
        my $session_cookie = "SESSION_ID=$session{_session_id}";
        $r->header_out("Set-Cookie" => $session_cookie);
        $session{_creation_time} = time;
        print STDERR "Set a new header for the session cookie: \"$session_cookie\"\n" if DEBUG;
    }

    # Update the "Last Accessed" timestamp key
    $session{_last_accessed_time} = time;

    # This is to try using the pnotes table, passing as a ref
    $r->pnotes( xsp_session => \%session );
    $r->pnotes( xsp_session_ref => tied %session );
    print STDERR "Successfully set the session object in the pnotes table\n" if DEBUG;
    return OK;
}

sub tieHash
{
    my ( $id, $options ) = @_;
    eval
    {
        tie %session, 'Apache::Session::Flex', $id, $options;
    };
    return $@ if ( $@ );
}

1;

__END__

=head1 NAME

Apache::AxKit::Plugins::Session - AxKit plugin that handles setting / loading of Sessions

=head1 SYNOPSIS

    AxAddPlugin Apache::AxKit::Plugins::Session
    PerlSetVar SessionDataStore DB_File
    PerlSetVar SessionArgs FileName,/tmp/sessions

=head1 DESCRIPTION

Session is an AxKit plugin which automatically creates and manages
server-side user sessions.  Based on Apache::Session::Flex, this allows
you to specify all the parameters normally configurable through ::Flex.

=head1 Parameter Reference

=head2 C<SessionDataStore>

Sets the backend datastore module.  Default: DB_File

=head2 C<SessionLock>

Sets the record locking module.  Default: Null

=head2 C<SessionGenerate>

Sets the session id generation module.  Default: MD5

=head2 C<SessionSerialize>



( run in 0.476 second using v1.01-cache-2.11-cpan-39bf76dae61 )