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__