2012-10-17 17:37:05 +02:00
|
|
|
<?php
|
|
|
|
|
|
|
|
final class PhameResourceController extends CelerityResourceController {
|
|
|
|
|
|
|
|
private $id;
|
|
|
|
private $hash;
|
|
|
|
private $name;
|
|
|
|
private $root;
|
2014-01-01 04:21:56 +01:00
|
|
|
private $celerityResourceMap;
|
2012-10-17 17:37:05 +02:00
|
|
|
|
2014-01-01 04:21:56 +01:00
|
|
|
public function getCelerityResourceMap() {
|
|
|
|
return $this->celerityResourceMap;
|
2012-10-17 17:37:05 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
public function willProcessRequest(array $data) {
|
|
|
|
$this->id = $data['id'];
|
|
|
|
$this->hash = $data['hash'];
|
|
|
|
$this->name = $data['name'];
|
|
|
|
}
|
|
|
|
|
|
|
|
public function processRequest() {
|
|
|
|
$request = $this->getRequest();
|
|
|
|
$user = $request->getUser();
|
|
|
|
|
|
|
|
// We require a visible blog associated with a given skin to serve
|
|
|
|
// resources, so you can't go fishing around where you shouldn't be.
|
2014-01-01 04:21:56 +01:00
|
|
|
// However, since these resources may be served off a CDN domain, we're
|
|
|
|
// bypassing the actual policy check. The blog needs to exist, but you
|
|
|
|
// don't necessarily need to be able to see it in order to see static
|
|
|
|
// resources on it.
|
2012-10-17 17:37:05 +02:00
|
|
|
|
|
|
|
$blog = id(new PhameBlogQuery())
|
2014-01-01 04:21:56 +01:00
|
|
|
->setViewer(PhabricatorUser::getOmnipotentUser())
|
2012-10-17 17:37:05 +02:00
|
|
|
->withIDs(array($this->id))
|
|
|
|
->executeOne();
|
|
|
|
if (!$blog) {
|
|
|
|
return new Aphront404Response();
|
|
|
|
}
|
|
|
|
|
|
|
|
$skin = $blog->getSkinRenderer($request);
|
|
|
|
$spec = $skin->getSpecification();
|
|
|
|
|
2014-01-01 04:21:56 +01:00
|
|
|
$resources = new PhameCelerityResources();
|
|
|
|
$resources->setSkin($spec);
|
|
|
|
|
|
|
|
$this->root = $spec->getRootDirectory();
|
|
|
|
$this->celerityResourceMap = new CelerityResourceMap($resources);
|
|
|
|
|
2014-01-01 03:04:25 +01:00
|
|
|
return $this->serveResource($this->name);
|
2012-10-17 17:37:05 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
protected function buildResourceTransformer() {
|
|
|
|
$xformer = new CelerityResourceTransformer();
|
|
|
|
$xformer->setMinify(false);
|
|
|
|
$xformer->setTranslateURICallback(array($this, 'translateResourceURI'));
|
|
|
|
return $xformer;
|
|
|
|
}
|
|
|
|
|
|
|
|
public function translateResourceURI(array $matches) {
|
|
|
|
$uri = trim($matches[1], "'\" \r\t\n");
|
|
|
|
|
|
|
|
if (Filesystem::pathExists($this->root.$uri)) {
|
|
|
|
$hash = filemtime($this->root.$uri);
|
|
|
|
} else {
|
|
|
|
$hash = '-';
|
|
|
|
}
|
|
|
|
|
|
|
|
$uri = '/phame/r/'.$this->id.'/'.$hash.'/'.$uri;
|
|
|
|
return 'url('.$uri.')';
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|