Нет описания

Router.php 3.6KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112
  1. <?php
  2. namespace MailPoet\Router;
  3. if (!defined('ABSPATH')) exit;
  4. use MailPoet\Config\AccessControl;
  5. use MailPoet\Util\Helpers;
  6. use MailPoet\WP\Functions as WPFunctions;
  7. use MailPoetVendor\Psr\Container\ContainerInterface;
  8. class Router {
  9. public $apiRequest;
  10. public $endpoint;
  11. public $action;
  12. public $data;
  13. public $endpointAction;
  14. public $accessControl;
  15. /** @var ContainerInterface */
  16. private $container;
  17. const NAME = 'mailpoet_router';
  18. const RESPONSE_ERROR = 404;
  19. const RESPONE_FORBIDDEN = 403;
  20. public function __construct(
  21. AccessControl $accessControl,
  22. ContainerInterface $container,
  23. $apiData = false
  24. ) {
  25. $apiData = ($apiData) ? $apiData : $_GET;
  26. $this->apiRequest = is_array($apiData) && array_key_exists(self::NAME, $apiData);
  27. $this->endpoint = isset($apiData['endpoint']) ?
  28. Helpers::underscoreToCamelCase($apiData['endpoint']) :
  29. false;
  30. $this->endpointAction = isset($apiData['action']) ?
  31. Helpers::underscoreToCamelCase($apiData['action']) :
  32. false;
  33. $this->data = isset($apiData['data']) ?
  34. self::decodeRequestData($apiData['data']) :
  35. [];
  36. $this->accessControl = $accessControl;
  37. $this->container = $container;
  38. }
  39. public function init() {
  40. if (!$this->apiRequest) return;
  41. $endpointClass = __NAMESPACE__ . "\\Endpoints\\" . ucfirst($this->endpoint);
  42. if (!$this->endpoint || !class_exists($endpointClass)) {
  43. return $this->terminateRequest(self::RESPONSE_ERROR, WPFunctions::get()->__('Invalid router endpoint', 'mailpoet'));
  44. }
  45. $endpoint = $this->container->get($endpointClass);
  46. if (!method_exists($endpoint, $this->endpointAction) || !in_array($this->endpointAction, $endpoint->allowedActions)) {
  47. return $this->terminateRequest(self::RESPONSE_ERROR, WPFunctions::get()->__('Invalid router endpoint action', 'mailpoet'));
  48. }
  49. if (!$this->validatePermissions($this->endpointAction, $endpoint->permissions)) {
  50. return $this->terminateRequest(self::RESPONE_FORBIDDEN, WPFunctions::get()->__('You do not have the required permissions.', 'mailpoet'));
  51. }
  52. WPFunctions::get()->doAction('mailpoet_conflict_resolver_router_url_query_parameters');
  53. $callback = [
  54. $endpoint,
  55. $this->endpointAction,
  56. ];
  57. if (is_callable($callback)) {
  58. return call_user_func($callback, $this->data);
  59. }
  60. }
  61. public static function decodeRequestData($data) {
  62. $data = !is_array($data) ? json_decode(base64_decode($data), true) : [];
  63. if (!is_array($data)) {
  64. $data = [];
  65. }
  66. return $data;
  67. }
  68. public static function encodeRequestData($data) {
  69. $jsonEncoded = json_encode($data);
  70. if ($jsonEncoded === false) {
  71. return '';
  72. }
  73. return rtrim(base64_encode($jsonEncoded), '=');
  74. }
  75. public static function buildRequest($endpoint, $action, $data = false) {
  76. $params = [
  77. self::NAME => '',
  78. 'endpoint' => $endpoint,
  79. 'action' => $action,
  80. ];
  81. if ($data) {
  82. $params['data'] = self::encodeRequestData($data);
  83. }
  84. return WPFunctions::get()->addQueryArg($params, WPFunctions::get()->homeUrl());
  85. }
  86. public function terminateRequest($code, $message) {
  87. WPFunctions::get()->statusHeader($code, $message);
  88. exit;
  89. }
  90. public function validatePermissions($endpointAction, $permissions) {
  91. // validate action permission if defined, otherwise validate global permission
  92. return(!empty($permissions['actions'][$endpointAction])) ?
  93. $this->accessControl->validatePermission($permissions['actions'][$endpointAction]) :
  94. $this->accessControl->validatePermission($permissions['global']);
  95. }
  96. }