MAPG-142 implemenet confirmation mail resend
This commit is contained in:
parent
6cafac1b65
commit
7e3315fc88
@ -0,0 +1,5 @@
|
|||||||
|
UPDATE `user_confirmations` SET token=SUBSTRING(token, 1, 32);
|
||||||
|
|
||||||
|
ALTER TABLE `user_confirmations`
|
||||||
|
ADD `last_sent` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
||||||
|
MODIFY `token` varchar(32) CHARACTER SET ascii NOT NULL;
|
@ -1,5 +1,6 @@
|
|||||||
<?php namespace MapGuesser\Controller;
|
<?php namespace MapGuesser\Controller;
|
||||||
|
|
||||||
|
use DateInterval;
|
||||||
use DateTime;
|
use DateTime;
|
||||||
use MapGuesser\Http\Request;
|
use MapGuesser\Http\Request;
|
||||||
use MapGuesser\Interfaces\Request\IRequest;
|
use MapGuesser\Interfaces\Request\IRequest;
|
||||||
@ -168,6 +169,8 @@ class LoginController
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (!$user->getActive()) {
|
if (!$user->getActive()) {
|
||||||
|
$this->resendConfirmationEmail($user);
|
||||||
|
|
||||||
return new JsonContent([
|
return new JsonContent([
|
||||||
'error' => [
|
'error' => [
|
||||||
'errorText' => 'User found with the given email address, but the account is not activated. ' .
|
'errorText' => 'User found with the given email address, but the account is not activated. ' .
|
||||||
@ -306,11 +309,12 @@ class LoginController
|
|||||||
|
|
||||||
$this->pdm->saveToDb($user);
|
$this->pdm->saveToDb($user);
|
||||||
|
|
||||||
$token = hash('sha256', serialize($user) . random_bytes(10) . microtime());
|
$token = bin2hex(random_bytes(16));
|
||||||
|
|
||||||
$confirmation = new UserConfirmation();
|
$confirmation = new UserConfirmation();
|
||||||
$confirmation->setUser($user);
|
$confirmation->setUser($user);
|
||||||
$confirmation->setToken($token);
|
$confirmation->setToken($token);
|
||||||
|
$confirmation->setLastSentDate(new DateTime());
|
||||||
|
|
||||||
$this->pdm->saveToDb($confirmation);
|
$this->pdm->saveToDb($confirmation);
|
||||||
|
|
||||||
@ -377,7 +381,7 @@ class LoginController
|
|||||||
return new Redirect(\Container::$routeCollection->getRoute('index')->generateLink(), IRedirect::TEMPORARY);
|
return new Redirect(\Container::$routeCollection->getRoute('index')->generateLink(), IRedirect::TEMPORARY);
|
||||||
}
|
}
|
||||||
|
|
||||||
$confirmation = $this->userConfirmationRepository->getByToken($this->request->query('token'));
|
$confirmation = $this->userConfirmationRepository->getByToken(substr($this->request->query('token'), 0, 32));
|
||||||
|
|
||||||
if ($confirmation === null) {
|
if ($confirmation === null) {
|
||||||
return new HtmlContent('login/activate');
|
return new HtmlContent('login/activate');
|
||||||
@ -405,7 +409,7 @@ class LoginController
|
|||||||
return new Redirect(\Container::$routeCollection->getRoute('index')->generateLink(), IRedirect::TEMPORARY);
|
return new Redirect(\Container::$routeCollection->getRoute('index')->generateLink(), IRedirect::TEMPORARY);
|
||||||
}
|
}
|
||||||
|
|
||||||
$confirmation = $this->userConfirmationRepository->getByToken($this->request->query('token'));
|
$confirmation = $this->userConfirmationRepository->getByToken(substr($this->request->query('token'), 0, 32));
|
||||||
|
|
||||||
if ($confirmation === null) {
|
if ($confirmation === null) {
|
||||||
return new HtmlContent('login/cancel', ['success' => false]);
|
return new HtmlContent('login/cancel', ['success' => false]);
|
||||||
@ -445,6 +449,8 @@ class LoginController
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (!$user->getActive()) {
|
if (!$user->getActive()) {
|
||||||
|
$this->resendConfirmationEmail($user);
|
||||||
|
|
||||||
return new JsonContent([
|
return new JsonContent([
|
||||||
'error' => [
|
'error' => [
|
||||||
'errorText' => 'User found with the given email address, but the account is not activated. ' .
|
'errorText' => 'User found with the given email address, but the account is not activated. ' .
|
||||||
@ -533,6 +539,23 @@ class LoginController
|
|||||||
$mail->send();
|
$mail->send();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private function resendConfirmationEmail(User $user): bool
|
||||||
|
{
|
||||||
|
$confirmation = $this->userConfirmationRepository->getByUser($user);
|
||||||
|
|
||||||
|
if ($confirmation === null || (clone $confirmation->getLastSentDate())->add(new DateInterval('PT1H')) > new DateTime()) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
$confirmation->setLastSentDate(new DateTime());
|
||||||
|
|
||||||
|
$this->pdm->saveToDb($confirmation);
|
||||||
|
|
||||||
|
$this->sendConfirmationEmail($user->getEmail(), $confirmation->getToken());
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
private function sendWelcomeEmail(string $email): void
|
private function sendWelcomeEmail(string $email): void
|
||||||
{
|
{
|
||||||
$mail = new Mail();
|
$mail = new Mail();
|
||||||
|
@ -1,10 +1,12 @@
|
|||||||
<?php namespace MapGuesser\PersistentData\Model;
|
<?php namespace MapGuesser\PersistentData\Model;
|
||||||
|
|
||||||
|
use DateTime;
|
||||||
|
|
||||||
class UserConfirmation extends Model
|
class UserConfirmation extends Model
|
||||||
{
|
{
|
||||||
protected static string $table = 'user_confirmations';
|
protected static string $table = 'user_confirmations';
|
||||||
|
|
||||||
protected static array $fields = ['user_id', 'token'];
|
protected static array $fields = ['user_id', 'token', 'last_sent'];
|
||||||
|
|
||||||
protected static array $relations = ['user' => User::class];
|
protected static array $relations = ['user' => User::class];
|
||||||
|
|
||||||
@ -14,6 +16,8 @@ class UserConfirmation extends Model
|
|||||||
|
|
||||||
private string $token = '';
|
private string $token = '';
|
||||||
|
|
||||||
|
private DateTime $lastSent;
|
||||||
|
|
||||||
public function setUser(User $user): void
|
public function setUser(User $user): void
|
||||||
{
|
{
|
||||||
$this->user = $user;
|
$this->user = $user;
|
||||||
@ -29,6 +33,16 @@ class UserConfirmation extends Model
|
|||||||
$this->token = $token;
|
$this->token = $token;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public function setLastSentDate(DateTime $lastSent): void
|
||||||
|
{
|
||||||
|
$this->lastSent = $lastSent;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function setLastSent(string $lastSent): void
|
||||||
|
{
|
||||||
|
$this->lastSent = new DateTime($lastSent);
|
||||||
|
}
|
||||||
|
|
||||||
public function getUser(): ?User
|
public function getUser(): ?User
|
||||||
{
|
{
|
||||||
return $this->user;
|
return $this->user;
|
||||||
@ -43,4 +57,14 @@ class UserConfirmation extends Model
|
|||||||
{
|
{
|
||||||
return $this->token;
|
return $this->token;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public function getLastSentDate(): DateTime
|
||||||
|
{
|
||||||
|
return $this->lastSent;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function getLastSent(): string
|
||||||
|
{
|
||||||
|
return $this->lastSent->format('Y-m-d H:i:s');
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user