public function __call($function, $args) { // Force zlib compression off. Image and movie files are already compressed and // recompressing them is CPU intensive. if (ini_get("zlib.output_compression")) { ini_set("zlib.output_compression", "Off"); } // request_uri: gallery3/var/albums/foo/bar.jpg?m=1234 $request_uri = rawurldecode(Input::instance()->server("REQUEST_URI")); // get rid of query parameters // request_uri: gallery3/var/albums/foo/bar.jpg $request_uri = preg_replace("/\\?.*/", "", $request_uri); // var_uri: gallery3/var/ $var_uri = url::file("var/"); // Make sure that the request is for a file inside var $offset = strpos(rawurldecode($request_uri), $var_uri); if ($offset !== 0) { throw new Kohana_404_Exception(); } // file_uri: albums/foo/bar.jpg $file_uri = substr($request_uri, strlen($var_uri)); // type: albums // path: foo/bar.jpg list($type, $path) = explode("/", $file_uri, 2); if ($type != "resizes" && $type != "albums" && $type != "thumbs") { throw new Kohana_404_Exception(); } // If the last element is .album.jpg, pop that off since it's not a real item $path = preg_replace("|/.album.jpg\$|", "", $path); $item = item::find_by_path($path); if (!$item->loaded()) { // We didn't turn it up. If we're looking for a .jpg then it's it's possible that we're // requesting the thumbnail for a movie. In that case, the .flv, .mp4 or .m4v file would // have been converted to a .jpg. So try some alternate types: if (preg_match('/.jpg$/', $path)) { foreach (array("flv", "mp4", "m4v") as $ext) { $movie_path = preg_replace('/.jpg$/', ".{$ext}", $path); $item = item::find_by_path($movie_path); if ($item->loaded()) { break; } } } } if (!$item->loaded()) { throw new Kohana_404_Exception(); } // Make sure we have access to the item if (!access::can("view", $item)) { throw new Kohana_404_Exception(); } // Make sure we have view_full access to the original if ($type == "albums" && !access::can("view_full", $item)) { throw new Kohana_404_Exception(); } // Don't try to load a directory if ($type == "albums" && $item->is_album()) { throw new Kohana_404_Exception(); } if ($type == "albums") { $file = $item->file_path(); } else { if ($type == "resizes") { $file = $item->resize_path(); } else { $file = $item->thumb_path(); } } if (!file_exists($file)) { throw new Kohana_404_Exception(); } header("Content-Length: " . filesize($file)); header("Pragma:"); // Check that the content hasn't expired or it wasn't changed since cached expires::check(2592000, $item->updated); // We don't need to save the session for this request Session::instance()->abort_save(); expires::set(2592000, $item->updated); // 30 days // Dump out the image. If the item is a movie, then its thumbnail will be a JPG. if ($item->is_movie() && $type != "albums") { header("Content-Type: image/jpeg"); } else { header("Content-Type: {$item->mime_type}"); } // Don't use Kohana::close_buffers(false) here because that only closes all the buffers // that Kohana started. We want to close *all* buffers at this point because otherwise we're // going to buffer up whatever file we're proxying (and it may be very large). This may // affect embedding or systems with PHP's output_buffering enabled. while (ob_get_level()) { Kohana_Log::add("error", "" . print_r(ob_get_level(), 1)); if (!@ob_end_clean()) { // ob_end_clean() can return false if the buffer can't be removed for some reason // (zlib output compression buffers sometimes cause problems). break; } } readfile($file); }
public function find_by_path_test() { $level1 = test::random_album(); $level2 = test::random_album_unsaved($level1); $level2->name = "plus + space"; $level2->save()->reload(); $level3 = test::random_photo_unsaved($level2); $level3->name = "same.jpg"; $level3->save()->reload(); $level2b = test::random_album($level1); $level3b = test::random_photo_unsaved($level2b); $level3b->name = "same.jpg"; $level3b->save()->reload(); // Item in album $this->assert_same($level3->id, item::find_by_path("/{$level1->name}/{$level2->name}/{$level3->name}")->id); // Album, ends with a slash $this->assert_same($level2->id, item::find_by_path("{$level1->name}/{$level2->name}/")->id); // Album, ends without a slash $this->assert_same($level2->id, item::find_by_path("/{$level1->name}/{$level2->name}")->id); // Return root if "" is passed $this->assert_same(item::root()->id, item::find_by_path("")->id); // Verify that we don't get confused by the part names, using the fallback code. db::build()->update("items")->set(array("relative_path_cache" => null))->where("id", "IN", array($level3->id, $level3b->id))->execute(); $this->assert_same($level3->id, item::find_by_path("{$level1->name}/{$level2->name}/{$level3->name}")->id); $this->assert_same($level3b->id, item::find_by_path("{$level1->name}/{$level2b->name}/{$level3b->name}")->id); // Verify that we don't get false positives $this->assert_false(item::find_by_path("foo/bar/baz")->loaded()); // Verify that the fallback code works $this->assert_same($level3b->id, item::find_by_path("{$level1->name}/{$level2b->name}/{$level3b->name}")->id); }
public function find_by_path_with_album_test() { $parent = test::random_album(); $album = test::random_movie($parent); $album_path = "{$parent->name}/{$album->name}"; $thumb_path = "{$album_path}/.album.jpg"; // Check normal operation. $this->assert_equal($album->id, item::find_by_path($album_path, "albums")->id); $this->assert_equal($album->id, item::find_by_path($thumb_path, "thumbs")->id); $this->assert_equal($album->id, item::find_by_path($album_path)->id); // Check that we don't get false positives. $this->assert_equal(null, item::find_by_path($thumb_path, "albums")->id); $this->assert_equal(null, item::find_by_path($album_path, "thumbs")->id); $this->assert_equal(null, item::find_by_path($thumb_path)->id); // Check normal operation without relative path cache. self::_remove_relative_path_caches(); $this->assert_equal($album->id, item::find_by_path($album_path, "albums")->id); self::_remove_relative_path_caches(); $this->assert_equal($album->id, item::find_by_path($thumb_path, "thumbs")->id); self::_remove_relative_path_caches(); $this->assert_equal($album->id, item::find_by_path($album_path)->id); // Check that we don't get false positives without relative path cache. self::_remove_relative_path_caches(); $this->assert_equal(null, item::find_by_path($thumb_path, "albums")->id); $this->assert_equal(null, item::find_by_path($album_path, "thumbs")->id); $this->assert_equal(null, item::find_by_path($thumb_path)->id); }
public function __call($function, $args) { // request_uri: gallery3/var/albums/foo/bar.jpg?m=1234 $request_uri = rawurldecode(Input::instance()->server("REQUEST_URI")); // get rid of query parameters // request_uri: gallery3/var/albums/foo/bar.jpg $request_uri = preg_replace("/\\?.*/", "", $request_uri); // var_uri: gallery3/var/ $var_uri = url::file("var/"); // Make sure that the request is for a file inside var $offset = strpos(rawurldecode($request_uri), $var_uri); if ($offset !== 0) { throw new Kohana_404_Exception(); } // file_uri: albums/foo/bar.jpg $file_uri = substr($request_uri, strlen($var_uri)); // type: albums // path: foo/bar.jpg list($type, $path) = explode("/", $file_uri, 2); if ($type != "resizes" && $type != "albums" && $type != "thumbs") { throw new Kohana_404_Exception(); } // If the last element is .album.jpg, pop that off since it's not a real item $path = preg_replace("|/.album.jpg\$|", "", $path); $item = item::find_by_path($path); if (!$item->loaded()) { // We didn't turn it up. If we're looking for a .jpg then it's it's possible that we're // requesting the thumbnail for a movie. In that case, the .flv, .mp4 or .m4v file would // have been converted to a .jpg. So try some alternate types: if (preg_match('/.jpg$/', $path)) { // rWatcher Mod: look for videos with file extensions supported by the videos module in addition to flv mp4 and m4v // Original Line: foreach (array("flv", "mp4", "m4v") as $ext) { foreach (array_merge(array("flv", "mp4", "m4v"), unserialize(module::get_var("videos", "allowed_extensions"))) as $ext) { $movie_path = preg_replace('/.jpg$/', ".{$ext}", $path); $item = item::find_by_path($movie_path); if ($item->loaded()) { break; } } } // rWatcher Mod: // If we're looking for a .flv then it's it's possible that we're requesting a flash resize // for a movie. if (strtolower(substr($path, strlen($path) - 4)) == ".flv") { $movie_path = str_ireplace(".flv", "", $path); $item = ORM::factory("item")->where("relative_path_cache", "=", $movie_path)->find(); } // END rWatcher Mod } if (!$item->loaded()) { throw new Kohana_404_Exception(); } // Make sure we have access to the item if (!access::can("view", $item)) { throw new Kohana_404_Exception(); } // Make sure we have view_full access to the original if ($type == "albums" && !access::can("view_full", $item)) { throw new Kohana_404_Exception(); } // Don't try to load a directory if ($type == "albums" && $item->is_album()) { throw new Kohana_404_Exception(); } if ($type == "albums") { $file = $item->file_path(); } else { if ($type == "resizes") { $file = $item->resize_path(); // rWatcher MOD // If the resize is for a movie, assume it needs a .flv extension. if ($item->is_movie()) { $file = $file . ".flv"; } // End rWatcher MOD } else { $file = $item->thumb_path(); } } if (!file_exists($file)) { throw new Kohana_404_Exception(); } header("Content-Length: " . filesize($file)); header("Pragma:"); // Check that the content hasn't expired or it wasn't changed since cached expires::check(2592000, $item->updated); // We don't need to save the session for this request Session::instance()->abort_save(); expires::set(2592000, $item->updated); // 30 days // Dump out the image. If the item is a movie, then its thumbnail will be a JPG. if ($item->is_movie() && $type != "albums") { header("Content-Type: image/jpeg"); } else { header("Content-Type: {$item->mime_type}"); } Kohana::close_buffers(false); readfile($file); }
public function __call($function, $args) { // Force zlib compression off. Image and movie files are already compressed and // recompressing them is CPU intensive. if (ini_get("zlib.output_compression")) { ini_set("zlib.output_compression", "Off"); } // request_uri: gallery3/var/albums/foo/bar.jpg?m=1234 $request_uri = rawurldecode(Input::instance()->server("REQUEST_URI")); // get rid of query parameters // request_uri: gallery3/var/albums/foo/bar.jpg $request_uri = preg_replace("/\\?.*/", "", $request_uri); // var_uri: gallery3/var/ $var_uri = url::file("var/"); // Make sure that the request is for a file inside var $offset = strpos(rawurldecode($request_uri), $var_uri); if ($offset !== 0) { $e = new Kohana_404_Exception(); $e->test_fail_code = 1; throw $e; } // file_uri: albums/foo/bar.jpg $file_uri = substr($request_uri, strlen($var_uri)); // type: albums // path: foo/bar.jpg list($type, $path) = explode("/", $file_uri, 2); if ($type != "resizes" && $type != "albums" && $type != "thumbs") { $e = new Kohana_404_Exception(); $e->test_fail_code = 2; throw $e; } // Get the item model using the path and type (which corresponds to a var subdir) $item = item::find_by_path($path, $type); if (!$item->loaded()) { $e = new Kohana_404_Exception(); $e->test_fail_code = 3; throw $e; } // Make sure we have access to the item if (!access::can("view", $item)) { $e = new Kohana_404_Exception(); $e->test_fail_code = 4; throw $e; } // Make sure we have view_full access to the original if ($type == "albums" && !access::can("view_full", $item)) { $e = new Kohana_404_Exception(); $e->test_fail_code = 5; throw $e; } // Don't try to load a directory if ($type == "albums" && $item->is_album()) { $e = new Kohana_404_Exception(); $e->test_fail_code = 6; throw $e; } // Note: this code is roughly duplicated in data_rest, so if you modify this, please look to // see if you should make the same change there as well. if ($type == "albums") { $file = $item->file_path(); } else { if ($type == "resizes") { $file = $item->resize_path(); } else { $file = $item->thumb_path(); } } if (!file_exists($file)) { $e = new Kohana_404_Exception(); $e->test_fail_code = 7; throw $e; } if (gallery::show_profiler()) { Profiler::enable(); $profiler = new Profiler(); $profiler->render(); exit; } header("Content-Length: " . filesize($file)); header("Pragma:"); // Check that the content hasn't expired or it wasn't changed since cached expires::check(2592000, $item->updated); // We don't need to save the session for this request Session::instance()->abort_save(); expires::set(2592000, $item->updated); // 30 days // Dump out the image. If the item is a movie or album, then its thumbnail will be a JPG. if (($item->is_movie() || $item->is_album()) && $type == "thumbs") { header("Content-Type: image/jpeg"); } else { header("Content-Type: {$item->mime_type}"); } if (TEST_MODE) { return $file; } else { // Don't use Kohana::close_buffers(false) here because that only closes all the buffers // that Kohana started. We want to close *all* buffers at this point because otherwise we're // going to buffer up whatever file we're proxying (and it may be very large). This may // affect embedding or systems with PHP's output_buffering enabled. while (ob_get_level()) { if (!@ob_end_clean()) { // ob_end_clean() can return false if the buffer can't be removed for some reason // (zlib output compression buffers sometimes cause problems). break; } } readfile($file); } }
static function graphics_rotate($input_file, $output_file, $options) { // Remove the current item's file size from the quotas table. $item = item::find_by_path(substr(str_replace(VARPATH, "", $input_file), strpos(str_replace(VARPATH, "", $input_file), "/") + 1)); if ($item->loaded()) { $record = ORM::factory("users_space_usage")->where("owner_id", "=", $item->owner_id)->find(); $record->remove_item($item); } }