The Perl and Raku Conference 2025: Greenville, South Carolina - June 27-29 Learn more

################################################################################
sub session_access_log_directory () {
"$preconf->{_}->{docroot}session_access_logs";
}
################################################################################
sub session_access_log_filename () {
session_access_log_directory . "/$_REQUEST{sid}.4k";
}
################################################################################
sub session_access_logs_purge {
my %session = ();
my $directory = session_access_log_directory;
opendir (DIR, $directory) or die "Can't opendir $directory:$!\n";
while (my $file_name = readdir (DIR)) {
$file_name =~ /\.4k$/ and $session {$`} = \$directory;
}
closedir (DIR);
sql_select_loop ('SELECT id FROM sessions', sub {
delete $session {$i -> {id}};
});
foreach (keys %session) { eval {
unlink "$directory/$_.4k";
}}
}
################################################################################
sub session_access_log_get {
my $buf;
open (F, session_access_log_filename) or return undef;
seek (F, ($_[0] - 1) << 12, 0);
read (F, $buf, 4096);
close (F);
return $buf =~ / / ? $` : $buf;
}
################################################################################
sub session_access_log_append {
my ($href) = @_;
my $filename = session_access_log_filename;
open (F, ">>$filename") or die "Can't append to $filename:$!";
print F $href;
my $no = (tell F) >> 12;
close (F);
return $no;
}
################################################################################
sub session_access_log_set {
my ($href) = @_;
$href =~ s{^https?\://}{};
if ($href =~ /[\/\?]/) {
$href = $& . $';
}
foreach my $key (qw(
_salt
salt
sid
id___query
__next_query_string
)) {
$href =~ s{\&?${key}=[\d\.]+}{}g;
}
$href = substr $href, 0, 4095;
$href .= (' ' x (4095 - length $href));
$href .= "\015";
my $filename = session_access_log_filename;
-f $filename or return session_access_log_append ($href);
my $size = -s $filename;
if ($size % 4096) {
unlink $filename;
return session_access_log_append ($href);
}
my $max = $size >> 12;
my $min = $max > 16 ? $max - 16 : 1;
my $n;
my $buf;
open (F, "$filename") or die "Can't read $filename:$!";
for (my $i = $max; $i >= $min; $i --) {
seek (F, ($i - 1) << 12, 0);
read (F, $buf, 4096);
$buf eq $href or next;
$n = $i;
last;
}
close (F);
return $n ? $n : session_access_log_append ($href);
}
1;