<?php
namespace App\Entity\System;
use Doctrine\ORM\Mapping as ORM;
/**
* @ORM\Table(name="multifactor_auth",
* indexes={
*
* @ORM\Index(name="auth_code_idx", columns={"auth_code"}),
* @ORM\Index(name="cookie_value_idx", columns={"cookie_value"}),
* @ORM\Index(name="valid_until_idx", columns={"valid_until"}),
* @ORM\Index(name="date_add_idx", columns={"date_add"})
* }
* )
*
* @ORM\Entity(repositoryClass="App\Repository\System\MultifactorAuthRepository")
*/
class MultifactorAuth
{
public const AUTH_CODE_LENGTH = 6;
/**
* @ORM\Id()
*
* @ORM\GeneratedValue()
*
* @ORM\Column(name="id", type="integer")
*/
private $id;
/**
* @var Customer
*
* @ORM\ManyToOne(targetEntity="App\Entity\System\Customer")
*
* @ORM\JoinColumn(name="customer_id", referencedColumnName="id_customer")
*/
private $customer;
/**
* @var Employee
*
* @ORM\ManyToOne(targetEntity="App\Entity\System\Employee")
*
* @ORM\JoinColumn(name="employee_id", referencedColumnName="id_employee")
*/
private $employee;
/**
* @var string|null
*
* @ORM\Column(name="auth_code", type="string", length=64, nullable=true)
*/
private $authCode;
/**
* @var int
*
* @ORM\Column(name="times_auth_code_emailed", type="integer", nullable=false)
*/
private $timesAuthCodeEmailed;
/**
* @var string|null
*
* @ORM\Column(name="cookie_value", type="string", length=64, nullable=true)
*/
private $cookieValue;
/**
* @var \DateTime
*
* @ORM\Column(type="datetime")
*/
private $dateAdd;
/**
* @var \DateTime|null
*
* @ORM\Column(name="valid_until", type="datetime", nullable=true)
*/
private $validUntil;
/**
* @param Customer $customer
*
* @return MultifactorAuth
*
* @throws \Exception
*/
public static function fromCustomer(Customer $customer): MultifactorAuth
{
$multifactorAuth = new self();
$multifactorAuth->customer = $customer;
$multifactorAuth->authCode = $multifactorAuth->generateAuthCode();
$multifactorAuth->dateAdd = new \DateTime();
$multifactorAuth->timesAuthCodeEmailed = 0;
return $multifactorAuth;
}
/**
* @param Employee $employee
*
* @return MultifactorAuth
*
* @throws \Exception
*/
public static function fromEmployee(Employee $employee): MultifactorAuth
{
$multifactorAuth = new self();
$multifactorAuth->employee = $employee;
$multifactorAuth->authCode = $multifactorAuth->generateAuthCode();
$multifactorAuth->dateAdd = new \DateTime();
$multifactorAuth->timesAuthCodeEmailed = 0;
return $multifactorAuth;
}
/**
* @param string $cookieValue
* @param int $timestampValidUntil
*
* @return void
*/
public function setCookieData(string $cookieValue, int $timestampValidUntil)
{
$this->authCode = null;
$this->cookieValue = $cookieValue;
$this->validUntil = \DateTime::createFromFormat('U', $timestampValidUntil);
}
/**
* @return string
*
* @throws \Exception
*/
private function generateAuthCode(): string
{
$authCode = '';
for ($i = 0; $i < self::AUTH_CODE_LENGTH; $i++) {
$authCode .= random_int(0, 9);
}
return $authCode;
}
/**
* @return string|null
*/
public function getAuthCode(): ?string
{
return $this->authCode;
}
/**
* @return int
*/
public function getTimesAuthCodeEmailed(): int
{
return $this->timesAuthCodeEmailed;
}
/**
* @return void
*/
public function emailedOnceAgain()
{
$this->timesAuthCodeEmailed++;
}
}