Passed
Push — master ( 601a0d...e41d14 )
by Alexey
02:40
created

User::processValidatePassword()   A

Complexity

Conditions 3
Paths 3

Size

Total Lines 7
Code Lines 5

Duplication

Lines 0
Ratio 0 %

Importance

Changes 1
Bugs 0 Features 0
Metric Value
c 1
b 0
f 0
dl 0
loc 7
rs 9.4285
cc 3
eloc 5
nc 3
nop 1
1
<?php
2
3
namespace modules\users\models;
4
5
use Yii;
6
use yii\helpers\ArrayHelper;
7
use yii\helpers\Html;
8
use modules\users\traits\ModuleTrait;
9
use modules\users\Module;
10
11
/**
12
 * Class User
13
 * @package modules\users\models
14
 *
15
 * @property array statusesArray Array statuses
16
 * @property string userFullName Full user name
17
 */
18
class User extends BaseUser
19
{
20
    use ModuleTrait;
21
22
    const LENGTH_STRING_PASSWORD_MIN = 6;
23
    const LENGTH_STRING_PASSWORD_MAX = 16;
24
25
    const SCENARIO_ADMIN_CREATE = 'adminCreate';
26
    const SCENARIO_ADMIN_UPDATE = 'adminUpdate';
27
    const SCENARIO_ADMIN_PASSWORD_UPDATE = 'adminPasswordUpdate';
28
    const SCENARIO_PROFILE_UPDATE = 'profileUpdate';
29
    const SCENARIO_PASSWORD_UPDATE = 'passwordUpdate';
30
    const SCENARIO_PROFILE_DELETE = 'profileDelete';
31
32
    /**
33
     * @var string
34
     */
35
    public $currentPassword;
36
37
    /**
38
     * @var string
39
     */
40
    public $newPassword;
41
42
    /**
43
     * @var string
44
     */
45
    public $newPasswordRepeat;
46
47
    /**
48
     * @return array
49
     */
50
    public function rules()
51
    {
52
        return ArrayHelper::merge(parent::rules(), [
53
            ['status', 'integer'],
54
            ['status', 'default', 'value' => self::STATUS_WAIT],
55
            ['status', 'in', 'range' => array_keys(self::getStatusesArray())],
56
57
            [['newPassword', 'newPasswordRepeat'], 'required', 'on' => [self::SCENARIO_ADMIN_CREATE, self::SCENARIO_PASSWORD_UPDATE, self::SCENARIO_ADMIN_PASSWORD_UPDATE]],
58
            ['newPassword', 'string', 'min' => self::LENGTH_STRING_PASSWORD_MIN],
59
            ['newPasswordRepeat', 'compare', 'compareAttribute' => 'newPassword'],
60
            ['currentPassword', 'validateCurrentPassword', 'skipOnEmpty' => false, 'skipOnError' => false],
61
        ]);
62
    }
63
64
    /**
65
     * @param string $attribute
66
     */
67
    public function validateCurrentPassword($attribute)
68
    {
69
        if (!empty($this->newPassword) && !empty($this->newPasswordRepeat) && !$this->hasErrors()) {
70
            $this->processValidatePassword($attribute);
71
        } else {
72
            $this->addError($attribute, Module::t('module', 'Not all fields are filled in correctly.'));
73
        }
74
    }
75
76
    /**
77
     * @param string $attribute
78
     */
79
    protected function processValidatePassword($attribute)
80
    {
81
        if ($attribute) {
82
            if (!$this->validatePassword($this->$attribute))
83
                $this->addError($attribute, Module::t('module', 'Incorrect current password.'));
84
        } else {
85
            $this->addError($attribute, Module::t('module', 'Enter your current password.'));
86
        }
87
    }
88
89
    /**
90
     * @return array
91
     */
92
    public function scenarios()
93
    {
94
        $scenarios = parent::scenarios();
95
        $scenarios[self::SCENARIO_ADMIN_CREATE] = ['avatar', 'username', 'email', 'status', 'newPassword', 'newPasswordRepeat', 'registration_type', 'first_name', 'last_name'];
96
        $scenarios[self::SCENARIO_ADMIN_UPDATE] = ['username', 'email', 'status', 'first_name', 'last_name'];
97
        $scenarios[self::SCENARIO_ADMIN_PASSWORD_UPDATE] = ['newPassword', 'newPasswordRepeat'];
98
        $scenarios[self::SCENARIO_PASSWORD_UPDATE] = ['currentPassword', 'newPassword', 'newPasswordRepeat'];
99
        $scenarios[self::SCENARIO_PROFILE_UPDATE] = ['email', 'first_name', 'last_name'];
100
        $scenarios[self::SCENARIO_PROFILE_DELETE] = ['status'];
101
        $scenarios['default'] = ['username', 'email', 'password_hash', 'status', 'auth_key', 'email_confirm_token'];
102
        return $scenarios;
103
    }
104
105
    /**
106
     * @return array
107
     */
108
    public function attributeLabels()
109
    {
110
        return ArrayHelper::merge(parent::attributeLabels(), [
111
            'userRoleName' => Module::t('module', 'Role'),
112
            'currentPassword' => Module::t('module', 'Current Password'),
113
            'newPassword' => Module::t('module', 'New Password'),
114
            'newPasswordRepeat' => Module::t('module', 'Repeat Password'),
115
        ]);
116
    }
117
118
    /**
119
     * Actions before saving
120
     *
121
     * @param bool $insert
122
     * @return bool
123
     */
124
    public function beforeSave($insert)
125
    {
126
        if (parent::beforeSave($insert)) {
127
            if (!empty($this->newPassword)) {
128
                $this->setPassword($this->newPassword);
129
                Yii::$app->session->setFlash('success', Module::t('module', 'Password changed successfully.'));
130
            }
131
            return true;
132
        }
133
        return false;
134
    }
135
136
    /**
137
     * @return array
138
     */
139
    public static function getStatusesArray()
140
    {
141
        return [
142
            self::STATUS_BLOCKED => Module::t('module', 'Blocked'),
143
            self::STATUS_ACTIVE => Module::t('module', 'Active'),
144
            self::STATUS_WAIT => Module::t('module', 'Wait'),
145
            self::STATUS_DELETED => Module::t('module', 'Deleted'),
146
        ];
147
    }
148
149
    /**
150
     * Set Status
151
     * @return int|string
152
     */
153
    public function setStatus()
154
    {
155
        switch ($this->status) {
156
            case self::STATUS_ACTIVE:
157
                $this->status = self::STATUS_BLOCKED;
158
                break;
159
            case self::STATUS_DELETED:
160
                $this->status = self::STATUS_WAIT;
161
                break;
162
            default:
163
                $this->status = self::STATUS_ACTIVE;
164
        }
165
        return $this->status;
166
    }
167
168
    /**
169
     * @return string
170
     */
171
    public function getUserFullName()
172
    {
173
        $fullName = Module::t('module', 'Guest');
174
        if (!Yii::$app->user->isGuest) {
175
            $fullName = $this->first_name . ' ' . $this->last_name;
176
            $fullName = ($fullName != ' ') ? $fullName : $this->username;
177
        }
178
        return Html::encode(trim($fullName));
179
    }
180
181
    /**
182
     * @param integer|string $id
183
     * @return bool
184
     */
185
    public
186
    function isSuperAdmin($id = '')
187
    {
188
        $id = $id ? $id : $this->id;
189
        $authManager = Yii::$app->authManager;
190
        $roles = $authManager->getRolesByUser($id);
191
        foreach ($roles as $role) {
192
            if ($role->name == \modules\rbac\models\Role::ROLE_SUPER_ADMIN)
193
                return true;
194
        }
195
        return false;
196
    }
197
198
    /**
199
     * @return bool
200
     */
201
    public
202
    function isDeleted()
203
    {
204
        return $this->status === self::STATUS_DELETED;
205
    }
206
207
    /**
208
     * @return mixed
209
     */
210
    public
211
    function getStatusName()
212
    {
213
        return ArrayHelper::getValue(self::getStatusesArray(), $this->status);
214
    }
215
216
    /**
217
     * Return <span class="label label-success">Active</span>
218
     * @return string
219
     */
220
    public
221
    function getStatusLabelName()
222
    {
223
        $name = ArrayHelper::getValue(self::getLabelsArray(), $this->status);
224
        return Html::tag('span', $this->getStatusName(), ['class' => 'label label-' . $name]);
225
    }
226
227
    /**
228
     * @return array
229
     */
230
    public
231
    static function getLabelsArray()
232
    {
233
        return [
234
            self::STATUS_BLOCKED => 'default',
235
            self::STATUS_ACTIVE => 'success',
236
            self::STATUS_WAIT => 'warning',
237
            self::STATUS_DELETED => 'danger',
238
        ];
239
    }
240
}
241