Catalyst-Plugin-Session-State-Cookie
view release on metacpan or search on metacpan
lib/Catalyst/Plugin/Session/State/Cookie.pm view on Meta::CPAN
package Catalyst::Plugin::Session::State::Cookie;
use Moose;
use namespace::autoclean;
extends 'Catalyst::Plugin::Session::State';
use MRO::Compat;
use Catalyst::Utils ();
our $VERSION = '0.18';
$VERSION =~ tr/_//d;
has _deleted_session_id => ( is => 'rw' );
sub setup_session {
my $c = shift;
$c->maybe::next::method(@_);
$c->_session_plugin_config->{cookie_name}
||= Catalyst::Utils::appprefix($c) . '_session';
}
sub extend_session_id {
my ( $c, $sid, $expires ) = @_;
if ( my $cookie = $c->get_session_cookie ) {
$c->update_session_cookie( $c->make_session_cookie( $sid ) );
}
$c->maybe::next::method( $sid, $expires );
}
sub set_session_id {
my ( $c, $sid ) = @_;
$c->update_session_cookie( $c->make_session_cookie( $sid ) );
return $c->maybe::next::method($sid);
}
sub update_session_cookie {
my ( $c, $updated ) = @_;
unless ( $c->cookie_is_rejecting( $updated ) ) {
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->_session_plugin_config;
my $cookie = {
value => $sid,
( $cfg->{cookie_domain} ? ( domain => $cfg->{cookie_domain} ) : () ),
( $cfg->{cookie_path} ? ( path => $cfg->{cookie_path} ) : () ),
%attrs,
};
unless ( exists $cookie->{expires} ) {
$cookie->{expires} = $c->calculate_session_cookie_expires();
}
#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 );
$cookie->{httponly} = $cfg->{cookie_httponly};
$cookie->{httponly} = 1
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 calc_expiry { # compat
my $c = shift;
$c->maybe::next::method( @_ ) || $c->calculate_session_cookie_expires( @_ );
}
sub calculate_session_cookie_expires {
my $c = shift;
my $cfg = $c->_session_plugin_config;
my $value = $c->maybe::next::method(@_);
return $value if $value;
( run in 1.047 second using v1.01-cache-2.11-cpan-39bf76dae61 )