shell bypass 403
######################################################################
# $Id: SharedMemoryBackend.pm,v 1.7 2003/04/15 14:46:23 dclinton Exp $
# Copyright (C) 2001-2003 DeWitt Clinton All Rights Reserved
#
# Software distributed under the License is distributed on an "AS
# IS" basis, WITHOUT WARRANTY OF ANY KIND, either expressed or
# implied. See the License for the specific language governing
# rights and limitations under the License.
######################################################################
package Cache::SharedMemoryBackend;
use strict;
use Cache::CacheUtils qw( Assert_Defined Freeze_Data Static_Params Thaw_Data );
use Cache::MemoryBackend;
use IPC::ShareLite qw( LOCK_EX LOCK_UN );
use vars qw( @ISA );
@ISA = qw ( Cache::MemoryBackend );
my $IPC_IDENTIFIER = 'ipcc';
sub new
{
my ( $proto ) = @_;
my $class = ref( $proto ) || $proto;
return $class->SUPER::new( );
}
sub delete_key
{
my ( $self, $p_namespace, $p_key ) = @_;
my $store_ref = $self->_get_locked_store_ref( );
delete $store_ref->{ $p_namespace }{ $p_key };
$self->_set_locked_store_ref( $store_ref );
}
sub delete_namespace
{
my ( $self, $p_namespace ) = @_;
my $store_ref = $self->_get_locked_store_ref( );
delete $store_ref->{ $p_namespace };
$self->_set_locked_store_ref( $store_ref );
}
sub store
{
my ( $self, $p_namespace, $p_key, $p_data ) = @_;
my $store_ref = $self->_get_locked_store_ref( );
$store_ref->{ $p_namespace }{ $p_key } = $p_data;
$self->_set_locked_store_ref( $store_ref );
}
# create a IPC::ShareLite share under the ipc_identifier
sub _Instantiate_Share
{
my ( $p_ipc_identifier ) = Static_Params( @_ );
Assert_Defined( $p_ipc_identifier );
my %ipc_options = (
-key => $p_ipc_identifier,
-create => 'yes',
-destroy => 'no',
-exclusive => 'no'
);
my $share = new IPC::ShareLite( %ipc_options ) or
throw Error::Simple( "Couldn't instantiate IPC::ShareLite: $!" );
return $share;
}
# this method uses the shared created by Instantiate_Share to
# transparently retrieve a reference to a shared hash structure
sub _Restore_Shared_Hash_Ref
{
my ( $p_ipc_identifier ) = Static_Params( @_ );
Assert_Defined( $p_ipc_identifier );
my $frozen_hash_ref = _Instantiate_Share( $p_ipc_identifier )->fetch( ) or
return { };
return Thaw_Data( $frozen_hash_ref );
}
# this method uses the shared created by Instantiate_Share to
# transparently retrieve a reference to a shared hash structure, and
# additionally exclusively locks the share
sub _Restore_Shared_Hash_Ref_With_Lock
{
my ( $p_ipc_identifier ) = Static_Params( @_ );
Assert_Defined( $p_ipc_identifier );
my $share = _Instantiate_Share( $p_ipc_identifier );
$share->lock( LOCK_EX );
my $frozen_hash_ref = $share->fetch( ) or
return { };
return Thaw_Data( $frozen_hash_ref );
}
# this method uses the shared created by Instantiate_Share to
# transparently persist a reference to a shared hash structure
sub _Store_Shared_Hash_Ref
{
my ( $p_ipc_identifier, $p_hash_ref ) = @_;
Assert_Defined( $p_ipc_identifier );
Assert_Defined( $p_hash_ref );
_Instantiate_Share( $p_ipc_identifier )->store( Freeze_Data( $p_hash_ref ) );
}
# this method uses the shared created by Instantiate_Share to
# transparently persist a reference to a shared hash structure and
# additionally unlocks the share
sub _Store_Shared_Hash_Ref_And_Unlock
{
my ( $p_ipc_identifier, $p_hash_ref ) = @_;
Assert_Defined( $p_ipc_identifier );
Assert_Defined( $p_hash_ref );
my $share = _Instantiate_Share( $p_ipc_identifier );
$share->store( Freeze_Data( $p_hash_ref ) );
$share->unlock( LOCK_UN );
}
sub _get_locked_store_ref
{
return _Restore_Shared_Hash_Ref_With_Lock( $IPC_IDENTIFIER );
}
sub _set_locked_store_ref
{
my ( $self, $p_store_ref ) = @_;
_Store_Shared_Hash_Ref_And_Unlock( $IPC_IDENTIFIER, $p_store_ref );
}
sub _get_store_ref
{
return _Restore_Shared_Hash_Ref( $IPC_IDENTIFIER );
}
sub _set_store_ref
{
my ( $self, $p_store_ref ) = @_;
_Store_Shared_Hash_Ref( $IPC_IDENTIFIER, $p_store_ref );
}
1;
__END__
=pod
=head1 NAME
Cache::SharedMemoryBackend -- a shared memory based persistence mechanism
=head1 DESCRIPTION
The SharedMemoryBackend class is used to persist data to shared memory
=head1 SYNOPSIS
my $backend = new Cache::SharedMemoryBackend( );
See Cache::Backend for the usage synopsis.
=head1 METHODS
See Cache::Backend for the API documentation.
=head1 SEE ALSO
Cache::Backend, Cache::FileBackend, Cache::ShareMemoryBackend
=head1 AUTHOR
Original author: DeWitt Clinton <dewitt@unto.net>
Last author: $Author: dclinton $
Copyright (C) 2001-2003 DeWitt Clinton
=cut