-
Notifications
You must be signed in to change notification settings - Fork 289
Expand file tree
/
Copy pathCreateUserTrait.php
More file actions
126 lines (112 loc) · 4.24 KB
/
Copy pathCreateUserTrait.php
File metadata and controls
126 lines (112 loc) · 4.24 KB
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
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
<?php
declare(strict_types=1);
namespace CakeDC\Users\Command\Logic;
use Cake\Console\Arguments;
use Cake\Console\ConsoleIo;
use Cake\Console\ConsoleOptionParser;
use Cake\ORM\Locator\LocatorAwareTrait;
use Cake\Utility\Text;
trait CreateUserTrait
{
use LocatorAwareTrait;
/**
* Work as a seed for username generator
*
* @var array
*/
protected array $_usernameSeed = [
'aayla', 'admiral', 'anakin', 'chewbacca',
'darthvader', 'hansolo', 'luke', 'obiwan', 'leia', 'r2d2',
];
/**
* Hook method for defining this command's option parser.
*
* @see https://book.cakephp.org/4/en/console-commands/commands.html#defining-arguments-and-options
* @param \Cake\Console\ConsoleOptionParser $parser The parser to be defined
* @return \Cake\Console\ConsoleOptionParser The built parser.
*/
public function buildOptionParser(ConsoleOptionParser $parser): ConsoleOptionParser
{
$parser = parent::buildOptionParser($parser);
return $parser
->addOptions([
'username' => ['short' => 'u', 'help' => 'The username for the new user'],
'password' => ['short' => 'p', 'help' => 'The password for the new user'],
'email' => ['short' => 'e', 'help' => 'The email for the new user'],
'role' => ['short' => 'r', 'help' => 'The role for the new user'],
]);
}
/**
* Create a new user or superuser
*
* @param \Cake\Console\Arguments $args The command arguments.
* @param \Cake\Console\ConsoleIo $io The console io
* @param array $template template with deafault user values
* @return void
*/
protected function _createUser(Arguments $args, ConsoleIo $io, $template)
{
/**
* @var \CakeDC\Users\Model\Table\UsersTable $UsersTable
*/
$UsersTable = $this->getTableLocator()->get('Users');
$username = $args->getOption('username');
$password = $args->getOption('password');
$email = $args->getOption('email');
$role = $args->getOption('role');
if (empty($username)) {
$username = empty($template['username'])
? $this->_generateRandomUsername()
: $template['username'];
}
$password = $password ?: $this->_generateRandomPassword();
$email = $email ?: $username . '@example.com';
$role = $role ?: $template['role'];
$user = [
'username' => $UsersTable->generateUniqueUsername($username),
'email' => $email,
'password' => $password,
'active' => 1,
];
$userEntity = $UsersTable->newEntity($user);
$userEntity->is_superuser = empty($template['is_superuser']) ?
false : $template['is_superuser'];
$userEntity->role = $role;
$savedUser = $UsersTable->save($userEntity);
if (is_object($savedUser)) {
if ($savedUser->is_superuser) {
$io->out(__d('cake_d_c/users', 'Superuser added:'));
} else {
$io->out(__d('cake_d_c/users', 'User added:'));
}
$io->out(__d('cake_d_c/users', 'Id: {0}', $savedUser->id));
$io->out(__d('cake_d_c/users', 'Username: {0}', $savedUser->username));
$io->out(__d('cake_d_c/users', 'Email: {0}', $savedUser->email));
$io->out(__d('cake_d_c/users', 'Role: {0}', $savedUser->role));
$io->out(__d('cake_d_c/users', 'Password: {0}', $password));
} else {
$io->out(__d('cake_d_c/users', 'User could not be added:'));
collection($userEntity->getErrors())->each(function ($error, $field) use ($io) {
$io->out(__d('cake_d_c/users', 'Field: {0} Error: {1}', $field, implode(',', $error)));
});
}
}
/**
* Generates a random password.
*
* @return string
*/
protected function _generateRandomPassword()
{
return str_replace('-', '', Text::uuid());
}
/**
* Generates a random username based on a list of preexisting ones.
*
* @return string
*/
protected function _generateRandomUsername()
{
return $this->_usernameSeed[array_rand($this->_usernameSeed)];
}
}