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;
 }