Skip to content
Snippets Groups Projects
Commit 0f9e36ec authored by Andreas De Rijcke's avatar Andreas De Rijcke Committed by davisben
Browse files

Issue #3276745: Create function to check if an email address is allowed to send a message

parent 10251071
Branches
Tags
1 merge request!6Issue #3276745: Create function to check if an email address is allowed to send a message
......@@ -16,24 +16,13 @@ class MailGroupMessageForm extends ContentEntityForm {
public function validateForm(array &$form, FormStateInterface $form_state) {
parent::validateForm($form, $form_state);
/** @var \Drupal\mailgroup\Entity\MailGroupMessageInterface $message */
$message = $this->getEntity();
$group = $message->getGroup();
$sender = $message->getSender();
if (!$group->isActive()) {
$message = $this->t('Message to @group not sent. The group is not active.', [
'@group' => $group->getName(),
]);
$form_state->setError($form, $message);
try {
/** @var \Drupal\mailgroup\Entity\MailGroupMessageInterface $message */
$message = $this->getEntity();
$message->getGroup()->isAllowedToSend($message->getSender());
}
if (!$group->isMember($sender)) {
$message = $this->t('Message to @group rejected. @email is not a member.', [
'@group' => $group->getName(),
'@email' => $sender,
]);
$form_state->setError($form, $message);
catch (\Exception $exception) {
$form_state->setError($form, $exception->getMessage());
}
}
......
......@@ -6,6 +6,8 @@ use Drupal\Core\Entity\ContentEntityBase;
use Drupal\Core\Entity\EntityTypeInterface;
use Drupal\Core\Field\BaseFieldDefinition;
use Drupal\Core\StringTranslation\StringTranslationTrait;
use Drupal\mailgroup\Exception\MailGroupInactiveException;
use Drupal\mailgroup\Exception\MemberNotFoundException;
use Drupal\user\EntityOwnerTrait;
/**
......@@ -229,6 +231,17 @@ class MailGroup extends ContentEntityBase implements MailGroupInterface {
return $messages;
}
/**
* {@inheritdoc}
*/
public function getMember($email) {
/** @var \Drupal\mailgroup\Entity\Storage\MailGroupMembershipStorageInterface $storage */
$storage = $this->entityTypeManager()->getStorage('mailgroup_membership');
$members = $storage->loadByEmail($email, $this);
return empty($members) ? NULL : reset($members);
}
/**
* {@inheritdoc}
*/
......@@ -262,11 +275,32 @@ class MailGroup extends ContentEntityBase implements MailGroupInterface {
* {@inheritdoc}
*/
public function isMember($email) {
/** @var \Drupal\mailgroup\Entity\Storage\MailGroupMembershipStorageInterface $storage */
$storage = $this->entityTypeManager()->getStorage('mailgroup_membership');
$memberships = $storage->loadByEmail($email, $this);
$member = $this->getMember($email);
return $member instanceof MailGroupMembershipInterface;
}
/**
* {@inheritdoc}
*/
public function isAllowedToSend($email) {
if (!$this->isActive()) {
$message = $this->t('The group @group is not active.', [
'@group' => $this->getName(),
]);
throw new MailGroupInactiveException($message);
}
$member = $this->getMember($email);
if (!$member instanceof MailGroupMembershipInterface) {
$message = $this->t('@email is not an (active) member of group @group.', [
'@group' => $this->getName(),
'@email' => $email,
]);
throw new MemberNotFoundException($message);
}
return !empty($memberships) ? TRUE : FALSE;
return $member;
}
/**
......
......@@ -191,6 +191,17 @@ interface MailGroupInterface extends ContentEntityInterface, EntityOwnerInterfac
*/
public function getMessages();
/**
* Get the member of the group matching given email.
*
* @param string $email
* The email address of the user to check.
*
* @return \Drupal\mailgroup\Entity\MailGroupMembershipInterface|null
* The membership entity.
*/
public function getMember($email);
/**
* Gets the members of the group.
*
......@@ -218,4 +229,20 @@ interface MailGroupInterface extends ContentEntityInterface, EntityOwnerInterfac
*/
public function isMember($email);
/**
* Checks if a given email is allowed to send to the group.
*
* Combines isActive and getMember.
*
* @param string $email
* The email address of the user to check.
*
* @return \Drupal\mailgroup\Entity\MailGroupMembershipInterface|null
* The membership entity.
*
* @throws \Drupal\mailgroup\Exception\MailGroupInactiveException
* @throws \Drupal\mailgroup\Exception\MemberNotFoundException
*/
public function isAllowedToSend($email);
}
......@@ -186,25 +186,14 @@ class MailGroupMessage extends MailGroupEntityBase implements MailGroupMessageIn
/**
* {@inheritdoc}
*
* @throws \Drupal\mailgroup\Exception\MailGroupInactiveException
* @throws \Drupal\mailgroup\Exception\MemberNotFoundException
*/
public function preSave(EntityStorageInterface $storage) {
$group = $this->getGroup();
$sender = $this->getSender();
if (!$group->isActive()) {
$message = $this->t('Message to @group not sent. The group is not active.', [
'@group' => $group->getName(),
]);
throw new \Exception($message);
}
if (!$group->isMember($sender)) {
$message = $this->t('Message to @group rejected. @email is not a member.', [
'@group' => $group->getName(),
'@email' => $sender,
]);
throw new \Exception($message);
}
$sender = $this->getSender();
$this->getGroup()->isAllowedToSend($sender);
parent::preSave($storage);
}
......
......@@ -14,7 +14,10 @@ class MailGroupMembershipStorage extends SqlContentEntityStorage implements Mail
* {@inheritdoc}
*/
public function loadByEmail($email, MailGroupInterface $group = NULL) {
$properties = ['uid.entity:user.mail' => $email];
$properties = [
'uid.entity:user.mail' => $email,
'status' => TRUE,
];
if ($group) {
$properties['gid'] = $group->id();
......
......@@ -15,7 +15,7 @@ interface MailGroupMembershipStorageInterface extends ContentEntityStorageInterf
*
* @param string $email
* The membership email address.
* @param \Drupal\mailgroup\Entity\MailGroupInterface $group
* @param \Drupal\mailgroup\Entity\MailGroupInterface|null $group
* (optional) A group to load the membership for.
*
* @return \Drupal\mailgroup\Entity\MailGroupMembershipInterface[]
......
<?php
namespace Drupal\mailgroup\Exception;
/**
* Thrown when trying to send a message to an inactive MailGroup.
*/
class MailGroupInactiveException extends \Exception {}
......@@ -2,9 +2,7 @@
namespace Drupal\mailgroup\Exception;
use Exception;
/**
* Thrown when a membership can't be found.
*/
class MemberNotFoundException extends Exception { }
class MemberNotFoundException extends \Exception {}
......@@ -5,7 +5,6 @@ namespace Drupal\mailgroup;
use Drupal\Core\Entity\EntityTypeManagerInterface;
use Drupal\Core\StringTranslation\StringTranslationTrait;
use Drupal\mailgroup\Entity\MailGroupInterface;
use Drupal\mailgroup\Exception\MemberNotFoundException;
use ZBateson\MailMimeParser\Header\HeaderConsts;
use ZBateson\MailMimeParser\IMessage;
......@@ -77,24 +76,12 @@ class MessageParser implements MessageParserInterface {
* {@inheritdoc}
*/
public function createMessageEntity() {
/** @var \Drupal\mailgroup\Entity\Storage\MailGroupMembershipStorageInterface $membership_storage */
$membership_storage = $this->entityTypeManager->getStorage('mailgroup_membership');
$message_storage = $this->entityTypeManager->getStorage('mailgroup_message');
$from_email = $this->message->getHeaderValue(HeaderConsts::FROM);
$subject = $this->message->getHeaderValue(HeaderConsts::SUBJECT);
$memberships = $membership_storage->loadByEmail($from_email, $this->group);
if (empty($memberships)) {
$message = $this->t('Membership for @email not found in @group', [
'@email' => $from_email,
'@group' => $this->group->getName(),
]);
throw new MemberNotFoundException($message);
}
$sending_member = reset($memberships);
$sending_member = $this->group->isAllowedToSend($from_email);
$values = [
'gid' => $this->group->id(),
......
......@@ -9,6 +9,9 @@ interface MessageParserInterface {
*
* @return \Drupal\mailgroup\Entity\MailGroupMessageInterface
* The message entity.
*
* @throws \Drupal\mailgroup\Exception\MailGroupInactiveException
* @throws \Drupal\mailgroup\Exception\MemberNotFoundException
*/
public function createMessageEntity();
......
......@@ -48,7 +48,7 @@ abstract class KernelTestBase extends EntityKernelTestBase {
$storage = $this->entityTypeManager->getStorage('mailgroup');
$group = $storage->create([
'type' => 'default',
'name' => $this->randomString(),
'name' => 'test_group',
'email' => $this->randomMachineName() . '@example.com',
'prepend_name' => TRUE,
'reply_to' => 1,
......
......@@ -4,6 +4,8 @@ namespace Drupal\Tests\mailgroup\Kernel;
use Drupal\mailgroup\Entity\MailGroupMembershipInterface;
use Drupal\mailgroup\Entity\MailGroupMessageInterface;
use Drupal\mailgroup\Exception\MailGroupInactiveException;
use Drupal\mailgroup\Exception\MemberNotFoundException;
/**
* Tests for mail group entities.
......@@ -94,4 +96,36 @@ class MailGroupTest extends KernelTestBase {
$this->assertTrue($this->group->isMember($this->groupUser->getEmail()));
}
/**
* Tests fetching the membership corresponding to an email address.
*
* @covers ::getMember
*/
public function testGetMember() {
$this->createMembership($this->group, $this->groupUser);
$this->assertNull($this->group->getMember($this->basicUser->getEmail()));
$this->assertInstanceOf(MailGroupMembershipInterface::class, $this->group->getMember($this->groupUser->getEmail()));
}
/**
* Tests an email address is allowed to send to a group.
*
* @covers ::isAllowedToSend
*/
public function testIsAllowedToSend() {
$this->createMembership($this->group, $this->groupUser);
$this->expectException(MemberNotFoundException::class);
$this->expectExceptionMessage("{$this->basicUser->getEmail()} is not an (active) member of group test_group.");
$this->assertInstanceOf(MailGroupMembershipInterface::class, $this->group->isAllowedToSend($this->basicUser->getEmail()));
$this->assertInstanceOf(MailGroupMembershipInterface::class, $this->group->isAllowedToSend($this->groupUser->getEmail()));
$this->group->setInactive();
$this->expectException(MailGroupInactiveException::class);
$this->expectExceptionMessage('The group test_group is not active.');
$this->assertInstanceOf(MailGroupMembershipInterface::class, $this->group->isAllowedToSend($this->groupUser->getEmail()));
$this->group->setActive();
}
}
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment