Merge branch 'main' into develop

cli-modification-summary
iglocska 2022-02-04 01:02:42 +01:00
commit 3b21a746b9
No known key found for this signature in database
GPG Key ID: BEA224F1FEF113AC
7 changed files with 73 additions and 10 deletions

View File

@ -1,7 +1,9 @@
## Requirements ## Requirements
An Ubuntu server (18.04/20.04 should both work fine) - though other linux installations should work too. An Ubuntu server (18.04/20.04 should both work fine) - though other linux installations should work too.
- apache2 (or nginx), mysql/mariadb, sqlite need to be installed and running - apache2 (or nginx), mysql/mariadb, sqlite need to be installed and running
- php version 8+ is required
- php extensions for intl, mysql, sqlite3, mbstring, xml need to be installed and running - php extensions for intl, mysql, sqlite3, mbstring, xml need to be installed and running
- php extention for curl (not required but makes composer run a little faster) - php extention for curl (not required but makes composer run a little faster)
- composer - composer

View File

@ -420,10 +420,16 @@ class CRUDComponent extends Component
} }
$data = $this->Table->get($id, $params); $data = $this->Table->get($id, $params);
if (empty($data)) {
throw new NotFoundException(__('Invalid {0}.', $this->ObjectAlias));
}
$data = $this->attachMetaData($id, $data); $data = $this->attachMetaData($id, $data);
if (isset($params['afterFind'])) { if (isset($params['afterFind'])) {
$data = $params['afterFind']($data); $data = $params['afterFind']($data);
} }
if (empty($data)) {
throw new NotFoundException(__('Invalid {0}.', $this->ObjectAlias));
}
if ($this->Controller->ParamHandler->isRest()) { if ($this->Controller->ParamHandler->isRest()) {
$this->Controller->restResponsePayload = $this->RestResponse->viewData($data, 'json'); $this->Controller->restResponsePayload = $this->RestResponse->viewData($data, 'json');
} }

View File

