use MRO::Compat;
use Catalyst::Utils ();
-our $VERSION = "0.14";
+our $VERSION = "0.17";
has _deleted_session_id => ( is => 'rw' );
$c->maybe::next::method(@_);
- $c->config->{session}{cookie_name}
+ $c->_session_plugin_config->{cookie_name}
||= Catalyst::Utils::appprefix($c) . '_session';
}
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 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} ) : () ),
$cookie->{secure} = 1 unless ( ($sec==0) || ($sec==2) );
$cookie->{secure} = 1 if ( ($sec==2) && $c->req->secure );
+ $cookie->{httponly} = $cfg->{cookie_httponly};
$cookie->{httponly} = 1
- unless exists $cookie->{httponly}; # default = 1 (set httponly)
+ unless defined $cookie->{httponly}; # default = 1 (set httponly)
+
+ $cookie->{samesite} = $cfg->{cookie_samesite};
+ $cookie->{samesite} = "Lax"
+ unless defined $cookie->{ samesite}; # default = Lax
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};
}
$c->maybe::next::method($sid);
}
-__PACKAGE__
-
+1;
__END__
-=pod
-
=head1 NAME
Catalyst::Plugin::Session::State::Cookie - Maintain session IDs using cookies.
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
-to send this cookies back to the server only via HTTPS.
+sent by the server to the client will get the secure flag that tells the browser
+to send this cookie back to the server only via HTTPS.
-If this attribute B<set to 2> then the cookie will got the secure flag only if
+If this attribute B<set to 2> then the cookie will get the secure flag only if
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).
+not good if you are mixing https and http in your application).
-Default vaule is 0.
+Default value is 0.
=item cookie_httponly
Default value is 1.
-Note1: Many peole are confused by the name "HTTPOnly" - it B<does not mean>
+Note1: Many people are confused by the name "HTTPOnly" - it B<does not mean>
that this cookie works only over HTTP and not over HTTPS.
-Note2: This paramater requires Catalyst::Runtime 5.80005 otherwise is skipped.
+Note2: This parameter requires Catalyst::Runtime 5.80005 otherwise is skipped.
+
+=item cookie_samesite
+
+This attribute configures the value of the
+L<SameSite|https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Set-Cookie/SameSite>
+flag.
+
+If set to None, the cookie will be sent when making cross origin requests,
+including following links from other origins. This requires the
+L</cookie_secure> flag to be set.
+
+If set to Lax, the cookie will not be included when embedded in or fetched from
+other origins, but will be included when following cross origin links.
+
+If set to Strict, the cookie will not be included for any cross origin requests,
+including links from different origins.
+
+Default value is C<Lax>. This is the default modern browsers use.
+
+Note: This parameter requires Catalyst::Runtime 5.90125 otherwise is skipped.
=item cookie_path
For example, you could stick this in MyApp.pm:
- __PACKAGE__->config( session => {
- cookie_domain => '.mydomain.com',
- });
+ __PACKAGE__->config( 'Plugin::Session' => {
+ cookie_domain => '.mydomain.com',
+ });
=head1 CAVEATS
Sessions have to be created before the first write to be saved. For example:
- sub action : Local {
- my ( $self, $c ) = @_;
- $c->res->write("foo");
- $c->session( ... );
- ...
- }
+ sub action : Local {
+ my ( $self, $c ) = @_;
+ $c->res->write("foo");
+ $c->session( ... );
+ ...
+ }
Will cause a session ID to not be set, because by the time a session is
actually created the headers have already been sent to the client.
=head1 AUTHORS
-Yuval Kogman E<lt>nothingmuch@woobling.orgE<gt>
+Yuval Kogman <nothingmuch@woobling.org>
=head1 CONTRIBUTORS
This module is derived from L<Catalyst::Plugin::Session::FastMmap> code, and
has been heavily modified since.
- Andrew Ford
- Andy Grundman
- Christian Hansen
- Marcus Ramberg
- Jonathan Rockway E<lt>jrockway@cpan.orgE<gt>
- Sebastian Riedel
+Andrew Ford
+
+Andy Grundman
+
+Christian Hansen
+
+Marcus Ramberg
+
+Jonathan Rockway <jrockway@cpan.org>
+
+Sebastian Riedel
+
+Florian Ragwitz
=head1 COPYRIGHT
-Copyright (c) 2005, Yuval Kogman C<< <nothingmuch@woobling.org> >>
+Copyright (c) 2005 - 2009
+the Catalyst::Plugin::Session::State::Cookie L</AUTHORS> and L</CONTRIBUTORS>
+as listed above.
=head1 LICENSE
under the same terms as Perl itself.
=cut
-
-1;