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…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user