# -*- perl -*-
#
# HTML::EP - A Perl based HTML extension.
#
#
# Copyright (C) 1998 Jochen Wiedmann
# Am Eisteich 9
# 72555 Metzingen
# Germany
#
# Phone: +49 7123 14887
# Email: joe@ispsoft.de
#
# All rights reserved.
#
# You may distribute this module under the terms of either
# the GNU General Public License or the Artistic License, as
# specified in the Perl README file.
#
############################################################################
require 5.004;
use strict;
use CGI::Cookie ();
package HTML::EP::Session::Cookie;
sub encode {
my($self, $in, $attr) = @_;
my $out = Storable::nfreeze($in);
if ($attr->{'zlib'}) {
require Compress::Zlib;
$out = Compress::Zlib::compress($out);
}
if ($attr->{'base64'}) {
require MIME::Base64;
$out = MIME::Base64::encode_base64($out);
} else {
$out = unpack("H*", $out);
}
$out;
}
sub decode {
my($self, $in, $attr) = @_;
my $out;
if ($attr->{'base64'}) {
require MIME::Base64;
$out = MIME::Base64::decode_base64($in);
} else {
$out = pack("H*", $in);
}
if ($attr->{'zlib'}) {
require Compress::Zlib;
$out = Compress::Zlib::uncompress($out);
}
Storable::thaw($out);
}
sub new {
my($proto, $ep, $id, $attr) = @_;
my $class = (ref($proto) || $proto);
my $session = {};
bless($session, $class);
my $freezed_session = $proto->encode($session, $attr);
my %opts;
$opts{'-name'} = $id;
$opts{'-expires'} = $attr->{'expires'} || '+1h';
$opts{'-domain'} = $attr->{'domain'} if exists($attr->{'domain'});
$opts{'-path'} = $attr->{'path'} if exists($attr->{'path'});
my $cookie = CGI::Cookie->new(%opts,
'-value' => $freezed_session);
$ep->{'_ep_cookies'}->{$id} = $cookie;
$opts{'zlib'} = $attr->{'zlib'};
$opts{'base64'} = $attr->{'base64'};
$session->{'_ep_data'} = \%opts;
$session;
}
sub Open {
my($proto, $ep, $id, $attr) = @_;
my $cgi = $ep->{'cgi'};
my $cookie = $cgi->cookie('-name' => $id);
return $proto->new($ep, $id, $attr) unless $cookie;
my $class = (ref($proto) || $proto);
my %opts;
$opts{'-name'} = $id;
$opts{'-expires'} = $attr->{'expires'} || '+1h';
$opts{'-domain'} = $attr->{'domain'} if exists($attr->{'domain'});
$opts{'-path'} = $attr->{'path'} if exists($attr->{'path'});
if (!$cookie) {
die "Missing cookie $id." .
" (Perhaps Cookies not enabled in the browser?)";
}
my $session = $proto->decode($cookie, $attr);
bless($session, $class);
$opts{'zlib'} = $attr->{'zlib'};
$opts{'base64'} = $attr->{'base64'};
$session->{'_ep_data'} = \%opts;
$session;
}
sub Store {
my($self, $ep, $id, $locked) = @_;
my $data = delete $self->{'_ep_data'};
my $freezed_session = $self->encode($self, $data);
my $zlib = delete $data->{'zlib'};
my $base64 = delete $data->{'base64'};
my $cookie = CGI::Cookie->new(%$data,
'-value' => $freezed_session);
$ep->{'_ep_cookies'}->{$id} = $cookie;
if ($locked) {
$data->{'zlib'} = $zlib if defined $zlib;
$data->{'base64'} = $base64 if defined $base64;
$self->{'_ep_data'} = $data;
}
}
sub Delete {
my($self, $ep, $id) = @_;
my $data = delete $self->{'_ep_data'};
my $cookie = CGI::Cookie->new('-name' => $id,
'-expires' => '-1m',
'-value' => '');
$self->{'_ep_cookies'}->{$id} = $cookie;
}
1;