diff --git a/src/__phutil_library_map__.php b/src/__phutil_library_map__.php --- a/src/__phutil_library_map__.php +++ b/src/__phutil_library_map__.php @@ -287,6 +287,7 @@ 'DatabaseConfigurationProvider' => 'infrastructure/storage/configuration/DatabaseConfigurationProvider.php', 'DefaultDatabaseConfigurationProvider' => 'infrastructure/storage/configuration/DefaultDatabaseConfigurationProvider.php', 'DifferentialAction' => 'applications/differential/constants/DifferentialAction.php', + 'DifferentialActionEmailCommand' => 'applications/differential/command/DifferentialActionEmailCommand.php', 'DifferentialActionMenuEventListener' => 'applications/differential/event/DifferentialActionMenuEventListener.php', 'DifferentialAddCommentView' => 'applications/differential/view/DifferentialAddCommentView.php', 'DifferentialAffectedPath' => 'applications/differential/storage/DifferentialAffectedPath.php', @@ -3459,6 +3460,7 @@ 'DarkConsoleServicesPlugin' => 'DarkConsolePlugin', 'DarkConsoleXHProfPlugin' => 'DarkConsolePlugin', 'DefaultDatabaseConfigurationProvider' => 'DatabaseConfigurationProvider', + 'DifferentialActionEmailCommand' => 'MetaMTAEmailTransactionCommand', 'DifferentialActionMenuEventListener' => 'PhabricatorEventListener', 'DifferentialAddCommentView' => 'AphrontView', 'DifferentialAffectedPath' => 'DifferentialDAO', @@ -3578,7 +3580,7 @@ 'DifferentialQueryConduitAPIMethod' => 'DifferentialConduitAPIMethod', 'DifferentialQueryDiffsConduitAPIMethod' => 'DifferentialConduitAPIMethod', 'DifferentialRemarkupRule' => 'PhabricatorObjectRemarkupRule', - 'DifferentialReplyHandler' => 'PhabricatorMailReplyHandler', + 'DifferentialReplyHandler' => 'PhabricatorApplicationTransactionReplyHandler', 'DifferentialRepositoryField' => 'DifferentialCoreCustomField', 'DifferentialRepositoryLookup' => 'Phobject', 'DifferentialRequiredSignaturesField' => 'DifferentialCoreCustomField', diff --git a/src/applications/differential/command/DifferentialActionEmailCommand.php b/src/applications/differential/command/DifferentialActionEmailCommand.php new file mode 100644 --- /dev/null +++ b/src/applications/differential/command/DifferentialActionEmailCommand.php @@ -0,0 +1,92 @@ +command; + } + + private function setCommand($command) { + $this->command = $command; + return $this; + } + + private function setAction($action) { + $this->action = $action; + return $this; + } + + private function getAction() { + return $this->action; + } + + private function setCommandAliases(array $aliases) { + $this->aliases = $aliases; + return $this; + } + + public function getCommandAliases() { + return $this->aliases; + } + + public function getCommandObjects() { + $actions = array( + DifferentialAction::ACTION_REJECT => 'request', + DifferentialAction::ACTION_ABANDON => 'abandon', + DifferentialAction::ACTION_RECLAIM => 'reclaim', + DifferentialAction::ACTION_RESIGN => 'resign', + DifferentialAction::ACTION_RETHINK => 'rethink', + DifferentialAction::ACTION_CLAIM => 'commandeer', + ); + + if (PhabricatorEnv::getEnvConfig('differential.enable-email-accept')) { + $actions[DifferentialAction::ACTION_ACCEPT] = 'accept'; + } + + $aliases = array( + DifferentialAction::ACTION_REJECT => array('reject'), + DifferentialAction::ACTION_CLAIM => array('claim'), + ); + + $objects = array(); + foreach ($actions as $action => $keyword) { + $object = id(new DifferentialActionEmailCommand()) + ->setCommand($keyword) + ->setAction($action); + + if (isset($aliases[$action])) { + $object->setCommandAliases($aliases[$action]); + } + + $objects[] = $object; + } + + return $objects; + } + + public function isCommandSupportedForObject( + PhabricatorApplicationTransactionInterface $object) { + return ($object instanceof DifferentialRevision); + } + + public function buildTransactions( + PhabricatorUser $viewer, + PhabricatorApplicationTransactionInterface $object, + PhabricatorMetaMTAReceivedMail $mail, + $command, + array $argv) { + $xactions = array(); + + $xactions[] = $object->getApplicationTransactionTemplate() + ->setTransactionType(DifferentialTransaction::TYPE_ACTION) + ->setNewValue($this->getAction()); + + return $xactions; + } + +} diff --git a/src/applications/differential/mail/DifferentialReplyHandler.php b/src/applications/differential/mail/DifferentialReplyHandler.php --- a/src/applications/differential/mail/DifferentialReplyHandler.php +++ b/src/applications/differential/mail/DifferentialReplyHandler.php @@ -1,6 +1,7 @@ getDefaultPrivateReplyHandlerEmailAddress($handle, 'D'); - } - - public function getPublicReplyHandlerEmailAddress() { - return $this->getDefaultPublicReplyHandlerEmailAddress('D'); - } - - public function getSupportedCommands() { - $actions = array( - DifferentialAction::ACTION_COMMENT, - DifferentialAction::ACTION_REJECT, - DifferentialAction::ACTION_ABANDON, - DifferentialAction::ACTION_RECLAIM, - DifferentialAction::ACTION_RESIGN, - DifferentialAction::ACTION_RETHINK, - 'unsubscribe', - ); - - if (PhabricatorEnv::getEnvConfig('differential.enable-email-accept')) { - $actions[] = DifferentialAction::ACTION_ACCEPT; - } - - return $actions; - } - - protected function receiveEmail(PhabricatorMetaMTAReceivedMail $mail) { - $revision = $this->getMailReceiver(); - $viewer = $this->getActor(); - - $body_data = $mail->parseBody(); - $body = $body_data['body']; - $body = $this->enhanceBodyWithAttachments($body, $mail->getAttachments()); - - $xactions = array(); - $content_source = PhabricatorContentSource::newForSource( - PhabricatorContentSource::SOURCE_EMAIL, - array( - 'id' => $mail->getID(), - )); - - $template = id(new DifferentialTransaction()); - - $commands = $body_data['commands']; - foreach ($commands as $command_argv) { - $command = head($command_argv); - switch ($command) { - case 'unsubscribe': - $xactions[] = id(clone $template) - ->setTransactionType(PhabricatorTransactions::TYPE_SUBSCRIBERS) - ->setNewValue( - array( - '-' => array($viewer->getPHID()), - )); - break; - case DifferentialAction::ACTION_ACCEPT: - $accept_key = 'differential.enable-email-accept'; - $can_accept = PhabricatorEnv::getEnvConfig($accept_key); - if (!$can_accept) { - throw new Exception( - pht( - 'You can not !accept revisions over email because '. - 'Differential is configured to disallow this.')); - } - // Fall through... - case DifferentialAction::ACTION_REJECT: - case DifferentialAction::ACTION_ABANDON: - case DifferentialAction::ACTION_RECLAIM: - case DifferentialAction::ACTION_RESIGN: - case DifferentialAction::ACTION_RETHINK: - case DifferentialAction::ACTION_CLAIM: - case DifferentialAction::ACTION_REOPEN: - $xactions[] = id(clone $template) - ->setTransactionType(DifferentialTransaction::TYPE_ACTION) - ->setNewValue($command); - break; - } - } - - $xactions[] = id(clone $template) - ->setTransactionType(PhabricatorTransactions::TYPE_COMMENT) - ->attachComment( - id(new DifferentialTransactionComment()) - ->setContent($body)); - - $editor = id(new DifferentialTransactionEditor()) - ->setActor($viewer) - ->setContentSource($content_source) - ->setExcludeMailRecipientPHIDs($this->getExcludeMailRecipientPHIDs()) - ->setContinueOnMissingFields(true) - ->setContinueOnNoEffect(true); - - $editor->applyTransactions($revision, $xactions); + public function getObjectPrefix() { + return 'D'; } }