From 33ae2b001092d34492644ce5b3da24cea9362374 Mon Sep 17 00:00:00 2001 From: osaajani <> Date: Tue, 13 Jul 2021 00:36:48 +0200 Subject: [PATCH 1/6] Define private prop --- adapters/OctopushVirtualNumberAdapter.php | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/adapters/OctopushVirtualNumberAdapter.php b/adapters/OctopushVirtualNumberAdapter.php index 33473f9..1715937 100644 --- a/adapters/OctopushVirtualNumberAdapter.php +++ b/adapters/OctopushVirtualNumberAdapter.php @@ -44,6 +44,11 @@ class OctopushVirtualNumberAdapter implements AdapterInterface */ private $api_url = 'https://api.octopush.com/v1/public'; + /** + * Octopush phone number + */ + private $number; + /** * Adapter constructor, called when instanciated by RaspiSMS. From ad93a7b5370b9d95238480bf4c8ae8e11584cf30 Mon Sep 17 00:00:00 2001 From: osaajani <> Date: Tue, 13 Jul 2021 01:21:23 +0200 Subject: [PATCH 2/6] Add function to impersonate a user --- VERSION | 2 +- controllers/publics/Account.php | 21 +++++++++++ controllers/publics/Connect.php | 1 + controllers/publics/User.php | 66 +++++++++++++++++++++++++++++++++ routes.php | 2 + templates/incs/nav.php | 8 +++- templates/user/list.php | 1 + 7 files changed, 99 insertions(+), 2 deletions(-) diff --git a/VERSION b/VERSION index ed530b3..d80dc33 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -v3.1.5 +v3.1.6 diff --git a/controllers/publics/Account.php b/controllers/publics/Account.php index 84e8d55..bcd4327 100644 --- a/controllers/publics/Account.php +++ b/controllers/publics/Account.php @@ -204,4 +204,25 @@ namespace controllers\publics; return $this->redirect(\descartes\Router::url('Connect', 'login')); } + + /** + * Allow to stop impersonating a user + * @param mixed $csrf + */ + public function stop_impersonate() + { + $old_session = $_SESSION['old_session'] ?? false; + if (!$old_session) + { + \FlashMessage\FlashMessage::push('danger', 'Impossible de récupérer l\'identité originale, vous avez été deconnecté à la place.'); + + return $this->redirect(\descartes\Router::url('Connect', 'logout')); + } + + $user_email = $_SESSION['user']['email']; + $_SESSION = $old_session; + + \FlashMessage\FlashMessage::push('success', 'Vous n\'incarnez plus l\'utilisateur ' . $user_email . '.'); + return $this->redirect(\descartes\Router::url('Dashboard', 'show')); + } } diff --git a/controllers/publics/Connect.php b/controllers/publics/Connect.php index d254b97..8c5faf2 100644 --- a/controllers/publics/Connect.php +++ b/controllers/publics/Connect.php @@ -164,4 +164,5 @@ namespace controllers\publics; return $this->redirect(\descartes\Router::url('Connect', 'login')); } + } diff --git a/controllers/publics/User.php b/controllers/publics/User.php index ab4df63..0581548 100644 --- a/controllers/publics/User.php +++ b/controllers/publics/User.php @@ -18,6 +18,7 @@ class User extends \descartes\Controller { private $internal_user; private $internal_quota; + private $internal_setting; /** * Cette fonction est appelée avant toute les autres : @@ -30,6 +31,7 @@ class User extends \descartes\Controller $bdd = \descartes\Model::_connect(DATABASE_HOST, DATABASE_NAME, DATABASE_USER, DATABASE_PASSWORD); $this->internal_user = new \controllers\internals\User($bdd); $this->internal_quota = new \controllers\internals\Quota($bdd); + $this->internal_setting = new \controllers\internals\Setting($bdd); \controllers\internals\Tool::verifyconnect(); @@ -407,4 +409,68 @@ class User extends \descartes\Controller return $this->redirect(\descartes\Router::url('User', 'list')); } + + + /** + * Allow an admin to impersonate a user + * @param mixed $csrf + * @param array int $_GET['user_ids'] : Ids of users to impersonate, the array should actually contain one id only, we keep use of array for simpler compatibility in UI + */ + public function impersonate ($csrf) + { + if (!$this->verify_csrf($csrf)) + { + \FlashMessage\FlashMessage::push('danger', 'Jeton CSRF invalid !'); + + return $this->redirect(\descartes\Router::url('User', 'list')); + } + + if (count($_GET['user_ids']) != 1) + { + \FlashMessage\FlashMessage::push('danger', 'Vous devez séléctionner un et un seul utilisateur à incarner !'); + + return $this->redirect(\descartes\Router::url('User', 'list')); + } + + $id_user = (int) $_GET['user_ids'][0]; + + //Check if this user exists + $user = $this->internal_user->get($id_user); + if (!$user) + { + \FlashMessage\FlashMessage::push('danger', 'Cet utilisateur n\'existe pas !'); + + return $this->redirect(\descartes\Router::url('User', 'list')); + } + + $settings = $this->internal_setting->gets_for_user($id_user); + if (!$settings) + { + \FlashMessage\FlashMessage::push('danger', 'Impossible de charger les settings de cet utilisateur !'); + + return $this->redirect(\descartes\Router::url('User', 'list')); + } + + if (\models\User::STATUS_ACTIVE !== $user['status']) + { + \FlashMessage\FlashMessage::push('danger', 'Impossible d\'incarner cet utilisateur car il est actuellement suspendu'); + + return $this->redirect(\descartes\Router::url('User', 'list')); + } + + $user['settings'] = $settings; + + //Save old session to get it back later + $old_session = $_SESSION; + $_SESSION = [ + 'old_session' => $old_session, + 'impersonate' => true, + 'connect' => true, + 'user' => $user, + ]; + + \FlashMessage\FlashMessage::push('success', 'Vous incarnez désormais l\'utilisateur ' . $user['email'] . '.'); + return $this->redirect(\descartes\Router::url('Dashboard', 'show')); + } + } diff --git a/routes.php b/routes.php index a0fab1f..5ddf90b 100644 --- a/routes.php +++ b/routes.php @@ -21,6 +21,7 @@ 'update_api_key' => '/account/update_api_key/{csrf}/', 'delete' => '/account/delete/{csrf}/', 'logout' => '/logout/', + 'stop_impersonate' => '/stop_impersonate/{csrf}/', ], 'Command' => [ @@ -148,6 +149,7 @@ 'edit' => '/user/edit/', 'update' => '/user/update/{csrf}/', 'update_status' => '/user/delete/{status}/{csrf}/', + 'impersonate' => '/user/impersonate/{csrf}/', ], 'Phone' => [ diff --git a/templates/incs/nav.php b/templates/incs/nav.php index a40d176..91e2340 100644 --- a/templates/incs/nav.php +++ b/templates/incs/nav.php @@ -21,7 +21,13 @@