Completed
Push — master ( 40dc0d...5c158a )
by Igor
05:13
created

IndexController::actionConfirmRequest()   A

Complexity

Conditions 3
Paths 4

Size

Total Lines 23
Code Lines 14

Duplication

Lines 0
Ratio 0 %

Importance

Changes 1
Bugs 0 Features 1
Metric Value
c 1
b 0
f 1
dl 0
loc 23
rs 9.0856
cc 3
eloc 14
nc 4
nop 0
1
<?php
2
3
namespace app\controllers;
4
5
use Yii;
6
use yii\filters\VerbFilter;
7
use yii\filters\AccessControl;
8
use app\components\BaseController;
9
use app\helpers\Http;
10
use app\models\User;
11
use app\models\UserProvider;
12
use app\models\forms\LoginForm;
13
use app\models\forms\SignupForm;
14
use app\models\forms\SignupProviderForm;
15
use app\models\forms\PasswordResetRequestForm;
16
use app\models\forms\ResetPasswordForm;
17
use app\models\forms\ConfirmEmailForm;
18
19
class IndexController extends BaseController
20
{
21
    /**
22
     * @inheritdoc
23
     */
24
    public function behaviors()
25
    {
26
        return [
27
            'access' => [
28
                'class' => AccessControl::className(),
29
                'only' => ['logout', 'signup', 'auth'],
30
                'rules' => [
31
                    [
32
                        'actions' => ['signup', 'auth'],
33
                        'allow' => true,
34
                        'roles' => ['?'],
35
                    ],
36
                    [
37
                        'actions' => ['logout', 'confirm-request'],
38
                        'allow' => true,
39
                        'roles' => ['@'],
40
                    ],
41
                ],
42
            ],
43
            'verbs' => [
44
                'class' => VerbFilter::className(),
45
                'actions' => [
46
                    'logout' => ['post'],
47
                ],
48
            ],
49
        ];
50
    }
51
52
    /**
53
     * @inheritdoc
54
     */
55
    public function actions()
56
    {
57
        return [
58
            'error' => [
59
                'class' => 'yii\web\ErrorAction',
60
            ],
61
            'auth' => [
62
                'class' => 'yii\authclient\AuthAction',
63
                'successCallback' => [$this, 'successCallback'],
64
                'successUrl' => 'signup-provider'
65
            ],
66
        ];
67
    }
68
69
    public function successCallback($provider)
70
    {
71
        Yii::$app->session['provider'] = null;
72
        Yii::$app->session['blocked'] = false;
73
74
        $type = UserProvider::getTypeByName($provider->id);
75
        $profile = $provider->getUserAttributes();
76
        $token = $provider->getAccessToken()->getParams();
77
        $data = [
78
            'type' => $type,
79
            'profile' => $profile,
80
            'token' => $token
81
        ];
82
83
        if ($user = User::findByProvider($type, $profile['id'])) {
84
            if ($user->isActive()) {
85
                $user->updateProvider(UserProvider::parseProvider($type, $data));
86
                $user->authorize(true);
87
            } else {
88
                Yii::$app->session['blocked'] = true;
89
                Yii::$app->session['message'] = $user->getStatusDescription();
0 ignored issues
show
Bug introduced by
The method getStatusDescription cannot be called on $user (of type array|boolean).

Methods can only be called on objects. This check looks for methods being called on variables that have been inferred to never be objects.

Loading history...
90
            }
91
        } else {
92
            Yii::$app->session['provider'] = $data;
93
        }
94
    }
95
96
    public function actionIndex()
97
    {
98
        return $this->render('index');
99
    }
100
101
    public function actionLogin()
102
    {
103
        if (!Yii::$app->user->isGuest) {
104
            return $this->goHome();
105
        }
106
107
        $model = new LoginForm();
108
        if ($model->load(Yii::$app->request->post()) && $model->login()) {
109
            return $this->goBack();
110
        } else {
111
            return $this->render('login', [
112
                'model' => $model,
113
            ]);
114
        }
115
    }
116
117
    public function actionSignup()
118
    {
119
        $model = new SignupForm();
120
        if ($model->load(Yii::$app->request->post()) && $model->signup()) {
121
            if ($model->sendEmail()) {
122
                return $this->alert(
123
                    'success',
124
                    Yii::t('app.messages', 'Please activate your account') . '. ' .
125
                    Yii::t('app.messages', 'A letter for activation was sent to {email}', ['email' => $model->email])
126
                );
127
            } else {
128
                return $this->alert(
129
                    'error',
130
                    Yii::t('app.messages', 'An error occurred while sending a message to activate account')
131
                );
132
            }
133
        }
134
135
        return $this->render('signup', [
136
            'model' => $model,
137
        ]);
138
    }
139
140
    public function actionSignupProvider()
141
    {
142
        if (Yii::$app->session['blocked']) {
143
            return $this->alert('error', Yii::$app->session['message']);
144
        }
145
146
        if (!Yii::$app->user->isGuest || Yii::$app->session['provider'] === null) {
147
            return $this->goHome();
148
        }
149
150
        $model = new SignupProviderForm(Yii::$app->session['provider']);
151
152
        if ($model->isVerified() && $model->signup(false)) {
153
            Yii::$app->session['provider'] = null;
154
            return $this->goHome();
155
        }
156
157
        if ($model->load(Yii::$app->request->post()) && $model->signup()) {
158
            Yii::$app->session['provider'] = null;
159
            if ($model->sendEmail()) {
160
                return $this->alert(
161
                    'success',
162
                    Yii::t('app.messages', 'Please activate your account') . '. ' .
163
                    Yii::t('app.messages', 'A letter for activation was sent to {email}', ['email' => $model->email])
164
                );
165
            } else {
166
                return $this->alert(
167
                    'error',
168
                    Yii::t('app.messages', 'An error occurred while sending a message to activate account')
169
                );
170
            }
171
        }
172
173
        return $this->render('signupProvider', [
174
            'model' => $model
175
        ]);
176
    }
177
178
    public function actionConfirmRequest()
179
    {
180
        $user = Yii::$app->user->identity;
181
        if ($user->isConfirmed()) {
182
            Http::exception(403);
183
        } // @codeCoverageIgnore
184
185
        $model = new ConfirmEmailForm();
186
187
        if ($model->sendEmail($user)) {
188
            return $this->alert(
189
                'success',
190
                Yii::t('app.messages', 'A letter for activation was sent to {email}', [
191
                    'email' => $user->email
192
                ])
193
            );
194
        } else {
195
            return $this->alert(
196
                'error',
197
                Yii::t('app.messages', 'An error occurred while sending a message to activate account')
198
            );
199
        }
200
    }
201
202
    public function actionConfirmEmail($token)
203
    {
204
        $model = new ConfirmEmailForm();
205
206
        if (!$model->validateToken($token)) {
207
            return $this->alert('error', Yii::t('app.messages', 'Invalid link for activate account'));
208
        }
209
210
        if ($model->confirmEmail()) {
211
            return $this->alert(
212
                'success',
213
                Yii::t('app.messages', 'Your account is successfully activated')
214
            );
215
        } else {
216
            return $this->alert(
217
                'error',
218
                Yii::t('app.messages', 'An error occurred while activating account')
219
            );
220
        }
221
    }
222
223
    public function actionRequestPasswordReset()
224
    {
225
        $model = new PasswordResetRequestForm();
226
227
        if ($model->load(Yii::$app->request->post()) && $model->validate()) {
228
            if ($model->sendEmail()) {
229
                return $this->alert(
230
                    'success',
231
                    Yii::t('app.messages', 'We\'ve sent you an email with instructions to reset your password')
232
                );
233
            } else {
234
                return $this->alert(
235
                    'error',
236
                    Yii::t('app.messages', 'An error occurred while sending a message to reset your password')
237
                );
238
            }
239
        }
240
241
        return $this->render('requestPasswordResetToken', [
242
            'model' => $model,
243
        ]);
244
    }
245
246
    public function actionResetPassword($token)
247
    {
248
        $model = new ResetPasswordForm();
249
250
        if (!$model->validateToken($token)) {
251
            return $this->alert('error', Yii::t('app.messages', 'Invalid link for reset password'));
252
        }
253
254
        if ($model->load(Yii::$app->request->post()) && $model->validate() && $model->resetPassword()) {
255
            return $this->alert('success', Yii::t('app', 'New password was saved'));
256
        }
257
258
        return $this->render('resetPassword', [
259
            'model' => $model,
260
        ]);
261
    }
262
263
    public function actionLogout()
264
    {
265
        Yii::$app->user->logout();
266
        return $this->goHome();
267
    }
268
269
    /** @see commands/MaintenanceController **/
270
    public function actionMaintenance()
271
    {
272
        if (!Yii::$app->catchAll) {
273
            Http::exception(404);
274
        } // @codeCoverageIgnore
275
276
        $this->layout = 'maintenance';
277
        return $this->render('maintenance');
278
    }
279
}
280