diff --git a/src/Security/Member.php b/src/Security/Member.php index ea82d185d..aac772bb3 100644 --- a/src/Security/Member.php +++ b/src/Security/Member.php @@ -871,6 +871,11 @@ class Member extends DataObject */ public function onBeforeWrite() { + // Remove any line-break or space characters accidentally added during a copy-paste operation + if ($this->Email) { + $this->Email = trim($this->Email); + } + // If a member with the same "unique identifier" already exists with a different ID, don't allow merging. // Note: This does not a full replacement for safeguards in the controller layer (e.g. in a registration form), // but rather a last line of defense against data inconsistencies. diff --git a/tests/php/Security/MemberTest.php b/tests/php/Security/MemberTest.php index d6dbd4d3d..96a30041b 100644 --- a/tests/php/Security/MemberTest.php +++ b/tests/php/Security/MemberTest.php @@ -1593,4 +1593,12 @@ class MemberTest extends FunctionalTest $this->assertSame('Johnson', $member->getLastName(), 'getLastName should proxy to Surname'); } + + public function testEmailIsTrimmed() + { + $member = new Member(); + $member->Email = " trimmed@test.com\r\n"; + $member->write(); + $this->assertNotNull(Member::get()->find('Email', 'trimmed@test.com')); + } }