Fixed some issues with the service messages endpoints:

master
Mike Koch 7 years ago
parent 0a2e37320a
commit 39e61b85c4
No known key found for this signature in database
GPG Key ID: 9BA5D7F8391455ED

@ -4,8 +4,8 @@ namespace BusinessLogic\Exceptions;
class MissingAuthenticationTokenException extends ApiFriendlyException { class MissingAuthenticationTokenException extends ApiFriendlyException {
function __construct() { function __construct() {
parent::__construct("An 'X-Auth-Token' is required for all requests", parent::__construct("An 'X-Auth-Token' is required for this request",
'Security Exception', 'Security Exception',
400); 401);
} }
} }

@ -57,6 +57,10 @@ class UserContext extends \BaseClass {
/* @var $active bool */ /* @var $active bool */
public $active; public $active;
function isAnonymousUser() {
return $this->id === -1;
}
static function buildAnonymousUser() { static function buildAnonymousUser() {
$userContext = new UserContext(); $userContext = new UserContext();
$userContext->id = -1; $userContext->id = -1;

@ -0,0 +1,12 @@
<?php
namespace BusinessLogic\ServiceMessages;
class GetServiceMessagesFilter {
/* @var $includeStaffServiceMessages bool */
public $includeStaffServiceMessages = true;
/* @var $includeDrafts bool */
public $includeDrafts = true;
}

@ -43,8 +43,8 @@ class ServiceMessageHandler extends \BaseClass {
return $this->serviceMessageGateway->createServiceMessage($serviceMessage, $heskSettings); return $this->serviceMessageGateway->createServiceMessage($serviceMessage, $heskSettings);
} }
function getServiceMessages($heskSettings) { function getServiceMessages($heskSettings, $searchFilter) {
return $this->serviceMessageGateway->getServiceMessages($heskSettings); return $this->serviceMessageGateway->getServiceMessages($heskSettings, $searchFilter);
} }
function editServiceMessage($serviceMessage, $heskSettings) { function editServiceMessage($serviceMessage, $heskSettings) {
@ -78,7 +78,7 @@ class ServiceMessageHandler extends \BaseClass {
} }
function sortServiceMessage($id, $direction, $heskSettings) { function sortServiceMessage($id, $direction, $heskSettings) {
$serviceMessages = $this->serviceMessageGateway->getServiceMessages($heskSettings); $serviceMessages = $this->serviceMessageGateway->getServiceMessages($heskSettings, new GetServiceMessagesFilter());
$serviceMessage = null; $serviceMessage = null;
foreach ($serviceMessages as $innerServiceMessage) { foreach ($serviceMessages as $innerServiceMessage) {
if (intval($innerServiceMessage->id) === intval($id)) { if (intval($innerServiceMessage->id) === intval($id)) {
@ -129,7 +129,7 @@ class ServiceMessageHandler extends \BaseClass {
break; break;
} }
} }
if (!$languageFound) { if (!$languageFound && !in_array('MISSING_LANGUAGE', $validationModel->errorKeys)) {
$validationModel->errorKeys[] = 'LANGUAGE_NOT_INSTALLED'; $validationModel->errorKeys[] = 'LANGUAGE_NOT_INSTALLED';
} }

@ -6,6 +6,7 @@ use BusinessLogic\Exceptions\ApiFriendlyException;
use BusinessLogic\Helpers; use BusinessLogic\Helpers;
use BusinessLogic\Security\UserContext; use BusinessLogic\Security\UserContext;
use BusinessLogic\Security\UserPrivilege; use BusinessLogic\Security\UserPrivilege;
use BusinessLogic\ServiceMessages\GetServiceMessagesFilter;
use BusinessLogic\ServiceMessages\ServiceMessage; use BusinessLogic\ServiceMessages\ServiceMessage;
use BusinessLogic\ServiceMessages\ServiceMessageHandler; use BusinessLogic\ServiceMessages\ServiceMessageHandler;
use Controllers\ControllerWithSecurity; use Controllers\ControllerWithSecurity;
@ -17,25 +18,41 @@ class ServiceMessagesController extends \BaseClass {
* @throws ApiFriendlyException * @throws ApiFriendlyException
*/ */
function checkSecurity($userContext) { function checkSecurity($userContext) {
if (!in_array(UserPrivilege::CAN_MANAGE_SERVICE_MESSAGES, $userContext->permissions)) { if (!$userContext->admin && !in_array(UserPrivilege::CAN_MANAGE_SERVICE_MESSAGES, $userContext->permissions)) {
throw new ApiFriendlyException("User does not have permission to access the following URI: " . $_SERVER['REQUEST_URI'], "Access Forbidden", 403);
}
}
static function staticCheckSecurity($userContext) {
if (!$userContext->admin && !in_array(UserPrivilege::CAN_MANAGE_SERVICE_MESSAGES, $userContext->permissions)) {
throw new ApiFriendlyException("User does not have permission to access the following URI: " . $_SERVER['REQUEST_URI'], "Access Forbidden", 403); throw new ApiFriendlyException("User does not have permission to access the following URI: " . $_SERVER['REQUEST_URI'], "Access Forbidden", 403);
} }
} }
function get() { function get() {
/* @var $userContext UserContext */
/* @var $hesk_settings array */
global $applicationContext, $hesk_settings, $userContext; global $applicationContext, $hesk_settings, $userContext;
$this->checkSecurity($userContext); $searchFilter = new GetServiceMessagesFilter();
if ($userContext->isAnonymousUser()) {
$searchFilter->includeDrafts = false;
$searchFilter->includeStaffServiceMessages = false;
} elseif (!$userContext->admin && !in_array(UserPrivilege::CAN_MANAGE_SERVICE_MESSAGES, $userContext->permissions)) {
$searchFilter->includeDrafts = false;
}
/* @var $handler ServiceMessageHandler */ /* @var $handler ServiceMessageHandler */
$handler = $applicationContext->get(ServiceMessageHandler::clazz()); $handler = $applicationContext->get(ServiceMessageHandler::clazz());
return output($handler->getServiceMessages($hesk_settings)); return output($handler->getServiceMessages($hesk_settings, $searchFilter));
} }
function post() { function post() {
global $applicationContext, $userContext, $hesk_settings; global $applicationContext, $userContext, $hesk_settings;
$this->checkSecurity($userContext);
/* @var $handler ServiceMessageHandler */ /* @var $handler ServiceMessageHandler */
$handler = $applicationContext->get(ServiceMessageHandler::clazz()); $handler = $applicationContext->get(ServiceMessageHandler::clazz());
@ -46,7 +63,9 @@ class ServiceMessagesController extends \BaseClass {
} }
function put($id) { function put($id) {
global $applicationContext, $hesk_settings; global $applicationContext, $hesk_settings, $userContext;
$this->checkSecurity($userContext);
/* @var $handler ServiceMessageHandler */ /* @var $handler ServiceMessageHandler */
$handler = $applicationContext->get(ServiceMessageHandler::clazz()); $handler = $applicationContext->get(ServiceMessageHandler::clazz());
@ -60,7 +79,9 @@ class ServiceMessagesController extends \BaseClass {
} }
function delete($id) { function delete($id) {
global $applicationContext, $hesk_settings; global $applicationContext, $hesk_settings, $userContext;
$this->checkSecurity($userContext);
/* @var $handler ServiceMessageHandler */ /* @var $handler ServiceMessageHandler */
$handler = $applicationContext->get(ServiceMessageHandler::clazz()); $handler = $applicationContext->get(ServiceMessageHandler::clazz());
@ -79,7 +100,7 @@ class ServiceMessagesController extends \BaseClass {
$serviceMessage = new ServiceMessage(); $serviceMessage = new ServiceMessage();
if (!$creating) { if (!$creating) {
$serviceMessage->order = $data['order']; $serviceMessage->order = Helpers::safeArrayGet($data, 'order');
} }
if ($creating) { if ($creating) {
@ -105,7 +126,10 @@ class ServiceMessagesController extends \BaseClass {
} }
static function sort($id, $direction) { static function sort($id, $direction) {
global $applicationContext, $hesk_settings; /* @var $userContext UserContext */
global $applicationContext, $hesk_settings, $userContext;
self::staticCheckSecurity($userContext);
/* @var $handler ServiceMessageHandler */ /* @var $handler ServiceMessageHandler */
$handler = $applicationContext->get(ServiceMessageHandler::clazz()); $handler = $applicationContext->get(ServiceMessageHandler::clazz());

@ -3,7 +3,9 @@
namespace DataAccess\ServiceMessages; namespace DataAccess\ServiceMessages;
use BusinessLogic\ServiceMessages\GetServiceMessagesFilter;
use BusinessLogic\ServiceMessages\ServiceMessage; use BusinessLogic\ServiceMessages\ServiceMessage;
use BusinessLogic\ServiceMessages\ServiceMessageLocation;
use BusinessLogic\ServiceMessages\ServiceMessageStyle; use BusinessLogic\ServiceMessages\ServiceMessageStyle;
use DataAccess\CommonDao; use DataAccess\CommonDao;
@ -56,14 +58,29 @@ class ServiceMessagesGateway extends CommonDao {
/** /**
* @param $heskSettings * @param $heskSettings
* @param $searchFilter GetServiceMessagesFilter
* @return ServiceMessage[] * @return ServiceMessage[]
*/ */
function getServiceMessages($heskSettings) { function getServiceMessages($heskSettings, $searchFilter) {
$this->init(); $this->init();
$serviceMessages = array(); $serviceMessages = array();
$rs = hesk_dbQuery("SELECT * FROM `". hesk_dbEscape($heskSettings['db_pfix']) . "service_messages` ORDER BY `order`"); $sql = "SELECT DISTINCT `service_messages`.* FROM `". hesk_dbEscape($heskSettings['db_pfix']) . "service_messages` AS `service_messages` ";
if (!$searchFilter->includeStaffServiceMessages) {
$sql .= "INNER JOIN `" . hesk_dbEscape($heskSettings['db_pfix']) . "mfh_service_message_to_location` AS `location`
ON `location`.`service_message_id` = `service_messages`.`id` AND `location`.`location` LIKE 'CUSTOMER%' ";
}
if (!$searchFilter->includeDrafts) {
$sql .= "WHERE `type` = '0' ";
}
$sql .= "ORDER BY `order`";
$rs = hesk_dbQuery($sql);
while ($row = hesk_dbFetchAssoc($rs)) { while ($row = hesk_dbFetchAssoc($rs)) {
$serviceMessage = new ServiceMessage(); $serviceMessage = new ServiceMessage();
$serviceMessage->id = $row['id']; $serviceMessage->id = $row['id'];
@ -78,8 +95,14 @@ class ServiceMessagesGateway extends CommonDao {
$serviceMessage->language = $row['mfh_language']; $serviceMessage->language = $row['mfh_language'];
$serviceMessage->locations = array(); $serviceMessage->locations = array();
$locationsRs = hesk_dbQuery("SELECT `location` FROM `" . hesk_dbEscape($heskSettings['db_pfix']) . "mfh_service_message_to_location` $locationSql = "SELECT `location` FROM `" . hesk_dbEscape($heskSettings['db_pfix']) . "mfh_service_message_to_location`
WHERE `service_message_id` = " . intval($serviceMessage->id)); WHERE `service_message_id` = " . intval($serviceMessage->id);
if (!$searchFilter->includeStaffServiceMessages) {
$locationSql .= " AND `location` LIKE 'CUSTOMER%'";
}
$locationsRs = hesk_dbQuery($locationSql);
while ($innerRow = hesk_dbFetchAssoc($locationsRs)) { while ($innerRow = hesk_dbFetchAssoc($locationsRs)) {
$serviceMessage->locations[] = $innerRow['location']; $serviceMessage->locations[] = $innerRow['location'];
} }

@ -45,8 +45,15 @@ function internalOrAuthHandler() {
function publicHandler() { function publicHandler() {
global $userContext; global $userContext;
//-- Create an "anonymous" UserContext // Check if we passed in a X-Auth-Token or X-Internal-Call header. Those take priority
$userContext = \BusinessLogic\Security\UserContext::buildAnonymousUser(); if (\BusinessLogic\Helpers::getHeader('X-INTERNAL-CALL') === 'true') {
internalHandler();
} elseif (\BusinessLogic\Helpers::getHeader('X-AUTH-TOKEN') !== null) {
authTokenHandler();
} else {
//-- Create an "anonymous" UserContext
$userContext = \BusinessLogic\Security\UserContext::buildAnonymousUser();
}
} }
function assertApiIsEnabled() { function assertApiIsEnabled() {
@ -205,7 +212,7 @@ Link::all(array(
// Service Messages // Service Messages
'/v1/service-messages' => action(\Controllers\ServiceMessages\ServiceMessagesController::clazz(), '/v1/service-messages' => action(\Controllers\ServiceMessages\ServiceMessagesController::clazz(),
array(RequestMethod::GET, RequestMethod::POST), array(RequestMethod::GET, RequestMethod::POST),
SecurityHandler::INTERNAL_OR_AUTH_TOKEN), SecurityHandler::OPEN),
'/v1/service-messages/{i}' => action(\Controllers\ServiceMessages\ServiceMessagesController::clazz(), '/v1/service-messages/{i}' => action(\Controllers\ServiceMessages\ServiceMessagesController::clazz(),
array(RequestMethod::PUT, RequestMethod::DELETE), array(RequestMethod::PUT, RequestMethod::DELETE),
SecurityHandler::INTERNAL_OR_AUTH_TOKEN), SecurityHandler::INTERNAL_OR_AUTH_TOKEN),

Loading…
Cancel
Save