diff --git a/application/Espo/Classes/FieldProcessing/Note/AttachmentsLoader.php b/application/Espo/Classes/FieldProcessing/Note/AdditionalFieldsLoader.php similarity index 93% rename from application/Espo/Classes/FieldProcessing/Note/AttachmentsLoader.php rename to application/Espo/Classes/FieldProcessing/Note/AdditionalFieldsLoader.php index 7780f1065e..2d8d5f117d 100644 --- a/application/Espo/Classes/FieldProcessing/Note/AttachmentsLoader.php +++ b/application/Espo/Classes/FieldProcessing/Note/AdditionalFieldsLoader.php @@ -29,19 +29,18 @@ namespace Espo\Classes\FieldProcessing\Note; -use Espo\ORM\Entity; use Espo\Core\FieldProcessing\Loader; use Espo\Core\FieldProcessing\Loader\Params; use Espo\Entities\Note; +use Espo\ORM\Entity; /** * @implements Loader */ -class AttachmentsLoader implements Loader +class AdditionalFieldsLoader implements Loader { public function process(Entity $entity, Params $params): void { - /** @var Note $entity */ - $entity->loadAttachments(); + $entity->loadAdditionalFields(); } } diff --git a/application/Espo/Classes/Record/Note/UpdateInputFilter.php b/application/Espo/Classes/Record/Note/UpdateInputFilter.php new file mode 100644 index 0000000000..cde16806be --- /dev/null +++ b/application/Espo/Classes/Record/Note/UpdateInputFilter.php @@ -0,0 +1,50 @@ +. + * + * The interactive user interfaces in modified source and object code versions + * of this program must display Appropriate Legal Notices, as required under + * Section 5 of the GNU Affero General Public License version 3. + * + * In accordance with Section 7(b) of the GNU Affero General Public License version 3, + * these Appropriate Legal Notices must retain the display of the "EspoCRM" word. + ************************************************************************/ + +namespace Espo\Classes\Record\Note; + +use Espo\Core\Record\Input\Data; +use Espo\Core\Record\Input\Filter; + +/** + * @noinspection PhpUnused + */ +class UpdateInputFilter implements Filter +{ + public function filter(Data $data): void + { + $data->clear('parentId'); + $data->clear('parentType'); + $data->clear('targetType'); + $data->clear('usersIds'); + $data->clear('teamsIds'); + $data->clear('portalsIds'); + $data->clear('isGlobal'); + } +} diff --git a/application/Espo/Classes/Record/Portal/InputFilter.php b/application/Espo/Classes/Record/Portal/InputFilter.php new file mode 100644 index 0000000000..d88765aa3d --- /dev/null +++ b/application/Espo/Classes/Record/Portal/InputFilter.php @@ -0,0 +1,59 @@ +. + * + * The interactive user interfaces in modified source and object code versions + * of this program must display Appropriate Legal Notices, as required under + * Section 5 of the GNU Affero General Public License version 3. + * + * In accordance with Section 7(b) of the GNU Affero General Public License version 3, + * these Appropriate Legal Notices must retain the display of the "EspoCRM" word. + ************************************************************************/ + +namespace Espo\Classes\Record\Portal; + +use Espo\Core\Record\Input\Data; +use Espo\Core\Record\Input\Filter; +use Espo\Core\Utils\Config; +use Espo\Entities\User; + +/** + * @noinspection PhpUnused + */ +class InputFilter implements Filter +{ + public function __construct( + private User $user, + private Config $config + ) {} + + public function filter(Data $data): void + { + if (!$this->config->get('restrictedMode')) { + return; + } + + if ($this->user->isSuperAdmin()) { + return; + } + + $data->clear('customUrl'); + } +} diff --git a/application/Espo/Entities/Note.php b/application/Espo/Entities/Note.php index 3a25da7219..44370413c4 100644 --- a/application/Espo/Entities/Note.php +++ b/application/Espo/Entities/Note.php @@ -264,7 +264,8 @@ class Note extends Entity { if ( $this->getType() == self::TYPE_POST || - $this->getType() == self::TYPE_EMAIL_RECEIVED + $this->getType() == self::TYPE_EMAIL_RECEIVED || + $this->getType() == self::TYPE_EMAIL_SENT ) { $this->loadAttachments(); } diff --git a/application/Espo/Resources/metadata/entityAcl/Note.json b/application/Espo/Resources/metadata/entityAcl/Note.json new file mode 100644 index 0000000000..b7837a0d97 --- /dev/null +++ b/application/Espo/Resources/metadata/entityAcl/Note.json @@ -0,0 +1,10 @@ +{ + "links": { + "teams": { + "readOnly": true + }, + "users": { + "readOnly": true + } + } +} diff --git a/application/Espo/Resources/metadata/recordDefs/Note.json b/application/Espo/Resources/metadata/recordDefs/Note.json index 39d101a2d2..42276727ee 100644 --- a/application/Espo/Resources/metadata/recordDefs/Note.json +++ b/application/Espo/Resources/metadata/recordDefs/Note.json @@ -1,6 +1,9 @@ { "readLoaderClassNameList": [ - "Espo\\Classes\\FieldProcessing\\Note\\AttachmentsLoader" + "Espo\\Classes\\FieldProcessing\\Note\\AdditionalFieldsLoader" + ], + "updateInputFilterClassNameList": [ + "Espo\\Classes\\Record\\Note\\UpdateInputFilter" ], "beforeCreateHookClassNameList": [ "Espo\\Classes\\RecordHooks\\Note\\BeforeCreate" diff --git a/application/Espo/Resources/metadata/recordDefs/Portal.json b/application/Espo/Resources/metadata/recordDefs/Portal.json index 5435dd4110..87ec63ab16 100644 --- a/application/Espo/Resources/metadata/recordDefs/Portal.json +++ b/application/Espo/Resources/metadata/recordDefs/Portal.json @@ -14,6 +14,12 @@ "customUrl", "customId" ], + "createInputFilterClassNameList": [ + "Espo\\Classes\\Record\\Portal\\InputFilter" + ], + "updateInputFilterClassNameList": [ + "Espo\\Classes\\Record\\Portal\\InputFilter" + ], "afterUpdateHookClassNameList": [ "Espo\\Classes\\RecordHooks\\Portal\\AfterUpdate" ] diff --git a/application/Espo/Services/Note.php b/application/Espo/Services/Note.php index b8550d0b08..bbd97dbaef 100644 --- a/application/Espo/Services/Note.php +++ b/application/Espo/Services/Note.php @@ -37,26 +37,11 @@ use Espo\Entities\Note as NoteEntity; use Espo\Entities\User as UserEntity; use Espo\ORM\Entity; -use stdClass; - /** * @extends Record */ class Note extends Record { - public function filterUpdateInput(stdClass $data): void - { - parent::filterUpdateInput($data); - - unset($data->parentId); - unset($data->parentType); - unset($data->targetType); - unset($data->usersIds); - unset($data->teamsIds); - unset($data->portalsIds); - unset($data->isGlobal); - } - /** * @throws BadRequest * @throws Forbidden @@ -205,35 +190,6 @@ class Note extends Record } } - public function link(string $id, string $link, string $foreignId) : void - { - if ($link === 'teams' || $link === 'users') { - throw new Forbidden(); - } - - parent::link($id, $link, $foreignId); - } - - public function unlink(string $id, string $link, string $foreignId) : void - { - if ($link === 'teams' || $link === 'users') { - throw new Forbidden(); - } - - parent::unlink($id, $link, $foreignId); - } - - /** - * @param NoteEntity $entity - * @return void - */ - public function loadAdditionalFields(Entity $entity) - { - parent::loadAdditionalFields($entity); - - $entity->loadAdditionalFields(); - } - private function getUserRepository(): UserRepository { /** @var UserRepository */ diff --git a/application/Espo/Services/Portal.php b/application/Espo/Services/Portal.php index bc3ab1c880..25b25ab9ab 100644 --- a/application/Espo/Services/Portal.php +++ b/application/Espo/Services/Portal.php @@ -29,45 +29,12 @@ namespace Espo\Services; -use Espo\Entities\Portal as PortalEntity; -use Espo\Core\Di; -use stdClass; +use Espo\Core\ORM\Entity; /** - * @extends Record + * @extends Record */ -class Portal extends Record implements - - Di\DataManagerAware +class Portal extends Record { - use Di\DataManagerSetter; - protected bool $getEntityBeforeUpdate = true; - - public function filterCreateInput(stdClass $data): void - { - parent::filterCreateInput($data); - - $this->filterRestrictedFields($data); - } - - public function filterUpdateInput(stdClass $data): void - { - parent::filterUpdateInput($data); - - $this->filterRestrictedFields($data); - } - - private function filterRestrictedFields(stdClass $data): void - { - if (!$this->config->get('restrictedMode')) { - return; - } - - if ($this->user->isSuperAdmin()) { - return; - } - - unset($data->customUrl); - } } diff --git a/tests/integration/Espo/Core/Utils/MetadataTest.php b/tests/integration/Espo/Core/Utils/MetadataTest.php index 6e949ca25c..939d0835ab 100644 --- a/tests/integration/Espo/Core/Utils/MetadataTest.php +++ b/tests/integration/Espo/Core/Utils/MetadataTest.php @@ -31,8 +31,9 @@ namespace tests\integration\Espo\Core\Utils; use Espo\Core\Utils\Json; use Espo\Core\Utils\Metadata; +use tests\integration\Core\BaseTestCase; -class MetadataTest extends \tests\integration\Core\BaseTestCase +class MetadataTest extends BaseTestCase { private $filePath1 = 'custom/Espo/Custom/Resources/metadata/app/rebuild.json'; private $filePath2 = 'custom/Espo/Custom/Resources/metadata/recordDefs/Note.json'; @@ -45,9 +46,6 @@ class MetadataTest extends \tests\integration\Core\BaseTestCase parent::tearDown(); } - /** - * @throws \Espo\Core\Exceptions\Error - */ public function testAppend1() { $initial = $this->getMetadata()->get(['app', 'rebuild', 'actionClassNameList']); @@ -63,7 +61,7 @@ class MetadataTest extends \tests\integration\Core\BaseTestCase $contents2 = Json::encode( (object) [ 'readLoaderClassNameList' => [ - "\\Espo\\Classes\\FieldProcessing\\Note\\AttachmentsLoader", + "\\Espo\\Classes\\FieldProcessing\\Note\\AdditionalFieldsLoader", ] ] ); @@ -88,8 +86,8 @@ class MetadataTest extends \tests\integration\Core\BaseTestCase $this->assertSame( [ - "Espo\\Classes\\FieldProcessing\\Note\\AttachmentsLoader", - "\\Espo\\Classes\\FieldProcessing\\Note\\AttachmentsLoader", + "Espo\\Classes\\FieldProcessing\\Note\\AdditionalFieldsLoader", + "\\Espo\\Classes\\FieldProcessing\\Note\\AdditionalFieldsLoader", ], $metadata->get(['recordDefs', 'Note', 'readLoaderClassNameList']) );