1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107
<?php
namespace BEdita\Core\Model\Action;
use BEdita\Core\Exception\InvalidDataException;
use Cake\Event\EventDispatcherTrait;
use Cake\I18n\FrozenTime;
use Cake\ORM\TableRegistry;
use Cake\Validation\Validator;
class ChangeCredentialsAction extends BaseAction
{
use EventDispatcherTrait;
protected $Users;
protected $AsyncJobs;
protected function initialize(array $config)
{
$this->Users = TableRegistry::getTableLocator()->get('Users');
$this->AsyncJobs = TableRegistry::getTableLocator()->get('AsyncJobs');
}
public function validate(array $data)
{
$validator = (new Validator())
->notEmptyString('uuid')
->requirePresence('uuid')
->notEmptyString('password')
->requirePresence('password');
$errors = $validator->validate($data);
if (empty($errors)) {
return true;
}
return $errors;
}
public function execute(array $data = [])
{
$errors = $this->validate($data);
if ($errors !== true) {
throw new InvalidDataException(__d('bedita', 'Invalid data'), $errors);
}
$asyncJob = $this->AsyncJobs->get($data['uuid'], ['finder' => 'incomplete']);
if (empty($asyncJob->payload['user_id'])) {
throw new \LogicException(__d('bedita', 'Parameter "{0}" missing', ['payload.user_id']));
}
$user = $this->Users->get($asyncJob->payload['user_id'], ['contain' => ['Roles']]);
$user->password_hash = $data['password'];
$this->Users->saveOrFail($user);
$asyncJob->completed = new FrozenTime();
$this->AsyncJobs->saveOrFail($asyncJob);
$this->dispatchEvent('Auth.credentialsChange', [$user, $asyncJob]);
return $user;
}
}