diff options
author | Matthew Somerville <matthew-github@dracos.co.uk> | 2018-02-07 13:09:04 +0000 |
---|---|---|
committer | Matthew Somerville <matthew-github@dracos.co.uk> | 2018-02-07 13:09:04 +0000 |
commit | 6879af98d0246b6973affff08a4e078206bb5dfc (patch) | |
tree | 73dbc53ea15e1e3324cf9843ccf39bc2cdc23b95 /perllib | |
parent | 1e301bf1e07daf35150d54b132bbbe66f0a8095e (diff) | |
parent | d126f95249a0a7b0b0c3289b597a7b89e13a2fbb (diff) |
Merge branch '1944-admin-remove-account'
Diffstat (limited to 'perllib')
-rw-r--r-- | perllib/Catalyst/Plugin/FixMyStreet/Session/StoreSessions.pm | 23 | ||||
-rw-r--r-- | perllib/FixMyStreet/App.pm | 3 | ||||
-rw-r--r-- | perllib/FixMyStreet/App/Controller/Admin.pm | 35 |
3 files changed, 60 insertions, 1 deletions
diff --git a/perllib/Catalyst/Plugin/FixMyStreet/Session/StoreSessions.pm b/perllib/Catalyst/Plugin/FixMyStreet/Session/StoreSessions.pm new file mode 100644 index 000000000..5e7a3cede --- /dev/null +++ b/perllib/Catalyst/Plugin/FixMyStreet/Session/StoreSessions.pm @@ -0,0 +1,23 @@ +package Catalyst::Plugin::FixMyStreet::Session::StoreSessions; +use Moose::Role; +use namespace::autoclean; + +after set_authenticated => sub { + my $c = shift; + my $sessions = $c->user->get_extra_metadata('sessions'); + push @$sessions, $c->sessionid; + $c->user->set_extra_metadata('sessions', $sessions); + $c->user->update; +}; + +before logout => sub { + my $c = shift; + if (my $user = $c->user) { + my $sessions = $user->get_extra_metadata('sessions'); + $sessions = [ grep { $_ ne $c->sessionid } @$sessions ]; + @$sessions ? $user->set_extra_metadata('sessions', $sessions) : $user->unset_extra_metadata('sessions'); + $user->update; + } +}; + +__PACKAGE__; diff --git a/perllib/FixMyStreet/App.pm b/perllib/FixMyStreet/App.pm index e47336b7c..a3331d32a 100644 --- a/perllib/FixMyStreet/App.pm +++ b/perllib/FixMyStreet/App.pm @@ -18,13 +18,14 @@ use URI; use URI::QueryParam; use Catalyst ( - 'Static::Simple', # + 'Static::Simple', 'Unicode::Encoding', 'Session', 'Session::Store::DBIC', 'Session::State::Cookie', # FIXME - we're using our own override atm 'Authentication', 'SmartURI', + 'FixMyStreet::Session::StoreSessions', ); extends 'Catalyst'; diff --git a/perllib/FixMyStreet/App/Controller/Admin.pm b/perllib/FixMyStreet/App/Controller/Admin.pm index a1d301249..85b6204fc 100644 --- a/perllib/FixMyStreet/App/Controller/Admin.pm +++ b/perllib/FixMyStreet/App/Controller/Admin.pm @@ -1423,10 +1423,14 @@ sub user_edit : Path('user_edit') : Args(1) { if ( $c->get_param('submit') and $c->get_param('unban') ) { $c->forward('unban_user', [ $user ]); + } elsif ( $c->get_param('submit') and $c->get_param('logout_everywhere') ) { + $c->forward('user_logout_everywhere', [ $user ]); } elsif ( $c->get_param('submit') and $c->get_param('anon_everywhere') ) { $c->forward('user_anon_everywhere', [ $user ]); } elsif ( $c->get_param('submit') and $c->get_param('hide_everywhere') ) { $c->forward('user_hide_everywhere', [ $user ]); + } elsif ( $c->get_param('submit') and $c->get_param('remove_account') ) { + $c->forward('user_remove_account', [ $user ]); } elsif ( $c->get_param('submit') ) { my $edited = 0; @@ -1756,6 +1760,15 @@ sub ban_user : Private { return 1; } +sub user_logout_everywhere : Private { + my ( $self, $c, $user ) = @_; + my $sessions = $user->get_extra_metadata('sessions'); + foreach (grep { $_ ne $c->sessionid } @$sessions) { + $c->delete_session_data("session:$_"); + } + $c->stash->{status_message} = _('That user has been logged out.'); +} + sub user_anon_everywhere : Private { my ( $self, $c, $user ) = @_; $user->problems->update({anonymous => 1}); @@ -1777,6 +1790,28 @@ sub user_hide_everywhere : Private { $c->stash->{status_message} = _('That user’s reports and updates have been hidden.'); } +# Anonymize and remove name from all problems/updates, disable all alerts. +# Remove their account's email address, phone number, password, etc. +sub user_remove_account : Private { + my ( $self, $c, $user ) = @_; + $c->forward('user_logout_everywhere', [ $user ]); + $user->problems->update({ anonymous => 1, name => '', send_questionnaire => 0 }); + $user->comments->update({ anonymous => 1, name => '' }); + $user->alerts->update({ whendisabled => \'current_timestamp' }); + $user->password('', 1); + $user->update({ + email => 'removed-' . $user->id . '@' . FixMyStreet->config('EMAIL_DOMAIN'), + email_verified => 0, + name => '', + phone => '', + phone_verified => 0, + title => undef, + twitter_id => undef, + facebook_id => undef, + }); + $c->stash->{status_message} = _('That user’s personal details have been removed.'); +} + sub unban_user : Private { my ( $self, $c, $user ) = @_; |