diff --git a/src/applications/phame/controller/PhameLiveController.php b/src/applications/phame/controller/PhameLiveController.php index b5b1984816..472f73c8c1 100644 --- a/src/applications/phame/controller/PhameLiveController.php +++ b/src/applications/phame/controller/PhameLiveController.php @@ -1,234 +1,235 @@ isExternal; } protected function getIsLive() { return $this->isLive; } protected function getBlog() { return $this->blog; } protected function getPost() { return $this->post; } protected function setupLiveEnvironment() { $request = $this->getRequest(); $viewer = $this->getViewer(); $site = $request->getSite(); $blog_id = $request->getURIData('blogID'); $post_id = $request->getURIData('id'); if ($site instanceof PhameBlogSite) { // This is a live page on a custom domain. We already looked up the blog // in the Site handler by examining the domain, so we don't need to do // more lookups. $blog = $site->getBlog(); $is_external = true; $is_live = true; } else if ($blog_id) { // This is a blog detail view, an internal blog live view, or an // internal post live view The internal post detail view is handled // below. $is_external = false; if ($request->getURIData('live')) { $is_live = true; } else { $is_live = false; } $blog_query = id(new PhameBlogQuery()) ->setViewer($viewer) ->needProfileImage(true) ->needHeaderImage(true) ->withIDs(array($blog_id)); // If this is a live view, only show active blogs. if ($is_live) { $blog_query->withStatuses( array( PhameBlog::STATUS_ACTIVE, )); } $blog = $blog_query->executeOne(); if (!$blog) { $this->isExternal = $is_external; $this->isLive = $is_live; return new Aphront404Response(); } } else { // This is a post detail page, so we'll figure out the blog by loading // the post first. $is_external = false; $is_live = false; $blog = null; } $this->isExternal = $is_external; $this->isLive = $is_live; if (strlen($post_id)) { $post_query = id(new PhamePostQuery()) ->setViewer($viewer) ->needHeaderImage(true) ->withIDs(array($post_id)); - if ($blog) { - $post_query->withBlogPHIDs(array($blog->getPHID())); - } - // Only show published posts on external domains. if ($is_external) { $post_query->withVisibility( array(PhameConstants::VISIBILITY_PUBLISHED)); } $post = $post_query->executeOne(); if (!$post) { // Not a valid Post $this->blog = $blog; return new Aphront404Response(); } // If this is a post detail page, the URI didn't come with a blog ID, // so fill that in. if (!$blog) { $blog = $post->getBlog(); } } else { $post = null; } $this->blog = $blog; $this->post = $post; // If we have a post, canonicalize the URI to the post's current slug and - // redirect the user if it isn't correct. + // redirect the user if it isn't correct. Likewise, canonicalize the URI + // if the blog ID is wrong. See T13353. if ($post) { $slug = $request->getURIData('slug'); - if ($post->getSlug() != $slug) { + + $wrong_slug = ($post->getSlug() !== $slug); + $wrong_blog = ($post->getBlog()->getID() !== $blog->getID()); + + if ($wrong_slug || $wrong_blog) { if ($is_live) { if ($is_external) { $uri = $post->getExternalLiveURI(); } else { $uri = $post->getInternalLiveURI(); } } else { $uri = $post->getViewURI(); } $response = id(new AphrontRedirectResponse()) ->setURI($uri); if ($is_external) { $response->setIsExternal(true); } return $response; } } return null; } protected function buildApplicationCrumbs() { $blog = $this->getBlog(); $post = $this->getPost(); $is_live = $this->getIsLive(); $is_external = $this->getIsExternal(); // If this is an external view, don't put the "Phame" crumb or the // "Blogs" crumb into the crumbs list. if ($is_external) { $crumbs = new PHUICrumbsView(); // Link back to parent site if ($blog->getParentSite() && $blog->getParentDomain()) { $crumbs->addTextCrumb( $blog->getParentSite(), $blog->getExternalParentURI()); } } else { $crumbs = parent::buildApplicationCrumbs(); $crumbs->addTextCrumb( pht('Blogs'), $this->getApplicationURI('blog/')); } $crumbs->setBorder(true); if ($blog) { if ($post) { if ($is_live) { if ($is_external) { $blog_uri = $blog->getExternalLiveURI(); } else { $blog_uri = $blog->getInternalLiveURI(); } } else { $blog_uri = $blog->getViewURI(); } } else { $blog_uri = null; } $crumbs->addTextCrumb($blog->getName(), $blog_uri); } if ($post) { if (!$is_external) { $crumbs->addTextCrumb('J'.$post->getID()); } } return $crumbs; } public function willSendResponse(AphrontResponse $response) { if ($this->getIsExternal()) { if ($response instanceof Aphront404Response) { $page = $this->newPage() ->setCrumbs($this->buildApplicationCrumbs()); $response = id(new Phame404Response()) ->setPage($page); } } return parent::willSendResponse($response); } public function newPage() { $page = parent::newPage(); if ($this->getIsLive()) { $page ->addClass('phame-live-view') ->setShowChrome(false) ->setShowFooter(false); } return $page; } }