| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403 |
- <?php
- namespace Opentalent\OtAdmin\Http;
- use Opentalent\OtAdmin\Controller\ScanController;
- use Opentalent\OtAdmin\Controller\SiteController;
- use Psr\Log\LoggerAwareInterface;
- use Psr\Log\LoggerAwareTrait;
- use TYPO3\CMS\Core\Http\JsonResponse;
- use TYPO3\CMS\Core\Http\ServerRequest;
- use TYPO3\CMS\Core\Utility\GeneralUtility;
- use TYPO3\CMS\Extbase\Object\ObjectManager;
- /**
- * Actions for Http API calls
- *
- * @package Opentalent\OtAdmin\Http
- */
- class ApiController implements LoggerAwareInterface
- {
- use LoggerAwareTrait;
- const ALLOWED_IPS = [
- '/^127\.0\.0\.[0-1]$/',
- '/^localhost$/',
- '/^10\.8\.0\.\d{1,3}$/',
- '/^80\.245\.24\.68$/', // prod-front
- '/^80\.245\.24\.70$/', // prod-back
- '/^80\.245\.24\.72$/', // test
- '/^80\.245\.24\.74$/' // preprod
- ];
- /**
- * Returns true if the client Ip is allowed
- *
- * @param string $clientIp
- * @return bool
- */
- public static function isIpAllowed(string $clientIp): bool
- {
- foreach (self::ALLOWED_IPS as $ipRule) {
- if (preg_match($ipRule, $clientIp)) {
- return true;
- }
- }
- return false;
- }
- /**
- * Check that the client Ip is allowed, else throw a Runtime error
- *
- * @return bool
- */
- private function assertIpAllowed(): bool
- {
- $clientIp = $_SERVER['REMOTE_ADDR'];
- if (!self::isIpAllowed($clientIp)){
- $route = $_REQUEST['route'];
- $this->logger->error(sprintf(
- "OtAdmin API: an attempt was made to call the route " .
- $route . " from an non-allowed IP (" . $clientIp . ")"));
- throw new \RuntimeException("Not allowed");
- }
- return true;
- }
- /**
- * Retrieve the organization's id from the given request parameters
- *
- * @param ServerRequest $request
- * @return int
- */
- private function getOrganizationId(ServerRequest $request): int
- {
- $params = $request->getQueryParams();
- $organizationId = $params['organization-id'];
- if (!$organizationId) {
- throw new \RuntimeException("Missing parameter: 'organization-id'");
- }
- return (int)$organizationId;
- }
- /**
- * -- Target of the route 'site_infos' --
- *
- * Return the main informations about the organization's website
- *
- * @param ServerRequest $request
- * @return JsonResponse
- * @throws \Exception
- */
- public function getSiteInfosAction(ServerRequest $request): JsonResponse
- {
- $this->assertIpAllowed();
- $organizationId = $this->getOrganizationId($request);
- $controller = GeneralUtility::makeInstance(ObjectManager::class)->get(SiteController::class);
- $infos = $controller->getSiteInfosAction($organizationId);
- return new JsonResponse($infos);
- }
- /**
- * -- Target of the route 'site_create' --
- * >> Requires a query param named 'organization-id' (int)
- *
- * Create the organization's website
- *
- * @param ServerRequest $request
- * @return JsonResponse
- * @throws \Exception
- */
- public function createSiteAction(ServerRequest $request): JsonResponse
- {
- $this->assertIpAllowed();
- $organizationId = $this->getOrganizationId($request);
- $controller = GeneralUtility::makeInstance(ObjectManager::class)->get(SiteController::class);
- $rootUid = $controller->createSiteAction($organizationId);
- $this->logger->info(sprintf(
- "OtAdmin API: A new website has been created with root page uid=" . $rootUid .
- " for the organization " . $organizationId));
- return new JsonResponse(
- [
- 'organization_id' => $organizationId,
- 'msg' => "A new website has been created with root page uid=" . $rootUid,
- 'root_uid' => $rootUid
- ]
- );
- }
- /**
- * -- Target of the route 'site_update' --
- * >> Requires a query param named 'organization-id' (int)
- *
- * Update the settings of the organization's website
- *
- * @param ServerRequest $request
- * @return JsonResponse
- * @throws \Exception
- */
- public function updateSiteConstantsAction(ServerRequest $request): JsonResponse
- {
- $this->assertIpAllowed();
- $organizationId = $this->getOrganizationId($request);
- $deep = (isset($queryParams['deep']) && $queryParams['deep']);
- $controller = GeneralUtility::makeInstance(ObjectManager::class)->get(SiteController::class);
- $rootUid = $controller->updateSiteAction($organizationId, $deep);
- $this->logger->info(sprintf(
- "OtAdmin API: The website with root uid " . $rootUid . " has been updated " .
- " (organization: " . $organizationId . ")"));
- return new JsonResponse(
- [
- 'organization_id' => $organizationId,
- 'msg' => "The website with root uid " . $rootUid . " has been updated",
- 'root_uid' => $rootUid
- ]
- );
- }
- /**
- * -- Target of the route 'site_delete' --
- * >> Requires a query param named 'organization-id' (int)
- *
- * Proceeds to a soft-deletion of the organization's website
- *
- * @param ServerRequest $request
- * @return JsonResponse
- * @throws \Exception
- */
- public function deleteSiteAction(ServerRequest $request): JsonResponse
- {
- $this->assertIpAllowed();
- $organizationId = $this->getOrganizationId($request);
- $params = $request->getQueryParams();
- $redirectTo = isset($params['redirect-to']) ? $params['redirect-to'] : null;
- $controller = GeneralUtility::makeInstance(ObjectManager::class)->get(SiteController::class);
- $rootUid = $controller->deleteSiteAction($organizationId, false, $redirectTo);
- $this->logger->info(sprintf(
- "OtAdmin API: The website with root uid " . $rootUid . " has been soft-deleted " .
- " (organization: " . $organizationId . ")"));
- return new JsonResponse(
- [
- 'organization_id' => $organizationId,
- 'msg' => "The website with root uid " . $rootUid . " has been soft-deleted. Use the /site/undelete route to restore it.",
- 'root_uid' => $rootUid
- ]
- );
- }
- /**
- * -- Target of the route 'site_undelete' --
- * >> Requires a query param named 'organization-id' (int)
- *
- * Restore a soft-deleted organization's website
- *
- * @param ServerRequest $request
- * @return JsonResponse
- * @throws \Exception
- */
- public function undeleteSiteAction(ServerRequest $request): JsonResponse
- {
- $this->assertIpAllowed();
- $organizationId = $this->getOrganizationId($request);
- $controller = GeneralUtility::makeInstance(ObjectManager::class)->get(SiteController::class);
- $rootUid = $controller->undeleteSiteAction($organizationId);
- $this->logger->info(sprintf(
- "OtAdmin API: The website with root uid " . $rootUid . " has been restored " .
- " (organization: " . $organizationId . ")"));
- return new JsonResponse(
- [
- 'organization_id' => $organizationId,
- 'msg' => "The website with root uid " . $rootUid . " has been restored",
- 'root_uid' => $rootUid
- ]
- );
- }
- /**
- * -- Target of the route 'site_clearcache' --
- * >> Requires a query param named 'organization-id' (int)
- *
- * Clear the cache of the organization's website
- *
- * @param ServerRequest $request
- * @return JsonResponse
- * @throws \Exception
- */
- public function clearSiteCacheAction(ServerRequest $request): JsonResponse
- {
- $this->assertIpAllowed();
- $organizationId = $this->getOrganizationId($request);
- $controller = GeneralUtility::makeInstance(ObjectManager::class)->get(SiteController::class);
- $rootUid = $controller->clearSiteCacheAction($organizationId);
- return new JsonResponse(
- [
- 'organization_id' => $organizationId,
- 'msg' => "The cache has been cleared for the website with root uid " . $rootUid . "",
- 'root_uid' => $rootUid
- ]
- );
- }
- /**
- * -- Target of the route 'site_setdomain' --
- * >> Requires a query param named 'organization-id' (int)
- *
- * Set a new domain for the organization website
- *
- * @param ServerRequest $request
- * @return JsonResponse
- * @throws \Exception
- */
- public function setSiteCustomDomainAction(ServerRequest $request): JsonResponse
- {
- $this->assertIpAllowed();
- $organizationId = $this->getOrganizationId($request);
- $queryParams = $request->getQueryParams();
- $domain = $queryParams['domain'];
- if (!$domain) {
- throw new \RuntimeException("Missing 'domain' parameter");
- }
- $redirect = (isset($queryParams['redirect']) && $queryParams['redirect']);
- $controller = GeneralUtility::makeInstance(ObjectManager::class)->get(SiteController::class);
- $rootUid = $controller->setSiteCustomDomainAction($organizationId, $domain, $redirect);
- return new JsonResponse(
- [
- 'organization_id' => $organizationId,
- 'msg' => "The cache has been cleared for the website with root uid " . $rootUid . "",
- 'root_uid' => $rootUid
- ]
- );
- }
- /**
- * -- Target of the route 'site_resetperms' --
- * >> Requires a query param named 'organization-id' (int)
- *
- * Reset the permissions of the website be users (admin, editors...)
- *
- * @param ServerRequest $request
- * @return JsonResponse
- * @throws \Exception
- */
- public function resetBeUserPermsAction(ServerRequest $request): JsonResponse
- {
- $this->assertIpAllowed();
- $organizationId = $this->getOrganizationId($request);
- $controller = GeneralUtility::makeInstance(ObjectManager::class)->get(SiteController::class);
- $rootUid = $controller->resetBeUserPermsAction($organizationId);
- return new JsonResponse(
- [
- 'organization_id' => $organizationId,
- 'msg' => "The website with root uid " . $rootUid . " had its be users permissions reset",
- 'root_uid' => $rootUid
- ]
- );
- }
- /**
- * -- Target of the route 'site_reindex' --
- * >> Requires a query param named 'organization-id' (int)
- *
- * Update the routing index for the given website
- *
- * @param ServerRequest $request
- * @return JsonResponse
- * @throws \Exception
- */
- public function updateRoutingIndexAction(ServerRequest $request): JsonResponse
- {
- $this->assertIpAllowed();
- $organizationId = $this->getOrganizationId($request);
- $controller = GeneralUtility::makeInstance(ObjectManager::class)->get(SiteController::class);
- $rootUid = $controller->updateRoutingIndexAction($organizationId);
- return new JsonResponse(
- [
- 'organization_id' => $organizationId,
- 'msg' => "The website with root uid " . $rootUid . " routing index has been updated",
- 'root_uid' => $rootUid
- ]
- );
- }
- /**
- * -- Target of the route 'site_status' --
- * >> Requires a query param named 'organization-id' (int)
- *
- * Returns the current status of the website
- *
- * @param ServerRequest $request
- * @return JsonResponse
- * @throws \Exception
- */
- public function getSiteStatusAction(ServerRequest $request): JsonResponse
- {
- $this->assertIpAllowed();
- $organizationId = $this->getOrganizationId($request);
- $controller = GeneralUtility::makeInstance(ObjectManager::class)->get(SiteController::class);
- $queryParams = $request->getQueryParams();
- $full = (isset($queryParams['full']) && $queryParams['full']);
- $status = $controller->getSiteStatusAction($organizationId, $full);
- return new JsonResponse($status->toArray());
- }
- /**
- * -- Target of the route 'scan' --
- *
- * Scan the whole Typo3 database and return the results
- *
- * @param ServerRequest $request
- * @return JsonResponse
- * @throws \Exception
- */
- public function scanAllAction(ServerRequest $request): JsonResponse
- {
- $this->assertIpAllowed();
- $controller = GeneralUtility::makeInstance(ObjectManager::class)->get(ScanController::class);
- $queryParams = $request->getQueryParams();
- $full = (isset($queryParams['full']) && $queryParams['full']);
- $results = $controller->scanAllAction($full);
- return new JsonResponse($results);
- }
- }
|