Skip to content

Commit

Permalink
Don't stop parsing on bad session
Browse files Browse the repository at this point in the history
  • Loading branch information
guimard committed Nov 20, 2019
1 parent 273577a commit 089f889
Show file tree
Hide file tree
Showing 11 changed files with 164 additions and 102 deletions.
2 changes: 1 addition & 1 deletion Build.PL
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ Module::Build->new(
requires => { 'Apache::Session' => 0, 'JSON' => 0, },
recommends => { 'DBI' => 0, 'Net::LDAP' => 0.38, },
test_requires => { DBI => 0, 'DBD::SQLite' => 0, },
dist_version => '1.3.3',
dist_version => '1.3.4',
autosplit => [qw(lib/Apache/Session/Browseable/_common.pm)],
configure_requires => { 'Module::Build' => 0, },
meta_merge => {
Expand Down
3 changes: 3 additions & 0 deletions Changes
Original file line number Diff line number Diff line change
@@ -1,5 +1,8 @@
Revision history for Perl extension Apache::Session::Browseable.

1.3.4
- Don't stop parsing sessions when one is bad

1.3.3
- LDAP: Add ldapRaw parameter (#20)

Expand Down
6 changes: 3 additions & 3 deletions META.json
Original file line number Diff line number Diff line change
Expand Up @@ -4,13 +4,13 @@
"Xavier Guimard, E<lt>[email protected]<gt>"
],
"dynamic_config" : 1,
"generated_by" : "Module::Build version 0.4224",
"generated_by" : "Module::Build version 0.4229",
"license" : [
"perl_5"
],
"meta-spec" : {
"url" : "http://search.cpan.org/perldoc?CPAN::Meta::Spec",
"version" : "2"
"version" : 2
},
"name" : "Apache-Session-Browseable",
"prereqs" : {
Expand Down Expand Up @@ -156,5 +156,5 @@
}
},
"version" : "v1.3.3",
"x_serialization_backend" : "JSON::PP version 2.27400_02"
"x_serialization_backend" : "JSON::PP version 2.97001"
}
2 changes: 1 addition & 1 deletion META.yml
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ build_requires:
configure_requires:
Module::Build: '0'
dynamic_config: 1
generated_by: 'Module::Build version 0.4224, CPAN::Meta::Converter version 2.150010'
generated_by: 'Module::Build version 0.4229, CPAN::Meta::Converter version 2.150010'
license: perl
meta-spec:
url: http://module-build.sourceforge.net/META-spec-v1.4.html
Expand Down
2 changes: 1 addition & 1 deletion lib/Apache/Session/Browseable.pm
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
package Apache::Session::Browseable;

our $VERSION = '1.3.2';
our $VERSION = '1.3.4';

print STDERR "Use a sub module of Apache::Session::Browseable such as Apache::Session::Browseable::File";

Expand Down
56 changes: 34 additions & 22 deletions lib/Apache/Session/Browseable/DBI.pm
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ use DBI;
use Apache::Session;
use Apache::Session::Browseable::_common;

our $VERSION = '1.2.7';
our $VERSION = '1.3.4';
our @ISA = qw(Apache::Session Apache::Session::Browseable::_common);

