| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226 |
- <?php
- namespace Opentalent\OtAdmin\Http;
- use Opentalent\OtAdmin\Controller\SiteController;
- use Psr\Log\LoggerAwareInterface;
- use Psr\Log\LoggerAwareTrait;
- use TYPO3\CMS\Core\Core\Bootstrap;
- use TYPO3\CMS\Core\Http\JsonResponse;
- use TYPO3\CMS\Core\Http\ServerRequest;
- use TYPO3\CMS\Core\Utility\GeneralUtility;
- use TYPO3\CMS\Extbase\Object\ObjectManager;
- 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) {
- 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() {
- $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) {
- $params = $request->getQueryParams();
- $organizationId = $params['organization-id'];
- if (!$organizationId) {
- throw new \RuntimeException("Missing parameter: 'organization-id'");
- }
- return (int)$organizationId;
- }
- /**
- * -- 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) {
- $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) {
- $this->assertIpAllowed();
- $organizationId = $this->getOrganizationId($request);
- $controller = GeneralUtility::makeInstance(ObjectManager::class)->get(SiteController::class);
- $rootUid = $controller->updateSiteConstantsAction($organizationId);
- $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) {
- $this->assertIpAllowed();
- $organizationId = $this->getOrganizationId($request);
- $controller = GeneralUtility::makeInstance(ObjectManager::class)->get(SiteController::class);
- $rootUid = $controller->deleteSiteAction($organizationId, false);
- $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) {
- $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) {
- $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
- ]
- );
- }
- }
|