From d321cc810aab52be00d75c9dcfa8b9cabd34828e Mon Sep 17 00:00:00 2001 From: epriestley Date: Wed, 22 Nov 2017 06:09:41 -0800 Subject: [PATCH 1/6] Freeze "maniphest.gettasktransactions" and make status/priority transactions more consistent Summary: Ref T13020. See PHI221. Freeze legacy method `maniphest.gettasktransactions` in favor of modern method `transaction.search`. Remove legacy "null on create" behavior from Maniphest status and priority transactions. This behavior is obsolete with EditEngine, and leads to inconsistent transaction sets in the transaction record. The desired behavior is that transactions which don't do anything (e.g., default value was not changed) don't appear in the transaction log. Test Plan: - Viewed API UI and saw `maniphest.gettasktransactions` marked as "Frozen". - Created a new task via web UI (without changing status/priority), queried transactions with `maniphest.gettasktransacitons`/`transaction.search`, no longer saw "null on create" no-op transactions in record. - Web UI is unchanged, since these transactions were hidden before and now do not exist. Reviewers: amckinley Reviewed By: amckinley Maniphest Tasks: T13020 Differential Revision: https://secure.phabricator.com/D18777 --- .../ManiphestGetTaskTransactionsConduitAPIMethod.php | 10 ++++++++++ .../xaction/ManiphestTaskPriorityTransaction.php | 9 +++------ .../xaction/ManiphestTaskStatusTransaction.php | 3 --- 3 files changed, 13 insertions(+), 9 deletions(-) diff --git a/src/applications/maniphest/conduit/ManiphestGetTaskTransactionsConduitAPIMethod.php b/src/applications/maniphest/conduit/ManiphestGetTaskTransactionsConduitAPIMethod.php index 8b0d0496cf..357d118bc4 100644 --- a/src/applications/maniphest/conduit/ManiphestGetTaskTransactionsConduitAPIMethod.php +++ b/src/applications/maniphest/conduit/ManiphestGetTaskTransactionsConduitAPIMethod.php @@ -21,6 +21,16 @@ final class ManiphestGetTaskTransactionsConduitAPIMethod return 'nonempty list>'; } + public function getMethodStatus() { + return self::METHOD_STATUS_FROZEN; + } + + public function getMethodStatusDescription() { + return pht( + 'This method is frozen and will eventually be deprecated. New code '. + 'should use "transaction.search" instead.'); + } + protected function execute(ConduitAPIRequest $request) { $results = array(); $task_ids = $request->getValue('ids'); diff --git a/src/applications/maniphest/xaction/ManiphestTaskPriorityTransaction.php b/src/applications/maniphest/xaction/ManiphestTaskPriorityTransaction.php index 2ed7c4e15b..83f38fc659 100644 --- a/src/applications/maniphest/xaction/ManiphestTaskPriorityTransaction.php +++ b/src/applications/maniphest/xaction/ManiphestTaskPriorityTransaction.php @@ -6,20 +6,17 @@ final class ManiphestTaskPriorityTransaction const TRANSACTIONTYPE = 'priority'; public function generateOldValue($object) { - if ($this->isNewObject()) { - return null; - } - return $object->getPriority(); + return (string)$object->getPriority(); } public function generateNewValue($object, $value) { // `$value` is supposed to be a keyword, but if the priority // assigned to a task has been removed from the config, // no such keyword will be available. Other edits to the task - // should still be allowed, even if the priority is no longer + // should still be allowed, even if the priority is no longer // valid, so treat this as a no-op. if ($value === ManiphestTaskPriority::UNKNOWN_PRIORITY_KEYWORD) { - return $object->getPriority(); + return (string)$object->getPriority(); } return (string)ManiphestTaskPriority::getTaskPriorityFromKeyword($value); diff --git a/src/applications/maniphest/xaction/ManiphestTaskStatusTransaction.php b/src/applications/maniphest/xaction/ManiphestTaskStatusTransaction.php index a3780e81b9..dd51a63799 100644 --- a/src/applications/maniphest/xaction/ManiphestTaskStatusTransaction.php +++ b/src/applications/maniphest/xaction/ManiphestTaskStatusTransaction.php @@ -6,9 +6,6 @@ final class ManiphestTaskStatusTransaction const TRANSACTIONTYPE = 'status'; public function generateOldValue($object) { - if ($this->isNewObject()) { - return null; - } return $object->getStatus(); } From 1cb0d41367b7a79f0fdaa1be20e348ce5bd8b628 Mon Sep 17 00:00:00 2001 From: epriestley Date: Wed, 22 Nov 2017 07:35:22 -0800 Subject: [PATCH 2/6] Fix inbound mail handling for messages with no HTML body part Summary: See D18776. See . The change in D18776 to improve handling of non-utf8 HTML parts broke handling of mail with //no// HTML parts. Partly, this is because MimeMailParser has a "traditional" PHP-style API where the return type is an exciting surprise. Test Plan: - Sent a text-only message in `Mail.app`. - Used "Show Raw" to copy it to `mail.txt`, verifying that the raw message contains ONLY a text body. - Ran `cat mail.txt | ./scripts/mail/mail_handler.php --trace --process-duplicates`. - Before patch: error about bad `idx()` on a non-array. - After patch: clean mail processing. - Did the same with a message with both HTML and text bodies to make sure I didn't break anything. Ideally we'd probably get test coverage on this, but it's been touched roughly once a year since 2013 so it'll probably hold. Reviewers: amckinley, alexmv Reviewed By: amckinley, alexmv Differential Revision: https://secure.phabricator.com/D18778 --- scripts/mail/mail_handler.php | 20 ++++++++++++-------- 1 file changed, 12 insertions(+), 8 deletions(-) diff --git a/scripts/mail/mail_handler.php b/scripts/mail/mail_handler.php index b76b3910df..1c3c71f305 100755 --- a/scripts/mail/mail_handler.php +++ b/scripts/mail/mail_handler.php @@ -38,15 +38,19 @@ $parser->setText(file_get_contents('php://stdin')); $content = array(); foreach (array('text', 'html') as $part) { $part_body = $parser->getMessageBody($part); - $part_headers = $parser->getMessageBodyHeaders($part); - $content_type = idx($part_headers, 'content-type'); - if ( - !phutil_is_utf8($part_body) && - (preg_match('/charset="(.*?)"/', $content_type, $matches) || - preg_match('/charset=(\S+)/', $content_type, $matches)) - ) { - $part_body = phutil_utf8_convert($part_body, 'UTF-8', $matches[1]); + + if (strlen($part_body) && !phutil_is_utf8($part_body)) { + $part_headers = $parser->getMessageBodyHeaders($part); + if (!is_array($part_headers)) { + $part_headers = array(); + } + $content_type = idx($part_headers, 'content-type'); + if (preg_match('/charset="(.*?)"/', $content_type, $matches) || + preg_match('/charset=(\S+)/', $content_type, $matches)) { + $part_body = phutil_utf8_convert($part_body, 'UTF-8', $matches[1]); + } } + $content[$part] = $part_body; } From 2d4a158356ef7fd7931495defe3ef3675f59f333 Mon Sep 17 00:00:00 2001 From: epriestley Date: Wed, 22 Nov 2017 07:52:20 -0800 Subject: [PATCH 3/6] Fix a bad link target in Diffusion content search results Summary: See . This links to the display path, which is incorrect. Test Plan: - In any repository, browsed into a directory. - Used pattern search to search for something that hits results. - Clicked the title (filename/path) of a result table. - Before patch: URL omits path context, 404 or wrong result. - After patch: taken to proper page. Reviewers: amckinley Reviewed By: amckinley Differential Revision: https://secure.phabricator.com/D18779 --- .../diffusion/view/DiffusionPatternSearchView.php | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/src/applications/diffusion/view/DiffusionPatternSearchView.php b/src/applications/diffusion/view/DiffusionPatternSearchView.php index a679b51400..93ef42d46d 100644 --- a/src/applications/diffusion/view/DiffusionPatternSearchView.php +++ b/src/applications/diffusion/view/DiffusionPatternSearchView.php @@ -96,10 +96,11 @@ final class DiffusionPatternSearchView extends DiffusionView { $path_title = Filesystem::readablePath($this->path, $drequest->getPath()); - $href = $drequest->generateURI(array( - 'action' => 'browse', - 'path' => $path_title, - )); + $href = $drequest->generateURI( + array( + 'action' => 'browse', + 'path' => $this->path, + )); $title = phutil_tag('a', array('href' => $href), $path_title); From 2c72c2b924ffa3f8a49dbec636a2cdca3bae004f Mon Sep 17 00:00:00 2001 From: epriestley Date: Wed, 22 Nov 2017 09:21:37 -0800 Subject: [PATCH 4/6] Add basic support for OpenGraph header tags for public installs Summary: Ref T13018. This is easy to get working roughly, at least, and seems reasonable. Test Plan: Viewed page source, saw tags. Custom header logo still worked. Pretty hard to debug against a local install since Disqus / debugger tools can't hit it, but I'll see what it looks like in production and tweak it if I got anything horribly wrong. Reviewers: amckinley Reviewed By: amckinley Maniphest Tasks: T13018 Differential Revision: https://secure.phabricator.com/D18780 --- .../PhabricatorCustomLogoConfigType.php | 33 +++++++++++++ src/view/page/PhabricatorStandardPageView.php | 46 ++++++++++++++++++- .../page/menu/PhabricatorMainMenuView.php | 34 +++----------- 3 files changed, 84 insertions(+), 29 deletions(-) diff --git a/src/applications/config/custom/PhabricatorCustomLogoConfigType.php b/src/applications/config/custom/PhabricatorCustomLogoConfigType.php index ff29050602..cf4dfda2b5 100644 --- a/src/applications/config/custom/PhabricatorCustomLogoConfigType.php +++ b/src/applications/config/custom/PhabricatorCustomLogoConfigType.php @@ -13,6 +13,39 @@ final class PhabricatorCustomLogoConfigType return idx($logo, 'wordmarkText'); } + public static function getLogoURI(PhabricatorUser $viewer) { + $logo_uri = null; + + $custom_header = self::getLogoImagePHID(); + if ($custom_header) { + $cache = PhabricatorCaches::getImmutableCache(); + $cache_key_logo = 'ui.custom-header.logo-phid.v3.'.$custom_header; + $logo_uri = $cache->getKey($cache_key_logo); + + if (!$logo_uri) { + // NOTE: If the file policy has been changed to be restrictive, we'll + // miss here and just show the default logo. The cache will fill later + // when someone who can see the file loads the page. This might be a + // little spooky, see T11982. + $files = id(new PhabricatorFileQuery()) + ->setViewer($viewer) + ->withPHIDs(array($custom_header)) + ->execute(); + $file = head($files); + if ($file) { + $logo_uri = $file->getViewURI(); + $cache->setKey($cache_key_logo, $logo_uri); + } + } + } + + if (!$logo_uri) { + $logo_uri = celerity_get_resource_uri('/rsrc/image/logo/light-eye.png'); + } + + return $logo_uri; + } + public function validateOption(PhabricatorConfigOption $option, $value) { if (!is_array($value)) { throw new Exception( diff --git a/src/view/page/PhabricatorStandardPageView.php b/src/view/page/PhabricatorStandardPageView.php index 78ff716a44..d2b4d0d2c2 100644 --- a/src/view/page/PhabricatorStandardPageView.php +++ b/src/view/page/PhabricatorStandardPageView.php @@ -426,10 +426,11 @@ final class PhabricatorStandardPageView extends PhabricatorBarePageView } return hsprintf( - '%s%s%s', + '%s%s%s%s', parent::getHead(), $font_css, - $response->renderSingleResource('javelin-magical-init', 'phabricator')); + $response->renderSingleResource('javelin-magical-init', 'phabricator'), + $this->newOpenGraphTags()); } public function setGlyph($glyph) { @@ -911,4 +912,45 @@ final class PhabricatorStandardPageView extends PhabricatorBarePageView return $response; } + private function newOpenGraphTags() { + // If we don't allow public access, there's no point in emitting OpenGraph + // tags because external systems can't fetch pages. + if (!PhabricatorEnv::getEnvConfig('policy.allow-public')) { + return array(); + } + + $viewer = $this->getViewer(); + + $properties = array( + array( + 'og:title', + $this->getTitle(), + ), + array( + 'og:type', + 'website', + ), + array( + 'og:url', + PhabricatorEnv::getProductionURI($this->getRequest()->getRequestURI()), + ), + array( + 'og:image', + PhabricatorCustomLogoConfigType::getLogoURI($viewer), + ), + ); + + $tags = array(); + foreach ($properties as $property) { + $tags[] = phutil_tag( + 'meta', + array( + 'property' => $property[0], + 'content' => $property[1], + )); + } + + return $tags; + } + } diff --git a/src/view/page/menu/PhabricatorMainMenuView.php b/src/view/page/menu/PhabricatorMainMenuView.php index f9e4032d87..2e5b5614ec 100644 --- a/src/view/page/menu/PhabricatorMainMenuView.php +++ b/src/view/page/menu/PhabricatorMainMenuView.php @@ -262,35 +262,16 @@ final class PhabricatorMainMenuView extends AphrontView { } private function renderPhabricatorLogo() { - $custom_header = PhabricatorCustomLogoConfigType::getLogoImagePHID(); - $logo_style = array(); + + $custom_header = PhabricatorCustomLogoConfigType::getLogoImagePHID(); if ($custom_header) { - $cache = PhabricatorCaches::getImmutableCache(); - $cache_key_logo = 'ui.custom-header.logo-phid.v3.'.$custom_header; + $viewer = $this->getViewer(); + $logo_uri = PhabricatorCustomLogoConfigType::getLogoURI($viewer); - $logo_uri = $cache->getKey($cache_key_logo); - if (!$logo_uri) { - // NOTE: If the file policy has been changed to be restrictive, we'll - // miss here and just show the default logo. The cache will fill later - // when someone who can see the file loads the page. This might be a - // little spooky, see T11982. - $files = id(new PhabricatorFileQuery()) - ->setViewer($this->getViewer()) - ->withPHIDs(array($custom_header)) - ->execute(); - $file = head($files); - if ($file) { - $logo_uri = $file->getViewURI(); - $cache->setKey($cache_key_logo, $logo_uri); - } - } - - if ($logo_uri) { - $logo_style[] = 'background-size: 40px 40px;'; - $logo_style[] = 'background-position: 0 0;'; - $logo_style[] = 'background-image: url('.$logo_uri.')'; - } + $logo_style[] = 'background-size: 40px 40px;'; + $logo_style[] = 'background-position: 0 0;'; + $logo_style[] = 'background-image: url('.$logo_uri.')'; } $logo_node = phutil_tag( @@ -300,7 +281,6 @@ final class PhabricatorMainMenuView extends AphrontView { 'style' => implode(' ', $logo_style), )); - $wordmark_text = PhabricatorCustomLogoConfigType::getLogoWordmark(); if (!strlen($wordmark_text)) { $wordmark_text = pht('Phabricator'); From c3d6c4b0ee8efed2ea20d4ece90b012ea19b7f00 Mon Sep 17 00:00:00 2001 From: epriestley Date: Wed, 22 Nov 2017 11:25:51 -0800 Subject: [PATCH 5/6] Include OpenGraph prefix material in tag if OpenGraph is enabled Summary: Ref T13018. Discourse doesn't seem to be picking this up yet (see ) so maybe it really needs this meta-meta-XML stuff? Test Plan: Will push. Reviewers: amckinley Reviewed By: amckinley Maniphest Tasks: T13018 Differential Revision: https://secure.phabricator.com/D18781 --- resources/celerity/map.php | 1 + src/view/page/AphrontPageView.php | 9 ++++++++- src/view/page/PhabricatorStandardPageView.php | 2 +- webroot/rsrc/favicons/opengraph-144x144.png | Bin 0 -> 13270 bytes 4 files changed, 10 insertions(+), 2 deletions(-) create mode 100644 webroot/rsrc/favicons/opengraph-144x144.png diff --git a/resources/celerity/map.php b/resources/celerity/map.php index 78ae8bd461..45da85c7f1 100644 --- a/resources/celerity/map.php +++ b/resources/celerity/map.php @@ -292,6 +292,7 @@ return array( 'rsrc/favicons/mstile-310x150.png' => '4a49d3ee', 'rsrc/favicons/mstile-310x310.png' => 'a52ab264', 'rsrc/favicons/mstile-70x70.png' => '5edce7b8', + 'rsrc/favicons/opengraph-144x144.png' => '648fb0fc', 'rsrc/image/BFCFDA.png' => 'd5ec91f4', 'rsrc/image/actions/edit.png' => '2fc41442', 'rsrc/image/avatar.png' => '17d346a4', diff --git a/src/view/page/AphrontPageView.php b/src/view/page/AphrontPageView.php index 8f3704dca2..bea516a8cf 100644 --- a/src/view/page/AphrontPageView.php +++ b/src/view/page/AphrontPageView.php @@ -59,9 +59,15 @@ abstract class AphrontPageView extends AphrontView { ), array($body, $tail)); + if (PhabricatorEnv::getEnvConfig('policy.allow-public')) { + $html_open_tag = hsprintf(''); + } else { + $html_open_tag = hsprintf(''); + } + $response = hsprintf( ''. - ''. + '%s'. ''. ''. '%s'. @@ -69,6 +75,7 @@ abstract class AphrontPageView extends AphrontView { ''. '%s'. '', + $html_open_tag, $title, $head, $body); diff --git a/src/view/page/PhabricatorStandardPageView.php b/src/view/page/PhabricatorStandardPageView.php index d2b4d0d2c2..b4e706ab0b 100644 --- a/src/view/page/PhabricatorStandardPageView.php +++ b/src/view/page/PhabricatorStandardPageView.php @@ -936,7 +936,7 @@ final class PhabricatorStandardPageView extends PhabricatorBarePageView ), array( 'og:image', - PhabricatorCustomLogoConfigType::getLogoURI($viewer), + celerity_get_resource_uri('rsrc/favicons/opengraph-144x144.png'), ), ); diff --git a/webroot/rsrc/favicons/opengraph-144x144.png b/webroot/rsrc/favicons/opengraph-144x144.png new file mode 100644 index 0000000000000000000000000000000000000000..92f2114b205565d9029e10ede56cdf23827ee1e4 GIT binary patch literal 13270 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 bFYpXZa^goDzqnxc>i`sG)nqEAOuzjf>K7hx literal 0 HcmV?d00001 From 49b57eae7df52c189aef1d973823c697fc97fd4b Mon Sep 17 00:00:00 2001 From: epriestley Date: Wed, 22 Nov 2017 14:27:28 -0800 Subject: [PATCH 6/6] Revert partial/nonfunctional OpenGraph support Summary: Ref T13018. See that task and the Discourse thread for discussion. This doesn't work as-is and we need to `og:description` everything to make it work. I don't want to sink any more time into this so just back all the changes out for now. (The `` change is unnecessary anyway.) Test Plan: Strict revert. Reviewers: amckinley Reviewed By: amckinley Maniphest Tasks: T13018 Differential Revision: https://secure.phabricator.com/D18782 --- resources/celerity/map.php | 1 - .../PhabricatorCustomLogoConfigType.php | 33 ------------- src/view/page/AphrontPageView.php | 9 +--- src/view/page/PhabricatorStandardPageView.php | 46 +----------------- .../page/menu/PhabricatorMainMenuView.php | 36 +++++++++++--- webroot/rsrc/favicons/opengraph-144x144.png | Bin 13270 -> 0 bytes 6 files changed, 31 insertions(+), 94 deletions(-) delete mode 100644 webroot/rsrc/favicons/opengraph-144x144.png diff --git a/resources/celerity/map.php b/resources/celerity/map.php index 45da85c7f1..78ae8bd461 100644 --- a/resources/celerity/map.php +++ b/resources/celerity/map.php @@ -292,7 +292,6 @@ return array( 'rsrc/favicons/mstile-310x150.png' => '4a49d3ee', 'rsrc/favicons/mstile-310x310.png' => 'a52ab264', 'rsrc/favicons/mstile-70x70.png' => '5edce7b8', - 'rsrc/favicons/opengraph-144x144.png' => '648fb0fc', 'rsrc/image/BFCFDA.png' => 'd5ec91f4', 'rsrc/image/actions/edit.png' => '2fc41442', 'rsrc/image/avatar.png' => '17d346a4', diff --git a/src/applications/config/custom/PhabricatorCustomLogoConfigType.php b/src/applications/config/custom/PhabricatorCustomLogoConfigType.php index cf4dfda2b5..ff29050602 100644 --- a/src/applications/config/custom/PhabricatorCustomLogoConfigType.php +++ b/src/applications/config/custom/PhabricatorCustomLogoConfigType.php @@ -13,39 +13,6 @@ final class PhabricatorCustomLogoConfigType return idx($logo, 'wordmarkText'); } - public static function getLogoURI(PhabricatorUser $viewer) { - $logo_uri = null; - - $custom_header = self::getLogoImagePHID(); - if ($custom_header) { - $cache = PhabricatorCaches::getImmutableCache(); - $cache_key_logo = 'ui.custom-header.logo-phid.v3.'.$custom_header; - $logo_uri = $cache->getKey($cache_key_logo); - - if (!$logo_uri) { - // NOTE: If the file policy has been changed to be restrictive, we'll - // miss here and just show the default logo. The cache will fill later - // when someone who can see the file loads the page. This might be a - // little spooky, see T11982. - $files = id(new PhabricatorFileQuery()) - ->setViewer($viewer) - ->withPHIDs(array($custom_header)) - ->execute(); - $file = head($files); - if ($file) { - $logo_uri = $file->getViewURI(); - $cache->setKey($cache_key_logo, $logo_uri); - } - } - } - - if (!$logo_uri) { - $logo_uri = celerity_get_resource_uri('/rsrc/image/logo/light-eye.png'); - } - - return $logo_uri; - } - public function validateOption(PhabricatorConfigOption $option, $value) { if (!is_array($value)) { throw new Exception( diff --git a/src/view/page/AphrontPageView.php b/src/view/page/AphrontPageView.php index bea516a8cf..8f3704dca2 100644 --- a/src/view/page/AphrontPageView.php +++ b/src/view/page/AphrontPageView.php @@ -59,15 +59,9 @@ abstract class AphrontPageView extends AphrontView { ), array($body, $tail)); - if (PhabricatorEnv::getEnvConfig('policy.allow-public')) { - $html_open_tag = hsprintf(''); - } else { - $html_open_tag = hsprintf(''); - } - $response = hsprintf( ''. - '%s'. + ''. ''. ''. '%s'. @@ -75,7 +69,6 @@ abstract class AphrontPageView extends AphrontView { ''. '%s'. '', - $html_open_tag, $title, $head, $body); diff --git a/src/view/page/PhabricatorStandardPageView.php b/src/view/page/PhabricatorStandardPageView.php index b4e706ab0b..78ff716a44 100644 --- a/src/view/page/PhabricatorStandardPageView.php +++ b/src/view/page/PhabricatorStandardPageView.php @@ -426,11 +426,10 @@ final class PhabricatorStandardPageView extends PhabricatorBarePageView } return hsprintf( - '%s%s%s%s', + '%s%s%s', parent::getHead(), $font_css, - $response->renderSingleResource('javelin-magical-init', 'phabricator'), - $this->newOpenGraphTags()); + $response->renderSingleResource('javelin-magical-init', 'phabricator')); } public function setGlyph($glyph) { @@ -912,45 +911,4 @@ final class PhabricatorStandardPageView extends PhabricatorBarePageView return $response; } - private function newOpenGraphTags() { - // If we don't allow public access, there's no point in emitting OpenGraph - // tags because external systems can't fetch pages. - if (!PhabricatorEnv::getEnvConfig('policy.allow-public')) { - return array(); - } - - $viewer = $this->getViewer(); - - $properties = array( - array( - 'og:title', - $this->getTitle(), - ), - array( - 'og:type', - 'website', - ), - array( - 'og:url', - PhabricatorEnv::getProductionURI($this->getRequest()->getRequestURI()), - ), - array( - 'og:image', - celerity_get_resource_uri('rsrc/favicons/opengraph-144x144.png'), - ), - ); - - $tags = array(); - foreach ($properties as $property) { - $tags[] = phutil_tag( - 'meta', - array( - 'property' => $property[0], - 'content' => $property[1], - )); - } - - return $tags; - } - } diff --git a/src/view/page/menu/PhabricatorMainMenuView.php b/src/view/page/menu/PhabricatorMainMenuView.php index 2e5b5614ec..f9e4032d87 100644 --- a/src/view/page/menu/PhabricatorMainMenuView.php +++ b/src/view/page/menu/PhabricatorMainMenuView.php @@ -262,16 +262,35 @@ final class PhabricatorMainMenuView extends AphrontView { } private function renderPhabricatorLogo() { - $logo_style = array(); - $custom_header = PhabricatorCustomLogoConfigType::getLogoImagePHID(); - if ($custom_header) { - $viewer = $this->getViewer(); - $logo_uri = PhabricatorCustomLogoConfigType::getLogoURI($viewer); - $logo_style[] = 'background-size: 40px 40px;'; - $logo_style[] = 'background-position: 0 0;'; - $logo_style[] = 'background-image: url('.$logo_uri.')'; + $logo_style = array(); + if ($custom_header) { + $cache = PhabricatorCaches::getImmutableCache(); + $cache_key_logo = 'ui.custom-header.logo-phid.v3.'.$custom_header; + + $logo_uri = $cache->getKey($cache_key_logo); + if (!$logo_uri) { + // NOTE: If the file policy has been changed to be restrictive, we'll + // miss here and just show the default logo. The cache will fill later + // when someone who can see the file loads the page. This might be a + // little spooky, see T11982. + $files = id(new PhabricatorFileQuery()) + ->setViewer($this->getViewer()) + ->withPHIDs(array($custom_header)) + ->execute(); + $file = head($files); + if ($file) { + $logo_uri = $file->getViewURI(); + $cache->setKey($cache_key_logo, $logo_uri); + } + } + + if ($logo_uri) { + $logo_style[] = 'background-size: 40px 40px;'; + $logo_style[] = 'background-position: 0 0;'; + $logo_style[] = 'background-image: url('.$logo_uri.')'; + } } $logo_node = phutil_tag( @@ -281,6 +300,7 @@ final class PhabricatorMainMenuView extends AphrontView { 'style' => implode(' ', $logo_style), )); + $wordmark_text = PhabricatorCustomLogoConfigType::getLogoWordmark(); if (!strlen($wordmark_text)) { $wordmark_text = pht('Phabricator'); diff --git a/webroot/rsrc/favicons/opengraph-144x144.png b/webroot/rsrc/favicons/opengraph-144x144.png deleted file mode 100644 index 92f2114b205565d9029e10ede56cdf23827ee1e4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 13270 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 bFYpXZa^goDzqnxc>i`sG)nqEAOuzjf>K7hx