src/BackendBundle/Helper/ValidationHelper.php line 216

Open in your IDE?
  1. <?php
  2. namespace App\BackendBundle\Helper;
  3. use DateTime;
  4. use DateInterval;
  5. Use Psr\Log\LoggerInterface;
  6. use Symfony\Component\HttpFoundation\Request;
  7. use Symfony\Component\HttpFoundation\RequestStack;
  8. use Symfony\Component\HttpFoundation\Session\SessionInterface;
  9. use App\Entity\SchoolClass;
  10. class ValidationHelper {
  11.     private RequestStack $requestStack;
  12.     private SessionInterface $session;
  13.     /* @var $logger LoggerInterface */
  14.     private $logger;
  15.     private $minutesValid;
  16.     private $formSaltText;
  17.     private $scoreSaltText;
  18.     public function __construct(RequestStack $requestStackLoggerInterface $logger) {
  19.         $this->requestStack $requestStack;
  20.         $this->session $this->requestStack->getSession();
  21.         $this->logger $logger;
  22.         $this->formSaltText "form-random-salt123";
  23.         $this->scoreSaltText "score-csrf-text-2022";
  24.         $this->minutesValid 5;
  25.     }
  26.     public function isEmailValid($email) {
  27.         return filter_var($emailFILTER_VALIDATE_EMAIL);
  28.     }
  29.     public function getCommonValidationData() {
  30.         $dt = new DateTime();
  31.         $strDateTime $dt->format("d.m.Y H:i:s");
  32.         $scoreSalt $this->scoreSaltText;
  33.         $csrftoken hash('sha256'"$strDateTime-$scoreSalt");
  34.         $data = array();
  35.         $data['datetime'] = $strDateTime;
  36.         $data["csrf"] = $csrftoken;
  37.         $this->session->set("common_csrf_token"$csrftoken);
  38.         return $data;
  39.     }
  40.     public function isCommonDataValid(Request $request) {
  41.         $submittedData $this->getCommonSubmittedData($request);
  42.         if (empty($submittedData)) {
  43.             return false;
  44.         }
  45.         $submittedToken $submittedData['csrf'];
  46.         $sessionToken $this->session->get("common_csrf_token");
  47.         if (empty($sessionToken)) {
  48.             return false;
  49.         }
  50.         if ($sessionToken != $submittedToken) {
  51.             return false;
  52.         }
  53.         return true;
  54.     }
  55.     public function getCommonSubmittedData(Request $request) {
  56.         $data = array();
  57.         $strDateTime $request->get('datetime');
  58.         if (empty($strDateTime)) {
  59.             $this->logger->error("Empty strDateTime");
  60.             return null;
  61.         }
  62.         $dt DateTime::createFromFormat("d.m.Y H:i:s"$strDateTime);
  63.         if ($dt == false) {
  64.             $this->logger->error("Wrong date time format");
  65.             return null;
  66.         }
  67.         $now = new DateTime();
  68.         /* @var $interval DateInterval */
  69.         $interval $dt->diff($now);
  70.         $minutes $interval->i;
  71.         /* if submitted data is older as 'minutesValid' return null -> error */
  72.         if ($minutes $this->minutesValid) {
  73.             $this->logger->error('Submitted data to old');
  74.             return null;
  75.         }
  76.         $data['dt'] = $dt->format('d.m.Y H:i');
  77.         $strCsrf $request->get('csrf');
  78.         if (empty($strCsrf)) {
  79.             $this->logger->error('No csrf token submitted');
  80.             return null;
  81.         }
  82.         $data['csrf'] = $strCsrf;
  83.         return $data;
  84.     }
  85.     public function getScoreValidationData(SchoolClass $schoolClass$round) {
  86.         $dt = new DateTime();
  87.         $strDateTime $dt->format("d.m.Y H:i:s");
  88.         $schoolClassID $schoolClass->getId();
  89.         $scoreSalt $this->scoreSaltText;
  90.         $csrftoken hash('sha256'"$strDateTime-$schoolClassID-$round-$scoreSalt");
  91.         $data = array();
  92.         $data['datetime'] = $strDateTime;
  93.         $data['schoolclassid'] = $schoolClassID;
  94.         $data['round'] = $round;
  95.         $data["csrf"] = $csrftoken;
  96.         $this->session->set("score_csrf_token"$csrftoken);
  97.         return $data;
  98.     }
  99.     public function isScoreValid(Request $request) {
  100.         $submittedData $this->getScoreSubmittedData($request);
  101.         if (empty($submittedData)) {
  102.             return false;
  103.         }
  104.         $submittedToken $submittedData['csrf'];
  105.         $sessionToken $this->session->get("score_csrf_token");
  106.         if (empty($sessionToken)) {
  107.             return false;
  108.         }
  109.         if ($sessionToken != $submittedToken) {
  110.             return false;
  111.         }
  112.         return true;
  113.     }
  114.     public function getScoreSubmittedData(Request $request) {
  115.         $data = array();
  116.         $strDateTime $request->get('datetime');
  117.         if (empty($strDateTime)) {
  118.             $this->logger->error("Empty date time string");
  119.             return null;
  120.         }
  121.         $dt DateTime::createFromFormat("d.m.Y H:i:s"$strDateTime);
  122.         if ($dt == false) {
  123.             $this->logger->error("Wrong date time format");
  124.             return null;
  125.         }
  126.         $now = new DateTime();
  127.         /* @var $interval DateInterval */
  128.         $interval $dt->diff($now);
  129.         $minutes $interval->i;
  130.         /* if submitted data is older as 'minutesValid' return null -> error */
  131.         if ($minutes $this->minutesValid) {
  132.             $this->logger->error("Submitted data is to old");
  133.             return null;
  134.         }
  135.         $data['dt'] = $dt->format('d.m.Y H:i');
  136.         $round $request->get('round');
  137.         if (empty($round)) {
  138.             $this->logger->error("Empty round value");
  139.             return null;
  140.         }
  141.         $data['round'] = intval($round);
  142.         $schoolClassID $request->get('schoolclassid');
  143.         if (empty($schoolClassID)) {
  144.             $this->logger->error("Empty school class id");
  145.             return null;
  146.         }
  147.         $data['schoolclassid'] = intval($schoolClassID);
  148.         $strCsrf $request->get('csrf');
  149.         if (empty($strCsrf)) {
  150.             $this->logger->error("Empty csrf token");
  151.             return null;
  152.         }
  153.         $data['csrf'] = $strCsrf;
  154.         return $data;
  155.     }
  156.     public function getFormValidationData($formName) {
  157.         $dt = new DateTime();
  158.         $strDateTime $dt->format("d.m.Y H:i:s");
  159.         $formSalt $this->formSaltText;
  160.         $csrftoken hash('sha256'"$strDateTime-$formName-$formSalt");
  161.         $data = array();
  162.         $data['datetime'] = $strDateTime;
  163.         $data['formname'] = $formName;
  164.         $data["csrf"] = $csrftoken;
  165.         $this->session->set("csrf_token_$formName"$csrftoken);
  166.         return $data;
  167.     }
  168.     public function isFormValid($formNameRequest $request) {
  169.         $submittedData $this->getSubmittedData($formName$request);
  170.         if (empty($submittedData)) {
  171.             return false;
  172.         }
  173.         $submittedToken $submittedData['csrf'];
  174.         $sessionToken $this->session->get("csrf_token_$formName");
  175.         if (empty($sessionToken)) {
  176.             return false;
  177.         }
  178.         if ($sessionToken != $submittedToken) {
  179.             return false;
  180.         }
  181.         return true;
  182.     }
  183.     public function getSubmittedData($formNameRequest $request) {
  184.         $data = array();
  185.         $strDateTime $request->get('valid_dt');
  186.         if (empty($strDateTime)) {
  187.             $this->logger->error("Empty date time string");
  188.             return null;
  189.         }
  190.         $dt DateTime::createFromFormat("d.m.Y H:i:s"$strDateTime);
  191.         if ($dt == false) {
  192.             $this->logger->error("Wrong date time format");
  193.             return null;
  194.         }
  195.         $now = new DateTime();
  196.         /* @var $interval DateInterval */
  197.         $interval $dt->diff($now);
  198.         $minutes $interval->i;
  199.         /* if submitted data is older as 'minutesValid' return null -> error */
  200.         if ($minutes $this->minutesValid) {
  201.             $this->logger->error("Submitted data too old");
  202.             return null;
  203.         }
  204.         $data['dt'] = $dt->format('d.m.Y H:i');
  205.         $submittedFormName $request->get('valid_formname');
  206.         if (empty($submittedFormName)) {
  207.             $this->logger->error("Empty form name");
  208.             return null;
  209.         }
  210.         if ($submittedFormName != $formName) {
  211.             $this->logger->error("Form name doesnt match");
  212.             return null;
  213.         }
  214.         $data['formName'] = $formName;
  215.         $strCsrf $request->get('valid_csrf');
  216.         if (empty($strCsrf)) {
  217.             $this->logger->error("empty csrf token");
  218.             return null;
  219.         }
  220.         $data['csrf'] = $strCsrf;
  221.         return $data;
  222.     }
  223. }