Cookie
view release on metacpan or search on metacpan
lib/Cookie.pm view on Meta::CPAN
sub accessed_on { return( shift->_set_get_datetime( 'accessed', @_ ) ); }
sub algo
{
my $self = shift( @_ );
if( @_ )
{
my $algo = shift( @_ );
if( defined( $algo ) && CORE::length( $algo ) )
{
$self->_load_class( 'Crypt::Mode::CBC', { version => CRYPTX_VERSION } ) || return( $self->pass_error );
# try-catch
local $@;
eval
{
# Crypt::Mode::CBC dies when it is unhappy, but we catch a null return
# value anyway just in case
my $o = Crypt::Mode::CBC->new( $algo ) ||
die( "Unsupported algorithm \"$algo\"\n" );
$self->_set_get_scalar_as_object( 'algo', $algo );
$self->reset(1);
};
if( $@ )
{
return( $self->error( "Unsupported algorithm \"$algo\": $@" ) );
}
}
else
lib/Cookie.pm view on Meta::CPAN
sub version { return( shift->_set_get_number( 'version', @_ ) ); }
sub _encrypt_objects
{
my $self = shift( @_ );
my( $key, $algo, $iv ) = @_;
return( $self->error( "Key provided is empty!" ) ) if( !defined( $key ) || !CORE::length( "$key" ) );
return( $self->error( "No algorithm was provided to encrypt cookie value. You can choose any <NAME> for which there exists Crypt::Cipher::<NAME>" ) ) if( !defined( $algo ) || !CORE::length( "$algo" ) );
$iv //= '';
$self->_load_class( 'Crypt::Mode::CBC', { version => CRYPTX_VERSION } ) || return( $self->pass_error );
$self->_load_class( 'Bytes::Random::Secure' ) || return( $self->pass_error );
my $crypt = eval
{
Crypt::Mode::CBC->new( "$algo" );
};
if( $@ )
{
return( $self->error( "Error getting the encryption objects for algorithm \"$algo\": $@" ) );
}
$crypt or return( $self->error( "Unable to create a Crypt::Mode::CBC object." ) );
my $class = "Crypt::Cipher::${algo}";
$self->_load_class( $class ) || return( $self->pass_error );
my $key_len = $class->keysize;
my $block_len = $class->blocksize;
return( $self->error( "The size of the key provided (", CORE::length( $key ), ") does not match the minimum key size required for this algorithm \"$algo\" (${key_len})." ) ) if( CORE::length( $key ) < $key_len );
# Generate an "IV", i.e. Initialisation Vector based on the required block size
$iv ||= $self->initialisation_vector;
if( defined( $iv ) && CORE::length( "$iv" ) )
{
if( CORE::length( "$iv" ) != $block_len )
lib/Cookie.pm view on Meta::CPAN
Given a L<DateTime> object, or by default will instantiate a new one, and this will set its formatter to L<DateTime::Format::Strptime> with the appropriate format to ensure the stringification produces a rfc6265 compliant datetime string.
=head2 TO_JSON
This method is used so that if the cookie object is part of some data encoded into json, this will convert the cookie data properly to be used by L<JSON>
=head1 SIGNED COOKIES
As shown in the L</SYNOPSIS> you can sign cookies effortlessly. This package has taken all the hassle of doing it for you.
To use this feature you need to have installed L<Crypt::Mode::CBC> which is part of L<CryptX>
The methods available to use for cookie integrity protection are: L</key>, L</sign> to enable cookie signature, L</is_valid> to check if the signature is valid.
Cookie signature is performed by L<CryptX>, which is an XS module, and thus very fast.
=head1 ENCRYPTED COOKIES
As shown in the L</SYNOPSIS> you can encrypt cookies effortlessly. This package has taken all the hassle of doing it for you.
To use this feature you need to have installed L<Crypt::Mode::CBC> which is part of L<CryptX>
The methods available to use for cookie encryption are: L</algo> to set the desired algorithm, L</key>, L</encrypt> to enable encryption, L</decrypt> to decrypt the cookie value, and optionally L</initialisation_vector>.
Cookie encryption is performed by L<CryptX>, which is an XS module, and thus very fast.
=head1 INSTALLATION
As usual, to install this module, you can do:
perl Makefile.PL
lib/Cookie/Jar.pm view on Meta::CPAN
return(1) if( $host =~ /\.\Q$domain\E$/ );
return(0);
}
sub _encrypt_objects
{
my $self = shift( @_ );
my( $key, $algo, $iv ) = @_;
return( $self->error( "Key provided is empty!" ) ) if( !defined( $key ) || !CORE::length( "$key" ) );
return( $self->error( "No algorithm was provided to encrypt cookie value. You can choose any <NAME> for which there exists Crypt::Cipher::<NAME>" ) ) if( !defined( $algo ) || !CORE::length( "$algo" ) );
$self->_load_class( 'Crypt::Mode::CBC', { version => CRYPTX_VERSION } ) || return( $self->pass_error );
$self->_load_class( 'Bytes::Random::Secure' ) || return( $self->pass_error );
# try-catch
local $@;
my $crypt = eval
{
Crypt::Mode::CBC->new( "$algo" );
};
if( $@ )
{
return( $self->error( "Error getting the encryption objects for algorithm \"$algo\": $@" ) );
}
$crypt or return( $self->error( "Unable to create a Crypt::Mode::CBC object." ) );
my $class = "Crypt::Cipher::${algo}";
$self->_load_class( $class ) || return( $self->pass_error );
my( $key_len, $block_len );
eval
{
$key_len = $class->keysize;
$block_len = $class->blocksize;
};
( run in 0.538 second using v1.01-cache-2.11-cpan-e1769b4cff6 )