Merge branch '38-admin-send-activation-password-resets-to-email' into dev
This commit is contained in:
commit
8c9455a2d5
8 changed files with 79 additions and 3 deletions
|
|
@ -70,8 +70,11 @@ router:
|
||||||
backend-user-edit:
|
backend-user-edit:
|
||||||
pattern: '/admin/user/{id:([0-9]+)}'
|
pattern: '/admin/user/{id:([0-9]+)}'
|
||||||
path: backend::user::edit
|
path: backend::user::edit
|
||||||
|
backend-user-activation-email:
|
||||||
|
pattern: '/admin/user/{id:([0-9]+)}/activation'
|
||||||
|
path: backend::user::activation-email
|
||||||
backend-user-status:
|
backend-user-status:
|
||||||
pattern: '/admin/user/{id:([0-9]+)}/{type}'
|
pattern: '/admin/user/{id:([0-9]+)}/status/{type}'
|
||||||
path:
|
path:
|
||||||
module: backend
|
module: backend
|
||||||
controller: user
|
controller: user
|
||||||
|
|
|
||||||
|
|
@ -6,6 +6,7 @@ use App\Controller\ControllerBase,
|
||||||
App\Model\Data\Callback as CallbackModel,
|
App\Model\Data\Callback as CallbackModel,
|
||||||
App\Model\Data\Request as RequestModel,
|
App\Model\Data\Request as RequestModel,
|
||||||
App\Model\Data\RequestMeta as RequestMetaModel,
|
App\Model\Data\RequestMeta as RequestMetaModel,
|
||||||
|
App\Model\Data\User,
|
||||||
App\Model\Data\UserActivation;
|
App\Model\Data\UserActivation;
|
||||||
|
|
||||||
class ApiController extends ControllerBase
|
class ApiController extends ControllerBase
|
||||||
|
|
|
||||||
|
|
@ -97,4 +97,20 @@ class UserController extends \Phalcon\Mvc\Controller
|
||||||
$this->flash->success('The account was: ' . $status);
|
$this->flash->success('The account was: ' . $status);
|
||||||
$this->response->redirect('/admin');
|
$this->response->redirect('/admin');
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public function activationEmailAction($id)
|
||||||
|
{
|
||||||
|
$user = User::findFirstById($id);
|
||||||
|
if ($user) {
|
||||||
|
if ($user->isSuspended()) {
|
||||||
|
$this->eventsManager->fire('auth:onSentActivation', $user);
|
||||||
|
$this->flash->success('Activation email sent to: ' . $user->email);
|
||||||
|
} else {
|
||||||
|
$this->flash->error('Only suspended users can be sent activation emails.');
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
$this->flash->error('Invalid user: ' . $id);
|
||||||
|
}
|
||||||
|
$this->response->redirect('/admin');
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -32,7 +32,8 @@ use Httpcb\Auth,
|
||||||
|
|
||||||
use App\Listener\AccessListener,
|
use App\Listener\AccessListener,
|
||||||
App\Listener\DispatchListener,
|
App\Listener\DispatchListener,
|
||||||
App\Listener\ActivityLog;
|
App\Listener\ActivityLog,
|
||||||
|
App\Listener\AuthEmailListener;
|
||||||
|
|
||||||
class Services extends DiDefault
|
class Services extends DiDefault
|
||||||
{
|
{
|
||||||
|
|
@ -345,6 +346,7 @@ class Services extends DiDefault
|
||||||
$eventsManager = new \Phalcon\Events\Manager();
|
$eventsManager = new \Phalcon\Events\Manager();
|
||||||
$eventsManager->attach('user', $activityLog);
|
$eventsManager->attach('user', $activityLog);
|
||||||
$eventsManager->attach('auth', $activityLog);
|
$eventsManager->attach('auth', $activityLog);
|
||||||
|
$eventsManager->attach('auth', new AuthEmailListener);
|
||||||
|
|
||||||
return $eventsManager;
|
return $eventsManager;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -65,6 +65,18 @@ class ActivityLog extends Injectable
|
||||||
$this->_log($user, sprintf("OAuth disconnected (%s)", $providerName));
|
$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)
|
protected function _log(User $user, $message)
|
||||||
{
|
{
|
||||||
$ip = (new \Phalcon\Http\Request())->getClientAddress(true);
|
$ip = (new \Phalcon\Http\Request())->getClientAddress(true);
|
||||||
|
|
|
||||||
25
app/listeners/AuthEmailListener.php
Normal file
25
app/listeners/AuthEmailListener.php
Normal file
|
|
@ -0,0 +1,25 @@
|
||||||
|
<?php
|
||||||
|
|
||||||
|
namespace App\Listener;
|
||||||
|
|
||||||
|
use App\Model\Data\User,
|
||||||
|
App\Model\Data\UserActivation;
|
||||||
|
|
||||||
|
use Phalcon\Di\Injectable,
|
||||||
|
Phalcon\Events\Event;
|
||||||
|
|
||||||
|
class AuthEmailListener extends Injectable
|
||||||
|
{
|
||||||
|
public function onSentActivation(Event $event, User $user)
|
||||||
|
{
|
||||||
|
$activation = new UserActivation();
|
||||||
|
$activation->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);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -265,6 +265,16 @@ class User extends Base
|
||||||
return $this->status == self::STATUS_ACTIVE;
|
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
|
* @return mixed
|
||||||
*/
|
*/
|
||||||
|
|
@ -282,7 +292,7 @@ class User extends Base
|
||||||
$this->password = $password;
|
$this->password = $password;
|
||||||
return $this;
|
return $this;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @return mixed
|
* @return mixed
|
||||||
*/
|
*/
|
||||||
|
|
|
||||||
|
|
@ -56,6 +56,13 @@
|
||||||
{% if (user.getId()) %}
|
{% if (user.getId()) %}
|
||||||
{% set actions = [ 'Activate': 'Active', 'Suspend': 'Suspended', 'Delete': 'Deleted' ] %}
|
{% set actions = [ 'Activate': 'Active', 'Suspend': 'Suspended', 'Delete': 'Deleted' ] %}
|
||||||
<div class="float-end">
|
<div class="float-end">
|
||||||
|
|
||||||
|
{% if user.isSuspended() %}
|
||||||
|
<a class="button button-info" href="{{ url(['for': 'backend-user-activation-email', 'id': user.getId() ]) }}">
|
||||||
|
Send activation email
|
||||||
|
</a>
|
||||||
|
{% endif %}
|
||||||
|
|
||||||
{% for label, status in actions %}
|
{% for label, status in actions %}
|
||||||
|
|
||||||
{% if (user.status != status) %}
|
{% if (user.status != status) %}
|
||||||
|
|
|
||||||
Reference in a new issue