Compare commits
30
Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
a255180a4d
|
||
|
|
af09da8782
|
||
|
|
ddfea0530d
|
||
|
|
9d7d19899d
|
||
|
|
10f032a9a5
|
||
|
|
c02e35580f
|
||
|
|
afd58bb91b
|
||
|
|
fc6792ccfc
|
||
|
|
a5ba8e71e4
|
||
|
|
184f63585c
|
||
|
|
d666593fde
|
||
|
|
75fad05362
|
||
|
|
45b34cb514
|
||
|
|
a6ba53764b
|
||
|
|
e70f8a9965
|
||
|
|
4aadcab2d2
|
||
|
|
9aea195f85
|
||
|
|
eafcf2315e
|
||
|
|
e52300b9e5
|
||
|
|
ee4a9f2ce3
|
||
|
|
8141845ae9
|
||
|
|
69f54c861a
|
||
|
|
c9ab7c31b7
|
||
|
|
82279f11d3
|
||
|
|
6cb4e06acc
|
||
|
|
ee33fc1913
|
||
|
|
4fb1831763
|
||
|
|
9dee8ba988
|
||
|
|
82562117b2
|
||
|
|
317a4de5c0
|
No files matched your search
+1
-1
@@ -10,7 +10,7 @@
|
||||
}
|
||||
],
|
||||
"require": {
|
||||
"esoko/soko-web": "0.3",
|
||||
"esoko/soko-web": "0.10.1",
|
||||
"fzaninotto/faker": "^1.9"
|
||||
},
|
||||
"require-dev": {
|
||||
|
||||
Generated
+4
-4
@@ -4,15 +4,15 @@
|
||||
"Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies",
|
||||
"This file is @generated automatically"
|
||||
],
|
||||
"content-hash": "0f82e530dedc414cfc0b04daf3c2085c",
|
||||
"content-hash": "27b6af78f89ef8dde87e918118511571",
|
||||
"packages": [
|
||||
{
|
||||
"name": "esoko/soko-web",
|
||||
"version": "v0.3",
|
||||
"version": "v0.10.1",
|
||||
"source": {
|
||||
"type": "git",
|
||||
"url": "https://git.esoko.eu/esoko/soko-web.git",
|
||||
"reference": "014a5480967c03c00dda5ee34c7eaf4be224b96e"
|
||||
"reference": "585d469b695365e6f8c0f9b596dbb18b6d3ce584"
|
||||
},
|
||||
"require": {
|
||||
"phpmailer/phpmailer": "^6.8",
|
||||
@@ -33,7 +33,7 @@
|
||||
"GNU GPL 3.0"
|
||||
],
|
||||
"description": "Lightweight web framework",
|
||||
"time": "2023-04-16T14:54:22+00:00"
|
||||
"time": "2023-05-02T16:06:33+00:00"
|
||||
},
|
||||
{
|
||||
"name": "fzaninotto/faker",
|
||||
|
||||
@@ -15,9 +15,11 @@ $dotenv->load();
|
||||
class Container
|
||||
{
|
||||
static SokoWeb\Interfaces\Database\IConnection $dbConnection;
|
||||
static SokoWeb\Routing\RouteCollection $routeCollection;
|
||||
static SokoWeb\Interfaces\PersistentData\IPersistentDataManager $persistentDataManager;
|
||||
static SokoWeb\Interfaces\Routing\IRouteCollection $routeCollection;
|
||||
static SokoWeb\Interfaces\Session\ISessionHandler $sessionHandler;
|
||||
static SokoWeb\Interfaces\Request\IRequest $request;
|
||||
}
|
||||
|
||||
Container::$dbConnection = new SokoWeb\Database\Mysql\Connection($_ENV['DB_HOST'], $_ENV['DB_USER'], $_ENV['DB_PASSWORD'], $_ENV['DB_NAME']);
|
||||
Container::$persistentDataManager = new SokoWeb\PersistentData\PersistentDataManager(Container::$dbConnection);
|
||||
@@ -1,66 +1,3 @@
|
||||
<?php
|
||||
|
||||
use SokoWeb\Interfaces\Response\IRedirect;
|
||||
use SokoWeb\Interfaces\Response\IContent;
|
||||
use SokoWeb\Interfaces\Authentication\IAuthenticationRequired;
|
||||
use SokoWeb\Interfaces\Authorization\ISecured;
|
||||
use SokoWeb\Response\Redirect;
|
||||
use SokoWeb\Response\HtmlContent;
|
||||
use SokoWeb\Response\JsonContent;
|
||||
|
||||
require '../web.php';
|
||||
|
||||
$method = strtolower($_SERVER['REQUEST_METHOD']);
|
||||
$url = substr($_SERVER['REQUEST_URI'], strlen('/'));
|
||||
if (($pos = strpos($url, '?')) !== false) {
|
||||
$url = substr($url, 0, $pos);
|
||||
}
|
||||
$url = rawurldecode($url);
|
||||
|
||||
$match = Container::$routeCollection->match($method, $url == '' ? [] : explode('/', $url));
|
||||
|
||||
if ($match !== null) {
|
||||
list($route, $params) = $match;
|
||||
|
||||
Container::$request->setParsedRouteParams($params);
|
||||
|
||||
$handler = $route->getHandler();
|
||||
$controller = new $handler[0](Container::$request);
|
||||
|
||||
if (
|
||||
$controller instanceof IAuthenticationRequired &&
|
||||
$controller->isAuthenticationRequired() &&
|
||||
Container::$request->user() === null
|
||||
) {
|
||||
Container::$request->session()->set('redirect_after_login', substr($_SERVER['REQUEST_URI'], strlen('/')));
|
||||
$response = new Redirect(Container::$routeCollection->getRoute('login')->generateLink(), IRedirect::TEMPORARY);
|
||||
header('Location: ' . $response->getUrl(), true, $response->getHttpCode());
|
||||
return;
|
||||
}
|
||||
|
||||
if ($method === 'post' && Container::$request->post('anti_csrf_token') !== Container::$request->session()->get('anti_csrf_token')) {
|
||||
$content = new JsonContent(['error' => 'no_valid_anti_csrf_token']);
|
||||
header('Content-Type: text/html; charset=UTF-8', true, 403);
|
||||
$content->render();
|
||||
return;
|
||||
}
|
||||
|
||||
if (
|
||||
!($controller instanceof ISecured) ||
|
||||
$controller->authorize()
|
||||
) {
|
||||
$response = call_user_func([$controller, $handler[1]]);
|
||||
if ($response instanceof IContent) {
|
||||
header('Content-Type: ' . $response->getContentType() . '; charset=UTF-8');
|
||||
$response->render();
|
||||
return;
|
||||
} elseif ($response instanceof IRedirect) {
|
||||
header('Location: ' . $response->getUrl(), true, $response->getHttpCode());
|
||||
return;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
$content = new HtmlContent('error/404');
|
||||
header('Content-Type: text/html; charset=UTF-8', true, 404);
|
||||
$content->render();
|
||||
@@ -1,7 +1,6 @@
|
||||
<?php namespace MapGuesser\Cli;
|
||||
|
||||
use DateTime;
|
||||
use SokoWeb\PersistentData\PersistentDataManager;
|
||||
use MapGuesser\PersistentData\Model\User;
|
||||
use Symfony\Component\Console\Command\Command;
|
||||
use Symfony\Component\Console\Input\InputArgument;
|
||||
@@ -32,8 +31,7 @@ class AddUserCommand extends Command
|
||||
}
|
||||
|
||||
try {
|
||||
$pdm = new PersistentDataManager();
|
||||
$pdm->saveToDb($user);
|
||||
\Container::$persistentDataManager->saveToDb($user);
|
||||
} catch (\Exception $e) {
|
||||
$output->writeln('<error>Adding user failed!</error>');
|
||||
$output->writeln('');
|
||||
|
||||
@@ -4,7 +4,6 @@ use DateTime;
|
||||
use SokoWeb\Database\Query\Modify;
|
||||
use SokoWeb\Database\Query\Select;
|
||||
use SokoWeb\Interfaces\Database\IResultSet;
|
||||
use SokoWeb\PersistentData\PersistentDataManager;
|
||||
use MapGuesser\Repository\MultiRoomRepository;
|
||||
use MapGuesser\Repository\UserConfirmationRepository;
|
||||
use MapGuesser\Repository\UserPasswordResetterRepository;
|
||||
@@ -16,8 +15,6 @@ use Symfony\Component\Console\Output\OutputInterface;
|
||||
|
||||
class MaintainDatabaseCommand extends Command
|
||||
{
|
||||
private PersistentDataManager $pdm;
|
||||
|
||||
private UserRepository $userRepository;
|
||||
|
||||
private UserConfirmationRepository $userConfirmationRepository;
|
||||
@@ -32,7 +29,6 @@ class MaintainDatabaseCommand extends Command
|
||||
{
|
||||
parent::__construct();
|
||||
|
||||
$this->pdm = new PersistentDataManager();
|
||||
$this->userRepository = new UserRepository();
|
||||
$this->userConfirmationRepository = new UserConfirmationRepository();
|
||||
$this->userPasswordResetterRepository = new UserPasswordResetterRepository();
|
||||
@@ -77,19 +73,19 @@ class MaintainDatabaseCommand extends Command
|
||||
//TODO: these can be in some wrapper class
|
||||
$userConfirmation = $this->userConfirmationRepository->getByUser($user);
|
||||
if ($userConfirmation !== null) {
|
||||
$this->pdm->deleteFromDb($userConfirmation);
|
||||
\Container::$persistentDataManager->deleteFromDb($userConfirmation);
|
||||
}
|
||||
|
||||
$userPasswordResetter = $this->userPasswordResetterRepository->getByUser($user);
|
||||
if ($userPasswordResetter !== null) {
|
||||
$this->pdm->deleteFromDb($userPasswordResetter);
|
||||
\Container::$persistentDataManager->deleteFromDb($userPasswordResetter);
|
||||
}
|
||||
|
||||
foreach ($this->userPlayedPlaceRepository->getAllByUser($user) as $userPlayedPlace) {
|
||||
$this->pdm->deleteFromDb($userPlayedPlace);
|
||||
\Container::$persistentDataManager->deleteFromDb($userPlayedPlace);
|
||||
}
|
||||
|
||||
$this->pdm->deleteFromDb($user);
|
||||
\Container::$persistentDataManager->deleteFromDb($user);
|
||||
}
|
||||
|
||||
\Container::$dbConnection->commit();
|
||||
@@ -98,14 +94,14 @@ class MaintainDatabaseCommand extends Command
|
||||
private function deleteExpiredPasswordResetters(): void
|
||||
{
|
||||
foreach ($this->userPasswordResetterRepository->getAllExpired() as $passwordResetter) {
|
||||
$this->pdm->deleteFromDb($passwordResetter);
|
||||
\Container::$persistentDataManager->deleteFromDb($passwordResetter);
|
||||
}
|
||||
}
|
||||
|
||||
private function deleteExpiredRooms(): void
|
||||
{
|
||||
foreach ($this->multiRoomRepository->getAllExpired() as $multiRoom) {
|
||||
$this->pdm->deleteFromDb($multiRoom);
|
||||
\Container::$persistentDataManager->deleteFromDb($multiRoom);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -3,7 +3,6 @@
|
||||
use DateTime;
|
||||
use Faker\Factory;
|
||||
use SokoWeb\Interfaces\Authentication\IAuthenticationRequired;
|
||||
use SokoWeb\Interfaces\Request\IRequest;
|
||||
use SokoWeb\Response\HtmlContent;
|
||||
use SokoWeb\Response\JsonContent;
|
||||
use SokoWeb\Interfaces\Response\IContent;
|
||||
@@ -13,7 +12,6 @@ use MapGuesser\PersistentData\Model\Challenge;
|
||||
use MapGuesser\PersistentData\Model\MultiRoom;
|
||||
use MapGuesser\PersistentData\Model\PlaceInChallenge;
|
||||
use MapGuesser\PersistentData\Model\UserInChallenge;
|
||||
use SokoWeb\PersistentData\PersistentDataManager;
|
||||
use MapGuesser\Repository\ChallengeRepository;
|
||||
use MapGuesser\Repository\MapRepository;
|
||||
use MapGuesser\Repository\MultiRoomRepository;
|
||||
@@ -25,10 +23,6 @@ class GameController implements IAuthenticationRequired
|
||||
{
|
||||
const NUMBER_OF_ROUNDS = 5;
|
||||
|
||||
private IRequest $request;
|
||||
|
||||
private PersistentDataManager $pdm;
|
||||
|
||||
private MultiConnector $multiConnector;
|
||||
|
||||
private MultiRoomRepository $multiRoomRepository;
|
||||
@@ -41,10 +35,8 @@ class GameController implements IAuthenticationRequired
|
||||
|
||||
private UserInChallengeRepository $userInChallengeRepository;
|
||||
|
||||
public function __construct(IRequest $request)
|
||||
public function __construct()
|
||||
{
|
||||
$this->request = $request;
|
||||
$this->pdm = new PersistentDataManager();
|
||||
$this->multiConnector = new MultiConnector();
|
||||
$this->multiRoomRepository = new MultiRoomRepository();
|
||||
$this->mapRepository = new MapRepository();
|
||||
@@ -60,14 +52,14 @@ class GameController implements IAuthenticationRequired
|
||||
|
||||
public function getGame(): IContent
|
||||
{
|
||||
$mapId = (int) $this->request->query('mapId');
|
||||
$mapId = (int) \Container::$request->query('mapId');
|
||||
|
||||
return new HtmlContent('game', ['mapId' => $mapId]);
|
||||
}
|
||||
|
||||
public function getNewMultiGame(): IRedirect
|
||||
{
|
||||
$mapId = (int) $this->request->query('mapId');
|
||||
$mapId = (int) \Container::$request->query('mapId');
|
||||
$map = $this->mapRepository->getById($mapId);
|
||||
$roomId = bin2hex(random_bytes(3));
|
||||
$token = $this->getMultiToken($roomId);
|
||||
@@ -83,7 +75,7 @@ class GameController implements IAuthenticationRequired
|
||||
$room->setMembersArray(['owner' => $token, 'all' => []]);
|
||||
$room->setUpdatedDate(new DateTime());
|
||||
|
||||
$this->pdm->saveToDb($room);
|
||||
\Container::$persistentDataManager->saveToDb($room);
|
||||
|
||||
$this->multiConnector->sendMessage('create_room', ['roomId' => $roomId]);
|
||||
|
||||
@@ -97,14 +89,14 @@ class GameController implements IAuthenticationRequired
|
||||
|
||||
public function getMultiGame(): IContent
|
||||
{
|
||||
$roomId = $this->request->query('roomId');
|
||||
$roomId = \Container::$request->query('roomId');
|
||||
|
||||
return new HtmlContent('game', ['roomId' => $roomId]);
|
||||
}
|
||||
|
||||
public function getChallenge(): IContent
|
||||
{
|
||||
$challengeToken = $this->request->query('challengeToken');
|
||||
$challengeToken = \Container::$request->query('challengeToken');
|
||||
|
||||
return new HtmlContent('game', ['challengeToken' => $challengeToken]);
|
||||
}
|
||||
@@ -121,27 +113,27 @@ class GameController implements IAuthenticationRequired
|
||||
$challenge->setToken($challengeToken);
|
||||
$challenge->setCreatedDate(new DateTime());
|
||||
|
||||
if ($this->request->post('timerEnabled') !== null && $this->request->post('timeLimit') !== null) {
|
||||
$challenge->setTimeLimit($this->request->post('timeLimit'));
|
||||
if (\Container::$request->post('timerEnabled') !== null && \Container::$request->post('timeLimit') !== null) {
|
||||
$challenge->setTimeLimit(\Container::$request->post('timeLimit'));
|
||||
}
|
||||
if ($this->request->post('timeLimitType') !== null) {
|
||||
$challenge->setTimeLimitType($this->request->post('timeLimitType'));
|
||||
if (\Container::$request->post('timeLimitType') !== null) {
|
||||
$challenge->setTimeLimitType(\Container::$request->post('timeLimitType'));
|
||||
}
|
||||
if ($this->request->post('noMove') !== null) {
|
||||
if (\Container::$request->post('noMove') !== null) {
|
||||
$challenge->setNoMove(true);
|
||||
}
|
||||
if ($this->request->post('noPan') !== null) {
|
||||
if (\Container::$request->post('noPan') !== null) {
|
||||
$challenge->setNoPan(true);
|
||||
}
|
||||
if ($this->request->post('noZoom') !== null) {
|
||||
if (\Container::$request->post('noZoom') !== null) {
|
||||
$challenge->setNoZoom(true);
|
||||
}
|
||||
|
||||
$this->pdm->saveToDb($challenge);
|
||||
\Container::$persistentDataManager->saveToDb($challenge);
|
||||
|
||||
// save owner/creator
|
||||
|
||||
$session = $this->request->session();
|
||||
$session = \Container::$request->session();
|
||||
$userId = $session->get('userId');
|
||||
|
||||
$userInChallenge = new UserInChallenge();
|
||||
@@ -150,11 +142,11 @@ class GameController implements IAuthenticationRequired
|
||||
$userInChallenge->setTimeLeft($challenge->getTimeLimit());
|
||||
$userInChallenge->setIsOwner(true);
|
||||
|
||||
$this->pdm->saveToDb($userInChallenge);
|
||||
\Container::$persistentDataManager->saveToDb($userInChallenge);
|
||||
|
||||
// select places
|
||||
|
||||
$mapId = (int) $this->request->post('mapId');
|
||||
$mapId = (int) \Container::$request->post('mapId');
|
||||
// $map = $this->mapRepository->getById($mapId);
|
||||
|
||||
$places = $this->placeRepository->getRandomNPlaces($mapId, static::NUMBER_OF_ROUNDS, $userId);
|
||||
@@ -165,7 +157,7 @@ class GameController implements IAuthenticationRequired
|
||||
$placeInChallenge->setPlace($place);
|
||||
$placeInChallenge->setChallenge($challenge);
|
||||
$placeInChallenge->setRound($round++);
|
||||
$this->pdm->saveToDb($placeInChallenge);
|
||||
\Container::$persistentDataManager->saveToDb($placeInChallenge);
|
||||
}
|
||||
|
||||
return new JsonContent(['challengeToken' => dechex($challengeToken)]);
|
||||
@@ -173,9 +165,9 @@ class GameController implements IAuthenticationRequired
|
||||
|
||||
public function prepareGame(): IContent
|
||||
{
|
||||
$mapId = (int) $this->request->query('mapId');
|
||||
$mapId = (int) \Container::$request->query('mapId');
|
||||
$map = $this->mapRepository->getById($mapId);
|
||||
$session = $this->request->session();
|
||||
$session = \Container::$request->session();
|
||||
|
||||
if (!($state = $session->get('state')) || $state['mapId'] !== $mapId) {
|
||||
$session->set('state', [
|
||||
@@ -198,8 +190,8 @@ class GameController implements IAuthenticationRequired
|
||||
|
||||
public function prepareMultiGame(): IContent
|
||||
{
|
||||
$roomId = $this->request->query('roomId');
|
||||
$userName = $this->request->post('userName');
|
||||
$roomId = \Container::$request->query('roomId');
|
||||
$userName = \Container::$request->post('userName');
|
||||
if (empty($userName)) {
|
||||
$faker = Factory::create();
|
||||
$userName = $faker->userName;
|
||||
@@ -228,7 +220,7 @@ class GameController implements IAuthenticationRequired
|
||||
$room->setMembersArray($members);
|
||||
$room->setUpdatedDate(new DateTime());
|
||||
|
||||
$this->pdm->saveToDb($room);
|
||||
\Container::$persistentDataManager->saveToDb($room);
|
||||
|
||||
$this->multiConnector->sendMessage('join_room', [
|
||||
'roomId' => $roomId,
|
||||
@@ -248,8 +240,8 @@ class GameController implements IAuthenticationRequired
|
||||
|
||||
public function prepareChallenge(): IContent
|
||||
{
|
||||
$challengeToken_str = $this->request->query('challengeToken');
|
||||
$session = $this->request->session();
|
||||
$challengeToken_str = \Container::$request->query('challengeToken');
|
||||
$session = \Container::$request->session();
|
||||
$userId = $session->get('userId');
|
||||
|
||||
if (!isset($userId))
|
||||
@@ -270,7 +262,7 @@ class GameController implements IAuthenticationRequired
|
||||
$userInChallenge->setUserId($userId);
|
||||
$userInChallenge->setChallenge($challenge);
|
||||
$userInChallenge->setTimeLeft($challenge->getTimeLimit());
|
||||
$this->pdm->saveToDb($userInChallenge);
|
||||
\Container::$persistentDataManager->saveToDb($userInChallenge);
|
||||
}
|
||||
|
||||
$map = $this->mapRepository->getByChallenge($challenge);
|
||||
@@ -284,7 +276,7 @@ class GameController implements IAuthenticationRequired
|
||||
|
||||
private function getMultiToken(string $roomId): string
|
||||
{
|
||||
$session = $this->request->session();
|
||||
$session = \Container::$request->session();
|
||||
|
||||
if (!($multiState = $session->get('multiState')) || $multiState['roomId'] !== $roomId) {
|
||||
$token = bin2hex(random_bytes(16));
|
||||
|
||||
@@ -2,12 +2,10 @@
|
||||
|
||||
use DateTime;
|
||||
use SokoWeb\Interfaces\Authentication\IAuthenticationRequired;
|
||||
use SokoWeb\Interfaces\Request\IRequest;
|
||||
use MapGuesser\Util\Geo\Position;
|
||||
use SokoWeb\Response\JsonContent;
|
||||
use SokoWeb\Interfaces\Response\IContent;
|
||||
use MapGuesser\Multi\MultiConnector;
|
||||
use SokoWeb\PersistentData\PersistentDataManager;
|
||||
use MapGuesser\PersistentData\Model\Challenge;
|
||||
use MapGuesser\PersistentData\Model\Guess;
|
||||
use MapGuesser\PersistentData\Model\Map;
|
||||
@@ -27,10 +25,6 @@ class GameFlowController implements IAuthenticationRequired
|
||||
const NUMBER_OF_ROUNDS = 5;
|
||||
const MAX_SCORE = 1000;
|
||||
|
||||
private IRequest $request;
|
||||
|
||||
private PersistentDataManager $pdm;
|
||||
|
||||
private MultiConnector $multiConnector;
|
||||
|
||||
private MultiRoomRepository $multiRoomRepository;
|
||||
@@ -45,10 +39,8 @@ class GameFlowController implements IAuthenticationRequired
|
||||
|
||||
private GuessRepository $guessRepository;
|
||||
|
||||
public function __construct(IRequest $request)
|
||||
public function __construct()
|
||||
{
|
||||
$this->request = $request;
|
||||
$this->pdm = new PersistentDataManager();
|
||||
$this->multiConnector = new MultiConnector();
|
||||
$this->multiRoomRepository = new MultiRoomRepository();
|
||||
$this->placeRepository = new PlaceRepository();
|
||||
@@ -65,8 +57,8 @@ class GameFlowController implements IAuthenticationRequired
|
||||
|
||||
public function initialData(): IContent
|
||||
{
|
||||
$mapId = (int) $this->request->query('mapId');
|
||||
$session = $this->request->session();
|
||||
$mapId = (int) \Container::$request->query('mapId');
|
||||
$session = \Container::$request->session();
|
||||
|
||||
if (!($state = $session->get('state')) || $state['mapId'] !== $mapId) {
|
||||
return new JsonContent(['error' => 'no_session_found']);
|
||||
@@ -103,8 +95,8 @@ class GameFlowController implements IAuthenticationRequired
|
||||
|
||||
public function multiInitialData(): IContent
|
||||
{
|
||||
$roomId = $this->request->query('roomId');
|
||||
$session = $this->request->session();
|
||||
$roomId = \Container::$request->query('roomId');
|
||||
$session = \Container::$request->session();
|
||||
|
||||
if (!($multiState = $session->get('multiState')) || $multiState['roomId'] !== $roomId) {
|
||||
return new JsonContent(['error' => 'no_session_found']);
|
||||
@@ -122,7 +114,7 @@ class GameFlowController implements IAuthenticationRequired
|
||||
$this->startNewGame($state, $state['mapId']);
|
||||
$room->setStateArray($state);
|
||||
$room->setUpdatedDate(new DateTime());
|
||||
$this->pdm->saveToDb($room);
|
||||
\Container::$persistentDataManager->saveToDb($room);
|
||||
}
|
||||
|
||||
$places = [];
|
||||
@@ -146,7 +138,7 @@ class GameFlowController implements IAuthenticationRequired
|
||||
// if the last round was played ($currentPlace == null) or history is explicitly requested (for initializing)
|
||||
if (!isset($currentPlace) || $withHistory) {
|
||||
|
||||
$withRelations = [User::class, PlaceInChallenge::class, Place::class];
|
||||
$withRelations = ['user', 'place_in_challange', 'place'];
|
||||
foreach ($this->guessRepository->getAllInChallenge($challenge, $withRelations) as $guess) {
|
||||
$round = $guess->getPlaceInChallenge()->getRound();
|
||||
|
||||
@@ -195,7 +187,7 @@ class GameFlowController implements IAuthenticationRequired
|
||||
|
||||
$prevRound = $currentRound - 1;
|
||||
if ($prevRound >= 0) {
|
||||
foreach ($this->guessRepository->getAllInChallengeByRound($prevRound, $challenge, [User::class]) as $guess) {
|
||||
foreach ($this->guessRepository->getAllInChallengeByRound($prevRound, $challenge, ['user']) as $guess) {
|
||||
if ($guess->getUser()->getId() != $userId) {
|
||||
$response['allResults'][] = [
|
||||
'userName' => $guess->getUser()->getDisplayName(),
|
||||
@@ -221,10 +213,10 @@ class GameFlowController implements IAuthenticationRequired
|
||||
|
||||
public function challengeInitialData(): IContent
|
||||
{
|
||||
$session = $this->request->session();
|
||||
$session = \Container::$request->session();
|
||||
$userId = $session->get('userId');
|
||||
$challengeToken_str = $this->request->query('challengeToken');
|
||||
$userInChallenge = $this->userInChallengeRepository->getByUserIdAndToken($userId, $challengeToken_str, [Challenge::class]);
|
||||
$challengeToken_str = \Container::$request->query('challengeToken');
|
||||
$userInChallenge = $this->userInChallengeRepository->getByUserIdAndToken($userId, $challengeToken_str, ['challenge']);
|
||||
|
||||
if (!isset($userInChallenge)) {
|
||||
return new JsonContent(['error' => 'game_not_found']);
|
||||
@@ -245,15 +237,15 @@ class GameFlowController implements IAuthenticationRequired
|
||||
|
||||
public function guess(): IContent
|
||||
{
|
||||
$mapId = (int) $this->request->query('mapId');
|
||||
$session = $this->request->session();
|
||||
$mapId = (int) \Container::$request->query('mapId');
|
||||
$session = \Container::$request->session();
|
||||
|
||||
if (!($state = $session->get('state')) || $state['mapId'] !== $mapId) {
|
||||
return new JsonContent(['error' => 'no_session_found']);
|
||||
}
|
||||
|
||||
$last = $state['rounds'][$state['currentRound']];
|
||||
$guessPosition = new Position((float) $this->request->post('lat'), (float) $this->request->post('lng'));
|
||||
$guessPosition = new Position((float) \Container::$request->post('lat'), (float) \Container::$request->post('lng'));
|
||||
$result = $this->evaluateGuess($last['position'], $guessPosition, $state['area']);
|
||||
|
||||
$last['guessPosition'] = $guessPosition;
|
||||
@@ -286,7 +278,7 @@ class GameFlowController implements IAuthenticationRequired
|
||||
// save the selected place for the round in UserPlayedPlace
|
||||
private function saveVisit($placeId): void
|
||||
{
|
||||
$session = $this->request->session();
|
||||
$session = \Container::$request->session();
|
||||
$userId = $session->get('userId');
|
||||
|
||||
if (isset($userId)) {
|
||||
@@ -299,14 +291,14 @@ class GameFlowController implements IAuthenticationRequired
|
||||
$userPlayedPlace->incrementOccurrences();
|
||||
}
|
||||
$userPlayedPlace->setLastTimeDate(new DateTime());
|
||||
$this->pdm->saveToDb($userPlayedPlace);
|
||||
\Container::$persistentDataManager->saveToDb($userPlayedPlace);
|
||||
}
|
||||
}
|
||||
|
||||
public function multiGuess(): IContent
|
||||
{
|
||||
$roomId = $this->request->query('roomId');
|
||||
$session = $this->request->session();
|
||||
$roomId = \Container::$request->query('roomId');
|
||||
$session = \Container::$request->session();
|
||||
|
||||
if (!($multiState = $session->get('multiState')) || $multiState['roomId'] !== $roomId) {
|
||||
return new JsonContent(['error' => 'no_session_found']);
|
||||
@@ -316,7 +308,7 @@ class GameFlowController implements IAuthenticationRequired
|
||||
$state = $room->getStateArray();
|
||||
|
||||
$last = $state['rounds'][$state['currentRound']];
|
||||
$guessPosition = new Position((float) $this->request->post('lat'), (float) $this->request->post('lng'));
|
||||
$guessPosition = new Position((float) \Container::$request->post('lat'), (float) \Container::$request->post('lng'));
|
||||
$result = $this->evaluateGuess($last['position'], $guessPosition, $state['area']);
|
||||
|
||||
$responseFromMulti = $this->multiConnector->sendMessage('guess', [
|
||||
@@ -342,10 +334,10 @@ class GameFlowController implements IAuthenticationRequired
|
||||
|
||||
public function challengeGuess(): IContent
|
||||
{
|
||||
$session = $this->request->session();
|
||||
$session = \Container::$request->session();
|
||||
$userId = $session->get('userId');
|
||||
$challengeToken_str = $this->request->query('challengeToken');
|
||||
$userInChallenge = $this->userInChallengeRepository->getByUserIdAndToken($userId, $challengeToken_str, [Challenge::class]);
|
||||
$challengeToken_str = \Container::$request->query('challengeToken');
|
||||
$userInChallenge = $this->userInChallengeRepository->getByUserIdAndToken($userId, $challengeToken_str, ['challenge']);
|
||||
|
||||
if (!isset($userInChallenge)) {
|
||||
return new JsonContent(['error' => 'game_not_found']);
|
||||
@@ -353,7 +345,7 @@ class GameFlowController implements IAuthenticationRequired
|
||||
|
||||
$challenge = $userInChallenge->getChallenge();
|
||||
$currentRound = $userInChallenge->getCurrentRound();
|
||||
$currentPlaceInChallenge = $this->placeInChallengeRepository->getByRoundInChallenge($currentRound, $challenge, [Place::class, Map::class]);
|
||||
$currentPlaceInChallenge = $this->placeInChallengeRepository->getByRoundInChallenge($currentRound, $challenge, ['place', 'map']);
|
||||
$currentPlace = $currentPlaceInChallenge->getPlace();
|
||||
$map = $currentPlace->getMap();
|
||||
|
||||
@@ -362,8 +354,8 @@ class GameFlowController implements IAuthenticationRequired
|
||||
$response = $this->prepareChallengeResponse($userId, $challenge, $nextRound);
|
||||
$response['position'] = $currentPlace->getPosition()->toArray();
|
||||
|
||||
if ($this->request->post('lat') && $this->request->post('lng')) {
|
||||
$guessPosition = new Position((float) $this->request->post('lat'), (float) $this->request->post('lng'));
|
||||
if (\Container::$request->post('lat') && \Container::$request->post('lng')) {
|
||||
$guessPosition = new Position((float) \Container::$request->post('lat'), (float) \Container::$request->post('lng'));
|
||||
$result = $this->evaluateGuess($currentPlace->getPosition(), $guessPosition, $map->getArea());
|
||||
|
||||
// save guess
|
||||
@@ -373,7 +365,7 @@ class GameFlowController implements IAuthenticationRequired
|
||||
$guess->setPosition($guessPosition);
|
||||
$guess->setDistance($result['distance']);
|
||||
$guess->setScore($result['score']);
|
||||
$this->pdm->saveToDb($guess);
|
||||
\Container::$persistentDataManager->saveToDb($guess);
|
||||
|
||||
$response['result'] = $result;
|
||||
|
||||
@@ -384,11 +376,11 @@ class GameFlowController implements IAuthenticationRequired
|
||||
|
||||
// save user relevant state of challenge
|
||||
$userInChallenge->setCurrentRound($nextRound);
|
||||
$timeLeft = $this->request->post('timeLeft');
|
||||
$timeLeft = \Container::$request->post('timeLeft');
|
||||
if (isset($timeLeft)) {
|
||||
$userInChallenge->setTimeLeft(intval($timeLeft));
|
||||
}
|
||||
$this->pdm->saveToDb($userInChallenge);
|
||||
\Container::$persistentDataManager->saveToDb($userInChallenge);
|
||||
|
||||
if ($challenge->getTimeLimitType() === 'game' && isset($timeLeft)) {
|
||||
$timeLimit = max(10, intval($timeLeft));
|
||||
@@ -406,8 +398,8 @@ class GameFlowController implements IAuthenticationRequired
|
||||
|
||||
public function multiNextRound(): IContent
|
||||
{
|
||||
$roomId = $this->request->query('roomId');
|
||||
$session = $this->request->session();
|
||||
$roomId = \Container::$request->query('roomId');
|
||||
$session = \Container::$request->session();
|
||||
|
||||
if (!($multiState = $session->get('multiState')) || $multiState['roomId'] !== $roomId) {
|
||||
return new JsonContent(['error' => 'no_session_found']);
|
||||
@@ -428,7 +420,7 @@ class GameFlowController implements IAuthenticationRequired
|
||||
|
||||
$room->setStateArray($state);
|
||||
$room->setUpdatedDate(new DateTime());
|
||||
$this->pdm->saveToDb($room);
|
||||
\Container::$persistentDataManager->saveToDb($room);
|
||||
|
||||
return new JsonContent(['ok' => true]);
|
||||
}
|
||||
@@ -443,7 +435,7 @@ class GameFlowController implements IAuthenticationRequired
|
||||
|
||||
private function startNewGame(array &$state, int $mapId): void
|
||||
{
|
||||
$session = $this->request->session();
|
||||
$session = \Container::$request->session();
|
||||
$userId = $session->get('userId');
|
||||
|
||||
$places = $this->placeRepository->getRandomNPlaces($mapId, static::NUMBER_OF_ROUNDS, $userId);
|
||||
|
||||
@@ -1,6 +1,5 @@
|
||||
<?php namespace MapGuesser\Controller;
|
||||
|
||||
use SokoWeb\Interfaces\Request\IRequest;
|
||||
use SokoWeb\Interfaces\Response\IContent;
|
||||
use SokoWeb\Interfaces\Response\IRedirect;
|
||||
use SokoWeb\Response\JsonContent;
|
||||
@@ -8,13 +7,6 @@ use SokoWeb\Response\Redirect;
|
||||
|
||||
class HomeController
|
||||
{
|
||||
private IRequest $request;
|
||||
|
||||
public function __construct(IRequest $request)
|
||||
{
|
||||
$this->request = $request;
|
||||
}
|
||||
|
||||
public function getIndex(): IRedirect
|
||||
{
|
||||
return new Redirect(\Container::$routeCollection->getRoute('maps')->generateLink(), IRedirect::TEMPORARY);
|
||||
@@ -24,6 +16,6 @@ class HomeController
|
||||
{
|
||||
// session starts with the request, this method just sends valid data to the client
|
||||
|
||||
return new JsonContent(['antiCsrfToken' => $this->request->session()->get('anti_csrf_token')]);
|
||||
return new JsonContent(['antiCsrfToken' => \Container::$request->session()->get('anti_csrf_token')]);
|
||||
}
|
||||
}
|
||||
@@ -3,7 +3,6 @@
|
||||
use DateInterval;
|
||||
use DateTime;
|
||||
use SokoWeb\Http\Request;
|
||||
use SokoWeb\Interfaces\Request\IRequest;
|
||||
use SokoWeb\Interfaces\Response\IContent;
|
||||
use SokoWeb\Interfaces\Response\IRedirect;
|
||||
use SokoWeb\Mailing\Mail;
|
||||
@@ -11,7 +10,6 @@ use SokoWeb\OAuth\GoogleOAuth;
|
||||
use MapGuesser\PersistentData\Model\User;
|
||||
use MapGuesser\PersistentData\Model\UserConfirmation;
|
||||
use MapGuesser\PersistentData\Model\UserPasswordResetter;
|
||||
use SokoWeb\PersistentData\PersistentDataManager;
|
||||
use MapGuesser\Repository\UserConfirmationRepository;
|
||||
use MapGuesser\Repository\UserPasswordResetterRepository;
|
||||
use MapGuesser\Repository\UserPlayedPlaceRepository;
|
||||
@@ -24,10 +22,6 @@ use SokoWeb\Util\JwtParser;
|
||||
|
||||
class LoginController
|
||||
{
|
||||
private IRequest $request;
|
||||
|
||||
private PersistentDataManager $pdm;
|
||||
|
||||
private UserRepository $userRepository;
|
||||
|
||||
private UserConfirmationRepository $userConfirmationRepository;
|
||||
@@ -38,27 +32,25 @@ class LoginController
|
||||
|
||||
private string $redirectUrl;
|
||||
|
||||
public function __construct(IRequest $request)
|
||||
public function __construct()
|
||||
{
|
||||
$this->request = $request;
|
||||
$this->pdm = new PersistentDataManager();
|
||||
$this->userRepository = new UserRepository();
|
||||
$this->userConfirmationRepository = new UserConfirmationRepository();
|
||||
$this->userPasswordResetterRepository = new UserPasswordResetterRepository();
|
||||
$this->userPlayedPlaceRepository = new UserPlayedPlaceRepository();
|
||||
$this->redirectUrl = $this->request->session()->has('redirect_after_login') ?
|
||||
$this->request->session()->get('redirect_after_login') :
|
||||
$this->redirectUrl = \Container::$request->session()->has('redirect_after_login') ?
|
||||
\Container::$request->session()->get('redirect_after_login') :
|
||||
\Container::$routeCollection->getRoute('index')->generateLink();
|
||||
}
|
||||
|
||||
public function getLoginForm()
|
||||
{
|
||||
if ($this->request->user() !== null) {
|
||||
if (\Container::$request->user() !== null) {
|
||||
$this->deleteRedirectUrl();
|
||||
return new Redirect($this->redirectUrl, IRedirect::TEMPORARY);
|
||||
}
|
||||
|
||||
return new HtmlContent('login/login', ['redirectUrl' => '/' . $this->redirectUrl]);
|
||||
return new HtmlContent('login/login', ['redirectUrl' => $this->redirectUrl]);
|
||||
}
|
||||
|
||||
public function getGoogleLoginRedirect(): IRedirect
|
||||
@@ -66,13 +58,13 @@ class LoginController
|
||||
$state = bin2hex(random_bytes(16));
|
||||
$nonce = bin2hex(random_bytes(16));
|
||||
|
||||
$this->request->session()->set('oauth_state', $state);
|
||||
$this->request->session()->set('oauth_nonce', $nonce);
|
||||
\Container::$request->session()->set('oauth_state', $state);
|
||||
\Container::$request->session()->set('oauth_nonce', $nonce);
|
||||
|
||||
$oAuth = new GoogleOAuth(new Request());
|
||||
$url = $oAuth->getDialogUrl(
|
||||
$state,
|
||||
$this->request->getBase() . '/' . \Container::$routeCollection->getRoute('login-google-action')->generateLink(),
|
||||
\Container::$request->getBase() . \Container::$routeCollection->getRoute('login-google-action')->generateLink(),
|
||||
$nonce
|
||||
);
|
||||
|
||||
@@ -81,13 +73,13 @@ class LoginController
|
||||
|
||||
public function getSignupForm()
|
||||
{
|
||||
if ($this->request->user() !== null) {
|
||||
if (\Container::$request->user() !== null) {
|
||||
$this->deleteRedirectUrl();
|
||||
return new Redirect($this->redirectUrl, IRedirect::TEMPORARY);
|
||||
}
|
||||
|
||||
if ($this->request->session()->has('tmp_user_data')) {
|
||||
$tmpUserData = $this->request->session()->get('tmp_user_data');
|
||||
if (\Container::$request->session()->has('tmp_user_data')) {
|
||||
$tmpUserData = \Container::$request->session()->get('tmp_user_data');
|
||||
|
||||
$data = ['email' => $tmpUserData['email']];
|
||||
} else {
|
||||
@@ -104,30 +96,30 @@ class LoginController
|
||||
|
||||
public function getSignupWithGoogleForm()
|
||||
{
|
||||
if ($this->request->user() !== null) {
|
||||
if (\Container::$request->user() !== null) {
|
||||
$this->deleteRedirectUrl();
|
||||
return new Redirect($this->redirectUrl, IRedirect::TEMPORARY);
|
||||
}
|
||||
|
||||
if (!$this->request->session()->has('google_user_data')) {
|
||||
if (!\Container::$request->session()->has('google_user_data')) {
|
||||
return new Redirect(\Container::$routeCollection->getRoute('login-google')->generateLink(), IRedirect::TEMPORARY);
|
||||
}
|
||||
|
||||
$userData = $this->request->session()->get('google_user_data');
|
||||
$userData = \Container::$request->session()->get('google_user_data');
|
||||
|
||||
$user = $this->userRepository->getByEmail($userData['email']);
|
||||
|
||||
return new HtmlContent('login/google_signup', ['found' => $user !== null, 'email' => $userData['email'], 'redirectUrl' => '/' . $this->redirectUrl]);
|
||||
return new HtmlContent('login/google_signup', ['found' => $user !== null, 'email' => $userData['email'], 'redirectUrl' => $this->redirectUrl]);
|
||||
}
|
||||
|
||||
public function getRequestPasswordResetForm()
|
||||
{
|
||||
if ($this->request->user() !== null) {
|
||||
if (\Container::$request->user() !== null) {
|
||||
$this->deleteRedirectUrl();
|
||||
return new Redirect($this->redirectUrl, IRedirect::TEMPORARY);
|
||||
}
|
||||
|
||||
return new HtmlContent('login/password_reset_request', ['email' => $this->request->query('email')]);
|
||||
return new HtmlContent('login/password_reset_request', ['email' => \Container::$request->query('email')]);
|
||||
}
|
||||
|
||||
public function getRequestPasswordResetSuccess(): IContent
|
||||
@@ -137,12 +129,12 @@ class LoginController
|
||||
|
||||
public function getResetPasswordForm()
|
||||
{
|
||||
if ($this->request->user() !== null) {
|
||||
if (\Container::$request->user() !== null) {
|
||||
$this->deleteRedirectUrl();
|
||||
return new Redirect($this->redirectUrl, IRedirect::TEMPORARY);
|
||||
}
|
||||
|
||||
$token = $this->request->query('token');
|
||||
$token = \Container::$request->query('token');
|
||||
$resetter = $this->userPasswordResetterRepository->getByToken($token);
|
||||
|
||||
if ($resetter === null || $resetter->getExpiresDate() < new DateTime()) {
|
||||
@@ -151,20 +143,20 @@ class LoginController
|
||||
|
||||
$user = $this->userRepository->getById($resetter->getUserId());
|
||||
|
||||
return new HtmlContent('login/reset_password', ['success' => true, 'token' => $token, 'email' => $user->getEmail(), 'redirectUrl' => '/' . $this->redirectUrl]);
|
||||
return new HtmlContent('login/reset_password', ['success' => true, 'token' => $token, 'email' => $user->getEmail(), 'redirectUrl' => $this->redirectUrl]);
|
||||
}
|
||||
|
||||
public function login(): IContent
|
||||
{
|
||||
if ($this->request->user() !== null) {
|
||||
if (\Container::$request->user() !== null) {
|
||||
$this->deleteRedirectUrl();
|
||||
return new JsonContent(['success' => true]);
|
||||
}
|
||||
|
||||
$user = $this->userRepository->getByEmail($this->request->post('email'));
|
||||
$user = $this->userRepository->getByEmail(\Container::$request->post('email'));
|
||||
|
||||
if ($user === null) {
|
||||
if (strlen($this->request->post('password')) < 6) {
|
||||
if (strlen(\Container::$request->post('password')) < 6) {
|
||||
return new JsonContent([
|
||||
'error' => [
|
||||
'errorText' => 'The given password is too short. Please choose a password that is at least 6 characters long!'
|
||||
@@ -173,16 +165,16 @@ class LoginController
|
||||
}
|
||||
|
||||
$tmpUser = new User();
|
||||
$tmpUser->setPlainPassword($this->request->post('password'));
|
||||
$tmpUser->setPlainPassword(\Container::$request->post('password'));
|
||||
|
||||
$this->request->session()->set('tmp_user_data', [
|
||||
'email' => $this->request->post('email'),
|
||||
\Container::$request->session()->set('tmp_user_data', [
|
||||
'email' => \Container::$request->post('email'),
|
||||
'password_hashed' => $tmpUser->getPassword()
|
||||
]);
|
||||
|
||||
return new JsonContent([
|
||||
'redirect' => [
|
||||
'target' => '/' . \Container::$routeCollection->getRoute('signup')->generateLink()
|
||||
'target' => \Container::$routeCollection->getRoute('signup')->generateLink()
|
||||
]
|
||||
]);
|
||||
}
|
||||
@@ -198,7 +190,7 @@ class LoginController
|
||||
]);
|
||||
}
|
||||
|
||||
if (!$user->checkPassword($this->request->post('password'))) {
|
||||
if (!$user->checkPassword(\Container::$request->post('password'))) {
|
||||
return new JsonContent([
|
||||
'error' => [
|
||||
'errorText' => 'The given password is wrong. You can <a href="/password/requestReset?email=' .
|
||||
@@ -207,7 +199,7 @@ class LoginController
|
||||
]);
|
||||
}
|
||||
|
||||
$this->request->setUser($user);
|
||||
\Container::$request->setUser($user);
|
||||
|
||||
$this->deleteRedirectUrl();
|
||||
return new JsonContent(['success' => true]);
|
||||
@@ -215,19 +207,19 @@ class LoginController
|
||||
|
||||
public function loginWithGoogle()
|
||||
{
|
||||
if ($this->request->user() !== null) {
|
||||
if (\Container::$request->user() !== null) {
|
||||
$this->deleteRedirectUrl();
|
||||
return new Redirect($this->redirectUrl, IRedirect::TEMPORARY);
|
||||
}
|
||||
|
||||
if ($this->request->query('state') !== $this->request->session()->get('oauth_state')) {
|
||||
if (\Container::$request->query('state') !== \Container::$request->session()->get('oauth_state')) {
|
||||
return new HtmlContent('login/google_login');
|
||||
}
|
||||
|
||||
$oAuth = new GoogleOAuth(new Request());
|
||||
$tokenData = $oAuth->getToken(
|
||||
$this->request->query('code'),
|
||||
$this->request->getBase() . '/' . \Container::$routeCollection->getRoute('login-google-action')->generateLink()
|
||||
\Container::$request->query('code'),
|
||||
\Container::$request->getBase() . \Container::$routeCollection->getRoute('login-google-action')->generateLink()
|
||||
);
|
||||
|
||||
if (!isset($tokenData['id_token'])) {
|
||||
@@ -237,7 +229,7 @@ class LoginController
|
||||
$jwtParser = new JwtParser($tokenData['id_token']);
|
||||
$idToken = $jwtParser->getPayload();
|
||||
|
||||
if ($idToken['nonce'] !== $this->request->session()->get('oauth_nonce')) {
|
||||
if ($idToken['nonce'] !== \Container::$request->session()->get('oauth_nonce')) {
|
||||
return new HtmlContent('login/google_login');
|
||||
}
|
||||
|
||||
@@ -248,12 +240,12 @@ class LoginController
|
||||
$user = $this->userRepository->getByGoogleSub($idToken['sub']);
|
||||
|
||||
if ($user === null) {
|
||||
$this->request->session()->set('google_user_data', ['sub' => $idToken['sub'], 'email' => $idToken['email']]);
|
||||
\Container::$request->session()->set('google_user_data', ['sub' => $idToken['sub'], 'email' => $idToken['email']]);
|
||||
|
||||
return new Redirect(\Container::$routeCollection->getRoute('signup-google')->generateLink(), IRedirect::TEMPORARY);
|
||||
}
|
||||
|
||||
$this->request->setUser($user);
|
||||
\Container::$request->setUser($user);
|
||||
|
||||
$this->deleteRedirectUrl();
|
||||
return new Redirect($this->redirectUrl, IRedirect::TEMPORARY);
|
||||
@@ -261,23 +253,23 @@ class LoginController
|
||||
|
||||
public function logout(): IRedirect
|
||||
{
|
||||
$this->request->setUser(null);
|
||||
\Container::$request->setUser(null);
|
||||
|
||||
return new Redirect(\Container::$routeCollection->getRoute('index')->generateLink(), IRedirect::TEMPORARY);
|
||||
}
|
||||
|
||||
public function signup(): IContent
|
||||
{
|
||||
if ($this->request->user() !== null) {
|
||||
if (\Container::$request->user() !== null) {
|
||||
$this->deleteRedirectUrl();
|
||||
return new JsonContent(['redirect' => ['target' => '/' . $this->redirectUrl]]);
|
||||
return new JsonContent(['redirect' => ['target' => $this->redirectUrl]]);
|
||||
}
|
||||
|
||||
$user = $this->userRepository->getByEmail($this->request->post('email'));
|
||||
$user = $this->userRepository->getByEmail(\Container::$request->post('email'));
|
||||
|
||||
if ($user !== null) {
|
||||
if ($user->getActive()) {
|
||||
if (!$user->checkPassword($this->request->post('password'))) {
|
||||
if (!$user->checkPassword(\Container::$request->post('password'))) {
|
||||
return new JsonContent([
|
||||
'error' => [
|
||||
'errorText' => 'There is a user already registered with the given email address, ' .
|
||||
@@ -287,10 +279,10 @@ class LoginController
|
||||
]);
|
||||
}
|
||||
|
||||
$this->request->setUser($user);
|
||||
\Container::$request->setUser($user);
|
||||
|
||||
$this->deleteRedirectUrl();
|
||||
$data = ['redirect' => ['target' => '/' . $this->redirectUrl]];
|
||||
$data = ['redirect' => ['target' => $this->redirectUrl]];
|
||||
} else {
|
||||
$data = [
|
||||
'error' => [
|
||||
@@ -303,32 +295,32 @@ class LoginController
|
||||
}
|
||||
|
||||
if (!empty($_ENV['RECAPTCHA_SITEKEY'])) {
|
||||
if (!$this->request->post('g-recaptcha-response')) {
|
||||
if (!\Container::$request->post('g-recaptcha-response')) {
|
||||
return new JsonContent(['error' => ['errorText' => 'Please check "I\'m not a robot" in the reCAPTCHA box!']]);
|
||||
}
|
||||
|
||||
$captchaValidator = new CaptchaValidator();
|
||||
$captchaResponse = $captchaValidator->validate($this->request->post('g-recaptcha-response'));
|
||||
$captchaResponse = $captchaValidator->validate(\Container::$request->post('g-recaptcha-response'));
|
||||
if (!$captchaResponse['success']) {
|
||||
return new JsonContent(['error' => ['errorText' => 'reCAPTCHA challenge failed. Please try again!']]);
|
||||
}
|
||||
}
|
||||
|
||||
if (filter_var($this->request->post('email'), FILTER_VALIDATE_EMAIL) === false) {
|
||||
if (filter_var(\Container::$request->post('email'), FILTER_VALIDATE_EMAIL) === false) {
|
||||
return new JsonContent(['error' => ['errorText' => 'The given email address is not valid.']]);
|
||||
}
|
||||
|
||||
if ($this->request->session()->has('tmp_user_data')) {
|
||||
$tmpUserData = $this->request->session()->get('tmp_user_data');
|
||||
if (\Container::$request->session()->has('tmp_user_data')) {
|
||||
$tmpUserData = \Container::$request->session()->get('tmp_user_data');
|
||||
|
||||
$tmpUser = new User();
|
||||
$tmpUser->setPassword($tmpUserData['password_hashed']);
|
||||
|
||||
if (!$tmpUser->checkPassword($this->request->post('password'))) {
|
||||
if (!$tmpUser->checkPassword(\Container::$request->post('password'))) {
|
||||
return new JsonContent(['error' => ['errorText' => 'The given passwords do not match.']]);
|
||||
}
|
||||
} else {
|
||||
if (strlen($this->request->post('password')) < 6) {
|
||||
if (strlen(\Container::$request->post('password')) < 6) {
|
||||
return new JsonContent([
|
||||
'error' => [
|
||||
'errorText' => 'The given password is too short. Please choose a password that is at least 6 characters long!'
|
||||
@@ -336,19 +328,17 @@ class LoginController
|
||||
]);
|
||||
}
|
||||
|
||||
if ($this->request->post('password') !== $this->request->post('password_confirm')) {
|
||||
if (\Container::$request->post('password') !== \Container::$request->post('password_confirm')) {
|
||||
return new JsonContent(['error' => ['errorText' => 'The given passwords do not match.']]);
|
||||
}
|
||||
}
|
||||
|
||||
$user = new User();
|
||||
$user->setEmail($this->request->post('email'));
|
||||
$user->setPlainPassword($this->request->post('password'));
|
||||
$user->setEmail(\Container::$request->post('email'));
|
||||
$user->setPlainPassword(\Container::$request->post('password'));
|
||||
$user->setCreatedDate(new DateTime());
|
||||
|
||||
\Container::$dbConnection->startTransaction();
|
||||
|
||||
$this->pdm->saveToDb($user);
|
||||
\Container::$persistentDataManager->saveToDb($user);
|
||||
|
||||
$token = bin2hex(random_bytes(16));
|
||||
|
||||
@@ -357,25 +347,23 @@ class LoginController
|
||||
$confirmation->setToken($token);
|
||||
$confirmation->setLastSentDate(new DateTime());
|
||||
|
||||
$this->pdm->saveToDb($confirmation);
|
||||
|
||||
\Container::$dbConnection->commit();
|
||||
\Container::$persistentDataManager->saveToDb($confirmation);
|
||||
|
||||
$this->sendConfirmationEmail($user->getEmail(), $token, $user->getCreatedDate());
|
||||
|
||||
$this->request->session()->delete('tmp_user_data');
|
||||
\Container::$request->session()->delete('tmp_user_data');
|
||||
|
||||
return new JsonContent(['success' => true]);
|
||||
}
|
||||
|
||||
public function signupWithGoogle(): IContent
|
||||
{
|
||||
if ($this->request->user() !== null) {
|
||||
if (\Container::$request->user() !== null) {
|
||||
$this->deleteRedirectUrl();
|
||||
return new JsonContent(['success' => true]);
|
||||
}
|
||||
|
||||
$userData = $this->request->session()->get('google_user_data');
|
||||
$userData = \Container::$request->session()->get('google_user_data');
|
||||
|
||||
$user = $this->userRepository->getByEmail($userData['email']);
|
||||
|
||||
@@ -392,14 +380,14 @@ class LoginController
|
||||
$user->setActive(true);
|
||||
$user->setGoogleSub($userData['sub']);
|
||||
|
||||
$this->pdm->saveToDb($user);
|
||||
\Container::$persistentDataManager->saveToDb($user);
|
||||
|
||||
if ($sendWelcomeEmail) {
|
||||
$this->sendWelcomeEmail($user->getEmail());
|
||||
}
|
||||
|
||||
$this->request->session()->delete('google_user_data');
|
||||
$this->request->setUser($user);
|
||||
\Container::$request->session()->delete('google_user_data');
|
||||
\Container::$request->setUser($user);
|
||||
|
||||
$this->deleteRedirectUrl();
|
||||
return new JsonContent(['success' => true]);
|
||||
@@ -407,43 +395,39 @@ class LoginController
|
||||
|
||||
public function resetSignup(): IContent
|
||||
{
|
||||
$this->request->session()->delete('tmp_user_data');
|
||||
\Container::$request->session()->delete('tmp_user_data');
|
||||
|
||||
return new JsonContent(['success' => true]);
|
||||
}
|
||||
|
||||
public function resetGoogleSignup(): IContent
|
||||
{
|
||||
$this->request->session()->delete('google_user_data');
|
||||
\Container::$request->session()->delete('google_user_data');
|
||||
|
||||
return new JsonContent(['success' => true]);
|
||||
}
|
||||
|
||||
public function activate()
|
||||
{
|
||||
if ($this->request->user() !== null) {
|
||||
if (\Container::$request->user() !== null) {
|
||||
$this->deleteRedirectUrl();
|
||||
return new Redirect($this->redirectUrl, IRedirect::TEMPORARY);
|
||||
}
|
||||
|
||||
$confirmation = $this->userConfirmationRepository->getByToken(substr($this->request->query('token'), 0, 32));
|
||||
$confirmation = $this->userConfirmationRepository->getByToken(substr(\Container::$request->query('token'), 0, 32));
|
||||
|
||||
if ($confirmation === null) {
|
||||
return new HtmlContent('login/activate');
|
||||
}
|
||||
|
||||
\Container::$dbConnection->startTransaction();
|
||||
|
||||
$this->pdm->deleteFromDb($confirmation);
|
||||
\Container::$persistentDataManager->deleteFromDb($confirmation);
|
||||
|
||||
$user = $this->userRepository->getById($confirmation->getUserId());
|
||||
$user->setActive(true);
|
||||
|
||||
$this->pdm->saveToDb($user);
|
||||
\Container::$persistentDataManager->saveToDb($user);
|
||||
|
||||
\Container::$dbConnection->commit();
|
||||
|
||||
$this->request->setUser($user);
|
||||
\Container::$request->setUser($user);
|
||||
|
||||
$this->deleteRedirectUrl();
|
||||
return new Redirect($this->redirectUrl, IRedirect::TEMPORARY);
|
||||
@@ -451,58 +435,54 @@ class LoginController
|
||||
|
||||
public function cancel()
|
||||
{
|
||||
if ($this->request->user() !== null) {
|
||||
if (\Container::$request->user() !== null) {
|
||||
$this->deleteRedirectUrl();
|
||||
return new Redirect($this->redirectUrl, IRedirect::TEMPORARY);
|
||||
}
|
||||
|
||||
$confirmation = $this->userConfirmationRepository->getByToken(substr($this->request->query('token'), 0, 32));
|
||||
$confirmation = $this->userConfirmationRepository->getByToken(substr(\Container::$request->query('token'), 0, 32));
|
||||
|
||||
if ($confirmation === null) {
|
||||
return new HtmlContent('login/cancel', ['success' => false]);
|
||||
}
|
||||
|
||||
\Container::$dbConnection->startTransaction();
|
||||
|
||||
$this->pdm->deleteFromDb($confirmation);
|
||||
\Container::$persistentDataManager->deleteFromDb($confirmation);
|
||||
|
||||
$user = $this->userRepository->getById($confirmation->getUserId());
|
||||
|
||||
foreach ($this->userPlayedPlaceRepository->getAllByUser($user) as $userPlayedPlace) {
|
||||
$this->pdm->deleteFromDb($userPlayedPlace);
|
||||
\Container::$persistentDataManager->deleteFromDb($userPlayedPlace);
|
||||
}
|
||||
|
||||
$this->pdm->deleteFromDb($user);
|
||||
|
||||
\Container::$dbConnection->commit();
|
||||
\Container::$persistentDataManager->deleteFromDb($user);
|
||||
|
||||
return new HtmlContent('login/cancel', ['success' => true]);
|
||||
}
|
||||
|
||||
public function requestPasswordReset(): IContent
|
||||
{
|
||||
if ($this->request->user() !== null) {
|
||||
if (\Container::$request->user() !== null) {
|
||||
$this->deleteRedirectUrl();
|
||||
return new JsonContent([
|
||||
'redirect' => [
|
||||
'target' => '/' . $this->redirectUrl
|
||||
'target' => $this->redirectUrl
|
||||
]
|
||||
]);
|
||||
}
|
||||
|
||||
if (!empty($_ENV['RECAPTCHA_SITEKEY'])) {
|
||||
if (!$this->request->post('g-recaptcha-response')) {
|
||||
if (!\Container::$request->post('g-recaptcha-response')) {
|
||||
return new JsonContent(['error' => ['errorText' => 'Please check "I\'m not a robot" in the reCAPTCHA box!']]);
|
||||
}
|
||||
|
||||
$captchaValidator = new CaptchaValidator();
|
||||
$captchaResponse = $captchaValidator->validate($this->request->post('g-recaptcha-response'));
|
||||
$captchaResponse = $captchaValidator->validate(\Container::$request->post('g-recaptcha-response'));
|
||||
if (!$captchaResponse['success']) {
|
||||
return new JsonContent(['error' => ['errorText' => 'reCAPTCHA challenge failed. Please try again!']]);
|
||||
}
|
||||
}
|
||||
|
||||
$user = $this->userRepository->getByEmail($this->request->post('email'));
|
||||
$user = $this->userRepository->getByEmail(\Container::$request->post('email'));
|
||||
|
||||
if ($user === null) {
|
||||
return new JsonContent([
|
||||
@@ -541,15 +521,11 @@ class LoginController
|
||||
$passwordResetter->setToken($token);
|
||||
$passwordResetter->setExpiresDate($expires);
|
||||
|
||||
\Container::$dbConnection->startTransaction();
|
||||
|
||||
if ($existingResetter !== null) {
|
||||
$this->pdm->deleteFromDb($existingResetter);
|
||||
\Container::$persistentDataManager->deleteFromDb($existingResetter);
|
||||
}
|
||||
|
||||
$this->pdm->saveToDb($passwordResetter);
|
||||
|
||||
\Container::$dbConnection->commit();
|
||||
\Container::$persistentDataManager->saveToDb($passwordResetter);
|
||||
|
||||
$this->sendPasswordResetEmail($user->getEmail(), $token, $expires);
|
||||
|
||||
@@ -559,27 +535,27 @@ class LoginController
|
||||
|
||||
public function resetPassword(): IContent
|
||||
{
|
||||
if ($this->request->user() !== null) {
|
||||
if (\Container::$request->user() !== null) {
|
||||
$this->deleteRedirectUrl();
|
||||
return new JsonContent([
|
||||
'redirect' => [
|
||||
'target' => '/' . $this->redirectUrl
|
||||
'target' => $this->redirectUrl
|
||||
]
|
||||
]);
|
||||
}
|
||||
|
||||
$token = $this->request->query('token');
|
||||
$token = \Container::$request->query('token');
|
||||
$resetter = $this->userPasswordResetterRepository->getByToken($token);
|
||||
|
||||
if ($resetter === null || $resetter->getExpiresDate() < new DateTime()) {
|
||||
return new JsonContent([
|
||||
'redirect' => [
|
||||
'target' => '/' . \Container::$routeCollection->getRoute('password-reset')->generateLink(['token' => $token])
|
||||
'target' => \Container::$routeCollection->getRoute('password-reset')->generateLink(['token' => $token])
|
||||
]
|
||||
]);
|
||||
}
|
||||
|
||||
if (strlen($this->request->post('password')) < 6) {
|
||||
if (strlen(\Container::$request->post('password')) < 6) {
|
||||
return new JsonContent([
|
||||
'error' => [
|
||||
'errorText' => 'The given password is too short. Please choose a password that is at least 6 characters long!'
|
||||
@@ -587,22 +563,18 @@ class LoginController
|
||||
]);
|
||||
}
|
||||
|
||||
if ($this->request->post('password') !== $this->request->post('password_confirm')) {
|
||||
if (\Container::$request->post('password') !== \Container::$request->post('password_confirm')) {
|
||||
return new JsonContent(['error' => ['errorText' => 'The given passwords do not match.']]);
|
||||
}
|
||||
|
||||
\Container::$dbConnection->startTransaction();
|
||||
|
||||
$this->pdm->deleteFromDb($resetter);
|
||||
\Container::$persistentDataManager->deleteFromDb($resetter);
|
||||
|
||||
$user = $this->userRepository->getById($resetter->getUserId());
|
||||
$user->setPlainPassword($this->request->post('password'));
|
||||
$user->setPlainPassword(\Container::$request->post('password'));
|
||||
|
||||
$this->pdm->saveToDb($user);
|
||||
\Container::$persistentDataManager->saveToDb($user);
|
||||
|
||||
\Container::$dbConnection->commit();
|
||||
|
||||
$this->request->setUser($user);
|
||||
\Container::$request->setUser($user);
|
||||
|
||||
$this->deleteRedirectUrl();
|
||||
return new JsonContent(['success' => true]);
|
||||
@@ -615,9 +587,9 @@ class LoginController
|
||||
$mail->setSubject('Welcome to ' . $_ENV['APP_NAME'] . ' - Activate your account');
|
||||
$mail->setBodyFromTemplate('signup', [
|
||||
'EMAIL' => $email,
|
||||
'ACTIVATE_LINK' => $this->request->getBase() . '/' .
|
||||
'ACTIVATE_LINK' => \Container::$request->getBase() .
|
||||
\Container::$routeCollection->getRoute('signup.activate')->generateLink(['token' => $token]),
|
||||
'CANCEL_LINK' => $this->request->getBase() . '/' .
|
||||
'CANCEL_LINK' => \Container::$request->getBase() .
|
||||
\Container::$routeCollection->getRoute('signup.cancel')->generateLink(['token' => $token]),
|
||||
'ACTIVATABLE_UNTIL' => (clone $created)->add(new DateInterval('P1D'))->format('Y-m-d H:i T')
|
||||
]);
|
||||
@@ -634,7 +606,7 @@ class LoginController
|
||||
|
||||
$confirmation->setLastSentDate(new DateTime());
|
||||
|
||||
$this->pdm->saveToDb($confirmation);
|
||||
\Container::$persistentDataManager->saveToDb($confirmation);
|
||||
|
||||
$this->sendConfirmationEmail($user->getEmail(), $confirmation->getToken(), $user->getCreatedDate());
|
||||
|
||||
@@ -659,7 +631,7 @@ class LoginController
|
||||
$mail->setSubject($_ENV['APP_NAME'] . ' - Password reset');
|
||||
$mail->setBodyFromTemplate('password-reset', [
|
||||
'EMAIL' => $email,
|
||||
'RESET_LINK' => $this->request->getBase() . '/' .
|
||||
'RESET_LINK' => \Container::$request->getBase() .
|
||||
\Container::$routeCollection->getRoute('password-reset')->generateLink(['token' => $token]),
|
||||
'EXPIRES' => $expires->format('Y-m-d H:i T')
|
||||
]);
|
||||
@@ -668,6 +640,6 @@ class LoginController
|
||||
|
||||
private function deleteRedirectUrl(): void
|
||||
{
|
||||
$this->request->session()->delete('redirect_after_login');
|
||||
\Container::$request->session()->delete('redirect_after_login');
|
||||
}
|
||||
}
|
||||
@@ -4,13 +4,11 @@ use DateTime;
|
||||
use SokoWeb\Interfaces\Authentication\IUser;
|
||||
use SokoWeb\Interfaces\Authentication\IAuthenticationRequired;
|
||||
use SokoWeb\Interfaces\Authorization\ISecured;
|
||||
use SokoWeb\Interfaces\Request\IRequest;
|
||||
use SokoWeb\Interfaces\Response\IContent;
|
||||
use MapGuesser\PersistentData\Model\Challenge;
|
||||
use MapGuesser\PersistentData\Model\Map;
|
||||
use MapGuesser\PersistentData\Model\Place;
|
||||
use MapGuesser\PersistentData\Model\PlaceInChallenge;
|
||||
use SokoWeb\PersistentData\PersistentDataManager;
|
||||
use MapGuesser\Repository\ChallengeRepository;
|
||||
use MapGuesser\Repository\GuessRepository;
|
||||
use MapGuesser\Repository\MapRepository;
|
||||
@@ -27,10 +25,6 @@ class MapAdminController implements IAuthenticationRequired, ISecured
|
||||
{
|
||||
private static string $unnamedMapName = '[unnamed map]';
|
||||
|
||||
private IRequest $request;
|
||||
|
||||
private PersistentDataManager $pdm;
|
||||
|
||||
private MapRepository $mapRepository;
|
||||
|
||||
private PlaceRepository $placeRepository;
|
||||
@@ -45,10 +39,8 @@ class MapAdminController implements IAuthenticationRequired, ISecured
|
||||
|
||||
private UserInChallengeRepository $userInChallengeRepository;
|
||||
|
||||
public function __construct(IRequest $request)
|
||||
public function __construct()
|
||||
{
|
||||
$this->request = $request;
|
||||
$this->pdm = new PersistentDataManager();
|
||||
$this->mapRepository = new MapRepository();
|
||||
$this->placeRepository = new PlaceRepository();
|
||||
$this->userPlayedPlaceRepository = new UserPlayedPlaceRepository();
|
||||
@@ -65,12 +57,12 @@ class MapAdminController implements IAuthenticationRequired, ISecured
|
||||
|
||||
public function authorize(): bool
|
||||
{
|
||||
return $this->request->user()->hasPermission(IUser::PERMISSION_ADMIN);
|
||||
return \Container::$request->user()->hasPermission(IUser::PERMISSION_ADMIN);
|
||||
}
|
||||
|
||||
public function getMapEditor(): IContent
|
||||
{
|
||||
$mapId = (int) $this->request->query('mapId');
|
||||
$mapId = (int) \Container::$request->query('mapId');
|
||||
|
||||
if ($mapId) {
|
||||
$map = $this->mapRepository->getById($mapId);
|
||||
@@ -93,7 +85,7 @@ class MapAdminController implements IAuthenticationRequired, ISecured
|
||||
|
||||
public function getPlace(): IContent
|
||||
{
|
||||
$placeId = (int) $this->request->query('placeId');
|
||||
$placeId = (int) \Container::$request->query('placeId');
|
||||
|
||||
$place = $this->placeRepository->getById($placeId);
|
||||
|
||||
@@ -102,16 +94,14 @@ class MapAdminController implements IAuthenticationRequired, ISecured
|
||||
|
||||
public function saveMap(): IContent
|
||||
{
|
||||
$mapId = (int) $this->request->query('mapId');
|
||||
|
||||
\Container::$dbConnection->startTransaction();
|
||||
$mapId = (int) \Container::$request->query('mapId');
|
||||
|
||||
if ($mapId) {
|
||||
$map = $this->mapRepository->getById($mapId);
|
||||
} else {
|
||||
$map = new Map();
|
||||
$map->setName(self::$unnamedMapName);
|
||||
$this->pdm->saveToDb($map);
|
||||
\Container::$persistentDataManager->saveToDb($map);
|
||||
}
|
||||
|
||||
if (isset($_POST['added'])) {
|
||||
@@ -133,7 +123,7 @@ class MapAdminController implements IAuthenticationRequired, ISecured
|
||||
$place->setPanoIdCachedTimestampDate(new DateTime('-1 day'));
|
||||
}
|
||||
|
||||
$this->pdm->saveToDb($place);
|
||||
\Container::$persistentDataManager->saveToDb($place);
|
||||
|
||||
$addedIds[] = ['tempId' => $placeRaw['id'], 'id' => $place->getId()];
|
||||
}
|
||||
@@ -155,7 +145,7 @@ class MapAdminController implements IAuthenticationRequired, ISecured
|
||||
));
|
||||
$place->setPanoIdCachedTimestampDate(new DateTime('-1 day'));
|
||||
|
||||
$this->pdm->saveToDb($place);
|
||||
\Container::$persistentDataManager->saveToDb($place);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -184,26 +174,20 @@ class MapAdminController implements IAuthenticationRequired, ISecured
|
||||
$map->setUnlisted((bool)$_POST['unlisted']);
|
||||
}
|
||||
|
||||
$this->pdm->saveToDb($map);
|
||||
|
||||
\Container::$dbConnection->commit();
|
||||
\Container::$persistentDataManager->saveToDb($map);
|
||||
|
||||
return new JsonContent(['mapId' => $map->getId(), 'added' => $addedIds]);
|
||||
}
|
||||
|
||||
public function deleteMap(): IContent
|
||||
{
|
||||
$mapId = (int) $this->request->query('mapId');
|
||||
$mapId = (int) \Container::$request->query('mapId');
|
||||
|
||||
$map = $this->mapRepository->getById($mapId);
|
||||
|
||||
\Container::$dbConnection->startTransaction();
|
||||
|
||||
$this->deletePlaces($map);
|
||||
|
||||
$this->pdm->deleteFromDb($map);
|
||||
|
||||
\Container::$dbConnection->commit();
|
||||
\Container::$persistentDataManager->deleteFromDb($map);
|
||||
|
||||
return new JsonContent(['success' => true]);
|
||||
}
|
||||
@@ -211,14 +195,14 @@ class MapAdminController implements IAuthenticationRequired, ISecured
|
||||
private function deletePlace(Place $place): void
|
||||
{
|
||||
foreach ($this->userPlayedPlaceRepository->getAllByPlace($place) as $userPlayedPlace) {
|
||||
$this->pdm->deleteFromDb($userPlayedPlace);
|
||||
\Container::$persistentDataManager->deleteFromDb($userPlayedPlace);
|
||||
}
|
||||
|
||||
foreach ($this->challengeRepository->getAllByPlace($place) as $challenge) {
|
||||
$this->deleteChallenge($challenge);
|
||||
}
|
||||
|
||||
$this->pdm->deleteFromDb($place);
|
||||
\Container::$persistentDataManager->deleteFromDb($place);
|
||||
}
|
||||
|
||||
private function deletePlaces(Map $map): void
|
||||
@@ -231,18 +215,18 @@ class MapAdminController implements IAuthenticationRequired, ISecured
|
||||
private function deleteChallenge(Challenge $challenge): void
|
||||
{
|
||||
foreach ($this->userInChallengeRepository->getAllByChallenge($challenge) as $userInChallenge) {
|
||||
$this->pdm->deleteFromDb($userInChallenge);
|
||||
\Container::$persistentDataManager->deleteFromDb($userInChallenge);
|
||||
}
|
||||
|
||||
foreach ($this->guessRepository->getAllInChallenge($challenge, [PlaceInChallenge::class]) as $guess) {
|
||||
$this->pdm->deleteFromDb($guess);
|
||||
foreach ($this->guessRepository->getAllInChallenge($challenge, ['place_in_challange']) as $guess) {
|
||||
\Container::$persistentDataManager->deleteFromDb($guess);
|
||||
}
|
||||
|
||||
foreach ($this->placeInChallengeRepository->getAllByChallenge($challenge) as $placeInChallenge) {
|
||||
$this->pdm->deleteFromDb($placeInChallenge);
|
||||
\Container::$persistentDataManager->deleteFromDb($placeInChallenge);
|
||||
}
|
||||
|
||||
$this->pdm->deleteFromDb($challenge);
|
||||
\Container::$persistentDataManager->deleteFromDb($challenge);
|
||||
}
|
||||
|
||||
private function calculateMapBounds(Map $map): Bounds
|
||||
|
||||
@@ -4,19 +4,11 @@ use SokoWeb\Database\Query\Select;
|
||||
use SokoWeb\Database\RawExpression;
|
||||
use SokoWeb\Interfaces\Authentication\IUser;
|
||||
use SokoWeb\Interfaces\Database\IResultSet;
|
||||
use SokoWeb\Interfaces\Request\IRequest;
|
||||
use SokoWeb\Interfaces\Response\IContent;
|
||||
use SokoWeb\Response\HtmlContent;
|
||||
|
||||
class MapsController
|
||||
{
|
||||
private IRequest $request;
|
||||
|
||||
public function __construct(IRequest $request)
|
||||
{
|
||||
$this->request = $request;
|
||||
}
|
||||
|
||||
public function getMaps(): IContent
|
||||
{
|
||||
//TODO: from repository - count should be added
|
||||
@@ -37,7 +29,7 @@ class MapsController
|
||||
$select->groupBy(['maps', 'id']);
|
||||
$select->orderBy('name');
|
||||
|
||||
$user = $this->request->user();
|
||||
$user = \Container::$request->user();
|
||||
$isAdmin = $user !== null && $user->hasPermission(IUser::PERMISSION_ADMIN);
|
||||
if (!$isAdmin) {
|
||||
$select->where(['maps', 'unlisted'], '=', false);
|
||||
|
||||
@@ -3,11 +3,9 @@
|
||||
use DateTime;
|
||||
use SokoWeb\Http\Request;
|
||||
use SokoWeb\Interfaces\Authentication\IAuthenticationRequired;
|
||||
use SokoWeb\Interfaces\Request\IRequest;
|
||||
use SokoWeb\Interfaces\Response\IContent;
|
||||
use SokoWeb\Interfaces\Response\IRedirect;
|
||||
use SokoWeb\OAuth\GoogleOAuth;
|
||||
use SokoWeb\PersistentData\PersistentDataManager;
|
||||
use MapGuesser\PersistentData\Model\User;
|
||||
use MapGuesser\Repository\GuessRepository;
|
||||
use MapGuesser\Repository\UserConfirmationRepository;
|
||||
@@ -21,10 +19,6 @@ use SokoWeb\Util\JwtParser;
|
||||
|
||||
class UserController implements IAuthenticationRequired
|
||||
{
|
||||
private IRequest $request;
|
||||
|
||||
private PersistentDataManager $pdm;
|
||||
|
||||
private UserConfirmationRepository $userConfirmationRepository;
|
||||
|
||||
private UserPasswordResetterRepository $userPasswordResetterRepository;
|
||||
@@ -35,10 +29,8 @@ class UserController implements IAuthenticationRequired
|
||||
|
||||
private GuessRepository $guessRepository;
|
||||
|
||||
public function __construct(IRequest $request)
|
||||
public function __construct()
|
||||
{
|
||||
$this->request = $request;
|
||||
$this->pdm = new PersistentDataManager();
|
||||
$this->userConfirmationRepository = new UserConfirmationRepository();
|
||||
$this->userPasswordResetterRepository = new UserPasswordResetterRepository();
|
||||
$this->userPlayedPlaceRepository = new UserPlayedPlaceRepository();
|
||||
@@ -56,7 +48,7 @@ class UserController implements IAuthenticationRequired
|
||||
/**
|
||||
* @var User $user
|
||||
*/
|
||||
$user = $this->request->user();
|
||||
$user = \Container::$request->user();
|
||||
|
||||
return new HtmlContent('account/account', ['user' => $user->toArray()]);
|
||||
}
|
||||
@@ -66,19 +58,19 @@ class UserController implements IAuthenticationRequired
|
||||
/**
|
||||
* @var User $user
|
||||
*/
|
||||
$user = $this->request->user();
|
||||
$user = \Container::$request->user();
|
||||
|
||||
$state = bin2hex(random_bytes(16));
|
||||
$nonce = bin2hex(random_bytes(16));
|
||||
|
||||
$this->request->session()->set('oauth_state', $state);
|
||||
$this->request->session()->set('oauth_nonce', $nonce);
|
||||
\Container::$request->session()->set('oauth_state', $state);
|
||||
\Container::$request->session()->set('oauth_nonce', $nonce);
|
||||
|
||||
$oAuth = new GoogleOAuth(new Request());
|
||||
|
||||
$url = $oAuth->getDialogUrl(
|
||||
$state,
|
||||
$this->request->getBase() . '/' . \Container::$routeCollection->getRoute('account.googleAuthenticate-action')->generateLink(),
|
||||
\Container::$request->getBase() . \Container::$routeCollection->getRoute('account.googleAuthenticate-action')->generateLink(),
|
||||
$nonce,
|
||||
$user->getEmail()
|
||||
);
|
||||
@@ -91,16 +83,16 @@ class UserController implements IAuthenticationRequired
|
||||
/**
|
||||
* @var User $user
|
||||
*/
|
||||
$user = $this->request->user();
|
||||
$user = \Container::$request->user();
|
||||
|
||||
if ($this->request->query('state') !== $this->request->session()->get('oauth_state')) {
|
||||
if (\Container::$request->query('state') !== \Container::$request->session()->get('oauth_state')) {
|
||||
return new HtmlContent('account/google_authenticate', ['success' => false]);
|
||||
}
|
||||
|
||||
$oAuth = new GoogleOAuth(new Request());
|
||||
$tokenData = $oAuth->getToken(
|
||||
$this->request->query('code'),
|
||||
$this->request->getBase() . '/' . \Container::$routeCollection->getRoute('account.googleAuthenticate-action')->generateLink()
|
||||
\Container::$request->query('code'),
|
||||
\Container::$request->getBase() . \Container::$routeCollection->getRoute('account.googleAuthenticate-action')->generateLink()
|
||||
);
|
||||
|
||||
if (!isset($tokenData['id_token'])) {
|
||||
@@ -110,7 +102,7 @@ class UserController implements IAuthenticationRequired
|
||||
$jwtParser = new JwtParser($tokenData['id_token']);
|
||||
$idToken = $jwtParser->getPayload();
|
||||
|
||||
if ($idToken['nonce'] !== $this->request->session()->get('oauth_nonce')) {
|
||||
if ($idToken['nonce'] !== \Container::$request->session()->get('oauth_nonce')) {
|
||||
return new HtmlContent('account/google_authenticate', ['success' => false]);
|
||||
}
|
||||
|
||||
@@ -122,7 +114,7 @@ class UserController implements IAuthenticationRequired
|
||||
}
|
||||
|
||||
$authenticatedWithGoogleUntil = new DateTime('+45 seconds');
|
||||
$this->request->session()->set('authenticated_with_google_until', $authenticatedWithGoogleUntil);
|
||||
\Container::$request->session()->set('authenticated_with_google_until', $authenticatedWithGoogleUntil);
|
||||
|
||||
return new HtmlContent('account/google_authenticate', [
|
||||
'success' => true,
|
||||
@@ -135,7 +127,7 @@ class UserController implements IAuthenticationRequired
|
||||
/**
|
||||
* @var User $user
|
||||
*/
|
||||
$user = $this->request->user();
|
||||
$user = \Container::$request->user();
|
||||
|
||||
return new HtmlContent('account/delete', ['user' => $user->toArray()]);
|
||||
}
|
||||
@@ -145,19 +137,19 @@ class UserController implements IAuthenticationRequired
|
||||
/**
|
||||
* @var User $user
|
||||
*/
|
||||
$user = $this->request->user();
|
||||
$user = \Container::$request->user();
|
||||
|
||||
if (!$this->confirmUserIdentity(
|
||||
$user,
|
||||
$this->request->session()->get('authenticated_with_google_until'),
|
||||
$this->request->post('password'),
|
||||
\Container::$request->session()->get('authenticated_with_google_until'),
|
||||
\Container::$request->post('password'),
|
||||
$error
|
||||
)) {
|
||||
return new JsonContent(['error' => ['errorText' => $error]]);
|
||||
}
|
||||
|
||||
if (strlen($this->request->post('password_new')) > 0) {
|
||||
if (strlen($this->request->post('password_new')) < 6) {
|
||||
if (strlen(\Container::$request->post('password_new')) > 0) {
|
||||
if (strlen(\Container::$request->post('password_new')) < 6) {
|
||||
return new JsonContent([
|
||||
'error' => [
|
||||
'errorText' => 'The given new password is too short. Please choose a password that is at least 6 characters long!'
|
||||
@@ -165,7 +157,7 @@ class UserController implements IAuthenticationRequired
|
||||
]);
|
||||
}
|
||||
|
||||
if ($this->request->post('password_new') !== $this->request->post('password_new_confirm')) {
|
||||
if (\Container::$request->post('password_new') !== \Container::$request->post('password_new_confirm')) {
|
||||
return new JsonContent([
|
||||
'error' => [
|
||||
'errorText' => 'The given new passwords do not match.'
|
||||
@@ -173,12 +165,12 @@ class UserController implements IAuthenticationRequired
|
||||
]);
|
||||
}
|
||||
|
||||
$user->setPlainPassword($this->request->post('password_new'));
|
||||
$user->setPlainPassword(\Container::$request->post('password_new'));
|
||||
}
|
||||
|
||||
$this->pdm->saveToDb($user);
|
||||
\Container::$persistentDataManager->saveToDb($user);
|
||||
|
||||
$this->request->session()->delete('authenticated_with_google_until');
|
||||
\Container::$request->session()->delete('authenticated_with_google_until');
|
||||
|
||||
return new JsonContent(['success' => true]);
|
||||
}
|
||||
@@ -188,46 +180,42 @@ class UserController implements IAuthenticationRequired
|
||||
/**
|
||||
* @var User $user
|
||||
*/
|
||||
$user = $this->request->user();
|
||||
$user = \Container::$request->user();
|
||||
|
||||
if (!$this->confirmUserIdentity(
|
||||
$user,
|
||||
$this->request->session()->get('authenticated_with_google_until'),
|
||||
$this->request->post('password'),
|
||||
\Container::$request->session()->get('authenticated_with_google_until'),
|
||||
\Container::$request->post('password'),
|
||||
$error
|
||||
)) {
|
||||
return new JsonContent(['error' => ['errorText' => $error]]);
|
||||
}
|
||||
|
||||
\Container::$dbConnection->startTransaction();
|
||||
|
||||
$userConfirmation = $this->userConfirmationRepository->getByUser($user);
|
||||
if ($userConfirmation !== null) {
|
||||
$this->pdm->deleteFromDb($userConfirmation);
|
||||
\Container::$persistentDataManager->deleteFromDb($userConfirmation);
|
||||
}
|
||||
|
||||
$userPasswordResetter = $this->userPasswordResetterRepository->getByUser($user);
|
||||
if ($userPasswordResetter !== null) {
|
||||
$this->pdm->deleteFromDb($userPasswordResetter);
|
||||
\Container::$persistentDataManager->deleteFromDb($userPasswordResetter);
|
||||
}
|
||||
|
||||
foreach ($this->userPlayedPlaceRepository->getAllByUser($user) as $userPlayedPlace) {
|
||||
$this->pdm->deleteFromDb($userPlayedPlace);
|
||||
\Container::$persistentDataManager->deleteFromDb($userPlayedPlace);
|
||||
}
|
||||
|
||||
foreach ($this->userInChallengeRepository->getAllByUser($user) as $userInChallenge) {
|
||||
$this->pdm->deleteFromDb($userInChallenge);
|
||||
\Container::$persistentDataManager->deleteFromDb($userInChallenge);
|
||||
}
|
||||
|
||||
foreach ($this->guessRepository->getAllByUser($user) as $guess) {
|
||||
$this->pdm->deleteFromDb($guess);
|
||||
\Container::$persistentDataManager->deleteFromDb($guess);
|
||||
}
|
||||
|
||||
$this->pdm->deleteFromDb($user);
|
||||
\Container::$persistentDataManager->deleteFromDb($user);
|
||||
|
||||
\Container::$dbConnection->commit();
|
||||
|
||||
$this->request->session()->delete('authenticated_with_google_until');
|
||||
\Container::$request->session()->delete('authenticated_with_google_until');
|
||||
|
||||
return new JsonContent(['success' => true]);
|
||||
}
|
||||
|
||||
@@ -4,7 +4,6 @@ use DateInterval;
|
||||
use DateTime;
|
||||
use SokoWeb\PersistentData\Model\Model;
|
||||
use SokoWeb\Http\Request;
|
||||
use SokoWeb\PersistentData\PersistentDataManager;
|
||||
use MapGuesser\Util\Geo\Position;
|
||||
use MapGuesser\Util\Panorama\Pov;
|
||||
|
||||
@@ -163,7 +162,7 @@ class Place extends Model
|
||||
$this->panoIdCached = $panoId;
|
||||
$this->panoIdCachedTimestamp = new DateTime();
|
||||
|
||||
(new PersistentDataManager())->saveToDb($this);
|
||||
\Container::$persistentDataManager->saveToDb($this);
|
||||
|
||||
return $panoId;
|
||||
}
|
||||
|
||||
@@ -5,20 +5,12 @@ use SokoWeb\Database\Query\Select;
|
||||
use MapGuesser\PersistentData\Model\Challenge;
|
||||
use MapGuesser\PersistentData\Model\Place;
|
||||
use MapGuesser\PersistentData\Model\User;
|
||||
use SokoWeb\PersistentData\PersistentDataManager;
|
||||
|
||||
class ChallengeRepository
|
||||
{
|
||||
private PersistentDataManager $pdm;
|
||||
|
||||
public function __construct()
|
||||
{
|
||||
$this->pdm = new PersistentDataManager();
|
||||
}
|
||||
|
||||
public function getById(int $challengeId): ?Challenge
|
||||
{
|
||||
return $this->pdm->selectFromDbById($challengeId, Challenge::class);
|
||||
return \Container::$persistentDataManager->selectFromDbById($challengeId, Challenge::class);
|
||||
}
|
||||
|
||||
public function getByToken(int $token): ?Challenge
|
||||
@@ -26,7 +18,7 @@ class ChallengeRepository
|
||||
$select = new Select(\Container::$dbConnection);
|
||||
$select->where('token', '=', $token);
|
||||
|
||||
return $this->pdm->selectFromDb($select, Challenge::class);
|
||||
return \Container::$persistentDataManager->selectFromDb($select, Challenge::class);
|
||||
}
|
||||
|
||||
public function getByTokenStr(string $token_str): ?Challenge
|
||||
@@ -48,9 +40,9 @@ class ChallengeRepository
|
||||
$select = new Select(\Container::$dbConnection);
|
||||
$select->innerJoin('user_in_challenge', ['challenge', 'id'], '=', ['user_in_challenge', 'challenge_id']);
|
||||
$select->innerJoin('users', ['users', 'id'], '=', ['user_in_challenge', 'user_id']);
|
||||
$select->where('user_id', '=', $user->getId());
|
||||
$select->where(['user_in_challenge', 'user_id'], '=', $user->getId());
|
||||
|
||||
yield from $this->pdm->selectMultipleFromDb($select, Challenge::class);
|
||||
yield from \Container::$persistentDataManager->selectMultipleFromDb($select, Challenge::class);
|
||||
}
|
||||
|
||||
public function getAllByOwner(User $user): Generator
|
||||
@@ -58,18 +50,18 @@ class ChallengeRepository
|
||||
$select = new Select(\Container::$dbConnection);
|
||||
$select->innerJoin('user_in_challenge', ['challenge', 'id'], '=', ['user_in_challenge', 'challenge_id']);
|
||||
$select->innerJoin('users', ['users', 'id'], '=', ['user_in_challenge', 'user_id']);
|
||||
$select->where('user_id', '=', $user->getId());
|
||||
$select->where('is_owner', '=', true);
|
||||
$select->where(['user_in_challenge', 'user_id'], '=', $user->getId());
|
||||
$select->where(['user_in_challenge', 'is_owner'], '=', true);
|
||||
|
||||
yield from $this->pdm->selectMultipleFromDb($select, Challenge::class);
|
||||
yield from \Container::$persistentDataManager->selectMultipleFromDb($select, Challenge::class);
|
||||
}
|
||||
|
||||
public function getAllByPlace(Place $place): Generator
|
||||
{
|
||||
$select = new Select(\Container::$dbConnection);
|
||||
$select->innerJoin('place_in_challenge', ['challenges', 'id'], '=', ['place_in_challenge', 'challenge_id']);
|
||||
$select->where('place_id', '=', $place->getId());
|
||||
$select->where(['place_in_challenge', 'place_id'], '=', $place->getId());
|
||||
|
||||
yield from $this->pdm->selectMultipleFromDb($select, Challenge::class);
|
||||
yield from \Container::$persistentDataManager->selectMultipleFromDb($select, Challenge::class);
|
||||
}
|
||||
}
|
||||
@@ -7,23 +7,15 @@ use MapGuesser\PersistentData\Model\Guess;
|
||||
use MapGuesser\PersistentData\Model\User;
|
||||
use MapGuesser\PersistentData\Model\Place;
|
||||
use MapGuesser\PersistentData\Model\PlaceInChallenge;
|
||||
use SokoWeb\PersistentData\PersistentDataManager;
|
||||
|
||||
class GuessRepository
|
||||
{
|
||||
private PersistentDataManager $pdm;
|
||||
|
||||
public function __construct()
|
||||
{
|
||||
$this->pdm = new PersistentDataManager();
|
||||
}
|
||||
|
||||
public function getAllByUser(User $user): Generator
|
||||
{
|
||||
$select = new Select(\Container::$dbConnection);
|
||||
$select->where('user_id', '=', $user->getId());
|
||||
|
||||
yield from $this->pdm->selectMultipleFromDb($select, Guess::class);
|
||||
yield from \Container::$persistentDataManager->selectMultipleFromDb($select, Guess::class);
|
||||
}
|
||||
|
||||
public function getAllByUserAndChallenge(User $user, Challenge $challenge): Generator
|
||||
@@ -31,9 +23,9 @@ class GuessRepository
|
||||
$select = new Select(\Container::$dbConnection);
|
||||
$select->innerJoin('place_in_challenge', ['place_in_challenge', 'id'], '=', ['guesses', 'place_in_challenge_id']);
|
||||
$select->where('user_id', '=', $user->getId());
|
||||
$select->where('challenge_id', '=', $challenge->getId());
|
||||
$select->where(['place_in_challenge', 'challenge_id'], '=', $challenge->getId());
|
||||
|
||||
yield from $this->pdm->selectMultipleFromDb($select, Guess::class);
|
||||
yield from \Container::$persistentDataManager->selectMultipleFromDb($select, Guess::class);
|
||||
}
|
||||
|
||||
public function getByUserAndPlaceInChallenge(User $user, Challenge $challenge, Place $place): ?Guess
|
||||
@@ -41,10 +33,10 @@ class GuessRepository
|
||||
$select = new Select(\Container::$dbConnection);
|
||||
$select->innerJoin('place_in_challenge', ['place_in_challenge', 'id'], '=', ['guesses', 'place_in_challenge_id']);
|
||||
$select->where('user_id', '=', $user->getId());
|
||||
$select->where('challenge_id', '=', $challenge->getId());
|
||||
$select->where('place_id', '=', $place->getId());
|
||||
$select->where(['place_in_challenge', 'challenge_id'], '=', $challenge->getId());
|
||||
$select->where(['place_in_challenge', 'place_id'], '=', $place->getId());
|
||||
|
||||
return $this->pdm->selectFromDb($select, Guess::class);
|
||||
return \Container::$persistentDataManager->selectFromDb($select, Guess::class);
|
||||
}
|
||||
|
||||
public function getAllInChallengeByUser(int $userId, Challenge $challenge): Generator
|
||||
@@ -52,46 +44,46 @@ class GuessRepository
|
||||
$select = new Select(\Container::$dbConnection);
|
||||
$select->innerJoin('place_in_challenge', ['place_in_challenge', 'id'], '=', ['guesses', 'place_in_challenge_id']);
|
||||
$select->where('user_id', '=', $userId);
|
||||
$select->where('challenge_id', '=', $challenge->getId());
|
||||
$select->orderBy('round');
|
||||
$select->where(['place_in_challenge', 'challenge_id'], '=', $challenge->getId());
|
||||
$select->orderBy(['place_in_challenge', 'round']);
|
||||
|
||||
yield from $this->pdm->selectMultipleFromDb($select, Guess::class);
|
||||
yield from \Container::$persistentDataManager->selectMultipleFromDb($select, Guess::class);
|
||||
}
|
||||
|
||||
public function getAllInChallenge(Challenge $challenge, array $withRelations = []): Generator
|
||||
{
|
||||
if (count($withRelations)) {
|
||||
$necessaryRelations = [PlaceInChallenge::class];
|
||||
$necessaryRelations = ['place_in_challenge'];
|
||||
$withRelations = array_unique(array_merge($withRelations, $necessaryRelations));
|
||||
}
|
||||
|
||||
$select = new Select(\Container::$dbConnection);
|
||||
$select->where('challenge_id', '=', $challenge->getId());
|
||||
$select->orderBy('round');
|
||||
$select->where(['guesses__place_in_challenge', 'challenge_id'], '=', $challenge->getId());
|
||||
$select->orderBy(['guesses__place_in_challenge', 'round']);
|
||||
|
||||
yield from $this->pdm->selectMultipleFromDb($select, Guess::class, true, $withRelations);
|
||||
yield from \Container::$persistentDataManager->selectMultipleFromDb($select, Guess::class, true, $withRelations);
|
||||
}
|
||||
|
||||
public function getAllInChallengeByRound(int $round, Challenge $challenge, array $withRelations = []): Generator
|
||||
{
|
||||
if (count($withRelations)) {
|
||||
$necessaryRelations = [PlaceInChallenge::class];
|
||||
$necessaryRelations = ['place_in_challenge'];
|
||||
$withRelations = array_unique(array_merge($withRelations, $necessaryRelations));
|
||||
}
|
||||
|
||||
$select = new Select(\Container::$dbConnection);
|
||||
$select->where('challenge_id', '=', $challenge->getId());
|
||||
$select->where('round', '=', $round);
|
||||
$select->where(['guesses__place_in_challenge', 'challenge_id'], '=', $challenge->getId());
|
||||
$select->where(['guesses__place_in_challenge', 'round'], '=', $round);
|
||||
|
||||
yield from $this->pdm->selectMultipleFromDb($select, Guess::class, true, $withRelations);
|
||||
yield from \Container::$persistentDataManager->selectMultipleFromDb($select, Guess::class, true, $withRelations);
|
||||
}
|
||||
|
||||
public function getAllByPlace(Place $place): Generator
|
||||
{
|
||||
$select = new Select(\Container::$dbConnection);
|
||||
$select->innerJoin('place_in_challenge', ['place_in_challenge', 'id'], '=', ['guesses', 'place_in_challenge_id']);
|
||||
$select->where('place_id', '=', $place->getId());
|
||||
$select->where(['place_in_challenge', 'place_id'], '=', $place->getId());
|
||||
|
||||
yield from $this->pdm->selectMultipleFromDb($select, Guess::class);
|
||||
yield from \Container::$persistentDataManager->selectMultipleFromDb($select, Guess::class);
|
||||
}
|
||||
}
|
||||
@@ -4,20 +4,12 @@ use SokoWeb\Database\Query\Select;
|
||||
use MapGuesser\PersistentData\Model\Challenge;
|
||||
use MapGuesser\PersistentData\Model\Map;
|
||||
use MapGuesser\PersistentData\Model\Place;
|
||||
use SokoWeb\PersistentData\PersistentDataManager;
|
||||
|
||||
class MapRepository
|
||||
{
|
||||
private PersistentDataManager $pdm;
|
||||
|
||||
public function __construct()
|
||||
{
|
||||
$this->pdm = new PersistentDataManager();
|
||||
}
|
||||
|
||||
public function getById(int $mapId): ?Map
|
||||
{
|
||||
return $this->pdm->selectFromDbById($mapId, Map::class);
|
||||
return \Container::$persistentDataManager->selectFromDbById($mapId, Map::class);
|
||||
}
|
||||
|
||||
public function getByPlace(Place $place): ?Map
|
||||
@@ -30,9 +22,9 @@ class MapRepository
|
||||
$select = new Select(\Container::$dbConnection);
|
||||
$select->innerJoin('places', ['maps', 'id'], '=', ['places', 'map_id']);
|
||||
$select->innerJoin('place_in_challenge', ['places', 'id'], '=', ['place_in_challenge', 'place_id']);
|
||||
$select->where('challenge_id', '=', $challenge->getId());
|
||||
$select->where(['place_in_challenge', 'challenge_id'], '=', $challenge->getId());
|
||||
$select->limit(1);
|
||||
|
||||
return $this->pdm->selectFromDb($select, Map::class);
|
||||
return \Container::$persistentDataManager->selectFromDb($select, Map::class);
|
||||
}
|
||||
}
|
||||
@@ -4,20 +4,12 @@ use DateTime;
|
||||
use Generator;
|
||||
use SokoWeb\Database\Query\Select;
|
||||
use MapGuesser\PersistentData\Model\MultiRoom;
|
||||
use SokoWeb\PersistentData\PersistentDataManager;
|
||||
|
||||
class MultiRoomRepository
|
||||
{
|
||||
private PersistentDataManager $pdm;
|
||||
|
||||
public function __construct()
|
||||
{
|
||||
$this->pdm = new PersistentDataManager();
|
||||
}
|
||||
|
||||
public function getById(int $id): ?MultiRoom
|
||||
{
|
||||
return $this->pdm->selectFromDbById($id, MultiRoom::class);
|
||||
return \Container::$persistentDataManager->selectFromDbById($id, MultiRoom::class);
|
||||
}
|
||||
|
||||
public function getByRoomId(string $roomId): ?MultiRoom
|
||||
@@ -25,7 +17,7 @@ class MultiRoomRepository
|
||||
$select = new Select(\Container::$dbConnection);
|
||||
$select->where('room_id', '=', $roomId);
|
||||
|
||||
return $this->pdm->selectFromDb($select, MultiRoom::class);
|
||||
return \Container::$persistentDataManager->selectFromDb($select, MultiRoom::class);
|
||||
}
|
||||
|
||||
public function getAllExpired(): Generator
|
||||
@@ -33,6 +25,6 @@ class MultiRoomRepository
|
||||
$select = new Select(\Container::$dbConnection);
|
||||
$select->where('updated', '<', (new DateTime('-7 day'))->format('Y-m-d H:i:s'));
|
||||
|
||||
yield from $this->pdm->selectMultipleFromDb($select, MultiRoom::class);
|
||||
yield from \Container::$persistentDataManager->selectMultipleFromDb($select, MultiRoom::class);
|
||||
}
|
||||
}
|
||||
@@ -5,23 +5,15 @@ use SokoWeb\Database\Query\Select;
|
||||
use MapGuesser\PersistentData\Model\Challenge;
|
||||
use MapGuesser\PersistentData\Model\Place;
|
||||
use MapGuesser\PersistentData\Model\PlaceInChallenge;
|
||||
use SokoWeb\PersistentData\PersistentDataManager;
|
||||
|
||||
class PlaceInChallengeRepository
|
||||
{
|
||||
private PersistentDataManager $pdm;
|
||||
|
||||
public function __construct()
|
||||
{
|
||||
$this->pdm = new PersistentDataManager();
|
||||
}
|
||||
|
||||
public function getAllByPlace(Place $place, array $withRelations = []) : Generator
|
||||
{
|
||||
$select = new Select(\Container::$dbConnection);
|
||||
$select->where('place_id', '=', $place->getId());
|
||||
|
||||
yield from $this->pdm->selectMultipleFromDb($select, PlaceInChallenge::class, true, $withRelations);
|
||||
yield from \Container::$persistentDataManager->selectMultipleFromDb($select, PlaceInChallenge::class, true, $withRelations);
|
||||
}
|
||||
|
||||
public function getAllByChallenge(Challenge $challenge) : Generator
|
||||
@@ -29,7 +21,7 @@ class PlaceInChallengeRepository
|
||||
$select = new Select(\Container::$dbConnection);
|
||||
$select->where('challenge_id', '=', $challenge->getId());
|
||||
|
||||
yield from $this->pdm->selectMultipleFromDb($select, PlaceInChallenge::class);
|
||||
yield from \Container::$persistentDataManager->selectMultipleFromDb($select, PlaceInChallenge::class);
|
||||
}
|
||||
|
||||
public function getByPlaceAndChallenge(Place $place, Challenge $challenge) : ?PlaceInChallenge
|
||||
@@ -38,7 +30,7 @@ class PlaceInChallengeRepository
|
||||
$select->where('place_id', '=', $place->getId());
|
||||
$select->where('challenge_id', '=', $challenge->getId());
|
||||
|
||||
return $this->pdm->selectFromDb($select, PlaceInChallenge::class);
|
||||
return \Container::$persistentDataManager->selectFromDb($select, PlaceInChallenge::class);
|
||||
}
|
||||
|
||||
public function getByRoundInChallenge(int $round, Challenge $challenge, array $withRelations = []): ?PlaceInChallenge
|
||||
@@ -48,6 +40,6 @@ class PlaceInChallengeRepository
|
||||
$select->orderBy('round');
|
||||
$select->limit(1, $round);
|
||||
|
||||
return $this->pdm->selectFromDb($select, PlaceInChallenge::class, true, $withRelations);
|
||||
return \Container::$persistentDataManager->selectFromDb($select, PlaceInChallenge::class, true, $withRelations);
|
||||
}
|
||||
}
|
||||
@@ -5,20 +5,12 @@ use SokoWeb\Database\Query\Select;
|
||||
use MapGuesser\PersistentData\Model\Challenge;
|
||||
use MapGuesser\PersistentData\Model\Map;
|
||||
use MapGuesser\PersistentData\Model\Place;
|
||||
use SokoWeb\PersistentData\PersistentDataManager;
|
||||
|
||||
class PlaceRepository
|
||||
{
|
||||
private PersistentDataManager $pdm;
|
||||
|
||||
public function __construct()
|
||||
{
|
||||
$this->pdm = new PersistentDataManager();
|
||||
}
|
||||
|
||||
public function getById(int $placeId): ?Place
|
||||
{
|
||||
return $this->pdm->selectFromDbById($placeId, Place::class);
|
||||
return \Container::$persistentDataManager->selectFromDbById($placeId, Place::class);
|
||||
}
|
||||
|
||||
public function getAllForMap(Map $map): Generator
|
||||
@@ -26,7 +18,7 @@ class PlaceRepository
|
||||
$select = new Select(\Container::$dbConnection);
|
||||
$select->where('map_id', '=', $map->getId());
|
||||
|
||||
yield from $this->pdm->selectMultipleFromDb($select, Place::class);
|
||||
yield from \Container::$persistentDataManager->selectMultipleFromDb($select, Place::class);
|
||||
}
|
||||
|
||||
//TODO: use Map and User instead of id
|
||||
@@ -99,7 +91,7 @@ class PlaceRepository
|
||||
$select->where('id', 'NOT IN', $exclude);
|
||||
$select->limit(1, $randomOffset);
|
||||
|
||||
return $this->pdm->selectFromDb($select, Place::class);
|
||||
return \Container::$persistentDataManager->selectFromDb($select, Place::class);
|
||||
}
|
||||
|
||||
// Never visited places
|
||||
@@ -117,8 +109,8 @@ class PlaceRepository
|
||||
// count the places never visited
|
||||
$selectUnvisited = new Select(\Container::$dbConnection, 'places');
|
||||
$selectUnvisited->leftJoin($selectPlacesByCurrentUser, ['places', 'id'], '=', ['places_by_current_user', 'place_id']);
|
||||
$selectUnvisited->where('map_id', '=', $mapId);
|
||||
$selectUnvisited->where('last_time', '=', null);
|
||||
$selectUnvisited->where(['places', 'map_id'], '=', $mapId);
|
||||
$selectUnvisited->where(['places_by_current_user', 'last_time'], '=', null);
|
||||
$numberOfUnvisitedPlaces = $selectUnvisited->count();
|
||||
|
||||
// look for as many new places as possible but maximum $n
|
||||
@@ -148,11 +140,11 @@ class PlaceRepository
|
||||
// count places that were visited at least once
|
||||
$selectOldPlaces = new Select(\Container::$dbConnection, 'places');
|
||||
$selectOldPlaces->innerJoin($selectPlacesByCurrentUser, ['places', 'id'], '=', ['places_by_current_user', 'place_id']);
|
||||
$selectOldPlaces->where('map_id', '=', $mapId);
|
||||
$selectOldPlaces->where(['places', 'map_id'], '=', $mapId);
|
||||
$numberOfOldPlaces = $selectOldPlaces->count();
|
||||
|
||||
// set order by datetime, oldest first
|
||||
$selectOldPlaces->orderBy('last_time');
|
||||
$selectOldPlaces->orderBy(['places_by_current_user', 'last_time']);
|
||||
|
||||
// selection algorithm with preference (weighting) for older places using Box-Muller transform
|
||||
$pickGaussianRandomInt = function($numberOfPlaces) {
|
||||
@@ -182,21 +174,21 @@ class PlaceRepository
|
||||
{
|
||||
$select = new Select(\Container::$dbConnection);
|
||||
$select->innerJoin('place_in_challenge', ['places', 'id'], '=', ['place_in_challenge', 'place_id']);
|
||||
$select->where('challenge_id', '=', $challenge->getId());
|
||||
$select->orderBy('round');
|
||||
$select->where(['place_in_challenge', 'challenge_id'], '=', $challenge->getId());
|
||||
$select->orderBy(['place_in_challenge', 'round']);
|
||||
$select->limit(1, $round);
|
||||
|
||||
return $this->pdm->selectFromDb($select, Place::class);
|
||||
return \Container::$persistentDataManager->selectFromDb($select, Place::class);
|
||||
}
|
||||
|
||||
public function getAllInChallenge(Challenge $challenge): Generator
|
||||
{
|
||||
$select = new Select(\Container::$dbConnection);
|
||||
$select->innerJoin('place_in_challenge', ['places', 'id'], '=', ['place_in_challenge', 'place_id']);
|
||||
$select->where('challenge_id', '=', $challenge->getId());
|
||||
$select->orderBy('round');
|
||||
$select->where(['place_in_challenge', 'challenge_id'], '=', $challenge->getId());
|
||||
$select->orderBy(['place_in_challenge', 'round']);
|
||||
|
||||
yield from $this->pdm->selectMultipleFromDb($select, Place::class);
|
||||
yield from \Container::$persistentDataManager->selectMultipleFromDb($select, Place::class);
|
||||
}
|
||||
|
||||
}
|
||||
@@ -3,20 +3,12 @@
|
||||
use SokoWeb\Database\Query\Select;
|
||||
use MapGuesser\PersistentData\Model\User;
|
||||
use MapGuesser\PersistentData\Model\UserConfirmation;
|
||||
use SokoWeb\PersistentData\PersistentDataManager;
|
||||
|
||||
class UserConfirmationRepository
|
||||
{
|
||||
private PersistentDataManager $pdm;
|
||||
|
||||
public function __construct()
|
||||
{
|
||||
$this->pdm = new PersistentDataManager();
|
||||
}
|
||||
|
||||
public function getById(int $userConfirmationId): ?UserConfirmation
|
||||
{
|
||||
return $this->pdm->selectFromDbById($userConfirmationId, UserConfirmation::class);
|
||||
return \Container::$persistentDataManager->selectFromDbById($userConfirmationId, UserConfirmation::class);
|
||||
}
|
||||
|
||||
public function getByToken(string $token): ?UserConfirmation
|
||||
@@ -24,7 +16,7 @@ class UserConfirmationRepository
|
||||
$select = new Select(\Container::$dbConnection);
|
||||
$select->where('token', '=', $token);
|
||||
|
||||
return $this->pdm->selectFromDb($select, UserConfirmation::class);
|
||||
return \Container::$persistentDataManager->selectFromDb($select, UserConfirmation::class);
|
||||
}
|
||||
|
||||
public function getByUser(User $user): ?UserConfirmation
|
||||
@@ -32,6 +24,6 @@ class UserConfirmationRepository
|
||||
$select = new Select(\Container::$dbConnection);
|
||||
$select->where('user_id', '=', $user->getId());
|
||||
|
||||
return $this->pdm->selectFromDb($select, UserConfirmation::class);
|
||||
return \Container::$persistentDataManager->selectFromDb($select, UserConfirmation::class);
|
||||
}
|
||||
}
|
||||
@@ -5,23 +5,15 @@ use SokoWeb\Database\Query\Select;
|
||||
use MapGuesser\PersistentData\Model\Challenge;
|
||||
use MapGuesser\PersistentData\Model\User;
|
||||
use MapGuesser\PersistentData\Model\UserInChallenge;
|
||||
use SokoWeb\PersistentData\PersistentDataManager;
|
||||
|
||||
class UserInChallengeRepository
|
||||
{
|
||||
private PersistentDataManager $pdm;
|
||||
|
||||
public function __construct()
|
||||
{
|
||||
$this->pdm = new PersistentDataManager();
|
||||
}
|
||||
|
||||
public function getAllByUser(User $user) : Generator
|
||||
{
|
||||
$select = new Select(\Container::$dbConnection);
|
||||
$select->where('user_id', '=', $user->getId());
|
||||
|
||||
yield from $this->pdm->selectMultipleFromDb($select, UserInChallenge::class);
|
||||
yield from \Container::$persistentDataManager->selectMultipleFromDb($select, UserInChallenge::class);
|
||||
}
|
||||
|
||||
public function getAllByChallenge(Challenge $challenge) : Generator
|
||||
@@ -29,7 +21,7 @@ class UserInChallengeRepository
|
||||
$select = new Select(\Container::$dbConnection);
|
||||
$select->where('challenge_id', '=', $challenge->getId());
|
||||
|
||||
yield from $this->pdm->selectMultipleFromDb($select, UserInChallenge::class);
|
||||
yield from \Container::$persistentDataManager->selectMultipleFromDb($select, UserInChallenge::class);
|
||||
}
|
||||
|
||||
public function getAllByChallengeWithUsers(Challenge $challenge) : Generator
|
||||
@@ -37,7 +29,7 @@ class UserInChallengeRepository
|
||||
$select = new Select(\Container::$dbConnection);
|
||||
$select->where('challenge_id', '=', $challenge->getId());
|
||||
|
||||
yield from $this->pdm->selectMultipleFromDb($select, UserInChallenge::class, true, [User::class]);
|
||||
yield from \Container::$persistentDataManager->selectMultipleFromDb($select, UserInChallenge::class, true, ['user']);
|
||||
}
|
||||
|
||||
public function getByUserIdAndChallenge(int $userId, Challenge $challenge): ?UserInChallenge
|
||||
@@ -46,13 +38,13 @@ class UserInChallengeRepository
|
||||
$select->where('user_id', '=', $userId);
|
||||
$select->where('challenge_id', '=', $challenge->getId());
|
||||
|
||||
return $this->pdm->selectFromDb($select, UserInChallenge::class);
|
||||
return \Container::$persistentDataManager->selectFromDb($select, UserInChallenge::class);
|
||||
}
|
||||
|
||||
public function getByUserIdAndToken(int $userId, string $token_str, array $withRelations = []): ?UserInChallenge
|
||||
{
|
||||
if (count($withRelations)) {
|
||||
$necessaryRelations = [Challenge::class];
|
||||
$necessaryRelations = ['challange'];
|
||||
$withRelations = array_unique(array_merge($withRelations, $necessaryRelations));
|
||||
}
|
||||
|
||||
@@ -65,9 +57,9 @@ class UserInChallengeRepository
|
||||
|
||||
$select = new Select(\Container::$dbConnection);
|
||||
$select->where('user_id', '=', $userId);
|
||||
$select->where('token', '=', $token);
|
||||
$select->where(['user_in_challenge__challenge', 'token'], '=', $token);
|
||||
|
||||
return $this->pdm->selectFromDb($select, UserInChallenge::class, true, $withRelations);
|
||||
return \Container::$persistentDataManager->selectFromDb($select, UserInChallenge::class, true, $withRelations);
|
||||
}
|
||||
|
||||
public function isUserParticipatingInChallenge(int $userId, Challenge $challenge): bool
|
||||
|
||||
@@ -5,20 +5,12 @@ use Generator;
|
||||
use SokoWeb\Database\Query\Select;
|
||||
use MapGuesser\PersistentData\Model\User;
|
||||
use MapGuesser\PersistentData\Model\UserPasswordResetter;
|
||||
use SokoWeb\PersistentData\PersistentDataManager;
|
||||
|
||||
class UserPasswordResetterRepository
|
||||
{
|
||||
private PersistentDataManager $pdm;
|
||||
|
||||
public function __construct()
|
||||
{
|
||||
$this->pdm = new PersistentDataManager();
|
||||
}
|
||||
|
||||
public function getById(int $userConfirmationId): ?UserPasswordResetter
|
||||
{
|
||||
return $this->pdm->selectFromDbById($userConfirmationId, UserPasswordResetter::class);
|
||||
return \Container::$persistentDataManager->selectFromDbById($userConfirmationId, UserPasswordResetter::class);
|
||||
}
|
||||
|
||||
public function getByToken(string $token): ?UserPasswordResetter
|
||||
@@ -26,7 +18,7 @@ class UserPasswordResetterRepository
|
||||
$select = new Select(\Container::$dbConnection);
|
||||
$select->where('token', '=', $token);
|
||||
|
||||
return $this->pdm->selectFromDb($select, UserPasswordResetter::class);
|
||||
return \Container::$persistentDataManager->selectFromDb($select, UserPasswordResetter::class);
|
||||
}
|
||||
|
||||
public function getByUser(User $user): ?UserPasswordResetter
|
||||
@@ -34,7 +26,7 @@ class UserPasswordResetterRepository
|
||||
$select = new Select(\Container::$dbConnection);
|
||||
$select->where('user_id', '=', $user->getId());
|
||||
|
||||
return $this->pdm->selectFromDb($select, UserPasswordResetter::class);
|
||||
return \Container::$persistentDataManager->selectFromDb($select, UserPasswordResetter::class);
|
||||
}
|
||||
|
||||
public function getAllExpired(): Generator
|
||||
@@ -42,6 +34,6 @@ class UserPasswordResetterRepository
|
||||
$select = new Select(\Container::$dbConnection);
|
||||
$select->where('expires', '<', (new DateTime())->format('Y-m-d H:i:s'));
|
||||
|
||||
yield from $this->pdm->selectMultipleFromDb($select, UserPasswordResetter::class);
|
||||
yield from \Container::$persistentDataManager->selectMultipleFromDb($select, UserPasswordResetter::class);
|
||||
}
|
||||
}
|
||||
@@ -5,23 +5,15 @@ use SokoWeb\Database\Query\Select;
|
||||
use MapGuesser\PersistentData\Model\User;
|
||||
use MapGuesser\PersistentData\Model\Place;
|
||||
use MapGuesser\PersistentData\Model\UserPlayedPlace;
|
||||
use SokoWeb\PersistentData\PersistentDataManager;
|
||||
|
||||
class UserPlayedPlaceRepository
|
||||
{
|
||||
private PersistentDataManager $pdm;
|
||||
|
||||
public function __construct()
|
||||
{
|
||||
$this->pdm = new PersistentDataManager();
|
||||
}
|
||||
|
||||
public function getByUser(User $user): Generator
|
||||
{
|
||||
$select = new Select(\Container::$dbConnection);
|
||||
$select->where('user_id', '=', $user->getId());
|
||||
|
||||
yield from $this->pdm->selectMultipleFromDb($select, UserPlayedPlace::class);
|
||||
yield from \Container::$persistentDataManager->selectMultipleFromDb($select, UserPlayedPlace::class);
|
||||
}
|
||||
|
||||
public function getAllByPlace(Place $place): Generator
|
||||
@@ -29,7 +21,7 @@ class UserPlayedPlaceRepository
|
||||
$select = new Select(\Container::$dbConnection);
|
||||
$select->where('place_id', '=', $place->getId());
|
||||
|
||||
yield from $this->pdm->selectMultipleFromDb($select, UserPlayedPlace::class);
|
||||
yield from \Container::$persistentDataManager->selectMultipleFromDb($select, UserPlayedPlace::class);
|
||||
}
|
||||
|
||||
public function getAllByUser(User $user) : Generator
|
||||
@@ -37,7 +29,7 @@ class UserPlayedPlaceRepository
|
||||
$select = new Select(\Container::$dbConnection);
|
||||
$select->where('user_id', '=', $user->getId());
|
||||
|
||||
yield from $this->pdm->selectMultipleFromDb($select, UserPlayedPlace::class);
|
||||
yield from \Container::$persistentDataManager->selectMultipleFromDb($select, UserPlayedPlace::class);
|
||||
}
|
||||
|
||||
public function getByUserIdAndPlaceId(int $userId, int $placeId) : ?UserPlayedPlace
|
||||
@@ -46,6 +38,6 @@ class UserPlayedPlaceRepository
|
||||
$select->where('user_id', '=', $userId);
|
||||
$select->where('place_id', '=', $placeId);
|
||||
|
||||
return $this->pdm->selectFromDb($select, UserPlayedPlace::class);
|
||||
return \Container::$persistentDataManager->selectFromDb($select, UserPlayedPlace::class);
|
||||
}
|
||||
}
|
||||
@@ -6,20 +6,12 @@ use SokoWeb\Interfaces\Repository\IUserRepository;
|
||||
use SokoWeb\Database\Query\Select;
|
||||
use MapGuesser\PersistentData\Model\Guess;
|
||||
use MapGuesser\PersistentData\Model\User;
|
||||
use SokoWeb\PersistentData\PersistentDataManager;
|
||||
|
||||
class UserRepository implements IUserRepository
|
||||
{
|
||||
private PersistentDataManager $pdm;
|
||||
|
||||
public function __construct()
|
||||
{
|
||||
$this->pdm = new PersistentDataManager();
|
||||
}
|
||||
|
||||
public function getById(int $userId): ?User
|
||||
{
|
||||
return $this->pdm->selectFromDbById($userId, User::class);
|
||||
return \Container::$persistentDataManager->selectFromDbById($userId, User::class);
|
||||
}
|
||||
|
||||
public function getByEmail(string $email): ?User
|
||||
@@ -27,7 +19,7 @@ class UserRepository implements IUserRepository
|
||||
$select = new Select(\Container::$dbConnection);
|
||||
$select->where('email', '=', $email);
|
||||
|
||||
return $this->pdm->selectFromDb($select, User::class);
|
||||
return \Container::$persistentDataManager->selectFromDb($select, User::class);
|
||||
}
|
||||
|
||||
public function getByGoogleSub(string $sub): ?User
|
||||
@@ -35,7 +27,7 @@ class UserRepository implements IUserRepository
|
||||
$select = new Select(\Container::$dbConnection);
|
||||
$select->where('google_sub', '=', $sub);
|
||||
|
||||
return $this->pdm->selectFromDb($select, User::class);
|
||||
return \Container::$persistentDataManager->selectFromDb($select, User::class);
|
||||
}
|
||||
|
||||
public function getAllInactiveExpired(): Generator
|
||||
@@ -44,7 +36,7 @@ class UserRepository implements IUserRepository
|
||||
$select->where('active', '=', false);
|
||||
$select->where('created', '<', (new DateTime('-1 day'))->format('Y-m-d H:i:s'));
|
||||
|
||||
yield from $this->pdm->selectMultipleFromDb($select, User::class);
|
||||
yield from \Container::$persistentDataManager->selectMultipleFromDb($select, User::class);
|
||||
}
|
||||
|
||||
public function getByGuess(Guess $guess): ?User
|
||||
|
||||
@@ -9,12 +9,12 @@
|
||||
<?php if ($user['password'] !== null && $user['google_sub'] !== null): ?>
|
||||
<p class="justify small">Please confirm your identity with your password or with Google to modify your account.</p>
|
||||
<div class="inputWithButton">
|
||||
<input type="password" class="text name="password" placeholder="Current password" required minlength="6" autofocus><!--
|
||||
<input type="password" class="text name="password" placeholder="Current password" autocomplete="current-password" required minlength="6" autofocus><!--
|
||||
--><button id="authenticateWithGoogleButton" class="yellow" type="button">Google</button>
|
||||
</div>
|
||||
<?php elseif ($user['password'] !== null): ?>
|
||||
<p class="justify small">Please confirm your identity with your password to modify your account.</p>
|
||||
<input type="password" class="text big fullWidth" name="password" placeholder="Current password" required minlength="6" autofocus>
|
||||
<input type="password" class="text big fullWidth" name="password" placeholder="Current password" autocomplete="current-password" required minlength="6" autofocus>
|
||||
<?php elseif ($user['google_sub'] !== null): ?>
|
||||
<p class="justify small">Please confirm your identity with Google to modify your account.</p>
|
||||
<div class="inputWithButton">
|
||||
@@ -24,9 +24,9 @@
|
||||
<?php endif; ?>
|
||||
<hr>
|
||||
<?php /* TODO: disabled for the time being, email modification should be implemented */ ?>
|
||||
<input type="email" class="text big fullWidth" name="email" placeholder="Email address" value="<?= $user['email'] ?>" disabled>
|
||||
<input type="password" class="text big fullWidth marginTop" name="password_new" placeholder="New password" minlength="6">
|
||||
<input type="password" class="text big fullWidth marginTop" name="password_new_confirm" placeholder="New password confirmation" minlength="6">
|
||||
<input type="email" class="text big fullWidth" name="email" placeholder="Email address" autocomplete="username" value="<?= $user['email'] ?>" disabled>
|
||||
<input type="password" class="text big fullWidth marginTop" name="password_new" placeholder="New password" autocomplete="new-password" minlength="6">
|
||||
<input type="password" class="text big fullWidth marginTop" name="password_new_confirm" placeholder="New password confirmation" autocomplete="new-password" minlength="6">
|
||||
<p id="accountFormError" class="formError justify marginTop"></p>
|
||||
<div class="right marginTop">
|
||||
<button type="submit" name="submit" disabled>Save</button>
|
||||
|
||||
@@ -7,15 +7,16 @@
|
||||
<div class="box">
|
||||
<form id="deleteAccountForm" action="/account/delete" method="post" data-redirect-on-success="/">
|
||||
<p class="justify marginBottom">Are you sure you want to delete your account? This cannot be undone!</p>
|
||||
<input type="email" style="display: none;" name="email" autocomplete="username" value="<?= $user['email'] ?>">
|
||||
<?php if ($user['password'] !== null && $user['google_sub'] !== null): ?>
|
||||
<p class="justify small">Please confirm your identity with your password or with Google to delete your account.</p>
|
||||
<div class="inputWithButton">
|
||||
<input type="password" class="text" name="password" placeholder="Current password" required minlength="6" autofocus><!--
|
||||
<input type="password" class="text" name="password" placeholder="Current password" autocomplete="current-password" required minlength="6" autofocus><!--
|
||||
--><button id="authenticateWithGoogleButton" class="yellow" type="button">Google</button>
|
||||
</div>
|
||||
<?php elseif ($user['password'] !== null): ?>
|
||||
<p class="justify small">Please confirm your identity with your password to delete your account.</p>
|
||||
<input type="password" class="text big fullWidth" name="password" placeholder="Current password" required minlength="6" autofocus>
|
||||
<input type="password" class="text big fullWidth" name="password" placeholder="Current password" autocomplete="current-password" required minlength="6" autofocus>
|
||||
<?php elseif ($user['google_sub'] !== null): ?>
|
||||
<p class="justify small">Please confirm your identity with Google to delete your account.</p>
|
||||
<div class="inputWithButton">
|
||||
|
||||
@@ -0,0 +1,11 @@
|
||||
@extends(templates/layout_normal)
|
||||
|
||||
@section(main)
|
||||
<h2>500 | Internal server error</h2>
|
||||
<p>An error occured during processing your request. <a href="<?= Container::$routeCollection->getRoute('index')->generateLink() ?>" title="<?= $_ENV['APP_NAME'] ?>">Back to start.</a></p>
|
||||
<?php if (isset($exceptionToPrint)): ?>
|
||||
<pre class="marginTop">
|
||||
<?= $exceptionToPrint ?>
|
||||
</pre>
|
||||
<?php endif; ?>
|
||||
@endsection
|
||||
@@ -4,8 +4,8 @@
|
||||
<h2>Login</h2>
|
||||
<div class="box">
|
||||
<form id="loginForm" action="/login" method="post" data-redirect-on-success="<?= $redirectUrl ?>">
|
||||
<input type="email" class="text big fullWidth" name="email" placeholder="Email address" required autofocus>
|
||||
<input type="password" class="text big fullWidth marginTop" name="password" placeholder="Password" required minlength="6">
|
||||
<input type="email" class="text big fullWidth" name="email" placeholder="Email address" autocomplete="username" required autofocus>
|
||||
<input type="password" class="text big fullWidth marginTop" name="password" placeholder="Password" autocomplete="current-password" required minlength="6">
|
||||
<p id="loginFormError" class="formError justify marginTop"></p>
|
||||
<div class="right marginTop">
|
||||
<button type="submit">Login</button>
|
||||
|
||||
@@ -6,7 +6,7 @@
|
||||
<h2>Request password reset</h2>
|
||||
<div class="box">
|
||||
<form id="passwordResetForm" action="/password/requestReset" method="post" data-redirect-on-success="/password/requestReset/success">
|
||||
<input type="email" class="text big fullWidth" name="email" placeholder="Email address" value="<?= isset($email) ? $email : '' ?>" required autofocus>
|
||||
<input type="email" class="text big fullWidth" name="email" placeholder="Email address" autocomplete="username" value="<?= isset($email) ? $email : '' ?>" required autofocus>
|
||||
<?php if (!empty($_ENV['RECAPTCHA_SITEKEY'])): ?>
|
||||
<div class="marginTop">
|
||||
<div class="g-recaptcha" data-sitekey="<?= $_ENV['RECAPTCHA_SITEKEY'] ?>"></div>
|
||||
|
||||
@@ -5,9 +5,9 @@
|
||||
<div class="box">
|
||||
<?php if ($success) : ?>
|
||||
<form id="resetPasswordForm" action="/password/reset/<?= $token ?>" method="post" data-redirect-on-success="<?= $redirectUrl ?>">
|
||||
<input type="email" class="text big fullWidth" name="email" placeholder="Email address" value="<?= $email ?>" disabled>
|
||||
<input type="password" class="text big fullWidth marginTop" name="password" placeholder="Password" required minlength="6" autofocus>
|
||||
<input type="password" class="text big fullWidth marginTop" name="password_confirm" placeholder="Password confirmation" required minlength="6">
|
||||
<input type="email" class="text big fullWidth" name="email" placeholder="Email address" autocomplete="username" value="<?= $email ?>" disabled>
|
||||
<input type="password" class="text big fullWidth marginTop" name="password" placeholder="Password" autocomplete="new-password" required minlength="6" autofocus>
|
||||
<input type="password" class="text big fullWidth marginTop" name="password_confirm" placeholder="Password confirmation" autocomplete="new-password" required minlength="6">
|
||||
<p id="resetPasswordFormError" class="formError justify marginTop"></p>
|
||||
<div class="right">
|
||||
<button class="marginTop" type="submit">Reset password</button>
|
||||
|
||||
@@ -9,12 +9,12 @@
|
||||
<form id="signupForm" action="/signup" method="post" data-redirect-on-success="/signup/success">
|
||||
<?php if (isset($email)): ?>
|
||||
<p class="justify">No user found with the given email address. Sign up with one click!</p>
|
||||
<input type="email" class="text big fullWidth marginTop" name="email" placeholder="Email address" value="<?= $email ?>" required>
|
||||
<input type="password" class="text big fullWidth marginTop" name="password" placeholder="Password confirmation" required minlength="6" autofocus>
|
||||
<input type="email" class="text big fullWidth marginTop" name="email" placeholder="Email address" autocomplete="username" value="<?= $email ?>" required>
|
||||
<input type="password" class="text big fullWidth marginTop" name="password" placeholder="Password confirmation" autocomplete="new-password" required minlength="6" autofocus>
|
||||
<?php else: ?>
|
||||
<input type="email" class="text big fullWidth" name="email" placeholder="Email address" required autofocus>
|
||||
<input type="password" class="text big fullWidth marginTop" name="password" placeholder="Password" required minlength="6">
|
||||
<input type="password" class="text big fullWidth marginTop" name="password_confirm" placeholder="Password confirmation" minlength="6">
|
||||
<input type="email" class="text big fullWidth" name="email" placeholder="Email address" autocomplete="username" required autofocus>
|
||||
<input type="password" class="text big fullWidth marginTop" name="password" placeholder="Password" autocomplete="new-password" required minlength="6">
|
||||
<input type="password" class="text big fullWidth marginTop" name="password_confirm" placeholder="Password confirmation" autocomplete="new-password" minlength="6">
|
||||
<?php endif; ?>
|
||||
<?php if (!empty($_ENV['RECAPTCHA_SITEKEY'])): ?>
|
||||
<div class="marginTop">
|
||||
|
||||
@@ -1,5 +1,19 @@
|
||||
<?php
|
||||
|
||||
use SokoWeb\Response\HttpResponse;
|
||||
use SokoWeb\Routing\RouteCollection;
|
||||
use SokoWeb\Session\DatabaseSessionHandler;
|
||||
use SokoWeb\Request\Request;
|
||||
use SokoWeb\Request\Session;
|
||||
use MapGuesser\Controller\MapsController;
|
||||
use MapGuesser\Controller\HomeController;
|
||||
use MapGuesser\Controller\LoginController;
|
||||
use MapGuesser\Controller\UserController;
|
||||
use MapGuesser\Controller\GameController;
|
||||
use MapGuesser\Controller\GameFlowController;
|
||||
use MapGuesser\Controller\MapAdminController;
|
||||
use MapGuesser\Repository\UserRepository;
|
||||
|
||||
require 'main.php';
|
||||
|
||||
if (!empty($_ENV['DEV'])) {
|
||||
@@ -10,94 +24,88 @@ if (!empty($_ENV['DEV'])) {
|
||||
ini_set('display_errors', '0');
|
||||
}
|
||||
|
||||
Container::$routeCollection = new SokoWeb\Routing\RouteCollection();
|
||||
Container::$routeCollection = new RouteCollection();
|
||||
|
||||
Container::$routeCollection->get('index', '', [MapGuesser\Controller\MapsController::class, 'getMaps']);
|
||||
Container::$routeCollection->get('startSession', 'startSession.json', [MapGuesser\Controller\HomeController::class, 'startSession']);
|
||||
Container::$routeCollection->group('login', function (SokoWeb\Routing\RouteCollection $routeCollection) {
|
||||
$routeCollection->get('login', '', [MapGuesser\Controller\LoginController::class, 'getLoginForm']);
|
||||
$routeCollection->post('login-action', '', [MapGuesser\Controller\LoginController::class, 'login']);
|
||||
$routeCollection->get('login-google', 'google', [MapGuesser\Controller\LoginController::class, 'getGoogleLoginRedirect']);
|
||||
$routeCollection->get('login-google-action', 'google/code', [MapGuesser\Controller\LoginController::class, 'loginWithGoogle']);
|
||||
Container::$routeCollection->get('index', '', [MapsController::class, 'getMaps']);
|
||||
Container::$routeCollection->get('startSession', 'startSession.json', [HomeController::class, 'startSession']);
|
||||
Container::$routeCollection->group('login', function (RouteCollection $routeCollection) {
|
||||
$routeCollection->get('login', '', [LoginController::class, 'getLoginForm']);
|
||||
$routeCollection->post('login-action', '', [LoginController::class, 'login']);
|
||||
$routeCollection->get('login-google', 'google', [LoginController::class, 'getGoogleLoginRedirect']);
|
||||
$routeCollection->get('login-google-action', 'google/code', [LoginController::class, 'loginWithGoogle']);
|
||||
});
|
||||
Container::$routeCollection->group('signup', function (SokoWeb\Routing\RouteCollection $routeCollection) {
|
||||
$routeCollection->get('signup', '', [MapGuesser\Controller\LoginController::class, 'getSignupForm']);
|
||||
$routeCollection->post('signup-action', '', [MapGuesser\Controller\LoginController::class, 'signup']);
|
||||
$routeCollection->get('signup-google', 'google', [MapGuesser\Controller\LoginController::class, 'getSignupWithGoogleForm']);
|
||||
$routeCollection->post('signup-google-action', 'google', [MapGuesser\Controller\LoginController::class, 'signupWithGoogle']);
|
||||
$routeCollection->post('signup.reset', 'reset', [MapGuesser\Controller\LoginController::class, 'resetSignup']);
|
||||
$routeCollection->post('signup-google.reset', 'google/reset', [MapGuesser\Controller\LoginController::class, 'resetGoogleSignup']);
|
||||
$routeCollection->get('signup.success', 'success', [MapGuesser\Controller\LoginController::class, 'getSignupSuccess']);
|
||||
$routeCollection->get('signup.activate', 'activate/{token}', [MapGuesser\Controller\LoginController::class, 'activate']);
|
||||
$routeCollection->get('signup.cancel', 'cancel/{token}', [MapGuesser\Controller\LoginController::class, 'cancel']);
|
||||
Container::$routeCollection->group('signup', function (RouteCollection $routeCollection) {
|
||||
$routeCollection->get('signup', '', [LoginController::class, 'getSignupForm']);
|
||||
$routeCollection->post('signup-action', '', [LoginController::class, 'signup']);
|
||||
$routeCollection->get('signup-google', 'google', [LoginController::class, 'getSignupWithGoogleForm']);
|
||||
$routeCollection->post('signup-google-action', 'google', [LoginController::class, 'signupWithGoogle']);
|
||||
$routeCollection->post('signup.reset', 'reset', [LoginController::class, 'resetSignup']);
|
||||
$routeCollection->post('signup-google.reset', 'google/reset', [LoginController::class, 'resetGoogleSignup']);
|
||||
$routeCollection->get('signup.success', 'success', [LoginController::class, 'getSignupSuccess']);
|
||||
$routeCollection->get('signup.activate', 'activate/{token}', [LoginController::class, 'activate']);
|
||||
$routeCollection->get('signup.cancel', 'cancel/{token}', [LoginController::class, 'cancel']);
|
||||
});
|
||||
Container::$routeCollection->group('password', function (SokoWeb\Routing\RouteCollection $routeCollection) {
|
||||
$routeCollection->get('password-requestReset', 'requestReset', [MapGuesser\Controller\LoginController::class, 'getRequestPasswordResetForm']);
|
||||
$routeCollection->post('password-requestReset-action', 'requestReset', [MapGuesser\Controller\LoginController::class, 'requestPasswordReset']);
|
||||
$routeCollection->get('password-requestReset.success', 'requestReset/success', [MapGuesser\Controller\LoginController::class, 'getRequestPasswordResetSuccess']);
|
||||
$routeCollection->get('password-reset', 'reset/{token}', [MapGuesser\Controller\LoginController::class, 'getResetPasswordForm']);
|
||||
$routeCollection->post('password-reset.action', 'reset/{token}', [MapGuesser\Controller\LoginController::class, 'resetPassword']);
|
||||
Container::$routeCollection->group('password', function (RouteCollection $routeCollection) {
|
||||
$routeCollection->get('password-requestReset', 'requestReset', [LoginController::class, 'getRequestPasswordResetForm']);
|
||||
$routeCollection->post('password-requestReset-action', 'requestReset', [LoginController::class, 'requestPasswordReset']);
|
||||
$routeCollection->get('password-requestReset.success', 'requestReset/success', [LoginController::class, 'getRequestPasswordResetSuccess']);
|
||||
$routeCollection->get('password-reset', 'reset/{token}', [LoginController::class, 'getResetPasswordForm']);
|
||||
$routeCollection->post('password-reset.action', 'reset/{token}', [LoginController::class, 'resetPassword']);
|
||||
});
|
||||
Container::$routeCollection->get('logout', 'logout', [MapGuesser\Controller\LoginController::class, 'logout']);
|
||||
Container::$routeCollection->group('account', function (SokoWeb\Routing\RouteCollection $routeCollection) {
|
||||
$routeCollection->get('account', '', [MapGuesser\Controller\UserController::class, 'getAccount']);
|
||||
$routeCollection->post('account-action', '', [MapGuesser\Controller\UserController::class, 'saveAccount']);
|
||||
$routeCollection->get('account.delete', 'delete', [MapGuesser\Controller\UserController::class, 'getDeleteAccount']);
|
||||
$routeCollection->post('account.delete-action', 'delete', [MapGuesser\Controller\UserController::class, 'deleteAccount']);
|
||||
$routeCollection->get('account.googleAuthenticate', 'googleAuthenticate', [MapGuesser\Controller\UserController::class, 'getGoogleAuthenticateRedirect']);
|
||||
$routeCollection->get('account.googleAuthenticate-action', 'googleAuthenticate/code', [MapGuesser\Controller\UserController::class, 'authenticateWithGoogle']);
|
||||
Container::$routeCollection->get('logout', 'logout', [LoginController::class, 'logout']);
|
||||
Container::$routeCollection->group('account', function (RouteCollection $routeCollection) {
|
||||
$routeCollection->get('account', '', [UserController::class, 'getAccount']);
|
||||
$routeCollection->post('account-action', '', [UserController::class, 'saveAccount']);
|
||||
$routeCollection->get('account.delete', 'delete', [UserController::class, 'getDeleteAccount']);
|
||||
$routeCollection->post('account.delete-action', 'delete', [UserController::class, 'deleteAccount']);
|
||||
$routeCollection->get('account.googleAuthenticate', 'googleAuthenticate', [UserController::class, 'getGoogleAuthenticateRedirect']);
|
||||
$routeCollection->get('account.googleAuthenticate-action', 'googleAuthenticate/code', [UserController::class, 'authenticateWithGoogle']);
|
||||
});
|
||||
//Container::$routeCollection->get('maps', 'maps', [MapGuesser\Controller\MapsController::class, 'getMaps']);
|
||||
Container::$routeCollection->group('game', function (SokoWeb\Routing\RouteCollection $routeCollection) {
|
||||
$routeCollection->get('game', '{mapId}', [MapGuesser\Controller\GameController::class, 'getGame']);
|
||||
$routeCollection->post('game.prepare-json', '{mapId}/prepare.json', [MapGuesser\Controller\GameController::class, 'prepareGame']);
|
||||
$routeCollection->post('game.initialData-json', '{mapId}/initialData.json', [MapGuesser\Controller\GameFlowController::class, 'initialData']);
|
||||
$routeCollection->post('game.guess-json', '{mapId}/guess.json', [MapGuesser\Controller\GameFlowController::class, 'guess']);
|
||||
//Container::$routeCollection->get('maps', 'maps', [MapsController::class, 'getMaps']);
|
||||
Container::$routeCollection->group('game', function (RouteCollection $routeCollection) {
|
||||
$routeCollection->get('game', '{mapId}', [GameController::class, 'getGame']);
|
||||
$routeCollection->post('game.prepare-json', '{mapId}/prepare.json', [GameController::class, 'prepareGame']);
|
||||
$routeCollection->post('game.initialData-json', '{mapId}/initialData.json', [GameFlowController::class, 'initialData']);
|
||||
$routeCollection->post('game.guess-json', '{mapId}/guess.json', [GameFlowController::class, 'guess']);
|
||||
});
|
||||
Container::$routeCollection->group('multiGame', function (SokoWeb\Routing\RouteCollection $routeCollection) {
|
||||
$routeCollection->get('multiGame.new', 'new/{mapId}', [MapGuesser\Controller\GameController::class, 'getNewMultiGame']);
|
||||
$routeCollection->get('multiGame', '{roomId}', [MapGuesser\Controller\GameController::class, 'getMultiGame']);
|
||||
$routeCollection->post('multiGame.prepare-json', '{roomId}/prepare.json', [MapGuesser\Controller\GameController::class, 'prepareMultiGame']);
|
||||
$routeCollection->post('multiGame.initialData-json', '{roomId}/initialData.json', [MapGuesser\Controller\GameFlowController::class, 'multiInitialData']);
|
||||
$routeCollection->post('multiGame.nextRound-json', '{roomId}/nextRound.json', [MapGuesser\Controller\GameFlowController::class, 'multiNextRound']);
|
||||
$routeCollection->post('multiGame.guess-json', '{roomId}/guess.json', [MapGuesser\Controller\GameFlowController::class, 'multiGuess']);
|
||||
Container::$routeCollection->group('multiGame', function (RouteCollection $routeCollection) {
|
||||
$routeCollection->get('multiGame.new', 'new/{mapId}', [GameController::class, 'getNewMultiGame']);
|
||||
$routeCollection->get('multiGame', '{roomId}', [GameController::class, 'getMultiGame']);
|
||||
$routeCollection->post('multiGame.prepare-json', '{roomId}/prepare.json', [GameController::class, 'prepareMultiGame']);
|
||||
$routeCollection->post('multiGame.initialData-json', '{roomId}/initialData.json', [GameFlowController::class, 'multiInitialData']);
|
||||
$routeCollection->post('multiGame.nextRound-json', '{roomId}/nextRound.json', [GameFlowController::class, 'multiNextRound']);
|
||||
$routeCollection->post('multiGame.guess-json', '{roomId}/guess.json', [GameFlowController::class, 'multiGuess']);
|
||||
});
|
||||
Container::$routeCollection->group('challenge', function (SokoWeb\Routing\RouteCollection $routeCollection) {
|
||||
$routeCollection->post('challenge.create', 'create.json', [\MapGuesser\Controller\GameController::class, 'createNewChallenge']);
|
||||
$routeCollection->get('challenge', '{challengeToken}', [MapGuesser\Controller\GameController::class, 'getChallenge']);
|
||||
$routeCollection->post('challenge.prepare-json', '{challengeToken}/prepare.json', [MapGuesser\Controller\GameController::class, 'prepareChallenge']);
|
||||
$routeCollection->post('challenge.initialData-json', '{challengeToken}/initialData.json', [MapGuesser\Controller\GameFlowController::class, 'challengeInitialData']);
|
||||
$routeCollection->post('challenge.guess-json', '{challengeToken}/guess.json', [MapGuesser\Controller\GameFlowController::class, 'challengeGuess']);
|
||||
Container::$routeCollection->group('challenge', function (RouteCollection $routeCollection) {
|
||||
$routeCollection->post('challenge.create', 'create.json', [GameController::class, 'createNewChallenge']);
|
||||
$routeCollection->get('challenge', '{challengeToken}', [GameController::class, 'getChallenge']);
|
||||
$routeCollection->post('challenge.prepare-json', '{challengeToken}/prepare.json', [GameController::class, 'prepareChallenge']);
|
||||
$routeCollection->post('challenge.initialData-json', '{challengeToken}/initialData.json', [GameFlowController::class, 'challengeInitialData']);
|
||||
$routeCollection->post('challenge.guess-json', '{challengeToken}/guess.json', [GameFlowController::class, 'challengeGuess']);
|
||||
});
|
||||
Container::$routeCollection->group('admin', function (SokoWeb\Routing\RouteCollection $routeCollection) {
|
||||
$routeCollection->get('admin.mapEditor', 'mapEditor/{mapId?}', [MapGuesser\Controller\MapAdminController::class, 'getMapEditor']);
|
||||
$routeCollection->get('admin.place', 'place.json/{placeId}', [MapGuesser\Controller\MapAdminController::class, 'getPlace']);
|
||||
$routeCollection->post('admin.saveMap', 'saveMap/{mapId}/json', [MapGuesser\Controller\MapAdminController::class, 'saveMap']);
|
||||
$routeCollection->post('admin.deleteMap', 'deleteMap/{mapId}', [MapGuesser\Controller\MapAdminController::class, 'deleteMap']);
|
||||
Container::$routeCollection->group('admin', function (RouteCollection $routeCollection) {
|
||||
$routeCollection->get('admin.mapEditor', 'mapEditor/{mapId?}', [MapAdminController::class, 'getMapEditor']);
|
||||
$routeCollection->get('admin.place', 'place.json/{placeId}', [MapAdminController::class, 'getPlace']);
|
||||
$routeCollection->post('admin.saveMap', 'saveMap/{mapId}/json', [MapAdminController::class, 'saveMap']);
|
||||
$routeCollection->post('admin.deleteMap', 'deleteMap/{mapId}', [MapAdminController::class, 'deleteMap']);
|
||||
});
|
||||
|
||||
if (isset($_COOKIE['COOKIES_CONSENT'])) {
|
||||
Container::$sessionHandler = new SokoWeb\Session\DatabaseSessionHandler();
|
||||
Container::$sessionHandler = new DatabaseSessionHandler(
|
||||
Container::$dbConnection,
|
||||
'sessions',
|
||||
new DateTime('-7 days')
|
||||
);
|
||||
|
||||
session_set_save_handler(Container::$sessionHandler, true);
|
||||
session_start([
|
||||
'gc_probability' => 0, // old sessions are deleted by MaintainDatabaseCommand
|
||||
'cookie_lifetime' => 604800,
|
||||
'cookie_lifetime' => 0,
|
||||
'cookie_path' => '/',
|
||||
'cookie_httponly' => true,
|
||||
'cookie_samesite' => 'Lax'
|
||||
]);
|
||||
|
||||
if (isset($_COOKIE[session_name()])) {
|
||||
// extend session cookie lifetime is cookie already exists
|
||||
setcookie(session_name(), session_id(), [
|
||||
'expires' => time() + 604800,
|
||||
'path' => '/',
|
||||
'httponly' => true,
|
||||
'samesite' => 'Lax'
|
||||
]);
|
||||
}
|
||||
|
||||
// this is needed to handle old type of session IDs
|
||||
if (!Container::$sessionHandler->validateId(session_id())) {
|
||||
session_regenerate_id(true);
|
||||
@@ -106,15 +114,34 @@ if (isset($_COOKIE['COOKIES_CONSENT'])) {
|
||||
$_SESSION = [];
|
||||
}
|
||||
|
||||
Container::$request = new SokoWeb\Request\Request(
|
||||
Container::$request = new Request(
|
||||
$_SERVER['REQUEST_SCHEME'] . '://' . $_SERVER['HTTP_HOST'],
|
||||
$_GET,
|
||||
$_POST,
|
||||
getallheaders(),
|
||||
$_SESSION,
|
||||
new MapGuesser\Repository\UserRepository()
|
||||
new Session($_SESSION),
|
||||
new UserRepository()
|
||||
);
|
||||
|
||||
if (!Container::$request->session()->has('anti_csrf_token')) {
|
||||
Container::$request->session()->set('anti_csrf_token', bin2hex(random_bytes(16)));
|
||||
}
|
||||
|
||||
$appConfig = [
|
||||
'antiCsrfTokenName' => 'anti_csrf_token',
|
||||
'antiCsrfTokenErrorResponse' => ['error' => 'no_valid_anti_csrf_token'],
|
||||
'antiCsrfTokenExceptions' => [],
|
||||
'loginRouteId' => 'login',
|
||||
'error404View' => 'error/404',
|
||||
'error500View' => 'error/500'
|
||||
];
|
||||
|
||||
$httpReponse = new HttpResponse(
|
||||
Container::$request,
|
||||
Container::$dbConnection,
|
||||
Container::$routeCollection,
|
||||
$appConfig,
|
||||
$_SERVER['REQUEST_METHOD'],
|
||||
$_SERVER['REQUEST_URI']
|
||||
);
|
||||
$httpReponse->render();
|
||||
Reference in new issue
Block a user