@ -11,13 +11,17 @@ use Cake\Http\Exception\NotFoundException;
use Cake\Http\Exception\MethodNotAllowedException; use Cake\Http\Exception\MethodNotAllowedException;
use Cake\Http\Exception\ForbiddenException; use Cake\Http\Exception\ForbiddenException;
use Cake\Event\EventInterface; use Cake\Event\EventInterface;
use Cake\Core\Configure;
class IndividualsController extends AppController class IndividualsController extends AppController
{ {
public function beforeFilter(EventInterface $event) public function beforeFilter(EventInterface $event)
{ {
parent::beforeFilter($event); parent::beforeFilter($event);
$this->Authentication->allowUnauthenticated(['index']); $open = Configure::read('Cerebrate.open');
if (!empty($open) && in_array('individuals', $open)) {
$this->Authentication->allowUnauthenticated(['index']);
}
} }
public function index() public function index()

View File

@ -10,13 +10,17 @@ use Cake\Http\Exception\NotFoundException;
use Cake\Http\Exception\MethodNotAllowedException; use Cake\Http\Exception\MethodNotAllowedException;
use Cake\Http\Exception\ForbiddenException; use Cake\Http\Exception\ForbiddenException;
use Cake\Event\EventInterface; use Cake\Event\EventInterface;
use Cake\Core\Configure;
class OrganisationsController extends AppController class OrganisationsController extends AppController
{ {
public function beforeFilter(EventInterface $event) public function beforeFilter(EventInterface $event)
{ {
parent::beforeFilter($event); parent::beforeFilter($event);
$this->Authentication->allowUnauthenticated(['index']); $open = Configure::read('Cerebrate.open');
if (!empty($open) && in_array('organisations', $open)) {
$this->Authentication->allowUnauthenticated(['index']);
}
} }
public function index() public function index()

View File

@ -7,6 +7,7 @@ use Cake\Utility\Hash;
use Cake\Utility\Text; use Cake\Utility\Text;
use \Cake\Database\Expression\QueryExpression; use \Cake\Database\Expression\QueryExpression;
use Cake\Error\Debugger; use Cake\Error\Debugger;
use Cake\Http\Exception\NotFoundException;
class SharingGroupsController extends AppController class SharingGroupsController extends AppController
{ {
@ -54,8 +55,25 @@ class SharingGroupsController extends AppController
public function view($id) public function view($id)
{ {
$currentUser = $this->ACL->getUser();
$this->CRUD->view($id, [ $this->CRUD->view($id, [
'contain' => ['SharingGroupOrgs', 'Organisations', 'Users' => ['fields' => ['id', 'username']]] 'contain' => ['SharingGroupOrgs', 'Organisations', 'Users' => ['fields' => ['id', 'username']]],
'afterFind' => function($data) use ($currentUser) {
if (empty($currentUser['role']['perm_admin'])) {
$orgFround = false;
if (!empty($data['sharing_group_orgs'])) {
foreach ($data['sharing_group_orgs'] as $org) {
if ($org['id'] === $currentUser['organisation_id']) {
$orgFound = true;
}
}
}
if ($data['organisation_id'] !== $currentUser['organisation_id'] && !$orgFround) {
return null;
}
}
return $data;
}
]); ]);
$responsePayload = $this->CRUD->getResponsePayload(); $responsePayload = $this->CRUD->getResponsePayload();
if (!empty($responsePayload)) { if (!empty($responsePayload)) {
@ -87,7 +105,11 @@ class SharingGroupsController extends AppController
public function delete($id) public function delete($id)
{ {
$this->CRUD->delete($id); $currentUser = $this->ACL->getUser();
if (empty($currentUser['role']['perm_admin'])) {
$params['conditions'] = ['organisation_id' => $currentUser['organisation_id']];
}
$this->CRUD->delete($id, $params);
$responsePayload = $this->CRUD->getResponsePayload(); $responsePayload = $this->CRUD->getResponsePayload();
if (!empty($responsePayload)) { if (!empty($responsePayload)) {
return $responsePayload; return $responsePayload;
@ -97,9 +119,18 @@ class SharingGroupsController extends AppController
public function addOrg($id) public function addOrg($id)
{ {
$currentUser = $this->ACL->getUser();
$sharingGroup = $this->SharingGroups->get($id, [ $sharingGroup = $this->SharingGroups->get($id, [
'contain' => 'SharingGroupOrgs' 'contain' => 'SharingGroupOrgs'
]); ]);
if (empty($currentUser['role']['perm_admin'])) {
if ($sharingGroup['organisation_id'] !== $currentUser['organisation_id']) {
$sharingGroup = null;
}
}
if (empty($sharingGroup)) {
throw new NotFoundException(__('Invalid SharingGroup.'));
}
$conditions = []; $conditions = [];
$containedOrgIds = array_values(\Cake\Utility\Hash::extract($sharingGroup, 'sharing_group_orgs.{n}.id')); $containedOrgIds = array_values(\Cake\Utility\Hash::extract($sharingGroup, 'sharing_group_orgs.{n}.id'));
if (!empty($containedOrgIds)) { if (!empty($containedOrgIds)) {
@ -156,9 +187,18 @@ class SharingGroupsController extends AppController
public function removeOrg($id, $org_id) public function removeOrg($id, $org_id)
{ {
$currentUser = $this->ACL->getUser();
$sharingGroup = $this->SharingGroups->get($id, [ $sharingGroup = $this->SharingGroups->get($id, [
'contain' => 'SharingGroupOrgs' 'contain' => 'SharingGroupOrgs'
]); ]);
if (empty($currentUser['role']['perm_admin'])) {
if ($sharingGroup['organisation_id'] !== $currentUser['organisation_id']) {
$sharingGroup = null;
}
}
if (empty($sharingGroup)) {
throw new NotFoundException(__('Invalid SharingGroup.'));
}
if ($this->request->is('post')) { if ($this->request->is('post')) {
$org = $this->SharingGroups->SharingGroupOrgs->get($org_id); $org = $this->SharingGroups->SharingGroupOrgs->get($org_id);
$result = (bool)$this->SharingGroups->SharingGroupOrgs->unlink($sharingGroup, [$org]); $result = (bool)$this->SharingGroups->SharingGroupOrgs->unlink($sharingGroup, [$org]);

View File

@ -36,9 +36,16 @@ class UserSettingsController extends AppController
return $responsePayload; return $responsePayload;
} }
if (!empty($this->request->getQuery('Users_id'))) { if (!empty($this->request->getQuery('Users_id'))) {
$settingsForUser = $this->UserSettings->Users->find()->where([ $conditions = [
'id' => $this->request->getQuery('Users_id') 'id' => $this->request->getQuery('Users_id')
])->first(); ];
if (empty($currentUser['role']['perm_admin'])) {
$conditions['organisation_id'] = $currentUser['organisation_id'];
}
$settingsForUser = $this->UserSettings->Users->find()->where($conditions)->first();
if (empty($settingsForUser)) {
throw new NotFoundException(__('Invalid {0}.', __('user')));
}
$this->set('settingsForUser', $settingsForUser); $this->set('settingsForUser', $settingsForUser);
} }
} }
@ -233,7 +240,7 @@ class UserSettingsController extends AppController
} }
/** /**
* isLoggedUserAllowedToEdit * isLoggedUserAllowedToEdit
* *
* @param int|\App\Model\Entity\UserSetting $setting * @param int|\App\Model\Entity\UserSetting $setting
* @return boolean * @return boolean

View File

@ -106,7 +106,7 @@
'%s%s%s%s%s%s', '%s%s%s%s%s%s',
empty($data['description']) ? '' : sprintf( empty($data['description']) ? '' : sprintf(
'<div class="pb-2 fw-light">%s</div>', '<div class="pb-2 fw-light">%s</div>',
$data['description'] h($data['description'])
), ),
$ajaxFlashMessage, $ajaxFlashMessage,
$formCreate, $formCreate,
@ -131,7 +131,7 @@
'%s%s%s%s%s%s', '%s%s%s%s%s%s',
empty($data['description']) ? '' : sprintf( empty($data['description']) ? '' : sprintf(
'<div class="pb-2">%s</div>', '<div class="pb-2">%s</div>',
$data['description'] h($data['description'])
), ),
$ajaxFlashMessage, $ajaxFlashMessage,
$formCreate, $formCreate,
@ -157,7 +157,7 @@
$ajaxFlashMessage, $ajaxFlashMessage,
empty($data['description']) ? '' : sprintf( empty($data['description']) ? '' : sprintf(
'<div class="pb-3 fw-light">%s</div>', '<div class="pb-3 fw-light">%s</div>',
$data['description'] h($data['description'])
), ),
sprintf('<div class="panel">%s</div>', $fieldsString), sprintf('<div class="panel">%s</div>', $fieldsString),
empty($metaTemplateString) ? '' : $this->element( empty($metaTemplateString) ? '' : $this->element(