1
0
Fork 0
mirror of https://we.phorge.it/source/phorge.git synced 2024-11-22 23:02:42 +01:00

Make Pholio mail render without a ton of over-escaped HTML

Summary:
Ref T13202. See PHI900. Fixes T12814. Pholio currently builds HTML comments in an older way that can dump a bunch of over-escaped HTML into mail bodies.

Update the logic to be more similar to the Differential rendering logic and stop over-escaping things.

The result isn't perfect, but is dramatically less broken.

Test Plan: {F5919860}

Reviewers: amckinley

Reviewed By: amckinley

Maniphest Tasks: T13202, T12814

Differential Revision: https://secure.phabricator.com/D19733
This commit is contained in:
epriestley 2018-10-05 11:40:51 -07:00
parent c6c1893dc0
commit 99034efa8b
4 changed files with 79 additions and 42 deletions

View file

@ -636,8 +636,8 @@ final class DifferentialTransactionEditor
$viewer = $this->requireActor(); $viewer = $this->requireActor();
$body = new PhabricatorMetaMTAMailBody(); $body = id(new PhabricatorMetaMTAMailBody())
$body->setViewer($this->requireActor()); ->setViewer($viewer);
$revision_uri = $object->getURI(); $revision_uri = $object->getURI();
$revision_uri = PhabricatorEnv::getProductionURI($revision_uri); $revision_uri = PhabricatorEnv::getProductionURI($revision_uri);

View file

@ -128,51 +128,30 @@ final class PholioMockEditor extends PhabricatorApplicationTransactionEditor {
PhabricatorLiskDAO $object, PhabricatorLiskDAO $object,
array $xactions) { array $xactions) {
$body = new PhabricatorMetaMTAMailBody(); $viewer = $this->requireActor();
$headers = array();
$comments = array();
$inline_comments = array();
$body = id(new PhabricatorMetaMTAMailBody())
->setViewer($viewer);
$mock_uri = $object->getURI();
$mock_uri = PhabricatorEnv::getProductionURI($mock_uri);
$this->addHeadersAndCommentsToMailBody(
$body,
$xactions,
pht('View Mock'),
$mock_uri);
$type_inline = PholioMockInlineTransaction::TRANSACTIONTYPE;
$inlines = array();
foreach ($xactions as $xaction) { foreach ($xactions as $xaction) {
if ($xaction->shouldHide()) { if ($xaction->getTransactionType() == $type_inline) {
continue; $inlines[] = $xaction;
}
$comment = $xaction->getComment();
switch ($xaction->getTransactionType()) {
case PholioMockInlineTransaction::TRANSACTIONTYPE:
if ($comment && strlen($comment->getContent())) {
$inline_comments[] = $comment;
}
break;
case PhabricatorTransactions::TYPE_COMMENT:
if ($comment && strlen($comment->getContent())) {
$comments[] = $comment->getContent();
}
// fallthrough
default:
$headers[] = id(clone $xaction)
->setRenderingTarget('text')
->getTitle();
break;
} }
} }
$body->addRawSection(implode("\n", $headers)); $this->appendInlineCommentsForMail($object, $inlines, $body);
foreach ($comments as $comment) {
$body->addRawSection($comment);
}
if ($inline_comments) {
$body->addRawSection(pht('INLINE COMMENTS'));
foreach ($inline_comments as $comment) {
$text = pht(
'Image %d: %s',
$comment->getImageID(),
$comment->getContent());
$body->addRawSection($text);
}
}
$body->addLinkSection( $body->addLinkSection(
pht('MOCK DETAIL'), pht('MOCK DETAIL'),
@ -181,6 +160,51 @@ final class PholioMockEditor extends PhabricatorApplicationTransactionEditor {
return $body; return $body;
} }
private function appendInlineCommentsForMail(
$object,
array $inlines,
PhabricatorMetaMTAMailBody $body) {
if (!$inlines) {
return;
}
$viewer = $this->requireActor();
$header = pht('INLINE COMMENTS');
$body->addRawPlaintextSection($header);
$body->addRawHTMLSection(phutil_tag('strong', array(), $header));
$image_ids = array();
foreach ($inlines as $inline) {
$comment = $inline->getComment();
$image_id = $comment->getImageID();
$image_ids[$image_id] = $image_id;
}
$images = id(new PholioImageQuery())
->setViewer($viewer)
->withIDs($image_ids)
->execute();
$images = mpull($images, null, 'getID');
foreach ($inlines as $inline) {
$comment = $inline->getComment();
$content = $comment->getContent();
$image_id = $comment->getImageID();
$image = idx($images, $image_id);
if ($image) {
$image_name = $image->getName();
} else {
$image_name = pht('Unknown (ID %d)', $image_id);
}
$body->addRemarkupSection(
pht('Image "%s":', $image_name),
$content);
}
}
protected function getMailSubjectPrefix() { protected function getMailSubjectPrefix() {
return PhabricatorEnv::getEnvConfig('metamta.pholio.subject-prefix'); return PhabricatorEnv::getEnvConfig('metamta.pholio.subject-prefix');
} }

View file

@ -58,6 +58,10 @@ final class PholioMock extends PholioDAO
return 'M'.$this->getID(); return 'M'.$this->getID();
} }
public function getURI() {
return '/'.$this->getMonogram();
}
protected function getConfiguration() { protected function getConfiguration() {
return array( return array(
self::CONFIG_AUX_PHID => true, self::CONFIG_AUX_PHID => true,

View file

@ -53,4 +53,13 @@ final class PholioTransaction extends PhabricatorModularTransaction {
return $tags; return $tags;
} }
public function isInlineCommentTransaction() {
switch ($this->getTransactionType()) {
case PholioMockInlineTransaction::TRANSACTIONTYPE:
return true;
}
return parent::isInlineCommentTransaction();
}
} }