package M42C::Web; use 5.008009; use strict; use warnings; use M42C::Web::Session; our @EXPORT = qw(); our $VERSION = '2.0.01'; sub new { my $this = shift; my $class = ref $this || $this; my $self = {}; my $r = shift; bless($self, $class); $self->{_r} = $r; return $self; }; sub session { my $self = shift; return M42C::Web::Session->new( ${$self->{_r}} )->session(); }; 1; __END__ #### package M42C::Web::Session; use strict; use warnings; use CGI::Cookie; use Carp; use DBI; sub new { my $this = shift; my $class = ref $this || $this; my $self = {}; my $r = shift; bless($self, $class); my %params = @_; $self->{_r} = $r; $self->{_commit} = $params{AutoCommit}; $self->getConnection(); if($self->getCookie) { $class->getSession(); } else { $class->createSession(); }; return $class; } sub getConnection { my $self = shift; return if( $self->{_dbi} ); my $sessionClass = $self->{_r}->dir_config->get("M42CSessionClass"); eval { require $sessionClass; $sessionClass->import(); 1; } or do { my $err = $@; die($err); }; my $dbh = DBI->connect( $self->{_r}->dir_config->get("M42CSessionDataSource"), $self->{_r}->dir_config->get("M42CSessionDataUsername"), $self->{_r}->dir_config->get("M42CSessionDataPassword")); $self->{_dbh} = $dbh; } sub session { my $self = shift; my %cookies = CGI::Cookie->fetch(); if($cookies{'sessionid'}) { $self->{_session} = $self->getSession( $cookies{'sessionid'}->value() ); } else { $self->{_session} = $self->createSession(); }; return $self->{_session}; }; sub getCookie { my $self = shift; my %cookies = CGI::Cookie->fetch(); if($cookies{"sessionid"}) { return $cookies{"sessionid"}; }; return undef; } sub setCookie { my $self = shift; my $sid = shift; my $cookie = CGI::Cookie->new( '-value' => $sid, '-name' => $self->{_r}->dir_config->get("M42CCookieName") || 'sessionid', '-expires' => $self->{_r}->dir_config->get("M42CCookieExpires") || 0, '-domain' => $self->{_r}->dir_config->get("M42CCookieDomain"), '-path' => $self->{_r}->dir_config->get("M42CCookiePath") || '/', '-secure' => $self->{_r}->dir_config->get("M42CCookieSecure") || undef, '-httponly' => $self->{_r}->dir_config->get("M42CCookieHttp") || undef ); $self->{_r}->headers_out->add("Set-Cookie", $cookie); } sub getSession { my $self = shift; my $cookie = $self->getCookie(); return $self->createSession() if (! $cookie); my %session; tie(%session, $self->{_r}->dir_config->get("M42CSessionClass"), $cookie->value(), { Handle=>$self->{_dbh}, Commit=>$self->{_r}->dir_config->get("M42CSessionAutoCommit") }); return \%session; }; sub createSession { my $self = shift; my %session; tie(%session, $self->{_r}->dir_config->get("M42CSessionClass"), undef, { Handle=>$self->{_dbh}, Commit=>$self->{_r}->dir_config->get("M42CSessionAutoCommit") }); if($self->{_r}->dir_config->get("M42CSessionUseCookie")) { $self->setCookie(\%session); }; return \%session; }; 1; __END__ #### <%init> # $m->comp('/comps/session.comp'); use Data::Dumper; use M42C::Web::Session; my $eng = M42C::Web->new(\$r);
<% Dumper($eng->session) %>
##
## Can't locate Apache::Session::Postgres in @INC (@INC contains: /opt/m42c/managed/opt/perl/5.8.9/lib/5.8.9/x86_64-linux /opt/m42c/managed/opt/perl/5.8.9/lib/5.8.9 /opt/m42c/managed/opt/perl/5.8.9/lib/site_perl/5.8.9/x86_64-linux /opt/m42c/managed/opt/perl/5.8.9/lib/site_perl/5.8.9 . /opt/m42c/managed/opt/httpd) at /opt/m42c/managed/opt/perl/5.8.9/lib/site_perl/5.8.9/M42C/Web/Session.pm line 39. ... 35: return if( $self->{_dbi} ); 36: 37: my $sessionClass = $self->{_r}->dir_config->get("M42CSessionClass"); 38: eval { 39: require $sessionClass; <-- Offending line 40: $sessionClass->import(); 41: 1; 42: } or do { 43: my $err = $@; #### perl -MApache::Session::Postgres. Just for kicks I have tried "using" the module as well to no effect. As well, if the require line is failing, WHY is blowing through the eval. Should it not be blowing at the die line below it? [shell]$ locate Postgres.pm |grep "Apache/Session" /opt/m42c/managed/opt/perl/5.8.9/lib/site_perl/5.8.9/Apache/Session/Postgres.pm /opt/m42c/managed/opt/perl/5.8.9/lib/site_perl/5.8.9/Apache/Session/Store/Postgres.pm