diff --git a/lib/API/JSON/API.php b/lib/API/JSON/API.php index 3d0b1ba03a..8df8eb5855 100644 --- a/lib/API/JSON/API.php +++ b/lib/API/JSON/API.php @@ -1,6 +1,7 @@ permissions; - if(array_key_exists($this->_request_method, $permissions) === false || - $permissions[$this->_request_method] !== Access::ALL - ) { - if($this->checkPermissions() === false) { - $error_message = __('You do not have the required permissions.', 'mailpoet'); - $error_response = $this->createErrorResponse(Error::FORBIDDEN, $error_message, Response::STATUS_FORBIDDEN); - return $error_response; - } + if(!$this->validatePermissions($this->_request_method, $endpoint->permissions)) { + $error_message = __('You do not have the required permissions.', 'mailpoet'); + $error_response = $this->createErrorResponse(Error::FORBIDDEN, $error_message, Response::STATUS_FORBIDDEN); + return $error_response; } - $response = $endpoint->{$this->_request_method}($this->_request_data); return $response; } catch(\Exception $e) { @@ -150,8 +145,15 @@ class API { } } - function checkPermissions() { - return current_user_can(Env::$required_permission); + function validatePermissions($request_method, $permissions) { + // if method permission is defined, validate it + if (!empty($permissions['methods'][$request_method])) { + return ($permissions['methods'][$request_method] === Access::ALL) ? + true : + AccessControl::validatePermission($permissions['methods'][$request_method]); + } + // use global permission + return AccessControl::validatePermission($permissions['global']); } function checkToken() { diff --git a/lib/API/JSON/Endpoint.php b/lib/API/JSON/Endpoint.php index 975dcc90f4..e75a3ded43 100644 --- a/lib/API/JSON/Endpoint.php +++ b/lib/API/JSON/Endpoint.php @@ -1,11 +1,16 @@ array(AccessControl::PERMISSION_MANAGE_SETTINGS), + 'methods' => array() + ); function successResponse( $data = array(), $meta = array(), $status = Response::STATUS_OK @@ -18,7 +23,7 @@ abstract class Endpoint { ) { if(empty($errors)) { $errors = array( - Error::UNKNOWN => __('An unknown error occurred.', 'mailpoet') + Error::UNKNOWN => __('An unknown error occurred.', 'mailpoet') ); } return new ErrorResponse($errors, $meta, $status); diff --git a/lib/API/JSON/v1/AutomatedLatestContent.php b/lib/API/JSON/v1/AutomatedLatestContent.php index 74d0ac4a29..e28be1642e 100644 --- a/lib/API/JSON/v1/AutomatedLatestContent.php +++ b/lib/API/JSON/v1/AutomatedLatestContent.php @@ -1,12 +1,18 @@ AccessControl::PERMISSION_MANAGE_EMAILS + ); function __construct() { $this->ALC = new \MailPoet\Newsletter\AutomatedLatestContent(); diff --git a/lib/API/JSON/v1/CustomFields.php b/lib/API/JSON/v1/CustomFields.php index 529e7d476a..823f0552a5 100644 --- a/lib/API/JSON/v1/CustomFields.php +++ b/lib/API/JSON/v1/CustomFields.php @@ -1,12 +1,19 @@ AccessControl::PERMISSION_MANAGE_FORMS + ); + function getAll() { $collection = CustomField::orderByAsc('created_at')->findMany(); $custom_fields = array_map(function($custom_field) { diff --git a/lib/API/JSON/v1/Forms.php b/lib/API/JSON/v1/Forms.php index 179d805836..4789b728be 100644 --- a/lib/API/JSON/v1/Forms.php +++ b/lib/API/JSON/v1/Forms.php @@ -1,17 +1,23 @@ AccessControl::PERMISSION_MANAGE_FORMS + ); + function get($data = array()) { $id = (isset($data['id']) ? (int)$data['id'] : false); $form = Form::findOne($id); diff --git a/lib/API/JSON/v1/ImportExport.php b/lib/API/JSON/v1/ImportExport.php index 8e4f3b89c0..62ff5dead0 100644 --- a/lib/API/JSON/v1/ImportExport.php +++ b/lib/API/JSON/v1/ImportExport.php @@ -1,13 +1,19 @@ AccessControl::PERMISSION_MANAGE_SUBSCRIBERS + ); + function getMailChimpLists($data) { try { $mailChimp = new MailChimp($data['api_key']); diff --git a/lib/API/JSON/v1/MP2Migrator.php b/lib/API/JSON/v1/MP2Migrator.php index 67d851ae21..aa3bd41d75 100644 --- a/lib/API/JSON/v1/MP2Migrator.php +++ b/lib/API/JSON/v1/MP2Migrator.php @@ -1,18 +1,24 @@ AccessControl::PERMISSION_MANAGE_SETTINGS + ); + public function __construct() { $this->MP2Migrator = new \MailPoet\Config\MP2Migrator(); } - + /** * Import end point - * + * * @param object $data * @return object */ @@ -26,10 +32,10 @@ class MP2Migrator extends APIEndpoint { )); } } - + /** * Stop import end point - * + * * @param object $data * @return object */ @@ -43,10 +49,10 @@ class MP2Migrator extends APIEndpoint { )); } } - + /** * Skip import end point - * + * * @param object $data * @return object */ @@ -60,5 +66,5 @@ class MP2Migrator extends APIEndpoint { )); } } - + } diff --git a/lib/API/JSON/v1/Mailer.php b/lib/API/JSON/v1/Mailer.php index 4400453299..872ac860ff 100644 --- a/lib/API/JSON/v1/Mailer.php +++ b/lib/API/JSON/v1/Mailer.php @@ -1,12 +1,19 @@ AccessControl::PERMISSION_MANAGE_EMAILS + ); + function send($data = array()) { try { $mailer = new \MailPoet\Mailer\Mailer( diff --git a/lib/API/JSON/v1/NewsletterTemplates.php b/lib/API/JSON/v1/NewsletterTemplates.php index 69c4f5a4d5..fae112eaf1 100644 --- a/lib/API/JSON/v1/NewsletterTemplates.php +++ b/lib/API/JSON/v1/NewsletterTemplates.php @@ -1,13 +1,19 @@ AccessControl::PERMISSION_MANAGE_EMAILS + ); + function get($data = array()) { $id = (isset($data['id']) ? (int)$data['id'] : false); $template = NewsletterTemplate::findOne($id); diff --git a/lib/API/JSON/v1/Newsletters.php b/lib/API/JSON/v1/Newsletters.php index 282b8e5bb4..8fabcfeb44 100644 --- a/lib/API/JSON/v1/Newsletters.php +++ b/lib/API/JSON/v1/Newsletters.php @@ -1,16 +1,18 @@ AccessControl::PERMISSION_MANAGE_EMAILS + ); + function get($data = array()) { $id = (isset($data['id']) ? (int)$data['id'] : false); $newsletter = Newsletter::findOne($id); diff --git a/lib/API/JSON/v1/Segments.php b/lib/API/JSON/v1/Segments.php index 2ef6a07b89..6c8000564a 100644 --- a/lib/API/JSON/v1/Segments.php +++ b/lib/API/JSON/v1/Segments.php @@ -1,15 +1,21 @@ AccessControl::PERMISSION_MANAGE_SEGMENTS + ); + function get($data = array()) { $id = (isset($data['id']) ? (int)$data['id'] : false); $segment = Segment::findOne($id); diff --git a/lib/API/JSON/v1/SendingQueue.php b/lib/API/JSON/v1/SendingQueue.php index e155cbd0cc..5484e004a5 100644 --- a/lib/API/JSON/v1/SendingQueue.php +++ b/lib/API/JSON/v1/SendingQueue.php @@ -1,18 +1,24 @@ AccessControl::PERMISSION_MANAGE_EMAILS + ); + function add($data = array()) { $newsletter_id = (isset($data['newsletter_id']) ? (int)$data['newsletter_id'] diff --git a/lib/API/JSON/v1/Services.php b/lib/API/JSON/v1/Services.php index 7885e501ca..9fc447338f 100644 --- a/lib/API/JSON/v1/Services.php +++ b/lib/API/JSON/v1/Services.php @@ -1,11 +1,12 @@ AccessControl::PERMISSION_MANAGE_SETTINGS + ); function __construct() { $this->bridge = new Bridge(); diff --git a/lib/API/JSON/v1/Settings.php b/lib/API/JSON/v1/Settings.php index 1a2093c4ed..1db60103da 100644 --- a/lib/API/JSON/v1/Settings.php +++ b/lib/API/JSON/v1/Settings.php @@ -1,24 +1,31 @@ AccessControl::PERMISSION_MANAGE_SETTINGS + ); + function get() { return $this->successResponse(Setting::getAll()); } function set($settings = array()) { if(empty($settings)) { - return $this->badRequest(array( - APIError::BAD_REQUEST => - __('You have not specified any settings to be saved.', 'mailpoet') - )); + return $this->badRequest( + array( + APIError::BAD_REQUEST => + __('You have not specified any settings to be saved.', 'mailpoet') + )); } else { foreach($settings as $name => $value) { Setting::setValue($name, $value); diff --git a/lib/API/JSON/v1/Setup.php b/lib/API/JSON/v1/Setup.php index d0f6989226..1bf0647748 100644 --- a/lib/API/JSON/v1/Setup.php +++ b/lib/API/JSON/v1/Setup.php @@ -1,13 +1,19 @@ AccessControl::PERMISSION_MANAGE_SETTINGS + ); + function reset() { try { $activator = new Activator(); diff --git a/lib/API/JSON/v1/Subscribers.php b/lib/API/JSON/v1/Subscribers.php index 38ddefb9af..e391072855 100644 --- a/lib/API/JSON/v1/Subscribers.php +++ b/lib/API/JSON/v1/Subscribers.php @@ -1,21 +1,23 @@ APIAccess::ALL + 'global' => AccessControl::PERMISSION_MANAGE_SUBSCRIBERS, + 'methods' => array('subscribe' => APIAccess::ALL) ); function get($data = array()) {