public function postRequest(\SS_HTTPRequest $request, \SS_HTTPResponse $response, \DataModel $model) { if ($this->convertUrls && $response && $response->getStatusCode() == 200) { // only convert if we have an HTML content type response $body = $response->getBody(); // find urls inserted in content if (strpos($body, 'cdnfileid') > 0 && preg_match_all('/data-cdnfileid="(\\d+)"/', $body, $matches)) { $files = CdnImage::get()->filter('ID', $matches[1]); $fileIds = array(); foreach ($files as $file) { $url = $file->getUrl(); $filename = $file->Filename; $body = str_replace("src=\"{$filename}\"", "src=\"{$url}\"", $body); $fileIds[] = $file->ID; } $assets = ContentServiceAsset::get()->filter('SourceID', $matches[1]); foreach ($assets as $asset) { $url = $asset->getUrl(); $filename = $asset->Filename; // note the extra forward slash here, image_cached inserts it $body = str_replace("src=\"/{$filename}\"", "src=\"{$url}\"", $body); } $response->setBody($body); } } }
public function updateURL(&$url) { $cached = $this->owner; /** @var \Image_Cached $cached */ $filename = $cached->getFilename(); $storeIn = $this->owner->targetStore(); if (!$storeIn) { return; } $asset = ContentServiceAsset::get()->filter('Filename', $filename)->first(); if (!$asset) { $asset = new ContentServiceAsset(); $asset->Filename = $filename; $writer = $this->service->getWriterFor($asset, 'FilePointer', $storeIn); if ($writer) { $mtime = @filemtime($cached->getFullPath()); $writer->write(fopen($cached->getFullPath(), 'r'), $mtime . '/' . $filename); $asset->FilePointer = $writer->getContentId(); $asset->write(); } else { $asset = null; } } if ($asset) { $url = $this->service->getReader($asset->FilePointer)->getURL(); } }
/** * Process all incoming requests passed to this controller, checking * that the file exists and passing the file through if possible. */ public function handleRequest(SS_HTTPRequest $request, DataModel $model) { $response = new SS_HTTPResponse(); $filename = $request->getURL(); if (strpos($filename, 'cdnassets') === 0) { $filename = 'assets/' . substr($filename, strlen('cdnassets/')); } $file = null; if (strpos($filename, '_resampled') !== false) { $file = ContentServiceAsset::get()->filter('Filename', $filename)->first(); } else { if (strpos($filename, '/_versions/') !== false) { $file = FileVersion::get()->filter('Filename', "/" . $filename)->first(); } else { $file = File::get()->filter('filename', $filename)->first(); } } if ($file && $file->canView()) { if (!$file->CDNFile && !$file->FilePointer) { return $this->httpError(404); } // Permission passed redirect to file $redirectLink = ''; if ($file->getViewType() != CDNFile::ANYONE_PERM) { if ($file->hasMethod('getSecureURL')) { $redirectLink = $file->getSecureURL(180); } if (!strlen($redirectLink)) { // can we stream it? return $this->sendFile($file); } } else { $redirectLink = $file->getURL(); } if ($redirectLink && trim($redirectLink, '/') != $request->getURL()) { $response->redirect($redirectLink); } else { return $this->httpError(404); } } else { if (class_exists('SecureFileController')) { $handoff = SecureFileController::create(); return $handoff->handleRequest($request, $model); } elseif ($file instanceof File) { // Permission failure Security::permissionFailure($this, 'You are not authorised to access this resource. Please log in.'); } else { // File doesn't exist $response = new SS_HTTPResponse('File Not Found', 404); } } return $response; }
protected function uploadCachedImages() { $store = $this->owner->targetStore(); if (!$store) { return; } $iterator = null; $dir = dirname($this->owner->getFullPath()) . '/_resampled'; try { $iterator = new DirectoryIterator($dir); } catch (UnexpectedValueException $e) { return; } $regex = sprintf('/([a-z]+)([0-9]?[0-9a-f]*)-%s/i', preg_quote($this->owner->Name, '/')); $iterator = new RegexIterator($iterator, $regex, RegexIterator::MATCH); if (!$this->cachedPaths || count($this->cachedPaths) === 0) { return; } foreach ($this->cachedPaths as $item) { $fullPath = "{$dir}/{$item}"; $path = dirname($this->owner->getFilename()) . '/_resampled/' . $item; $asset = ContentServiceAsset::get()->filter('Filename', $path)->first(); if (!file_exists($fullPath) && $asset) { // delete the remote $writer = $this->service->getWriterFor($asset, 'FilePointer', $store); if ($writer) { $writer->delete(); } $asset->delete(); continue; } if (!file_exists($fullPath)) { continue; } if (!$asset) { $asset = new ContentServiceAsset(); $asset->Filename = $path; } $writer = $this->service->getWriterFor($asset, 'FilePointer', $store); $mtime = @filemtime($path); if ($writer) { $writer->write(fopen($fullPath, 'r'), $mtime . '/' . $path); if ($asset->ID <= 0) { $asset->FilePointer = $writer->getContentId(); $asset->write(); } } } }
public function process() { $daysAgo = (int) $this->daysAgo; if (!$daysAgo) { $daysAgo = 30; } $age = date('Y-m-d 00:00:00', strtotime("-{$daysAgo} days")); $assets = ContentServiceAsset::get()->filter(array('Filename' => 'deleted', 'LastEdited:LessThan' => $age)); foreach ($assets as $asset) { $asset->delete(); $this->currentStep++; } $this->isComplete = true; $job = new PruneContentAssetsJob($daysAgo); singleton('QueuedJobService')->queueJob($job, date('Y-m-d H:00:00', time() + 86400)); }
public function updateURL(&$url) { $cached = $this->owner; /** @var \CdnImage_Cached $cached */ $filename = $cached->getFilename(); $storeIn = $this->owner->targetStore(); if (!$storeIn) { return; } $pointer = null; if ($this->owner->ResampledPointer) { $pointer = $this->owner->ResampledPointer; } if (!$pointer) { //////////////////////////////////// /* THE FOLLOWING IS LEGACY AND SHOULD BE REMOVED LATER - CdnImage has obsoleted it */ //////////////////////////////////// $asset = ContentServiceAsset::get()->filter('Filename', $filename)->first(); if (!$asset) { $asset = new ContentServiceAsset(); $asset->Filename = $filename; $asset->SourceID = $this->owner->SourceID; $asset->ParentID = $this->owner->ParentID; $mtime = strtotime($this->owner->LastEdited); $writer = $this->service->getWriterFor($asset, 'FilePointer', $storeIn); if ($writer) { if (file_exists($cached->getFullPath())) { // likely that cached image never got built correctly. $name = \Controller::join_links(dirname($filename), $mtime, basename($filename)); $writer->write(fopen($cached->getFullPath(), 'r'), $name); $asset->FilePointer = $writer->getContentId(); // @TODO Cleanup local system copy; see note further below $reader = $writer->getReader(); if ($reader && $reader->exists()) { @unlink($cached->getFullPath()); } $asset->write(); $reader = $writer->getReader(); if ($reader && $reader->exists()) { @unlink($cached->getFullPath()); } } else { $asset = null; } } else { $asset = null; } } if ($asset) { $pointer = $asset->FilePointer; } //////////////////////////////////// /* End obsolete code */ //////////////////////////////////// } if ($pointer) { $reader = $this->service->getReader($pointer); if ($reader) { if ($this->owner->CanViewType && $this->owner->getViewType() != \CDNFile::ANYONE_PERM) { return; } else { $controller = \Controller::has_curr() ? \Controller::curr() : null; if ($controller instanceof \LeftAndMain) { return; } $url = $reader->getURL(); } } } }
/** * Mark content service assets as being deleted, and reset our Resamplings value * for update later * * @return int */ protected function deleteResamplings() { $children = ContentServiceAsset::get()->filter('SourceID', $this->ID); $numDeleted = 0; foreach ($children as $child) { $child->SourceID = -1; // we _DONT_ do a hard delete; if content has this image cached, it should be able to // hold it for a while. Instead, mark deleted and allow a cleanup job to collect it later $child->Filename = 'deleted'; $child->write(); $numDeleted++; } $this->Resamplings = []; return $numDeleted; }