/** * Cache content * * Returns feedParser object from cache if present or write it to cache and * returns result. * * @param string $url Feed URL * @return feedParser */ protected function withCache($url) { $url_md5 = md5($url); $cached_file = sprintf('%s/%s/%s/%s/%s.php', $this->cache_dir, $this->cache_file_prefix, substr($url_md5, 0, 2), substr($url_md5, 2, 2), $url_md5); $may_use_cached = false; if (@file_exists($cached_file)) { $may_use_cached = true; $ts = @filemtime($cached_file); if ($ts > strtotime($this->cache_ttl)) { # Direct cache return unserialize(file_get_contents($cached_file)); } $this->setValidator('IfModifiedSince', $ts); } if (!$this->getFeed($url)) { if ($may_use_cached) { # connection failed - fetched from cache return unserialize(file_get_contents($cached_file)); } return false; } switch ($this->getStatus()) { case '304': @files::touch($cached_file); return unserialize(file_get_contents($cached_file)); case '200': if ($feed = new feedParser($this->getContent())) { try { files::makeDir(dirname($cached_file), true); } catch (Exception $e) { return $feed; } if ($fp = @fopen($cached_file, 'wb')) { fwrite($fp, serialize($feed)); fclose($fp); files::inheritChmod($cached_file); } return $feed; } } return false; }
protected function putContent($content, $target = false) { if ($target) { $r = @file_put_contents($target, $content); if ($r === false) { throw new Exception(__('Unable to write destination file.')); } files::inheritChmod($target); return true; } return $content; }
/** * Upload file by bits * * Creates a new file <var>$dest</var> with contents of <var>$bits</var> and * return the destination file path. * <var>$dest</var> should be in jail. This method will throw exception * if file cannot be written. * * @param string $bits Destination file content * @param string $dest Destination file * @return string Destination real path */ public function uploadBits($name, $bits) { $dest = $this->pwd . '/' . path::clean($name); if ($this->isFileExclude($dest)) { throw new Exception(__('Uploading this file is not allowed.')); } if (!$this->inJail(dirname($dest))) { throw new Exception(__('Destination directory is not in jail.')); } if (!is_writable(dirname($dest))) { throw new Exception(__('Cannot write in this directory.')); } $fp = @fopen($dest, 'wb'); if ($fp === false) { throw new Exception(__('An error occurred while writing the file.')); } fwrite($fp, $bits); fclose($fp); files::inheritChmod($dest); return path::real($dest); }
public function getFile($file) { $tpl_file = $this->getFilePath($file); if (!$tpl_file) { throw new Exception('No template found for ' . $file); return false; } $file_md5 = md5($tpl_file); $dest_file = sprintf('%s/%s/%s/%s/%s.php', $this->cache_dir, 'cbtpl', substr($file_md5, 0, 2), substr($file_md5, 2, 2), $file_md5); clearstatcache(); $stat_f = $stat_d = false; if (file_exists($dest_file)) { $stat_f = stat($tpl_file); $stat_d = stat($dest_file); } # We create template if: # - dest_file doest not exists # - we don't want cache # - dest_file size == 0 # - tpl_file is more recent thant dest_file if (!$stat_d || !$this->use_cache || $stat_d['size'] == 0 || $stat_f['mtime'] > $stat_d['mtime']) { files::makeDir(dirname($dest_file), true); if (($fp = @fopen($dest_file, 'wb')) === false) { throw new Exception('Unable to create cache file'); } $fc = $this->compileFile($tpl_file); fwrite($fp, $fc); fclose($fp); files::inheritChmod($dest_file); } return $dest_file; }
/** * Get repository modules list using cache. * * @param string $url XML feed URL * @return array Feed content or False on fail */ protected function withCache($url) { $url_md5 = md5($url); $cached_file = sprintf('%s/%s/%s/%s/%s.ser', $this->cache_dir, $this->cache_file_prefix, substr($url_md5, 0, 2), substr($url_md5, 2, 2), $url_md5); $may_use_cached = false; # Use cache file ? if (@file_exists($cached_file) && !$this->force) { $may_use_cached = true; $ts = @filemtime($cached_file); if ($ts > strtotime($this->cache_ttl)) { # Direct cache return unserialize(file_get_contents($cached_file)); } $this->setValidator('IfModifiedSince', $ts); } # Query repository if (!$this->getModulesXML($url)) { if ($may_use_cached) { # Touch cache TTL even if query failed ? if ($this->cache_touch_on_fail) { @files::touch($cached_file); } # Connection failed - fetched from cache return unserialize(file_get_contents($cached_file)); } return false; } # Parse response switch ($this->getStatus()) { # Not modified, use cache case '304': @files::touch($cached_file); return unserialize(file_get_contents($cached_file)); # Ok, parse feed # Ok, parse feed case '200': if ($modules = new dcStoreParser($this->getContent())) { try { files::makeDir(dirname($cached_file), true); } catch (Exception $e) { return $modules; } if ($fp = @fopen($cached_file, 'wb')) { fwrite($fp, serialize($modules)); fclose($fp); files::inheritChmod($cached_file); } return $modules; } } return false; }