sub searchOn {
Expand All @@ -29,7 +29,7 @@ sub searchOnExpr {
my ( $args, $selectField, $value, @fields ) = @_;

# Escape quotes
$value =~ s/'/''/g;
$value =~ s/'/''/g;
$selectField =~ s/'/''/g;
if ( $class->_fieldIsIndexed( $args, $selectField ) ) {
$value =~ s/\*/%/g;
Expand Down Expand Up @@ -74,12 +74,18 @@ sub _query {
no strict 'refs';
my $self = eval "&${class}::populate();";
my $sub = $self->{unserialize};
my $tmp = &$sub( { serialized => $row[1] } );
if (@fields) {
$res{ $row[0] }->{$_} = $tmp->{$_} foreach (@fields);
}
else {
$res{ $row[0] } = $tmp;
eval {
my $tmp = &$sub( { serialized => $row[1] } );
if (@fields) {
$res{ $row[0] }->{$_} = $tmp->{$_} foreach (@fields);
}
else {
$res{ $row[0] } = $tmp;
}
};
if ($@) {
print STDERR "Error in session $row[0]: $@\n";
delete $res{ $row[0] };
}
}
}
Expand Down Expand Up @@ -156,29 +162,35 @@ sub get_key_from_all_sessions {
? sub {
require Storable;
return Storable::thaw( pack( 'H*', $_[0] ) );
}
}
: $args->{DataSource} =~ /^mysql/i ? sub {
require MIME::Base64;
require Storable;
return Storable::thaw( MIME::Base64::decode_base64( $_[0] ) );
}
}
: undef
);
while ( my @row = $sth->fetchrow_array ) {
no strict 'refs';
my $self = eval "&${class}::populate();";
my $sub = $self->{unserialize};
my $tmp = &$sub( { serialized => $row[1] }, $next );
if ( ref($data) eq 'CODE' ) {
$tmp = &$data( $tmp, $row[0] );
$res{ $row[0] } = $tmp if ( defined($tmp) );
}
elsif ($data) {
$data = [$data] unless ( ref($data) );
$res{ $row[0] }->{$_} = $tmp->{$_} foreach (@$data);
}
else {
$res{ $row[0] } = $tmp;
eval {
my $sub = $self->{unserialize};
my $tmp = &$sub( { serialized => $row[1] }, $next );
if ( ref($data) eq 'CODE' ) {
$tmp = &$data( $tmp, $row[0] );
$res{ $row[0] } = $tmp if ( defined($tmp) );
}
elsif ($data) {
$data = [$data] unless ( ref($data) );
$res{ $row[0] }->{$_} = $tmp->{$_} foreach (@$data);
}
else {
$res{ $row[0] } = $tmp;
}
};
if ($@) {
print STDERR "Error in session $row[0]: $@\n";
delete $res{ $row[0] };
}
}
return \%res;
Expand Down
37 changes: 22 additions & 15 deletions lib/Apache/Session/Browseable/File.pm
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@ use Apache::Session::Browseable::_common;

use constant SL => ( $^O and $^O =~ /(?:MSWin|Windows)/i ? '\\' : '/' );

our $VERSION = '1.2.3';
our $VERSION = '1.3.4';
our @ISA = qw(Apache::Session Apache::Session::Browseable::_common);

sub populate {
Expand Down Expand Up @@ -48,20 +48,27 @@ sub get_key_from_all_sessions {
closedir DIR;
my %res;
for my $f (@t) {
open F, $args->{Directory} . SL . $f;
my $row = join '', <F>;
if ( ref($data) eq 'CODE' ) {
$res{$f} =
&$data( &Apache::Session::Serialize::JSON::_unserialize($row),
$f );
}
elsif ($data) {
$data = [$data] unless ( ref($data) );
my $tmp = &Apache::Session::Serialize::JSON::_unserialize($row);
$res{$f}->{$_} = $tmp->{$_} foreach (@$data);
}
else {
$res{$f} = &Apache::Session::Serialize::JSON::_unserialize($row);
eval {
open F, $args->{Directory} . SL . $f or die $!;
my $row = join '', <F>;
if ( ref($data) eq 'CODE' ) {
$res{$f} =
&$data( &Apache::Session::Serialize::JSON::_unserialize($row),
$f );
}
elsif ($data) {
$data = [$data] unless ( ref($data) );
my $tmp = &Apache::Session::Serialize::JSON::_unserialize($row);
$res{$f}->{$_} = $tmp->{$_} foreach (@$data);
}
else {
$res{$f} =
&Apache::Session::Serialize::JSON::_unserialize($row);
}
};
if ($@) {
print STDERR "Error in session $f: $@\n";
delete $res{$f};
}
}
return \%res;
Expand Down
34 changes: 20 additions & 14 deletions lib/Apache/Session/Browseable/MySQLJSON.pm
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@ use Apache::Session::Generate::SHA256;
use Apache::Session::Serialize::JSON;
use Apache::Session::Browseable::DBI;

our $VERSION = '1.2.7';
our $VERSION = '1.3.4';
our @ISA = qw(Apache::Session::Browseable::DBI Apache::Session);

sub populate {
Expand All @@ -36,7 +36,7 @@ sub searchOn {
sub searchOnExpr {
my ( $class, $args, $selectField, $value, @fields ) = @_;
$selectField =~ s/'/''/g;
$value =~ s/\*/%/g;
$value =~ s/\*/%/g;
my $query =
{ query => qq'a_session->>"\$.$selectField" like ?', values => [$value] };
return $class->_query( $args, $query, @fields );
Expand Down Expand Up @@ -123,18 +123,24 @@ sub get_key_from_all_sessions {
while ( my @row = $sth->fetchrow_array ) {
no strict 'refs';
my $self = eval "&${class}::populate();";
my $sub = $self->{unserialize};
my $tmp = &$sub( { serialized => $row[1] } );
if ( ref($data) eq 'CODE' ) {
$tmp = &$data( $tmp, $row[0] );
$res{ $row[0] } = $tmp if ( defined($tmp) );
}
elsif ($data) {
$data = [$data] unless ( ref($data) );
$res{ $row[0] }->{$_} = $tmp->{$_} foreach (@$data);
}
else {
$res{ $row[0] } = $tmp;
eval {
my $sub = $self->{unserialize};
my $tmp = &$sub( { serialized => $row[1] } );
if ( ref($data) eq 'CODE' ) {
$tmp = &$data( $tmp, $row[0] );
$res{ $row[0] } = $tmp if ( defined($tmp) );
}
elsif ($data) {
$data = [$data] unless ( ref($data) );
$res{ $row[0] }->{$_} = $tmp->{$_} foreach (@$data);
}
else {
$res{ $row[0] } = $tmp;
}
};
if ($@) {
print STDERR "Error in session $row[0]: $@\n";
delete $res{ $row[0] };
}
}
return \%res;
Expand Down
14 changes: 10 additions & 4 deletions lib/Apache/Session/Browseable/PgHstore.pm
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ use Apache::Session::Browseable::Store::Postgres;
use Apache::Session::Generate::SHA256;
use Apache::Session::Serialize::Hstore;

our $VERSION = '1.3.0';
our $VERSION = '1.3.4';
our @ISA = qw(Apache::Session);

sub populate {
Expand Down Expand Up @@ -36,7 +36,7 @@ sub searchOn {
sub searchOnExpr {
my ( $class, $args, $selectField, $value, @fields ) = @_;
$selectField =~ s/'/''/g;
$value =~ s/\*/%/g;
$value =~ s/\*/%/g;
my $query =
{ query => "a_session -> '$selectField' like ?", values => [$value] };
return $class->_query( $args, $query, @fields );
Expand Down Expand Up @@ -74,8 +74,14 @@ sub _query {
my $self = eval "&${class}::populate();";
my $sub = $self->{unserialize};
foreach my $s ( keys %$res ) {
my $tmp = &$sub( { serialized => $res->{$s}->{a_session} } );
$res->{$s} = $tmp;
eval {
my $tmp = &$sub( { serialized => $res->{$s}->{a_session} } );
$res->{$s} = $tmp;
};
if ($@) {
print STDERR "Error in session $s: $@\n";
delete $res->{$s};
}
}
}
return $res;
Expand Down
56 changes: 36 additions & 20 deletions lib/Apache/Session/Browseable/PgJSON.pm
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ use Apache::Session::Browseable::Store::Postgres;
use Apache::Session::Generate::SHA256;
use Apache::Session::Serialize::JSON;

our $VERSION = '1.2.9';
our $VERSION = '1.3.4';
our @ISA = qw(Apache::Session);

sub populate {
Expand Down Expand Up @@ -36,7 +36,7 @@ sub searchOn {
sub searchOnExpr {
my ( $class, $args, $selectField, $value, @fields ) = @_;
$selectField =~ s/'/''/g;
$value =~ s/\*/%/g;
$value =~ s/\*/%/g;
my $query =
{ query => "a_session ->> '$selectField' like ?", values => [$value] };
return $class->_query( $args, $query, @fields );
Expand Down Expand Up @@ -74,8 +74,14 @@ sub _query {
my $self = eval "&${class}::populate();";
my $sub = $self->{unserialize};
foreach my $s ( keys %$res ) {
my $tmp = &$sub( { serialized => $res->{$s}->{a_session} } );
$res->{$s} = $tmp;
eval {
my $tmp = &$sub( { serialized => $res->{$s}->{a_session} } );
$res->{$s} = $tmp;
};
if ($@) {
print STDERR "Error in session $s: $@\n";
delete $res->{$s};
}
}
}
return $res;
Expand All @@ -86,16 +92,19 @@ sub deleteIfLowerThan {
my $query;
if ( $rule->{or} ) {
$query = join ' OR ',
map { "cast(a_session ->> '$_' as bigint) < $rule->{or}->{$_}" } keys %{ $rule->{or} };
map { "cast(a_session ->> '$_' as bigint) < $rule->{or}->{$_}" }
keys %{ $rule->{or} };
}
elsif ( $rule->{and} ) {
$query = join ' AND ',
map { "cast(a_session ->> '$_' as bigint) < $rule->{or}->{$_}" } keys %{ $rule->{or} };
map { "cast(a_session ->> '$_' as bigint) < $rule->{or}->{$_}" }
keys %{ $rule->{or} };
}
if ( $rule->{not} ) {
$query = "($query) AND "
. join( ' AND ',
map { "a_session ->> '$_' <> '$rule->{not}->{$_}'" } keys %{ $rule->{not} } );
map { "a_session ->> '$_' <> '$rule->{not}->{$_}'" }
keys %{ $rule->{not} } );
}
return 0 unless ($query);
my $dbh = $class->_classDbh($args);
Expand All @@ -116,7 +125,8 @@ sub get_key_from_all_sessions {
# Special case if all wanted fields are indexed
if ( $data and ref($data) ne 'CODE' ) {
$data = [$data] unless ( ref($data) );
my $fields = join ',', map { s/'//g; "a_session ->> '$_' AS $_" } @$data;
my $fields = join ',',
map { s/'//g; "a_session ->> '$_' AS $_" } @$data;
$sth = $dbh->prepare("SELECT $fields from $table_name");
$sth->execute;
return $sth->fetchall_hashref('id');
Expand All @@ -127,18 +137,24 @@ sub get_key_from_all_sessions {
while ( my @row = $sth->fetchrow_array ) {
no strict 'refs';
my $self = eval "&${class}::populate();";
my $sub = $self->{unserialize};
my $tmp = &$sub( { serialized => $row[1] } );
if ( ref($data) eq 'CODE' ) {
$tmp = &$data( $tmp, $row[0] );
$res{ $row[0] } = $tmp if ( defined($tmp) );
}
elsif ($data) {
$data = [$data] unless ( ref($data) );
$res{ $row[0] }->{$_} = $tmp->{$_} foreach (@$data);
}
else {
$res{ $row[0] } = $tmp;
eval {
my $sub = $self->{unserialize};
my $tmp = &$sub( { serialized => $row[1] } );
if ( ref($data) eq 'CODE' ) {
$tmp = &$data( $tmp, $row[0] );
$res{ $row[0] } = $tmp if ( defined($tmp) );
}
elsif ($data) {
$data = [$data] unless ( ref($data) );
$res{ $row[0] }->{$_} = $tmp->{$_} foreach (@$data);
}
else {
$res{ $row[0] } = $tmp;
}
};
if ($@) {
print STDERR "Error in session $row[0]: $@\n";
delete $res{ $row[0] };
}
}
return \%res;
Expand Down
Loading

0 comments on commit 089f889

Please sign in to comment.