1
0
Fork 0
mirror of https://we.phorge.it/source/phorge.git synced 2024-12-20 20:40:56 +01:00

MetaMTA - update documentation and make config a tad easier

Summary: Fixes T7088. Mainly this updates the documentation but I also snuck in tweaking how the domain reply handler is built. This does two main things -- makes the behavior consistent as some applications who didn't override this behavior would send out emails with reply tos AND makes it easier for us to deprecate the custom domain thing on a per application basis, which is just silly. On that note, the main documentation doesn't get into how this can be overridden, though I left in that mini blurb on the config setting itself. We could deprecate this harder and LOCK things if you want as well.

Test Plan: read docs, looked good. reasoned through re-factor

Reviewers: epriestley

Reviewed By: epriestley

Subscribers: Korvin, epriestley

Maniphest Tasks: T7088

Differential Revision: https://secure.phabricator.com/D11725
This commit is contained in:
Bob Trahan 2015-02-12 11:05:39 -08:00
parent 1e94320371
commit d598edc5f3
14 changed files with 70 additions and 45 deletions

View file

@ -18,7 +18,7 @@ final class PhabricatorAuditReplyHandler extends PhabricatorMailReplyHandler {
}
public function getReplyHandlerDomain() {
return PhabricatorEnv::getEnvConfig(
return $this->getCustomReplyHandlerDomainIfExists(
'metamta.diffusion.reply-handler-domain');
}

View file

@ -243,10 +243,11 @@ EODOC
$this->newOption(
'metamta.reply-handler-domain',
'string',
'phabricator.example.com')
null)
->setDescription(pht(
'Domain used for reply email addresses. Some applications can '.
'configure this domain.')),
'override this configuration with a different domain.'))
->addExample('phabricator.example.com', ''),
$this->newOption('metamta.reply.show-hints', 'bool', true)
->setBoolOptions(
array(

View file

@ -25,7 +25,7 @@ class DifferentialReplyHandler extends PhabricatorMailReplyHandler {
}
public function getReplyHandlerDomain() {
return PhabricatorEnv::getEnvConfig(
return $this->getCustomReplyHandlerDomainIfExists(
'metamta.differential.reply-handler-domain');
}

View file

@ -17,10 +17,6 @@ final class FundInitiativeReplyHandler extends PhabricatorMailReplyHandler {
return $this->getDefaultPublicReplyHandlerEmailAddress('I');
}
public function getReplyHandlerDomain() {
return PhabricatorEnv::getEnvConfig('metamta.reply-handler-domain');
}
public function getReplyHandlerInstructions() {
if ($this->supportsReplies()) {
// TODO: Implement.

View file

@ -17,11 +17,6 @@ final class LegalpadReplyHandler extends PhabricatorMailReplyHandler {
return $this->getDefaultPublicReplyHandlerEmailAddress('L');
}
public function getReplyHandlerDomain() {
return PhabricatorEnv::getEnvConfig(
'metamta.reply-handler-domain');
}
public function getReplyHandlerInstructions() {
if ($this->supportsReplies()) {
return pht('Reply to comment or !unsubscribe.');

View file

@ -18,7 +18,7 @@ final class PhabricatorMacroReplyHandler extends PhabricatorMailReplyHandler {
}
public function getReplyHandlerDomain() {
return PhabricatorEnv::getEnvConfig(
return $this->getCustomReplyHandlerDomainIfExists(
'metamta.macro.reply-handler-domain');
}

View file

@ -18,7 +18,7 @@ final class ManiphestReplyHandler extends PhabricatorMailReplyHandler {
}
public function getReplyHandlerDomain() {
return PhabricatorEnv::getEnvConfig(
return $this->getCustomReplyHandlerDomainIfExists(
'metamta.maniphest.reply-handler-domain');
}

View file

@ -32,6 +32,9 @@ final class PhabricatorAppSearchEngine
$saved->setParameter(
'launchable',
$this->readBoolFromRequest($request, 'launchable'));
$saved->setParameter(
'appemails',
$this->readBoolFromRequest($request, 'appemails'));
return $saved;
}
@ -73,6 +76,11 @@ final class PhabricatorAppSearchEngine
$query->withLaunchable($launchable);
}
$appemails = $saved->getParameter('appemails');
if ($appemails !== null) {
$query->withApplicationEmailSupport($appemails);
}
return $query;
}
@ -129,6 +137,17 @@ final class PhabricatorAppSearchEngine
'' => pht('Show All Applications'),
'true' => pht('Show Launchable Applications'),
'false' => pht('Show Non-Launchable Applications'),
)))
->appendChild(
id(new AphrontFormSelectControl())
->setLabel(pht('Application Emails'))
->setName('appemails')
->setValue($this->getBoolFromQuery($saved, 'appemails'))
->setOptions(
array(
'' => pht('Show All Applications'),
'true' => pht('Show Applications w/ App Email Support'),
'false' => pht('Show Applications w/o App Email Support'),
)));
}

View file

@ -10,6 +10,7 @@ final class PhabricatorApplicationQuery
private $unlisted;
private $classes;
private $launchable;
private $applicationEmailSupport;
private $phids;
const ORDER_APPLICATION = 'order:application';
@ -47,6 +48,11 @@ final class PhabricatorApplicationQuery
return $this;
}
public function withApplicationEmailSupport($appemails) {
$this->applicationEmailSupport = $appemails;
return $this;
}
public function withClasses(array $classes) {
$this->classes = $classes;
return $this;
@ -131,6 +137,14 @@ final class PhabricatorApplicationQuery
}
}
if ($this->applicationEmailSupport !== null) {
foreach ($apps as $key => $app) {
if ($app->supportsEmailIntegration() !=
$this->applicationEmailSupport) {
unset($apps[$key]);
}
}
}
switch ($this->order) {
case self::ORDER_NAME:

View file

@ -49,9 +49,20 @@ abstract class PhabricatorMailReplyHandler {
abstract public function getPrivateReplyHandlerEmailAddress(
PhabricatorObjectHandle $handle);
public function getReplyHandlerDomain() {
return $this->getDefaultReplyHandlerDomain();
}
protected function getCustomReplyHandlerDomainIfExists($config_key) {
$domain = PhabricatorEnv::getEnvConfig($config_key);
if ($domain) {
return $domain;
}
return $this->getDefaultReplyHandlerDomain();
}
private function getDefaultReplyHandlerDomain() {
return PhabricatorEnv::getEnvConfig(
'metamta.reply-handler-domain');
}
abstract public function getReplyHandlerInstructions();
abstract protected function receiveEmail(
PhabricatorMetaMTAReceivedMail $mail);

View file

@ -18,7 +18,7 @@ final class PholioReplyHandler extends PhabricatorMailReplyHandler {
}
public function getReplyHandlerDomain() {
return PhabricatorEnv::getEnvConfig(
return $this->getCustomReplyHandlerDomainIfExists(
'metamta.pholio.reply-handler-domain');
}

View file

@ -17,10 +17,6 @@ final class PhortuneCartReplyHandler extends PhabricatorMailReplyHandler {
return $this->getDefaultPublicReplyHandlerEmailAddress('CART');
}
public function getReplyHandlerDomain() {
return PhabricatorEnv::getEnvConfig('metamta.reply-handler-domain');
}
public function getReplyHandlerInstructions() {
if ($this->supportsReplies()) {
// TODO: Implement.

View file

@ -20,10 +20,6 @@ final class PhrictionReplyHandler extends PhabricatorMailReplyHandler {
PhrictionDocumentPHIDType::TYPECONST);
}
public function getReplyHandlerDomain() {
return PhabricatorEnv::getEnvConfig('metamta.reply-handler-domain');
}
public function getReplyHandlerInstructions() {
if ($this->supportsReplies()) {
// TODO: Implement.

View file

@ -2,8 +2,7 @@
@group config
This document contains instructions for configuring inbound email, so users
may update Differential and Maniphest by replying to messages and create
Maniphest tasks via email.
may interact with some Phabricator applications via email.
= Preamble =
@ -33,20 +32,13 @@ in Phabricator and users will not be able to take actions like claiming tasks or
requesting changes to revisions.
To change this behavior so that users can interact with objects in Phabricator
over email, set these configuration keys:
- ##metamta.differential.reply-handler-domain##: enables email replies for
Differential.
- ##metamta.maniphest.reply-handler-domain##: enables email replies for
Maniphest.
Set these keys to some domain which you configure according to the instructions
below, e.g. `phabricator.example.com`. You can set these both to the same
domain, and will generally want to. Once you set these keys, emails will use a
'Reply-To' like `T123+273+af310f9220ad@example.com`, which -- when
over email, change the configuration key `metamta.reply-handler-domain` to some
domain you configure according to the instructions below, e.g.
`phabricator.example.com`. Once you set this key, emails will use a
'Reply-To' like `T123+273+af310f9220ad@phabricator.example.com`, which -- when
configured correctly, according to the instructions below -- will parse incoming
email and allow users to interact with Maniphest tasks and Differential
revisions over email.
email and allow users to interact with Differential revisions, Maniphest tasks,
etc. over email.
If you don't want Phabricator to take up an entire domain (or subdomain) you
can configure a general prefix so you can use a single mailbox to receive mail
@ -56,10 +48,15 @@ mail address. This works because everything up to the first (optional) '+'
character in an email-address is considered the receiver, and everything
after is essentially ignored.
You can also set up a task creation email address, like `bugs@example.com`,
which will create a Maniphest task out of any email which is set to it. To do
this, set `metamta.maniphest.public-create-email` in your configuration. This
has some mild security implications, see below.
You can also set up application email addresses to allow users to create
application objects via email. For example, you could configure
`bugs@phabricator.example.com` to create a Maniphest task out of any email
which is sent to it. To do this, see application settings for a given
application at
{nav icon=home, name=Home >
name=Applications >
icon=cog, name=Settings}
= Security =
@ -93,8 +90,8 @@ practically, is a reasonable setting for many installs. The reply-to address
will still contain a hash unique to the object it represents, so users who have
not received an email about an object can not blindly interact with it.
If you enable `metamta.maniphest.public-create-email`, that address also uses
the weaker "From" authentication mechanism.
If you enable application email addresses, those addresses also use the weaker
"From" authentication mechanism.
NOTE: Phabricator does not currently attempt to verify "From" addresses because
this is technically complex, seems unreasonably difficult in the general case,