aboutsummaryrefslogtreecommitdiffstats
path: root/bin/expire-sessions
diff options
context:
space:
mode:
Diffstat (limited to 'bin/expire-sessions')
-rwxr-xr-xbin/expire-sessions64
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;
}