package Catalyst::Plugin::Session::State::Cookie;
-use base qw/Catalyst::Plugin::Session::State Class::Accessor::Fast/;
+use Moose;
+use namespace::autoclean;
-use strict;
-use warnings;
+extends 'Catalyst::Plugin::Session::State';
use MRO::Compat;
use Catalyst::Utils ();
-our $VERSION = "0.11";
+our $VERSION = "0.17";
-BEGIN { __PACKAGE__->mk_accessors(qw/_deleted_session_id/) }
+has _deleted_session_id => ( is => 'rw' );
sub setup_session {
my $c = shift;
$c->maybe::next::method(@_);
- $c->config->{session}{cookie_name}
+ $c->_session_plugin_config->{cookie_name}
||= Catalyst::Utils::appprefix($c) . '_session';
}
sub update_session_cookie {
my ( $c, $updated ) = @_;
-
+
unless ( $c->cookie_is_rejecting( $updated ) ) {
- my $cookie_name = $c->config->{session}{cookie_name};
+ my $cookie_name = $c->_session_plugin_config->{cookie_name};
$c->response->cookies->{$cookie_name} = $updated;
}
}
sub cookie_is_rejecting {
my ( $c, $cookie ) = @_;
-
+
if ( $cookie->{path} ) {
return 1 if index '/'.$c->request->path, $cookie->{path};
}
-
+
return 0;
}
sub make_session_cookie {
my ( $c, $sid, %attrs ) = @_;
- my $cfg = $c->config->{session};
+ my $cfg = $c->_session_plugin_config;
my $cookie = {
value => $sid,
( $cfg->{cookie_domain} ? ( domain => $cfg->{cookie_domain} ) : () ),
#beware: we have to accept also the old syntax "cookie_secure = true"
my $sec = $cfg->{cookie_secure} || 0; # default = 0 (not set)
$cookie->{secure} = 1 unless ( ($sec==0) || ($sec==2) );
- $cookie->{secure} = 1 if ( ($sec==2) && $c->req->secure );
-
- my $hto = $cookie->{httponly} || 1; # default = 1 (set httponly)
- $cookie->{httponly} = 1 unless ($hto==0);
+ $cookie->{secure} = 1 if ( ($sec==2) && $c->req->secure );
+
+ $cookie->{httponly} = $cfg->{cookie_httponly};
+ $cookie->{httponly} = 1
+ unless defined $cookie->{httponly}; # default = 1 (set httponly)
return $cookie;
}
sub calculate_session_cookie_expires {
my $c = shift;
- my $cfg = $c->config->{session};
+ my $cfg = $c->_session_plugin_config;
my $value = $c->maybe::next::method(@_);
return $value if $value;
sub get_session_cookie {
my $c = shift;
- my $cookie_name = $c->config->{session}{cookie_name};
+ my $cookie_name = $c->_session_plugin_config->{cookie_name};
return $c->request->cookies->{$cookie_name};
}
sub get_session_id {
my $c = shift;
- if ( !$c->_deleted_session_id and my $cookie = $c->get_session_cookie ) {
+ if ( !$c->_deleted_session_id and my $cookie = $c->get_session_cookie ) {
my $sid = $cookie->value;
$c->log->debug(qq/Found sessionid "$sid" in cookie/) if $c->debug;
return $sid if $sid;
sub delete_session_id {
my ( $c, $sid ) = @_;
-
+
$c->_deleted_session_id(1); # to prevent get_session_id from returning it
$c->update_session_cookie( $c->make_session_cookie( $sid, expires => 0 ) );
=item cookie_expires
-Number of seconds from now you want to elapse before cookie will expire.
-Set to 0 to create a session cookie, ie one which will die when the
+Number of seconds from now you want to elapse before cookie will expire.
+Set to 0 to create a session cookie, ie one which will die when the
user's browser is shut down.
=item cookie_secure
If this attribute B<set to 0> the cookie will not have the secure flag.
-If this attribute B<set to 1> (or true for backward compatibility) - the cookie
-send by the server to the client will got the secure flag that tells the browser
+If this attribute B<set to 1> (or true for backward compatibility) - the cookie
+send by the server to the client will got the secure flag that tells the browser
to send this cookies back to the server only via HTTPS.
If this attribute B<set to 2> then the cookie will got the secure flag only if
-the request that caused cookie generation was sent over https (this option is
+the request that caused cookie generation was sent over https (this option is
not good if you are mixing https and http in you application).
Default vaule is 0.
If this attribute B<set to 0>, the cookie will not have HTTPOnly flag.
-If this attribute B<set to 1>, the cookie will got HTTPOnly flag that should
+If this attribute B<set to 1>, the cookie will got HTTPOnly flag that should
prevent client side Javascript accessing the cookie value - this makes some
sort of session hijacking attacks significantly harder. Unfortunately not all
-browsers support this flag (MSIE 6 SP1+, Firefox 3.0.0.6+, Opera 9.5+); if
+browsers support this flag (MSIE 6 SP1+, Firefox 3.0.0.6+, Opera 9.5+); if
a browser is not aware of HTTPOnly the flag will be ignored.
Default value is 1.
Note1: Many peole are confused by the name "HTTPOnly" - it B<does not mean>
-that this cookie works only over HTTP and not over HTTPS.
+that this cookie works only over HTTP and not over HTTPS.
Note2: This paramater requires Catalyst::Runtime 5.80005 otherwise is skipped.
For example, you could stick this in MyApp.pm:
- __PACKAGE__->config( session => {
+ __PACKAGE__->config( 'Plugin::Session' => {
cookie_domain => '.mydomain.com',
});
Marcus Ramberg
Jonathan Rockway E<lt>jrockway@cpan.orgE<gt>
Sebastian Riedel
+ Florian Ragwitz
=head1 COPYRIGHT
+Copyright (c) 2005 - 2009
+the Catalyst::Plugin::Session::State::Cookie L</AUTHORS> and L</CONTRIBUTORS>
+as listed above.
+
+=head1 LICENSE
+
This program is free software, you can redistribute it and/or modify it
under the same terms as Perl itself.