diff --git a/CHANGELOG b/CHANGELOG index 2fb795b74..137e1cc70 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -38,6 +38,7 @@ CHANGELOG Roundcube Webmail - Fix regression where using an absolute path to SQLite database file on Windows didn't work (#7196) - Fix using unix:///path/to/socket.file in memcached driver (#7210) - Fix bug where attachments with Content-Id were attached to the message on reply (#7122) +- Fix identity selection on reply when both sender and recipient addresses are included in identities (#7211) RELEASE 1.4.2 ------------- diff --git a/program/include/rcmail_sendmail.php b/program/include/rcmail_sendmail.php index 9ed65f756..503710a1a 100644 --- a/program/include/rcmail_sendmail.php +++ b/program/include/rcmail_sendmail.php @@ -1478,8 +1478,9 @@ class rcmail_sendmail break; } } + // use replied/forwarded message recipients - else if (($found = array_search(strtolower($ident['email_ascii']), $a_recipients)) !== false) { + if (($found = array_search(strtolower($ident['email_ascii']), $a_recipients)) !== false) { // remember first matching identity address if ($found_idx['to'] === null) { $found_idx['to'] = $idx; @@ -1495,7 +1496,7 @@ class rcmail_sendmail // If matching by name+address didn't find any matches, // get first found identity (address) if any if ($from_idx === null) { - $from_idx = $found_idx['from'] !== null ? $found_idx['from'] : $found_idx['to']; + $from_idx = $found_idx['to'] !== null ? $found_idx['to'] : $found_idx['from']; } // Try Return-Path diff --git a/tests/MailFunc.php b/tests/MailFunc.php index 678882413..1aac96bec 100644 --- a/tests/MailFunc.php +++ b/tests/MailFunc.php @@ -276,88 +276,4 @@ class MailFunc extends PHPUnit\Framework\TestCase $this->assertNotContains('onerror=alert(1)//">test', $body); $this->assertContains(' 'Test', - 'email_ascii' => 'addr@domain.tld', - 'ident' => 'Test ', - ), - array( - 'name' => 'Test', - 'email_ascii' => 'thing@domain.tld', - 'ident' => 'Test ', - ), - array( - 'name' => 'Test', - 'email_ascii' => 'other@domain.tld', - 'ident' => 'Test ', - ), - ); - - $message = new stdClass; - $message->headers = new rcube_message_header; - $message->headers->set('Return-Path', ''); - $res = rcmail_identity_select($message, $identities); - - $this->assertSame($identities[0], $res); - - $message->headers->set('Return-Path', ''); - $res = rcmail_identity_select($message, $identities); - - $this->assertSame($identities[1], $res); - } - - /** - * Test identities selection (#1489378) - */ - function test_rcmail_identity_select2() - { - $identities = array( - array( - 'name' => 'Test 1', - 'email_ascii' => 'addr1@domain.tld', - 'ident' => 'Test 1 ', - ), - array( - 'name' => 'Test 2', - 'email_ascii' => 'addr2@domain.tld', - 'ident' => 'Test 2 ', - ), - array( - 'name' => 'Test 3', - 'email_ascii' => 'addr3@domain.tld', - 'ident' => 'Test 3 ', - ), - array( - 'name' => 'Test 4', - 'email_ascii' => 'addr2@domain.tld', - 'ident' => 'Test 4 ', - ), - ); - - $message = new stdClass; - $message->headers = new rcube_message_header; - - $message->headers->set('From', ''); - $res = rcmail_identity_select($message, $identities); - $this->assertSame($identities[1], $res); - - $message->headers->set('From', 'Test 2 '); - $res = rcmail_identity_select($message, $identities); - $this->assertSame($identities[1], $res); - - $message->headers->set('From', 'Other '); - $res = rcmail_identity_select($message, $identities); - $this->assertSame($identities[1], $res); - - $message->headers->set('From', 'Test 4 '); - $res = rcmail_identity_select($message, $identities); - $this->assertSame($identities[3], $res); - } } diff --git a/tests/Rcmail/OutputHtml.php b/tests/Rcmail/OutputHtml.php index af108e0f0..2943acbd3 100644 --- a/tests/Rcmail/OutputHtml.php +++ b/tests/Rcmail/OutputHtml.php @@ -5,7 +5,7 @@ * * @package Tests */ -class Rcmail_OutputHtml extends PHPUnit\Framework\TestCase +class Rcmail_RcmailOutputHtml extends PHPUnit\Framework\TestCase { /** * Test get_template_logo() diff --git a/tests/Rcmail/Sendmail.php b/tests/Rcmail/Sendmail.php new file mode 100644 index 000000000..9e99f70b4 --- /dev/null +++ b/tests/Rcmail/Sendmail.php @@ -0,0 +1,165 @@ +headers = new rcube_message_header; + $message->headers->charset = 'UTF-8'; + $message->headers->to = ''; + $message->headers->from = ''; + $message->headers->cc = ''; + $message->headers->other = []; + + $result = rcmail_sendmail::identity_select($message, []); + $this->assertSame(null, $result); + + $identities = [ + [ + 'identity_id' => 1, + 'user_id' => 1, + 'standard' => 1, + 'name' => 'Default', + 'email' => 'default@domain.tld', + 'email_ascii' => 'default@domain.tld', + 'ident' => 'Default ', + ], + [ + 'identity_id' => 2, + 'user_id' => 1, + 'standard' => 0, + 'name' => 'Identity One', + 'email' => 'ident1@domain.tld', + 'email_ascii' => 'ident1@domain.tld', + 'ident' => '"Identity One" ', + ], + [ + 'identity_id' => 3, + 'user_id' => 1, + 'standard' => 0, + 'name' => 'Identity Two', + 'email' => 'ident2@domain.tld', + 'email_ascii' => 'ident2@domain.tld', + 'ident' => '"Identity Two" ', + ], + ]; + + $message->headers->to = 'ident2@domain.tld'; + $message->headers->from = 'from@other.domain.tld'; + + $result = rcmail_sendmail::identity_select($message, $identities); + $this->assertSame($identities[2], $result); + + $message->headers->to = 'ident1@domain.tld'; + $message->headers->from = 'from@other.domain.tld'; + + $result = rcmail_sendmail::identity_select($message, $identities); + $this->assertSame($identities[1], $result); + + // #7211 + $message->headers->to = 'ident1@domain.tld'; + $message->headers->from = 'ident2@domain.tld'; + + $result = rcmail_sendmail::identity_select($message, $identities); + $this->assertSame($identities[1], $result); + + $message->headers->to = 'ident2@domain.tld'; + $message->headers->from = 'ident1@domain.tld'; + + $result = rcmail_sendmail::identity_select($message, $identities); + $this->assertSame($identities[2], $result); + } + + /** + * Test identities selection using Return-Path header + */ + function test_identity_select_return_path() + { + $identities = array( + array( + 'name' => 'Test', + 'email_ascii' => 'addr@domain.tld', + 'ident' => 'Test ', + ), + array( + 'name' => 'Test', + 'email_ascii' => 'thing@domain.tld', + 'ident' => 'Test ', + ), + array( + 'name' => 'Test', + 'email_ascii' => 'other@domain.tld', + 'ident' => 'Test ', + ), + ); + + $message = new stdClass; + $message->headers = new rcube_message_header; + $message->headers->set('Return-Path', ''); + $res = rcmail_sendmail::identity_select($message, $identities); + + $this->assertSame($identities[0], $res); + + $message->headers->set('Return-Path', ''); + $res = rcmail_sendmail::identity_select($message, $identities); + + $this->assertSame($identities[1], $res); + } + + /** + * Test identities selection (#1489378) + */ + function test_identity_select_more() + { + $identities = array( + array( + 'name' => 'Test 1', + 'email_ascii' => 'addr1@domain.tld', + 'ident' => 'Test 1 ', + ), + array( + 'name' => 'Test 2', + 'email_ascii' => 'addr2@domain.tld', + 'ident' => 'Test 2 ', + ), + array( + 'name' => 'Test 3', + 'email_ascii' => 'addr3@domain.tld', + 'ident' => 'Test 3 ', + ), + array( + 'name' => 'Test 4', + 'email_ascii' => 'addr2@domain.tld', + 'ident' => 'Test 4 ', + ), + ); + + $message = new stdClass; + $message->headers = new rcube_message_header; + + $message->headers->set('From', ''); + $res = rcmail_sendmail::identity_select($message, $identities); + $this->assertSame($identities[1], $res); + + $message->headers->set('From', 'Test 2 '); + $res = rcmail_sendmail::identity_select($message, $identities); + $this->assertSame($identities[1], $res); + + $message->headers->set('From', 'Other '); + $res = rcmail_sendmail::identity_select($message, $identities); + $this->assertSame($identities[1], $res); + + $message->headers->set('From', 'Test 4 '); + $res = rcmail_sendmail::identity_select($message, $identities); + $this->assertSame($identities[3], $res); + } +} diff --git a/tests/phpunit.xml b/tests/phpunit.xml index 1369b89c9..41cb5c1ce 100644 --- a/tests/phpunit.xml +++ b/tests/phpunit.xml @@ -53,6 +53,7 @@ MailFunc.php Rcmail/OutputHtml.php Rcmail/Rcmail.php + Rcmail/Sendmail.php ./../plugins/acl/tests/Acl.php