From fec6bf8ee0bf6562c7aae21310129fa38ba03f04 Mon Sep 17 00:00:00 2001 From: Yuri Kuznetsov Date: Wed, 7 Feb 2024 09:01:56 +0200 Subject: [PATCH 1/3] mass email link checker --- .../LinkCheckers/InboundEmailLinkChecker.php | 48 +++++++++++++++++++ .../Resources/metadata/aclDefs/MassEmail.json | 5 +- 2 files changed, 52 insertions(+), 1 deletion(-) create mode 100644 application/Espo/Modules/Crm/Classes/Acl/MassEmail/LinkCheckers/InboundEmailLinkChecker.php diff --git a/application/Espo/Modules/Crm/Classes/Acl/MassEmail/LinkCheckers/InboundEmailLinkChecker.php b/application/Espo/Modules/Crm/Classes/Acl/MassEmail/LinkCheckers/InboundEmailLinkChecker.php new file mode 100644 index 0000000000..72bc943e59 --- /dev/null +++ b/application/Espo/Modules/Crm/Classes/Acl/MassEmail/LinkCheckers/InboundEmailLinkChecker.php @@ -0,0 +1,48 @@ +. + * + * 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\Modules\Crm\Classes\Acl\MassEmail\LinkCheckers; + +use Espo\Core\Acl\LinkChecker; +use Espo\Entities\InboundEmail; +use Espo\Entities\User; +use Espo\Modules\Crm\Entities\MassEmail; +use Espo\ORM\Entity; + +/** + * @implements LinkChecker + * @noinspection PhpUnused + */ +class InboundEmailLinkChecker implements LinkChecker +{ + public function check(User $user, Entity $entity, Entity $foreignEntity): bool + { + return $foreignEntity->smtpIsForMassEmail(); + } +} diff --git a/application/Espo/Modules/Crm/Resources/metadata/aclDefs/MassEmail.json b/application/Espo/Modules/Crm/Resources/metadata/aclDefs/MassEmail.json index 4df8077061..85bc2edc20 100644 --- a/application/Espo/Modules/Crm/Resources/metadata/aclDefs/MassEmail.json +++ b/application/Espo/Modules/Crm/Resources/metadata/aclDefs/MassEmail.json @@ -1,3 +1,6 @@ { - "ownershipCheckerClassName": "Espo\\Modules\\Crm\\Classes\\Acl\\MassEmail\\OwnershipChecker" + "ownershipCheckerClassName": "Espo\\Modules\\Crm\\Classes\\Acl\\MassEmail\\OwnershipChecker", + "linkCheckerClassNameMap": { + "inboundEmail": "Espo\\Modules\\Crm\\Classes\\Acl\\MassEmail\\LinkCheckers\\InboundEmailLinkChecker" + } } From 623b26f60f74e0c9bf075208c230d43f7673ea46 Mon Sep 17 00:00:00 2001 From: Yuri Kuznetsov Date: Wed, 7 Feb 2024 09:42:59 +0200 Subject: [PATCH 2/3] email phone fields save fix --- .../FieldProcessing/EmailAddress/Saver.php | 2 +- .../FieldProcessing/PhoneNumber/Saver.php | 2 +- .../Core/FieldProcessing/EmailAddressTest.php | 22 ++++++++++++++++++- .../Core/FieldProcessing/PhoneNumberTest.php | 22 ++++++++++++++++++- 4 files changed, 44 insertions(+), 4 deletions(-) diff --git a/application/Espo/Core/FieldProcessing/EmailAddress/Saver.php b/application/Espo/Core/FieldProcessing/EmailAddress/Saver.php index 2c0988387e..6d952e0825 100644 --- a/application/Espo/Core/FieldProcessing/EmailAddress/Saver.php +++ b/application/Espo/Core/FieldProcessing/EmailAddress/Saver.php @@ -69,7 +69,7 @@ class Saver implements SaverInterface $emailAddressData = $entity->get('emailAddressData'); } - if ($emailAddressData !== null) { + if ($emailAddressData !== null && $entity->isAttributeChanged('emailAddressData')) { $this->storeData($entity); return; diff --git a/application/Espo/Core/FieldProcessing/PhoneNumber/Saver.php b/application/Espo/Core/FieldProcessing/PhoneNumber/Saver.php index f1b3aad527..37fc54f024 100644 --- a/application/Espo/Core/FieldProcessing/PhoneNumber/Saver.php +++ b/application/Espo/Core/FieldProcessing/PhoneNumber/Saver.php @@ -74,7 +74,7 @@ class Saver implements SaverInterface $phoneNumberData = $entity->get('phoneNumberData'); } - if ($phoneNumberData !== null) { + if ($phoneNumberData !== null && $entity->isAttributeChanged('phoneNumberData')) { $this->storeData($entity); return; diff --git a/tests/integration/Espo/Core/FieldProcessing/EmailAddressTest.php b/tests/integration/Espo/Core/FieldProcessing/EmailAddressTest.php index 9492e737a6..6e093b6cad 100644 --- a/tests/integration/Espo/Core/FieldProcessing/EmailAddressTest.php +++ b/tests/integration/Espo/Core/FieldProcessing/EmailAddressTest.php @@ -31,10 +31,12 @@ namespace tests\integration\Espo\Core\FieldProcessing; use Espo\Core\ORM\EntityManager; +use Espo\Modules\Crm\Entities\Contact; use Espo\Core\{ Field\EmailAddressGroup, Field\EmailAddress, -}; + Record\ServiceContainer, + Record\UpdateParams}; class EmailAddressTest extends \tests\integration\Core\BaseTestCase { @@ -120,4 +122,22 @@ class EmailAddressTest extends \tests\integration\Core\BaseTestCase $this->assertEquals('test@test.com', $group->getPrimary()->getAddress()); } + + public function testEmailAddress3(): void + { + $service = $this->getContainer()->getByClass(ServiceContainer::class)->getByClass(Contact::class); + $em = $this->getEntityManager(); + + /** @var Contact $contact */ + $contact = $em->createEntity(Contact::ENTITY_TYPE); + + /** @noinspection PhpUnhandledExceptionInspection */ + $service->update($contact->getId(), (object) [ + 'emailAddress' => 'test@test.com', + ], UpdateParams::create()); + + $em->refreshEntity($contact); + + $this->assertEquals('test@test.com', $contact->getEmailAddress()); + } } diff --git a/tests/integration/Espo/Core/FieldProcessing/PhoneNumberTest.php b/tests/integration/Espo/Core/FieldProcessing/PhoneNumberTest.php index 225ea494e1..12348d7199 100644 --- a/tests/integration/Espo/Core/FieldProcessing/PhoneNumberTest.php +++ b/tests/integration/Espo/Core/FieldProcessing/PhoneNumberTest.php @@ -31,10 +31,12 @@ namespace tests\integration\Espo\Core\FieldProcessing; use Espo\Core\ORM\EntityManager; +use Espo\Modules\Crm\Entities\Contact; use Espo\Core\{ Field\PhoneNumberGroup, Field\PhoneNumber, -}; + Record\ServiceContainer, + Record\UpdateParams}; class PhoneNumberTest extends \tests\integration\Core\BaseTestCase { @@ -99,4 +101,22 @@ class PhoneNumberTest extends \tests\integration\Core\BaseTestCase $this->assertEquals(1, $group5->getCount()); } + + public function testPhoneNumber2(): void + { + $service = $this->getContainer()->getByClass(ServiceContainer::class)->getByClass(Contact::class); + $em = $this->getEntityManager(); + + /** @var Contact $contact */ + $contact = $em->createEntity(Contact::ENTITY_TYPE); + + /** @noinspection PhpUnhandledExceptionInspection */ + $service->update($contact->getId(), (object) [ + 'phoneNumber' => '+11111111111', + ], UpdateParams::create()); + + $em->refreshEntity($contact); + + $this->assertEquals('+11111111111', $contact->getPhoneNumber()); + } } From db26c579b0ad55ce5a1508c7cb6c22f19ccbbd46 Mon Sep 17 00:00:00 2001 From: Yuri Kuznetsov Date: Wed, 7 Feb 2024 11:35:44 +0200 Subject: [PATCH 3/3] 8.1.4 --- package-lock.json | 4 ++-- package.json | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/package-lock.json b/package-lock.json index e7685cd0e4..0033db91e8 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "espocrm", - "version": "8.1.3", + "version": "8.1.4", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "espocrm", - "version": "8.1.3", + "version": "8.1.4", "hasInstallScript": true, "license": "AGPL-3.0-or-later", "dependencies": { diff --git a/package.json b/package.json index 543fbf4277..ac64c6d90a 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "espocrm", - "version": "8.1.3", + "version": "8.1.4", "description": "Open-source CRM.", "repository": { "type": "git",