From 8d74cb2f060236720a6e2888f73218409e73645c Mon Sep 17 00:00:00 2001 From: Henrik Hautakoski Date: Sat, 27 Aug 2022 13:02:26 +0200 Subject: [PATCH 01/12] Adding app/listeners/AuthEmailListener.php --- app/listeners/AuthEmailListener.php | 25 +++++++++++++++++++++++++ 1 file changed, 25 insertions(+) create mode 100644 app/listeners/AuthEmailListener.php diff --git a/app/listeners/AuthEmailListener.php b/app/listeners/AuthEmailListener.php new file mode 100644 index 0000000..73908a0 --- /dev/null +++ b/app/listeners/AuthEmailListener.php @@ -0,0 +1,25 @@ +setUserId($user->getId()) + ->save(); + + $content = $this->di->getShared('template')->render('mail/account_activation', [ + 'link' => $activation->getActivationKey() + ]); + + $this->di->getMail()->send('Httpcb account activation', $user->getEmail(), $content); + } +} From ad2952f9fc44173d154fe49f63f24a53817468e5 Mon Sep 17 00:00:00 2001 From: Henrik Hautakoski Date: Sat, 27 Aug 2022 13:03:28 +0200 Subject: [PATCH 02/12] app/listeners/ActivityLog.php: Adding onSentActivation --- app/listeners/ActivityLog.php | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/app/listeners/ActivityLog.php b/app/listeners/ActivityLog.php index b12190a..2af1481 100644 --- a/app/listeners/ActivityLog.php +++ b/app/listeners/ActivityLog.php @@ -65,6 +65,18 @@ class ActivityLog extends Injectable $this->_log($user, sprintf("OAuth disconnected (%s)", $providerName)); } + /** + * Fired when a activation email is sent. + * + * @param Event $event + * @param User $user + * @param string $providerName + */ + public function onSentActivation(Event $event, User $user) + { + $this->_log($user, sprintf("Activation email sent")); + } + protected function _log(User $user, $message) { $ip = (new \Phalcon\Http\Request())->getClientAddress(true); From 5b9d64c09e844f6c9234bcf1c814fb1581e2b4cd Mon Sep 17 00:00:00 2001 From: Henrik Hautakoski Date: Sat, 27 Aug 2022 13:04:23 +0200 Subject: [PATCH 03/12] app/config/routes.yml: Add backend-user-activation-email route --- app/config/routes.yml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/app/config/routes.yml b/app/config/routes.yml index 71b1d67..31c65e9 100644 --- a/app/config/routes.yml +++ b/app/config/routes.yml @@ -70,6 +70,9 @@ router: backend-user-edit: pattern: '/admin/user/{id:([0-9]+)}' path: backend::user::edit + backend-user-activation-email: + pattern: '/admin/user/{id:([0-9]+)}/activation' + path: backend::user::activation-email backend-user-status: pattern: '/admin/user/{id:([0-9]+)}/{type}' path: From e47aa5188e712b5fd715fbc3058262bb4e84b31c Mon Sep 17 00:00:00 2001 From: Henrik Hautakoski Date: Sat, 27 Aug 2022 13:05:40 +0200 Subject: [PATCH 04/12] app/library/Services.php: Attach AuthEmailListener to listen to auth events. --- app/library/Services.php | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/app/library/Services.php b/app/library/Services.php index 56aa404..b3d9cab 100644 --- a/app/library/Services.php +++ b/app/library/Services.php @@ -32,7 +32,8 @@ use Httpcb\Auth, use App\Listener\AccessListener, App\Listener\DispatchListener, - App\Listener\ActivityLog; + App\Listener\ActivityLog, + App\Listener\AuthEmailListener; class Services extends DiDefault { @@ -345,6 +346,7 @@ class Services extends DiDefault $eventsManager = new \Phalcon\Events\Manager(); $eventsManager->attach('user', $activityLog); $eventsManager->attach('auth', $activityLog); + $eventsManager->attach('auth', new AuthEmailListener); return $eventsManager; } From 14eb4a913766f6bf5c4b8fffa93923a725a3604e Mon Sep 17 00:00:00 2001 From: Henrik Hautakoski Date: Sat, 27 Aug 2022 13:07:52 +0200 Subject: [PATCH 05/12] app/controllers/backend/UserController.php: Adding activationEmailAction() --- app/controllers/backend/UserController.php | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/app/controllers/backend/UserController.php b/app/controllers/backend/UserController.php index c1f8206..c104381 100644 --- a/app/controllers/backend/UserController.php +++ b/app/controllers/backend/UserController.php @@ -97,4 +97,16 @@ class UserController extends \Phalcon\Mvc\Controller $this->flash->success('The account was: ' . $status); $this->response->redirect('/admin'); } + + public function activationEmailAction($id) + { + $user = User::findFirstById($id); + if ($user) { + $this->eventsManager->fire('auth:onSentActivation', $user); + $this->flash->success('Ativation email sent to: ' . $user->email); + } else { + $this->flash->error('Invalid user: ' . $id); + } + $this->response->redirect('/admin'); + } } From 0f5f42ca9257c8cd60418b0db78008e510913184 Mon Sep 17 00:00:00 2001 From: Henrik Hautakoski Date: Sat, 27 Aug 2022 13:08:29 +0200 Subject: [PATCH 06/12] app/views/backend/user/form.volt: Add button for sending activation email. # Conflicts: # app/views/backend/user/form.volt --- app/views/backend/user/form.volt | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/app/views/backend/user/form.volt b/app/views/backend/user/form.volt index 43d0542..ccc8157 100644 --- a/app/views/backend/user/form.volt +++ b/app/views/backend/user/form.volt @@ -56,6 +56,10 @@ {% if (user.getId()) %} {% set actions = [ 'Activate': 'Active', 'Suspend': 'Suspended', 'Delete': 'Deleted' ] %}
+ + Send activation email + + {% for label, status in actions %} {% if (user.status != status) %} From 2e98191d56440b057a26bf18370dd7ae012fb38a Mon Sep 17 00:00:00 2001 From: Henrik Hautakoski Date: Sat, 27 Aug 2022 13:09:11 +0200 Subject: [PATCH 07/12] app/controllers/ApiController.php: need to include App\Model\Data\User --- app/controllers/ApiController.php | 1 + 1 file changed, 1 insertion(+) diff --git a/app/controllers/ApiController.php b/app/controllers/ApiController.php index 50a79a8..b5642f3 100644 --- a/app/controllers/ApiController.php +++ b/app/controllers/ApiController.php @@ -6,6 +6,7 @@ use App\Controller\ControllerBase, App\Model\Data\Callback as CallbackModel, App\Model\Data\Request as RequestModel, App\Model\Data\RequestMeta as RequestMetaModel, + App\Model\Data\User, App\Model\Data\UserActivation; class ApiController extends ControllerBase From ff15ee697c3206e4e52bfd769a2a6372f8f0794e Mon Sep 17 00:00:00 2001 From: Henrik Hautakoski Date: Sun, 28 Aug 2022 16:40:44 +0200 Subject: [PATCH 08/12] app/config/routes.yml: Add "status" to the url for backend-user-status route. --- app/config/routes.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/config/routes.yml b/app/config/routes.yml index 31c65e9..610ed71 100644 --- a/app/config/routes.yml +++ b/app/config/routes.yml @@ -74,7 +74,7 @@ router: pattern: '/admin/user/{id:([0-9]+)}/activation' path: backend::user::activation-email backend-user-status: - pattern: '/admin/user/{id:([0-9]+)}/{type}' + pattern: '/admin/user/{id:([0-9]+)}/status/{type}' path: module: backend controller: user From 4ff351d39d0f3dd2e1e0d8e9e5b91b180118d622 Mon Sep 17 00:00:00 2001 From: Henrik Hautakoski Date: Sun, 28 Aug 2022 17:46:16 +0200 Subject: [PATCH 09/12] app/models/Data/User.php: Adding isSuspended() --- app/models/Data/User.php | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/app/models/Data/User.php b/app/models/Data/User.php index 1fe205c..7bb2cbb 100644 --- a/app/models/Data/User.php +++ b/app/models/Data/User.php @@ -265,6 +265,16 @@ class User extends Base return $this->status == self::STATUS_ACTIVE; } + /** + * Returns true if this user is suspended. + * + * @return bool + */ + public function isSuspended() + { + return $this->status == self::STATUS_SUSPENDED; + } + /** * @return mixed */ @@ -282,7 +292,7 @@ class User extends Base $this->password = $password; return $this; } - + /** * @return mixed */ From 8048b3fda8f351bd1bb0408f7031be16247044a9 Mon Sep 17 00:00:00 2001 From: Henrik Hautakoski Date: Sun, 28 Aug 2022 17:47:56 +0200 Subject: [PATCH 10/12] app/controllers/backend/UserController.php: in activationEmailAction() only send activation email to suspended users. --- app/controllers/backend/UserController.php | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/app/controllers/backend/UserController.php b/app/controllers/backend/UserController.php index c104381..efaded4 100644 --- a/app/controllers/backend/UserController.php +++ b/app/controllers/backend/UserController.php @@ -102,8 +102,12 @@ class UserController extends \Phalcon\Mvc\Controller { $user = User::findFirstById($id); if ($user) { - $this->eventsManager->fire('auth:onSentActivation', $user); - $this->flash->success('Ativation email sent to: ' . $user->email); + if ($user->isSuspended()) { + $this->eventsManager->fire('auth:onSentActivation', $user); + $this->flash->success('Ativation email sent to: ' . $user->email); + } else { + $this->flash->error('Only suspended users can be sent activation emails.'); + } } else { $this->flash->error('Invalid user: ' . $id); } From d3e52269cdc63029a3ea0c52f653558d9f8fe5af Mon Sep 17 00:00:00 2001 From: Henrik Hautakoski Date: Sun, 28 Aug 2022 17:48:25 +0200 Subject: [PATCH 11/12] app/views/backend/user/form.volt: only show "Send activation email" button for suspended users. --- app/views/backend/user/form.volt | 3 +++ 1 file changed, 3 insertions(+) diff --git a/app/views/backend/user/form.volt b/app/views/backend/user/form.volt index ccc8157..1878dd1 100644 --- a/app/views/backend/user/form.volt +++ b/app/views/backend/user/form.volt @@ -56,9 +56,12 @@ {% if (user.getId()) %} {% set actions = [ 'Activate': 'Active', 'Suspend': 'Suspended', 'Delete': 'Deleted' ] %}
+ + {% if user.isSuspended() %} Send activation email + {% endif %} {% for label, status in actions %} From 151daa8529a890ade3973a9ebfec261d985f833e Mon Sep 17 00:00:00 2001 From: Henrik Hautakoski Date: Sun, 28 Aug 2022 17:49:03 +0200 Subject: [PATCH 12/12] app/controllers/backend/UserController.php: typo fix. --- app/controllers/backend/UserController.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/controllers/backend/UserController.php b/app/controllers/backend/UserController.php index efaded4..61206e6 100644 --- a/app/controllers/backend/UserController.php +++ b/app/controllers/backend/UserController.php @@ -104,7 +104,7 @@ class UserController extends \Phalcon\Mvc\Controller if ($user) { if ($user->isSuspended()) { $this->eventsManager->fire('auth:onSentActivation', $user); - $this->flash->success('Ativation email sent to: ' . $user->email); + $this->flash->success('Activation email sent to: ' . $user->email); } else { $this->flash->error('Only suspended users can be sent activation emails.'); }