Passed
Push — master ( 502cab...a00bcc )
by Greg
05:16
created

PasswordRequestAction::handle()   A

Complexity

Conditions 2
Paths 2

Size

Total Lines 33
Code Lines 23

Duplication

Lines 0
Ratio 0 %

Importance

Changes 1
Bugs 0 Features 0
Metric Value
cc 2
eloc 23
c 1
b 0
f 0
nc 2
nop 1
dl 0
loc 33
rs 9.552
1
<?php
2
/**
3
 * webtrees: online genealogy
4
 * Copyright (C) 2019 webtrees development team
5
 * This program is free software: you can redistribute it and/or modify
6
 * it under the terms of the GNU General Public License as published by
7
 * the Free Software Foundation, either version 3 of the License, or
8
 * (at your option) any later version.
9
 * This program is distributed in the hope that it will be useful,
10
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12
 * GNU General Public License for more details.
13
 * You should have received a copy of the GNU General Public License
14
 * along with this program. If not, see <http://www.gnu.org/licenses/>.
15
 */
16
declare(strict_types=1);
17
18
namespace Fisharebest\Webtrees\Http\RequestHandlers;
19
20
use Fig\Http\Message\RequestMethodInterface;
21
use Fig\Http\Message\StatusCodeInterface;
22
use Fisharebest\Webtrees\Carbon;
23
use Fisharebest\Webtrees\FlashMessages;
24
use Fisharebest\Webtrees\I18N;
25
use Fisharebest\Webtrees\Log;
26
use Fisharebest\Webtrees\Services\MailService;
27
use Fisharebest\Webtrees\Services\UserService;
28
use Fisharebest\Webtrees\SiteUser;
29
use Fisharebest\Webtrees\User;
30
use Illuminate\Support\Str;
31
use Psr\Http\Message\ResponseInterface;
32
use Psr\Http\Message\ServerRequestInterface;
33
use Psr\Http\Server\RequestHandlerInterface;
34
use function e;
35
use function redirect;
36
use function route;
37
use function view;
38
39
/**
40
 * Request a new password.
41
 */
42
class PasswordRequestAction implements RequestHandlerInterface, StatusCodeInterface, RequestMethodInterface
43
{
44
    const TOKEN_LENGTH = 40;
45
46
    /** @var MailService */
47
    private $mail_service;
48
49
    /** @var UserService */
50
    private $user_service;
51
52
    /**
53
     * PasswordRequestForm constructor.
54
     *
55
     * @param MailService $mail_service
56
     * @param UserService $user_service
57
     */
58
    public function __construct(MailService $mail_service, UserService $user_service)
59
    {
60
        $this->user_service = $user_service;
61
        $this->mail_service = $mail_service;
62
    }
63
64
    /**
65
     * @param ServerRequestInterface $request
66
     *
67
     * @return ResponseInterface
68
     */
69
    public function handle(ServerRequestInterface $request): ResponseInterface
70
    {
71
        $email = $request->getParsedBody()['email'] ?? '';
72
        $user  = $this->user_service->findByEmail($email);
73
74
        if ($user instanceof User) {
75
            $token  = Str::random(self::TOKEN_LENGTH);
76
            $expire = (string) Carbon::now()->addHour()->timestamp;
77
            $url    = route('password-reset', ['token' => $token]);
78
79
            $user->setPreference('password-token', $token);
80
            $user->setPreference('password-token-expire', $expire);
81
82
            $this->mail_service->send(
83
                new SiteUser(),
84
                $user,
85
                new SiteUser(),
86
                I18N::translate('Request a new password'),
87
                view('emails/password-request-text', ['url' => $url, 'user' => $user]),
88
                view('emails/password-request-html', ['url' => $url, 'user' => $user])
89
            );
90
91
            Log::addAuthenticationLog('Password request for user: ' . $user->userName());
92
93
            $message1 = I18N::translate('A password reset link has been sent to “%s”.', e($email));
94
            $message2 = I18N::translate('This link is valid for one hour.');
95
            FlashMessages::addMessage($message1 . '<br>' . $message2, 'success');
96
        } else {
97
            $message = I18N::translate('There is no user account with the email “%s”.', e($email));
98
            FlashMessages::addMessage($message, 'danger');
99
        }
100
101
        return redirect(route('password-request'));
102
    }
103
}
104