diff options
Diffstat (limited to 'bin/expire-sessions')
-rwxr-xr-x | bin/expire-sessions | 64 |
1 files changed, 27 insertions, 37 deletions
diff --git a/bin/expire-sessions b/bin/expire-sessions index 8cfdd57e3..375ba4c6f 100755 --- a/bin/expire-sessions +++ b/bin/expire-sessions @@ -1,11 +1,11 @@ #!/usr/bin/env perl # expire-sessions: Run regularly to remove old sessions (plus -# can set up data for 'log user out' admin functionality). +# can set up data for 'log user out' admin functionality, and +# inactive user processing). -use strict; +use v5.14; use warnings; -require 5.8.0; BEGIN { use File::Basename qw(dirname); @@ -17,55 +17,46 @@ BEGIN { use FixMyStreet::DB; use Getopt::Long; use List::Util qw(uniq); -use MIME::Base64; -use Storable; GetOptions( + # Update sessions to make sure all present in User objects 'init' => \my $init, ); my $rs = FixMyStreet::DB->resultset("Session"); +my $now = time(); # Delete expired sessions (including from in User object) -while (my $session = $rs->search({ expires => { '<', time() } })->next) { - if (my $user = get_user($session)) { - my $id = get_id($session); - my $sessions = $user->get_extra_metadata('sessions'); - my @new_sessions = grep { $_ ne $id } @$sessions; - update_user_sessions($user, \@new_sessions) if @new_sessions != @$sessions; - } - $session->delete; -} - -if ($init) { - # Update sessions to make sure all present in User objects - print "Setting up sessions in user objects\n"; - while (my $session = $rs->next) { - my $user = get_user($session) or next; - my $id = get_id($session); +# And update last active time of current sessions +while (my $session = $rs->next) { + my $id = $session->id_code; + my $user = $session->user; + my $expires = $session->expires; + if (!$expires || $expires < $now) { + if ($user) { + my $sessions = $user->get_extra_metadata('sessions'); + my @new_sessions = grep { $_ ne $id } @$sessions; + update_user_sessions($user, \@new_sessions) if @new_sessions != @$sessions; + } + $session->delete; + } elsif ($user && $init) { my $sessions = $user->get_extra_metadata('sessions'); my @new_sessions = uniq @$sessions, $id; update_user_sessions($user, \@new_sessions) if @new_sessions != @$sessions; } + if ($user) { + update_user_last_active($user, $expires); + $user->update; + } } # --- -sub get_user { - my $session = shift; - return unless $session->session_data; - my $data = Storable::thaw(MIME::Base64::decode($session->session_data)); - return unless $data->{__user}; - my $user = FixMyStreet::DB->resultset("User")->find($data->{__user}{id}); - return $user; -} - -sub get_id { - my $session = shift; - my $id = $session->id; - $id =~ s/^session://; - $id =~ s/\s+$//; - return $id; +sub update_user_last_active { + my ($user, $expires) = @_; + return unless $expires; + my $t = DateTime->from_epoch(epoch => $expires)->subtract(weeks => 4); + $user->set_last_active($t) if !$user->last_active || $user->last_active < $t; } sub update_user_sessions { @@ -75,5 +66,4 @@ sub update_user_sessions { } else { $user->unset_extra_metadata('sessions'); } - $user->update; } |