Summary: These are all unambiguously unextensible. Issues I hit: - Maniphest Change/Diff controllers, just consolidated them. - Some search controllers incorrectly extend from "Search" but should extend from "SearchBase". This has no runtime effects. - D1836 introduced a closure, which we don't handle correctly (somewhat on purpose; we target PHP 5.2). See T962. Test Plan: Ran "testEverythingImplemented" unit test to identify classes extending from `final` classes. Resolved issues. Reviewers: btrahan Reviewed By: btrahan CC: aran, epriestley Maniphest Tasks: T795 Differential Revision: https://secure.phabricator.com/D1843
		
			
				
	
	
		
			71 lines
		
	
	
		
			2.0 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
			
		
		
	
	
			71 lines
		
	
	
		
			2.0 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
<?php
 | 
						|
 | 
						|
/*
 | 
						|
 * Copyright 2012 Facebook, Inc.
 | 
						|
 *
 | 
						|
 * Licensed under the Apache License, Version 2.0 (the "License");
 | 
						|
 * you may not use this file except in compliance with the License.
 | 
						|
 * You may obtain a copy of the License at
 | 
						|
 *
 | 
						|
 *   http://www.apache.org/licenses/LICENSE-2.0
 | 
						|
 *
 | 
						|
 * Unless required by applicable law or agreed to in writing, software
 | 
						|
 * distributed under the License is distributed on an "AS IS" BASIS,
 | 
						|
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 | 
						|
 * See the License for the specific language governing permissions and
 | 
						|
 * limitations under the License.
 | 
						|
 */
 | 
						|
 | 
						|
final class PhabricatorFileProxyController extends PhabricatorFileController {
 | 
						|
 | 
						|
  private $uri;
 | 
						|
 | 
						|
  public function processRequest() {
 | 
						|
 | 
						|
    if (!PhabricatorEnv::getEnvConfig('files.enable-proxy')) {
 | 
						|
      return new Aphront400Response();
 | 
						|
    }
 | 
						|
 | 
						|
    $request = $this->getRequest();
 | 
						|
    $uri = $request->getStr('uri');
 | 
						|
 | 
						|
    $proxy = id(new PhabricatorFileProxyImage())->loadOneWhere(
 | 
						|
      'uri = %s',
 | 
						|
      $uri);
 | 
						|
 | 
						|
    if (!$proxy) {
 | 
						|
      // This write is fine to skip CSRF checks for, we're just building a
 | 
						|
      // cache of some remote image.
 | 
						|
      $unguarded = AphrontWriteGuard::beginScopedUnguardedWrites();
 | 
						|
 | 
						|
      $file = PhabricatorFile::newFromFileDownload(
 | 
						|
        $uri,
 | 
						|
        nonempty(basename($uri), 'proxied-file'));
 | 
						|
      if ($file) {
 | 
						|
        $proxy = new PhabricatorFileProxyImage();
 | 
						|
        $proxy->setURI($uri);
 | 
						|
        $proxy->setFilePHID($file->getPHID());
 | 
						|
        $proxy->save();
 | 
						|
      }
 | 
						|
 | 
						|
      unset($unguarded);
 | 
						|
    }
 | 
						|
 | 
						|
    if ($proxy) {
 | 
						|
      $file = id(new PhabricatorFile())->loadOneWhere('phid = %s',
 | 
						|
                                                      $proxy->getFilePHID());
 | 
						|
      if ($file) {
 | 
						|
        $view_uri = $file->getBestURI();
 | 
						|
      } else {
 | 
						|
        $bad_phid = $proxy->getFilePHID();
 | 
						|
        throw new Exception(
 | 
						|
          "Unable to load file with phid {$bad_phid}."
 | 
						|
        );
 | 
						|
      }
 | 
						|
      return id(new AphrontRedirectResponse())->setURI($view_uri);
 | 
						|
    }
 | 
						|
 | 
						|
    return new Aphront400Response();
 | 
						|
  }
 | 
						|
}
 |