diff --git a/lib/API/JSON/API.php b/lib/API/JSON/API.php index 82619f3b2a..dbc26102af 100644 --- a/lib/API/JSON/API.php +++ b/lib/API/JSON/API.php @@ -1,6 +1,7 @@ wp->doAction('mailpoet_api_setup', [$this]); + if (isset($_POST['api_version'])) { - $this->setRequestData($_POST); + $this->setRequestData($_POST, Endpoint::TYPE_POST); } else { - $this->setRequestData($_GET); + $this->setRequestData($_GET, Endpoint::TYPE_GET); } $ignoreToken = ( @@ -101,7 +104,7 @@ class API { $response->send(); } - function setRequestData($data) { + function setRequestData($data, $request_type) { $this->_request_api_version = !empty($data['api_version']) ? $data['api_version'] : false; $this->_request_endpoint = isset($data['endpoint']) @@ -113,6 +116,7 @@ class API { $this->_request_method = isset($data[$method_param_name]) ? Helpers::underscoreToCamelCase(trim($data[$method_param_name])) : null; + $this->_request_type = $request_type; $this->_request_token = isset($data['token']) ? trim($data['token']) @@ -170,6 +174,10 @@ class API { throw new \Exception(__('Invalid API endpoint method.', 'mailpoet')); } + if (!$endpoint->isMethodAllowed($this->_request_method, $this->_request_type)) { + throw new \Exception(__('HTTP request method not allowed.', 'mailpoet')); + } + if (class_exists(Debugger::class)) { ApiPanel::init($endpoint, $this->_request_method, $this->_request_data); DIPanel::init(); diff --git a/lib/API/JSON/Endpoint.php b/lib/API/JSON/Endpoint.php index 8de0ac4efa..95c5ef987b 100644 --- a/lib/API/JSON/Endpoint.php +++ b/lib/API/JSON/Endpoint.php @@ -6,11 +6,16 @@ use MailPoet\Config\AccessControl; use MailPoet\WP\Functions as WPFunctions; abstract class Endpoint { + const TYPE_POST = 'POST'; + const TYPE_GET = 'GET'; + public $permissions = [ 'global' => AccessControl::PERMISSION_MANAGE_SETTINGS, 'methods' => [], ]; + protected static $get_methods = []; + function successResponse( $data = [], $meta = [], $status = Response::STATUS_OK ) { @@ -36,4 +41,14 @@ abstract class Endpoint { } return new ErrorResponse($errors, $meta, Response::STATUS_BAD_REQUEST); } + + public function isMethodAllowed($name, $type) { + if ($type === self::TYPE_GET && !in_array($name, static::$get_methods)) { + return false; + } + if ($type === self::TYPE_POST && in_array($name, static::$get_methods)) { + return false; + } + return true; + } } diff --git a/lib/API/JSON/v1/NewsletterTemplates.php b/lib/API/JSON/v1/NewsletterTemplates.php index 17900b183b..5822791d87 100644 --- a/lib/API/JSON/v1/NewsletterTemplates.php +++ b/lib/API/JSON/v1/NewsletterTemplates.php @@ -13,6 +13,10 @@ class NewsletterTemplates extends APIEndpoint { 'global' => AccessControl::PERMISSION_MANAGE_EMAILS, ]; + protected static $get_methods = [ + 'getAll', + ]; + function get($data = []) { $id = (isset($data['id']) ? (int)$data['id'] : false); $template = NewsletterTemplate::findOne($id);