summaryrefslogtreecommitdiff
path: root/modules/gallery
diff options
context:
space:
mode:
Diffstat (limited to 'modules/gallery')
-rw-r--r--modules/gallery/controllers/admin.php10
-rw-r--r--modules/gallery/controllers/albums.php4
-rw-r--r--modules/gallery/controllers/file_proxy.php6
-rw-r--r--modules/gallery/controllers/flash_uploader.php (renamed from modules/gallery/controllers/simple_uploader.php)4
-rw-r--r--modules/gallery/controllers/login.php7
-rw-r--r--modules/gallery/controllers/logout.php11
-rw-r--r--modules/gallery/controllers/packager.php11
-rw-r--r--modules/gallery/controllers/quick.php4
-rw-r--r--modules/gallery/controllers/reauthenticate.php4
-rw-r--r--modules/gallery/css/gallery.css19
-rw-r--r--modules/gallery/helpers/MY_url.php6
-rw-r--r--modules/gallery/helpers/auth.php1
-rw-r--r--modules/gallery/helpers/gallery.php2
-rw-r--r--modules/gallery/helpers/gallery_block.php4
-rw-r--r--modules/gallery/helpers/gallery_event.php91
-rw-r--r--modules/gallery/helpers/gallery_rss.php8
-rw-r--r--modules/gallery/helpers/item.php9
-rw-r--r--modules/gallery/helpers/item_rest.php36
-rw-r--r--modules/gallery/helpers/items_rest.php70
-rw-r--r--modules/gallery/helpers/message.php1
-rw-r--r--modules/gallery/helpers/module.php7
-rw-r--r--modules/gallery/helpers/photo.php2
-rw-r--r--modules/gallery/helpers/site_status.php2
-rw-r--r--modules/gallery/helpers/theme.php16
-rw-r--r--modules/gallery/hooks/init_gallery.php9
-rw-r--r--modules/gallery/js/item_form_delete.js5
-rw-r--r--modules/gallery/js/l10n_client.js22
-rw-r--r--modules/gallery/libraries/MY_Kohana_Exception.php64
-rw-r--r--modules/gallery/libraries/Theme_View.php4
-rw-r--r--modules/gallery/models/item.php20
-rw-r--r--modules/gallery/tests/File_Structure_Test.php9
-rw-r--r--modules/gallery/tests/Gallery_Filters.php5
-rw-r--r--modules/gallery/tests/Item_Helper_Test.php12
-rw-r--r--modules/gallery/tests/Item_Model_Test.php13
-rw-r--r--modules/gallery/tests/Item_Rest_Helper_Test.php10
-rw-r--r--modules/gallery/tests/Items_Rest_Helper_Test.php206
-rw-r--r--modules/gallery/tests/controller_auth_data.txt8
-rw-r--r--modules/gallery/tests/xss_data.txt195
-rw-r--r--modules/gallery/views/admin_modules.html.php2
-rw-r--r--modules/gallery/views/admin_theme_options.html.php34
-rw-r--r--modules/gallery/views/admin_themes_preview.html.php1
-rw-r--r--modules/gallery/views/error_404.html.php7
-rw-r--r--modules/gallery/views/error_admin.html.php272
-rw-r--r--modules/gallery/views/error_cli.txt.php3
-rw-r--r--modules/gallery/views/error_user.html.php42
-rw-r--r--modules/gallery/views/form_uploadify.html.php2
-rw-r--r--modules/gallery/views/kohana/error.php320
-rw-r--r--modules/gallery/views/login_ajax.html.php7
48 files changed, 1062 insertions, 545 deletions
diff --git a/modules/gallery/controllers/admin.php b/modules/gallery/controllers/admin.php
index 787a2138..40dd260b 100644
--- a/modules/gallery/controllers/admin.php
+++ b/modules/gallery/controllers/admin.php
@@ -22,7 +22,12 @@ class Admin_Controller extends Controller {
public function __construct($theme=null) {
if (!identity::active_user()->admin) {
- access::forbidden();
+ if (identity::active_user()->guest) {
+ Session::instance()->set("continue_url", url::abs_current(true));
+ url::redirect("login");
+ } else {
+ access::forbidden();
+ }
}
parent::__construct();
@@ -69,6 +74,7 @@ class Admin_Controller extends Controller {
$result = new stdClass();
$result->result = "success";
if ($time_remaining < 30) {
+ message::success(t("Automatically logged out of the admin area for your security"));
$result->location = url::abs_site("");
}
@@ -78,7 +84,7 @@ class Admin_Controller extends Controller {
private static function _prompt_for_reauth($controller_name, $args) {
if (request::method() == "get" && !request::is_ajax()) {
// Avoid anti-phishing protection by passing the url as session variable.
- Session::instance()->set("continue_url", url::current(true));
+ Session::instance()->set("continue_url", url::abs_current(true));
}
url::redirect("reauthenticate");
}
diff --git a/modules/gallery/controllers/albums.php b/modules/gallery/controllers/albums.php
index ea15418f..eaa09be5 100644
--- a/modules/gallery/controllers/albums.php
+++ b/modules/gallery/controllers/albums.php
@@ -73,8 +73,8 @@ class Albums_Controller extends Items_Controller {
// We can't use math in ORM or the query builder, so do this by hand. It's important
// that we do this with math, otherwise concurrent accesses will damage accuracy.
- db::query(
- "UPDATE {items} SET `view_count` = `view_count` + 1 WHERE `id` = $album->id");
+ db::query("UPDATE {items} SET `view_count` = `view_count` + 1 WHERE `id` = $album->id")
+ ->execute();
print $template;
}
diff --git a/modules/gallery/controllers/file_proxy.php b/modules/gallery/controllers/file_proxy.php
index fff90ec5..32690fc0 100644
--- a/modules/gallery/controllers/file_proxy.php
+++ b/modules/gallery/controllers/file_proxy.php
@@ -60,12 +60,12 @@ class File_Proxy_Controller extends Controller {
foreach (explode("/", $path) as $path_part) {
$encoded_path[] = rawurlencode($path_part);
}
-
+ $encoded_path = implode("/", $encoded_path);
// We now have the relative path to the item. Search for it in the path cache
// The patch cache is urlencoded so re-encode the path. (it was decoded earlier to
// insure that the paths are normalized.
$item = ORM::factory("item")
- ->where("relative_path_cache", "=", implode("/", $encoded_path))->find();
+ ->where("relative_path_cache", "=", $encoded_path)->find();
if (!$item->loaded()) {
// We didn't turn it up. It's possible that the relative_path_cache is out of date here.
// There was fallback code, but bharat deleted it in 8f1bca74. If it turns out to be
@@ -76,7 +76,7 @@ class File_Proxy_Controller extends Controller {
// So try some alternate types:
if (preg_match('/.jpg$/', $path)) {
foreach (array("flv", "mp4") as $ext) {
- $movie_path = preg_replace('/.jpg$/', ".$ext", $path);
+ $movie_path = preg_replace('/.jpg$/', ".$ext", $encoded_path);
$item = ORM::factory("item")->where("relative_path_cache", "=", $movie_path)->find();
if ($item->loaded()) {
break;
diff --git a/modules/gallery/controllers/simple_uploader.php b/modules/gallery/controllers/flash_uploader.php
index c7e5031b..f7da5124 100644
--- a/modules/gallery/controllers/simple_uploader.php
+++ b/modules/gallery/controllers/flash_uploader.php
@@ -17,7 +17,7 @@
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA.
*/
-class Simple_Uploader_Controller extends Controller {
+class Flash_Uploader_Controller extends Controller {
public function app($id) {
$item = ORM::factory("item", $id);
access::required("view", $item);
@@ -109,7 +109,7 @@ class Simple_Uploader_Controller extends Controller {
}
private function _get_add_form($album) {
- $form = new Forge("simple_uploader/finish", "", "post", array("id" => "g-add-photos-form"));
+ $form = new Forge("flash_uploader/finish", "", "post", array("id" => "g-add-photos-form"));
$group = $form->group("add_photos")
->label(t("Add photos to %album_title", array("album_title" => html::purify($album->title))));
$group->uploadify("uploadify")->album($album);
diff --git a/modules/gallery/controllers/login.php b/modules/gallery/controllers/login.php
index 40125476..2b60316b 100644
--- a/modules/gallery/controllers/login.php
+++ b/modules/gallery/controllers/login.php
@@ -38,15 +38,18 @@ class Login_Controller extends Controller {
}
public function html() {
- print auth::get_login_form("login/auth_html");
+ $view = new Theme_View("page.html", "other", "login");
+ $view->page_title = t("Login");
+ $view->content = auth::get_login_form("login/auth_html");
+ print $view;
}
public function auth_html() {
access::verify_csrf();
- $continue_url = Session::instance()->get("continue_url", null);
list ($valid, $form) = $this->_auth("login/auth_html");
if ($valid) {
+ $continue_url = $form->continue_url->value;
url::redirect($continue_url ? $continue_url : item::root()->abs_url());
} else {
$view = new Theme_View("page.html", "other", "login");
diff --git a/modules/gallery/controllers/logout.php b/modules/gallery/controllers/logout.php
index 967dad49..20fa8074 100644
--- a/modules/gallery/controllers/logout.php
+++ b/modules/gallery/controllers/logout.php
@@ -21,14 +21,9 @@ class Logout_Controller extends Controller {
public function index() {
access::verify_csrf();
auth::logout();
- if ($continue_url = Input::instance()->get("continue")) {
- $item = url::get_item_from_uri($continue_url);
- if (access::can("view", $item)) {
- // Don't use url::redirect() because it'll call url::site() and munge the continue url.
- header("Location: $continue_url");
- } else {
- url::redirect(item::root()->abs_url());
- }
+ if ($continue_url = Input::instance()->get("continue_url")) {
+ url::redirect($continue_url);
}
+ url::redirect(item::root()->abs_url());
}
} \ No newline at end of file
diff --git a/modules/gallery/controllers/packager.php b/modules/gallery/controllers/packager.php
index 6eafd9df..835cb903 100644
--- a/modules/gallery/controllers/packager.php
+++ b/modules/gallery/controllers/packager.php
@@ -63,8 +63,8 @@ class Packager_Controller extends Controller {
module::load_modules();
- foreach (array("user", "comment", "organize", "info", "rss",
- "search", "slideshow", "tag") as $module_name) {
+ foreach (array("user", "comment", "organize", "info", "rest",
+ "rss", "search", "slideshow", "tag") as $module_name) {
module::install($module_name);
module::activate($module_name);
}
@@ -163,9 +163,11 @@ class Packager_Controller extends Controller {
$paths = array();
foreach($objects as $name => $file){
- if ($file->getBasename() == "database.php") {
+ $path = $file->getPath();
+ $basename = $file->getBasename();
+ if ($basename == "database.php" || $basename == "." || $basename == "..") {
continue;
- } else if (basename($file->getPath()) == "logs" && $file->getBasename() != ".htaccess") {
+ } else if (basename($path) == "logs" && $basename != ".htaccess") {
continue;
}
@@ -186,6 +188,7 @@ class Packager_Controller extends Controller {
foreach ($paths as $path) {
fwrite($fd, "!file_exists($path) && mkdir($path);\n");
}
+ ksort($files);
foreach ($files as $file => $contents) {
fwrite($fd, "file_put_contents($file, base64_decode(\"$contents\"));\n");
}
diff --git a/modules/gallery/controllers/quick.php b/modules/gallery/controllers/quick.php
index 813d1a93..6cfbbc62 100644
--- a/modules/gallery/controllers/quick.php
+++ b/modules/gallery/controllers/quick.php
@@ -58,12 +58,12 @@ class Quick_Controller extends Controller {
if (Input::instance()->get("page_type") == "collection") {
print json_encode(
- array("src" => $item->thumb_url() . "?rnd=" . rand(),
+ array("src" => $item->thumb_url(),
"width" => $item->thumb_width,
"height" => $item->thumb_height));
} else {
print json_encode(
- array("src" => $item->resize_url() . "?rnd=" . rand(),
+ array("src" => $item->resize_url(),
"width" => $item->resize_width,
"height" => $item->resize_height));
}
diff --git a/modules/gallery/controllers/reauthenticate.php b/modules/gallery/controllers/reauthenticate.php
index 3503d80a..acb27f6a 100644
--- a/modules/gallery/controllers/reauthenticate.php
+++ b/modules/gallery/controllers/reauthenticate.php
@@ -37,8 +37,7 @@ class Reauthenticate_Controller extends Controller {
if ($valid) {
message::success(t("Successfully re-authenticated!"));
module::event("user_auth", $user);
- $continue_url = Session::instance()->get_once("continue_url", "admin");
- url::redirect($continue_url);
+ url::redirect($form->continue_url->value);
} else {
$name = $user->name;
log::warning("user", t("Failed re-authentication for %name", array("name" => $name)));
@@ -59,6 +58,7 @@ class Reauthenticate_Controller extends Controller {
private static function _form() {
$form = new Forge("reauthenticate/auth", "", "post", array("id" => "g-reauthenticate-form"));
$form->set_attr('class', "g-narrow");
+ $form->hidden("continue_url")->value(Session::instance()->get("continue_url", "admin"));
$group = $form->group("reauthenticate")->label(t("Re-authenticate"));
$group->password("password")->label(t("Password"))->id("g-password")->class(null)
->callback("auth::validate_too_many_failed_auth_attempts")
diff --git a/modules/gallery/css/gallery.css b/modules/gallery/css/gallery.css
index c2fb97e8..08bd4749 100644
--- a/modules/gallery/css/gallery.css
+++ b/modules/gallery/css/gallery.css
@@ -30,7 +30,7 @@
#g-add-photos-canvas object,
#g-add-photos-button {
left: 137px;
- margin: 0 0 .5em 0;
+ margin: .5em 0;
padding: .4em 1em;
position: absolute;
top: 0;
@@ -38,10 +38,13 @@
}
#g-add-photos-canvas object {
- margin: 0;
z-index: 100;
}
+#g-add-photos-canvas .uploadifyQueue {
+ margin-top: .5em;
+}
+
#g-add-photos-canvas .uploadifyQueueItem {
margin: 0;
}
@@ -81,6 +84,10 @@
clear: both;
}
+#g-edit-permissions-form th {
+ text-align: center;
+}
+
#g-edit-permissions-form td {
background-image: none;
}
@@ -197,3 +204,11 @@
.rtl #g-user-profile .g-avatar {
margin-left: .6em;
}
+
+.rtl #g-languages-form table {
+ margin: 0 0 1em 3em;
+}
+
+.rtl #g-translations ol {
+ margin: 0 2em 1em 0;
+}
diff --git a/modules/gallery/helpers/MY_url.php b/modules/gallery/helpers/MY_url.php
index 57ce9623..877c5ada 100644
--- a/modules/gallery/helpers/MY_url.php
+++ b/modules/gallery/helpers/MY_url.php
@@ -70,8 +70,7 @@ class url extends url_Core {
* Just like url::file() except that it returns an absolute URI
*/
static function abs_file($path) {
- return url::base(
- false, (empty($_SERVER['HTTPS']) || $_SERVER['HTTPS'] === 'off') ? 'http' : 'https') . $path;
+ return url::base(false, request::protocol()) . $path;
}
/**
@@ -79,8 +78,7 @@ class url extends url_Core {
* doesn't take a protocol parameter.
*/
static function abs_site($path) {
- return url::site(
- $path, (empty($_SERVER['HTTPS']) || $_SERVER['HTTPS'] === 'off') ? 'http' : 'https');
+ return url::site($path, request::protocol());
}
/**
diff --git a/modules/gallery/helpers/auth.php b/modules/gallery/helpers/auth.php
index 1a9fe869..48b5fc32 100644
--- a/modules/gallery/helpers/auth.php
+++ b/modules/gallery/helpers/auth.php
@@ -21,6 +21,7 @@ class auth_Core {
static function get_login_form($url) {
$form = new Forge($url, "", "post", array("id" => "g-login-form"));
$form->set_attr("class", "g-narrow");
+ $form->hidden("continue_url")->value(Session::instance()->get("continue_url"));
$group = $form->group("login")->label(t("Login"));
$group->input("name")->label(t("Username"))->id("g-username")->class(null)
->callback("auth::validate_too_many_failed_logins")
diff --git a/modules/gallery/helpers/gallery.php b/modules/gallery/helpers/gallery.php
index 7f7db10b..d4078209 100644
--- a/modules/gallery/helpers/gallery.php
+++ b/modules/gallery/helpers/gallery.php
@@ -18,7 +18,7 @@
* Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA.
*/
class gallery_Core {
- const VERSION = "3.0 RC1 (Santa Fe)";
+ const VERSION = "3.0 RC2 (Santa Fe)";
/**
* If Gallery is in maintenance mode, then force all non-admins to get routed to a "This site is
diff --git a/modules/gallery/helpers/gallery_block.php b/modules/gallery/helpers/gallery_block.php
index 08ce21b7..cb28cbcd 100644
--- a/modules/gallery/helpers/gallery_block.php
+++ b/modules/gallery/helpers/gallery_block.php
@@ -70,9 +70,9 @@ class gallery_block_Core {
$block->css_id = "g-platform";
$block->title = t("Platform information");
$block->content = new View("admin_block_platform.html");
- if (@is_readable("/proc/loadavg")) {
+ if (@is_readable("/proc/loadavg") && $first_line = current(@file("/proc/loadavg"))) {
$block->content->load_average =
- join(" ", array_slice(explode(" ", current(file("/proc/loadavg"))), 0, 3));
+ join(" ", array_slice(explode(" ", $first_line), 0, 3));
} else {
$block->content->load_average = t("Unavailable");
}
diff --git a/modules/gallery/helpers/gallery_event.php b/modules/gallery/helpers/gallery_event.php
index 2416f2e5..272fd205 100644
--- a/modules/gallery/helpers/gallery_event.php
+++ b/modules/gallery/helpers/gallery_event.php
@@ -98,6 +98,15 @@ class gallery_event_Core {
static function item_deleted($item) {
access::delete_item($item);
+ // Find any other albums that had the deleted item as the album cover and null it out.
+ // In some cases this may leave us with a missing album cover up in this item's parent
+ // hierarchy, but in most cases it'll work out fine.
+ foreach (ORM::factory("item")
+ ->where("album_cover_item_id", "=", $item->id)
+ ->find_all() as $parent) {
+ item::remove_album_cover($parent);
+ }
+
$parent = $item->parent();
if (!$parent->album_cover_item_id) {
// Assume we deleted the album cover and pick a new one. Choosing the first photo in the
@@ -157,17 +166,28 @@ class gallery_event_Core {
->view("login_current_user.html")
->url(user_profile::url($user->id))
->label($user->display_name()));
+
+ if (isset($theme->item)) {
+ if (access::user_can(identity::guest(), "view", $theme->item)) {
+ $continue_url = $theme->item->abs_url();
+ } else {
+ $continue_url = item::root()->abs_url();
+ }
+ } else {
+ $continue_url = url::abs_current();
+ }
+
$menu->append(Menu::factory("link")
->id("user_menu_logout")
->css_id("g-logout-link")
- ->url(url::site("logout?csrf=$csrf&amp;continue=" .
- urlencode(url::abs_current())))
+ ->url(url::site("logout?csrf=$csrf&amp;continue_url=" .
+ urlencode($continue_url)))
->label(t("Logout")));
}
}
}
- static function site_menu($menu, $theme) {
+ static function site_menu($menu, $theme, $item_css_selector) {
if ($theme->page_subtype != "login") {
$menu->append(Menu::factory("link")
->id("home")
@@ -191,7 +211,7 @@ class gallery_event_Core {
$add_menu->append(Menu::factory("dialog")
->id("add_photos_item")
->label(t("Add photos"))
- ->url(url::site("simple_uploader/app/$item->id")));
+ ->url(url::site("flash_uploader/app/$item->id")));
if ($item->is_album()) {
$add_menu->append(Menu::factory("dialog")
->id("add_album_item")
@@ -208,14 +228,17 @@ class gallery_event_Core {
case "album":
$option_text = t("Album options");
$edit_text = t("Edit album");
+ $delete_text = t("Delete album");
break;
case "movie":
$option_text = t("Movie options");
$edit_text = t("Edit movie");
+ $delete_text = t("Delete movie");
break;
default:
$option_text = t("Photo options");
$edit_text = t("Edit photo");
+ $delete_text = t("Delete photo");
}
$menu->append($options_menu = Menu::factory("submenu")
@@ -238,6 +261,63 @@ class gallery_event_Core {
}
}
}
+
+ $csrf = access::csrf_token();
+ $theme_item = $theme->item();
+ $page_type = $theme->page_type();
+ if ($can_edit && $item->is_photo() && graphics::can("rotate")) {
+ $options_menu
+ ->append(
+ Menu::factory("ajax_link")
+ ->id("rotate_ccw")
+ ->label(t("Rotate 90° counter clockwise"))
+ ->css_class("ui-icon-rotate-ccw")
+ ->ajax_handler("function(data) { " .
+ "\$.gallery_replace_image(data, \$('$item_css_selector')) }")
+ ->url(url::site("quick/rotate/$item->id/ccw?csrf=$csrf&amp;from_id=$theme_item->id&amp;page_type=$page_type")))
+ ->append(
+ Menu::factory("ajax_link")
+ ->id("rotate_cw")
+ ->label(t("Rotate 90° clockwise"))
+ ->css_class("ui-icon-rotate-cw")
+ ->ajax_handler("function(data) { " .
+ "\$.gallery_replace_image(data, \$('$item_css_selector')) }")
+ ->url(url::site("quick/rotate/$item->id/cw?csrf=$csrf&amp;from_id=$theme_item->id&amp;page_type=$page_type")));
+ }
+
+ if ($item->id != item::root()->id) {
+ $parent = $item->parent();
+ if (access::can("edit", $parent)) {
+ // We can't make this item the highlight if it's an album with no album cover, or if it's
+ // already the album cover.
+ if (($item->type == "album" && empty($item->album_cover_item_id)) ||
+ ($item->type == "album" && $parent->album_cover_item_id == $item->album_cover_item_id) ||
+ $parent->album_cover_item_id == $item->id) {
+ $disabledState = " ui-state-disabled";
+ } else {
+ $disabledState = " ";
+ }
+
+ if ($item->parent()->id != 1) {
+ $options_menu
+ ->append(
+ Menu::factory("ajax_link")
+ ->id("make_album_cover")
+ ->label(t("Choose as the album cover"))
+ ->css_class("ui-icon-star")
+ ->ajax_handler("function(data) { window.location.reload() }")
+ ->url(url::site("quick/make_album_cover/$item->id?csrf=$csrf")));
+ }
+ $options_menu
+ ->append(
+ Menu::factory("dialog")
+ ->id("delete")
+ ->label($delete_text)
+ ->css_class("ui-icon-trash")
+ ->css_class("g-quick-delete")
+ ->url(url::site("quick/form_delete/$item->id?csrf=$csrf&amp;from_id=$theme_item->id&amp;page_type=$page_type")));
+ }
+ }
}
if (identity::active_user()->admin) {
@@ -394,7 +474,6 @@ class gallery_event_Core {
->id("delete")
->label($delete_title)
->css_class("ui-icon-trash")
- ->css_class("g-quick-delete")
->url(url::site("quick/form_delete/$item->id?csrf=$csrf&amp;from_id=$theme_item->id&amp;page_type=$page_type")));
}
@@ -404,7 +483,7 @@ class gallery_event_Core {
->id("add_item")
->label(t("Add a photo"))
->css_class("ui-icon-plus")
- ->url(url::site("simple_uploader/app/$item->id")))
+ ->url(url::site("flash_uploader/app/$item->id")))
->append(Menu::factory("dialog")
->id("add_album")
->label(t("Add an album"))
diff --git a/modules/gallery/helpers/gallery_rss.php b/modules/gallery/helpers/gallery_rss.php
index 9c528c0e..bec34912 100644
--- a/modules/gallery/helpers/gallery_rss.php
+++ b/modules/gallery/helpers/gallery_rss.php
@@ -28,18 +28,18 @@ class gallery_rss_Core {
$feed = new stdClass();
switch ($feed_id) {
case "latest":
- $feed->children = ORM::factory("item")
+ $feed->items = ORM::factory("item")
->viewable()
->where("type", "<>", "album")
->order_by("created", "DESC")
->find_all($limit, $offset);
- $all_children = ORM::factory("item")
+ $all_items = ORM::factory("item")
->viewable()
->where("type", "<>", "album")
->order_by("created", "DESC");
- $feed->max_pages = ceil($all_children->find_all()->count() / $limit);
+ $feed->max_pages = ceil($all_items->find_all()->count() / $limit);
$feed->title = t("Recent updates");
$feed->description = t("Recent updates");
return $feed;
@@ -48,7 +48,7 @@ class gallery_rss_Core {
$item = ORM::factory("item", $id);
access::required("view", $item);
- $feed->children = $item
+ $feed->items = $item
->viewable()
->descendants($limit, $offset, array(array("type", "=", "photo")));
$feed->max_pages = ceil(
diff --git a/modules/gallery/helpers/item.php b/modules/gallery/helpers/item.php
index 43c93225..aef68c6e 100644
--- a/modules/gallery/helpers/item.php
+++ b/modules/gallery/helpers/item.php
@@ -136,7 +136,7 @@ class item_Core {
*/
static function convert_filename_to_title($filename) {
$title = strtr($filename, "_", " ");
- $title = preg_replace("/\..*?$/", "", $title);
+ $title = preg_replace("/\..{3,4}$/", "", $title);
$title = preg_replace("/ +/", " ", $title);
return $title;
}
@@ -162,6 +162,8 @@ class item_Core {
"quick/delete/$item->id?page_type=$page_type", "", "post", array("id" => "g-confirm-delete"));
$group = $form->group("confirm_delete")->label(t("Confirm Deletion"));
$group->submit("")->value(t("Delete"));
+ $form->script("")
+ ->url(url::abs_file("modules/gallery/js/item_form_delete.js"));
return $form;
}
@@ -209,17 +211,14 @@ class item_Core {
/**
* Return a query to get a random Item_Model, with optional filters
- *
- * @param array (optional) where tuple
*/
- static function random_query($where=null) {
+ static function random_query() {
// Pick a random number and find the item that's got nearest smaller number.
// This approach works best when the random numbers in the system are roughly evenly
// distributed so this is going to be more efficient with larger data sets.
return ORM::factory("item")
->viewable()
->where("rand_key", "<", ((float)mt_rand()) / (float)mt_getrandmax())
- ->merge_where($where)
->order_by("rand_key", "DESC");
}
} \ No newline at end of file
diff --git a/modules/gallery/helpers/item_rest.php b/modules/gallery/helpers/item_rest.php
index 36d2ca62..6869181d 100644
--- a/modules/gallery/helpers/item_rest.php
+++ b/modules/gallery/helpers/item_rest.php
@@ -126,18 +126,19 @@ class item_rest_Core {
}
}
}
+ $item->save();
- $weight = 0;
- if (isset($request->params->members)) {
+ if (isset($request->params->members) && $item->sort_column == "weight") {
+ $weight = 0;
foreach ($request->params->members as $url) {
$child = rest::resolve($url);
if ($child->parent_id == $item->id && $child->weight != $weight) {
- $child->weight = $weight++;
+ $child->weight = $weight;
$child->save();
}
+ $weight++;
}
}
- $item->save();
}
static function post($request) {
@@ -151,7 +152,7 @@ class item_rest_Core {
$item->type = "album";
$item->parent_id = $parent->id;
$item->name = $entity->name;
- $item->title = isset($entity->title) ? $entity->title : $name;
+ $item->title = isset($entity->title) ? $entity->title : $entity->name;
$item->description = isset($entity->description) ? $entity->description : null;
$item->slug = isset($entity->slug) ? $entity->slug : null;
$item->save();
@@ -159,18 +160,23 @@ class item_rest_Core {
case "photo":
case "movie":
- $item->type = $entity->type;
- $item->parent_id = $parent->id;
- $item->set_data_file($request->file);
- $item->name = $entity->name;
- $item->title = isset($entity->title) ? $entity->title : $entity->name;
- $item->description = isset($entity->description) ? $entity->description : null;
- $item->slug = isset($entity->slug) ? $entity->slug : null;
- $item->save();
- break;
+ if (empty($request->file)) {
+ throw new Rest_Exception(
+ "Bad Request", 400, array("errors" => array("file" => t("Upload failed"))));
+ }
+ $item->type = $entity->type;
+ $item->parent_id = $parent->id;
+ $item->set_data_file($request->file);
+ $item->name = $entity->name;
+ $item->title = isset($entity->title) ? $entity->title : $entity->name;
+ $item->description = isset($entity->description) ? $entity->description : null;
+ $item->slug = isset($entity->slug) ? $entity->slug : null;
+ $item->save();
+ break;
default:
- throw new Rest_Exception("Invalid type: $entity->type", 400);
+ throw new Rest_Exception(
+ "Bad Request", 400, array("errors" => array("type" => "invalid")));
}
return array("url" => rest::url("item", $item));
diff --git a/modules/gallery/helpers/items_rest.php b/modules/gallery/helpers/items_rest.php
index 5d8e80b2..9cca9a54 100644
--- a/modules/gallery/helpers/items_rest.php
+++ b/modules/gallery/helpers/items_rest.php
@@ -18,28 +18,74 @@
* Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA.
*/
class items_rest_Core {
+ /**
+ * To retrieve a collection of items, you can specify the following query parameters to specify
+ * the type of the collection. If both are specified, then the url parameter is used and the
+ * ancestors_for is ignored. Specifying the "type" parameter with the urls parameter, will
+ * filter the results based on the specified type. Using the type parameter with the
+ * ancestors_for parameter makes no sense and will be ignored.
+ *
+ * urls=url1,url2,url3
+ * return items that match the specified urls. Typically used to return the member detail
+ *
+ * ancestors_for=url
+ * return the ancestors of the specified item
+ *
+ * type=<comma separate list of photo, movie or album>
+ * limit the type to types in this list. eg, "type=photo,movie"
+ */
static function get($request) {
-
$items = array();
- if (isset($request->params->url)) {
- foreach (json_decode($request->params->url) as $url) {
+ if (isset($request->params->urls)) {
+ foreach (json_decode($request->params->urls) as $url) {
+ if (isset($request->params->type)) {
+ $types = explode(",", $request->params->type);
+ }
$item = rest::resolve($url);
if (access::can("view", $item)) {
- $item_rest = array("url" => $url,
- "entity" => $item->as_restful_array(),
- "relationship" => rest::relationships("item", $item));
- if ($item->type == "album") {
- $members = array();
- foreach ($item->children() as $child) {
- $members[] = rest::url("item", $child);
+ if (isset($types)) {
+ if (in_array($item->type, $types)) {
+ $items[] = items_rest::_format_restful_item($item);
}
- $item_rest["members"] = $members;
+ } else {
+ $items[] = items_rest::_format_restful_item($item);
}
- $items[] = $item_rest;
}
}
+ } else if (isset($request->params->ancestors_for)) {
+ $item = rest::resolve($request->params->ancestors_for);
+ if (!access::can("view", $item)) {
+ throw new Kohana_404_Exception();
+ }
+ $items[] = items_rest::_format_restful_item($item);
+ while (($item = $item->parent()) != null) {
+ array_unshift($items, items_rest::_format_restful_item($item));
+ };
}
return $items;
}
+
+ static function resolve($id) {
+ $item = ORM::factory("item", $id);
+ if (!access::can("view", $item)) {
+ throw new Kohana_404_Exception();
+ }
+ return $item;
+ }
+
+ private static function _format_restful_item($item) {
+ $item_rest = array("url" => rest::url("item", $item),
+ "entity" => $item->as_restful_array(),
+ "relationships" => rest::relationships("item", $item));
+ if ($item->type == "album") {
+ $members = array();
+ foreach ($item->children() as $child) {
+ $members[] = rest::url("item", $child);
+ }
+ $item_rest["members"] = $members;
+ }
+
+ return $item_rest;
+ }
}
diff --git a/modules/gallery/helpers/message.php b/modules/gallery/helpers/message.php
index 047eb2c7..1f69e2a9 100644
--- a/modules/gallery/helpers/message.php
+++ b/modules/gallery/helpers/message.php
@@ -78,6 +78,7 @@ class message_Core {
$messages = Session::instance()->get_once("messages", array());
foreach ($messages as $msg) {
+ $msg[0] = str_replace("__CSRF__", access::csrf_token(), $msg[0]);
$buf[] = "<li class=\"" . self::severity_class($msg[1]) . "\">$msg[0]</li>";
}
if ($buf) {
diff --git a/modules/gallery/helpers/module.php b/modules/gallery/helpers/module.php
index 18d65ed5..5134c7b3 100644
--- a/modules/gallery/helpers/module.php
+++ b/modules/gallery/helpers/module.php
@@ -214,13 +214,6 @@ class module_Core {
throw new Exception("@todo UNKNOWN_MODULE");
}
}
-
- // Now the module is upgraded so deactivate it, but we can'it deactivae gallery or the
- // current identity provider.
- $identity_provider = module::get_var("gallery", "identity_provider", "user");
- if (!in_array($module_name, array("gallery", $identity_provider)) ) {
- self::deactivate($module_name);
- }
module::load_modules();
$version_after = module::get_version($module_name);
diff --git a/modules/gallery/helpers/photo.php b/modules/gallery/helpers/photo.php
index f20d37a3..73cd60c0 100644
--- a/modules/gallery/helpers/photo.php
+++ b/modules/gallery/helpers/photo.php
@@ -26,7 +26,7 @@
class photo_Core {
static function get_edit_form($photo) {
$form = new Forge("photos/update/$photo->id", "", "post", array("id" => "g-edit-photo-form"));
- $form->hidden("from_id");
+ $form->hidden("from_id")->value($photo->id);
$group = $form->group("edit_item")->label(t("Edit Photo"));
$group->input("title")->label(t("Title"))->value($photo->title)
->error_messages("required", t("You must provide a title"))
diff --git a/modules/gallery/helpers/site_status.php b/modules/gallery/helpers/site_status.php
index 759eb382..13c42dda 100644
--- a/modules/gallery/helpers/site_status.php
+++ b/modules/gallery/helpers/site_status.php
@@ -100,7 +100,7 @@ class site_status_Core {
}
$buf = array();
foreach (ORM::factory("message")->find_all() as $msg) {
- $value = str_replace('__CSRF__', access::csrf_token(), $msg->value);
+ $value = str_replace("__CSRF__", access::csrf_token(), $msg->value);
$buf[] = "<li class=\"" . self::severity_class($msg->severity) . "\">$value</li>";
}
diff --git a/modules/gallery/helpers/theme.php b/modules/gallery/helpers/theme.php
index 980ee11a..3589a5b7 100644
--- a/modules/gallery/helpers/theme.php
+++ b/modules/gallery/helpers/theme.php
@@ -53,13 +53,22 @@ class theme_Core {
if (file_exists(THEMEPATH . self::$site_theme_name . "/admin")) {
array_unshift($modules, THEMEPATH . self::$site_theme_name . "/admin");
}
+ // Admins can override the site theme, temporarily. This lets us preview themes.
+ if (identity::active_user()->admin && $override = $input->get("theme")) {
+ if (file_exists(THEMEPATH . $override)) {
+ self::$admin_theme_name = $override;
+ array_unshift($modules, THEMEPATH . self::$admin_theme_name);
+ } else {
+ Kohana_Log::add("error", "Missing override admin theme: '$override'");
+ }
+ }
} else {
// Admins can override the site theme, temporarily. This lets us preview themes.
if (identity::active_user()->admin && $override = $input->get("theme")) {
if (file_exists(THEMEPATH . $override)) {
self::$site_theme_name = $override;
} else {
- Kohana_Log::add("error", "Missing override theme: '$override'");
+ Kohana_Log::add("error", "Missing override site theme: '$override'");
}
}
array_unshift($modules, THEMEPATH . self::$site_theme_name);
@@ -70,7 +79,7 @@ class theme_Core {
static function get_edit_form_admin() {
$form = new Forge("admin/theme_options/save/", "", null, array("id" =>"g-theme-options-form"));
- $group = $form->group("edit_theme");
+ $group = $form->group("edit_theme")->label(t("Theme layout"));
$group->input("page_size")->label(t("Items per page"))->id("g-page-size")
->rules("required|valid_digit")
->error_messages("required", t("You must enter a number"))
@@ -95,7 +104,8 @@ class theme_Core {
module::event("theme_edit_form", $form);
- $group = $form->group("buttons");
+ $group = $form->group("buttons")
+ ->set_attr("style","border: none");
$group->submit("")->value(t("Save"));
return $form;
}
diff --git a/modules/gallery/hooks/init_gallery.php b/modules/gallery/hooks/init_gallery.php
index 10383e9a..64e44b56 100644
--- a/modules/gallery/hooks/init_gallery.php
+++ b/modules/gallery/hooks/init_gallery.php
@@ -24,6 +24,15 @@ if (!file_exists(VARPATH . "database.php")) {
url::redirect(url::abs_file("installer"));
}
+// Simple and cheap test to make sure that the database config is ok. Do this before we do
+// anything else database related.
+try {
+ Database::instance()->connect();
+} catch (Kohana_PHP_Exception $e) {
+ print "Database configuration error. Please check var/database.php";
+ exit;
+}
+
Event::add("system.ready", array("Gallery_I18n", "instance"));
Event::add("system.ready", array("module", "load_modules"));
Event::add("system.ready", array("gallery", "ready"));
diff --git a/modules/gallery/js/item_form_delete.js b/modules/gallery/js/item_form_delete.js
new file mode 100644
index 00000000..fa3f24a2
--- /dev/null
+++ b/modules/gallery/js/item_form_delete.js
@@ -0,0 +1,5 @@
+$("#g-confirm-delete").submit(
+ function() {
+ $("#g-confirm-delete input[type=submit]").gallery_show_loading();
+ }
+);
diff --git a/modules/gallery/js/l10n_client.js b/modules/gallery/js/l10n_client.js
index a1170e2d..a1b970e7 100644
--- a/modules/gallery/js/l10n_client.js
+++ b/modules/gallery/js/l10n_client.js
@@ -60,25 +60,21 @@ jQuery.extend(Gallery, {
$('#l10n-client').height('22em').removeClass('hidden');
//$('#l10n-client').slideUp();
$('#g-minimize-l10n').text("_");
- /*
- * This CSS clashes with Gallery's CSS, probably due to
- * YUI's grid / floats.
- if(!$.browser.msie) {
- $('body').css('border-bottom', '22em solid #fff');
- }
- */
+ // This CSS clashes with Gallery's CSS, probably due to
+ // YUI's grid / floats.
+ // if(!$.browser.msie) {
+ // $('body').css('border-bottom', '22em solid #fff');
+ // }
$.cookie('Gallery_l10n_client', '1', {expires: 7, path: '/'});
break;
case 0:
$('#l10n-client-string-select, #l10n-client-string-editor, #l10n-client .labels .label').hide();
$('#l10n-client').height('2em').addClass('hidden');
// TODO: Localize this message
- $('#g-minimize-l10n').text(MSG_TRANSLATE_TEXT);
- /*
- if(!$.browser.msie) {
- $('body').css('border-bottom', '0px');
- }
- */
+ $('#g-minimize-l10n').text(MSG_TRANSLATE_TEXT);
+ // if(!$.browser.msie) {
+ // $('body').css('border-bottom', '0px');
+ // }
$.cookie('Gallery_l10n_client', '0', {expires: 7, path: '/'});
break;
}
diff --git a/modules/gallery/libraries/MY_Kohana_Exception.php b/modules/gallery/libraries/MY_Kohana_Exception.php
index e7ebdb1f..72cb2ac0 100644
--- a/modules/gallery/libraries/MY_Kohana_Exception.php
+++ b/modules/gallery/libraries/MY_Kohana_Exception.php
@@ -29,70 +29,6 @@ class Kohana_Exception extends Kohana_Exception_Core {
$e->getTraceAsString());
}
- public static function handle(Exception $e) {
- if ($e instanceof ORM_Validation_Exception) {
- Kohana_Log::add("error", "Validation errors: " . print_r($e->validation->errors(), 1));
- }
- try {
- $user = identity::active_user();
- $try_themed_view = $user && !$user->admin;
- } catch (Exception $e2) {
- $try_themed_view = false;
- }
-
- if ($try_themed_view) {
- try {
- return self::_show_themed_error_page($e);
- } catch (Exception $e3) {
- Kohana_Log::add("error", "Exception in exception handling code: " . self::text($e3));
- return parent::handle($e);
- }
- } else {
- return parent::handle($e);
- }
- }
-
- /**
- * Shows a themed error page.
- * @see Kohana_Exception::handle
- */
- private static function _show_themed_error_page(Exception $e) {
- // Create a text version of the exception
- $error = Kohana_Exception::text($e);
-
- // Add this exception to the log
- Kohana_Log::add('error', $error);
-
- // Manually save logs after exceptions
- Kohana_Log::save();
-
- if (!headers_sent()) {
- if ($e instanceof Kohana_Exception) {
- $e->sendHeaders();
- } else {
- header("HTTP/1.1 500 Internal Server Error");
- }
- }
-
- $view = new Theme_View("page.html", "other", "error");
- if ($e instanceof Kohana_404_Exception) {
- $view->page_title = t("Dang... Page not found!");
- $view->content = new View("error_404.html");
- $user = identity::active_user();
- $view->content->is_guest = $user && $user->guest;
- if ($view->content->is_guest) {
- $view->content->login_form = new View("login_ajax.html");
- $view->content->login_form->form = auth::get_login_form("login/auth_html");
- // Avoid anti-phishing protection by passing the url as session variable.
- Session::instance()->set("continue_url", url::current(true));
- }
- } else {
- $view->page_title = t("Dang... Something went wrong!");
- $view->content = new View("error.html");
- }
- print $view;
- }
-
/**
* @see Kohana_Exception::dump()
*/
diff --git a/modules/gallery/libraries/Theme_View.php b/modules/gallery/libraries/Theme_View.php
index 8b432fb6..6246c6f1 100644
--- a/modules/gallery/libraries/Theme_View.php
+++ b/modules/gallery/libraries/Theme_View.php
@@ -86,9 +86,9 @@ class Theme_View_Core extends Gallery_View {
return $menu->render();
}
- public function site_menu() {
+ public function site_menu($item_css_selector) {
$menu = Menu::factory("root");
- module::event("site_menu", $menu, $this);
+ module::event("site_menu", $menu, $this, $item_css_selector);
return $menu->render();
}
diff --git a/modules/gallery/models/item.php b/modules/gallery/models/item.php
index 7fc37325..4d05e4da 100644
--- a/modules/gallery/models/item.php
+++ b/modules/gallery/models/item.php
@@ -671,10 +671,23 @@ class Item_Model extends ORM_MPTT {
*/
public function movie_img($extra_attrs) {
$v = new View("movieplayer.html");
- $v->attrs = array_merge($extra_attrs,
- array("style" => "display:block;width:{$this->width}px;height:{$this->height}px"));
+ $max_size = module::get_var("gallery", "resize_size", 640);
+ $width = $this->width;
+ $height = $this->height;
+ if ($width > $max_size || $height > $max_size) {
+ if ($width > $height) {
+ $height *= $max_size / $width;
+ $width = $max_size;
+ } else {
+ $width *= $max_size / $height;
+ $height = $max_size;
+ }
+ }
+
+ $v->attrs = array_merge($extra_attrs, array("style" => "width:{$width}px;height:{$height}px",
+ "class" => "g-movie"));
if (empty($v->attrs["id"])) {
- $v->attrs["id"] = "g-movie-id-{$this->id}";
+ $v->attrs["id"] = "g-item-id-{$this->id}";
}
return $v;
}
@@ -944,6 +957,7 @@ class Item_Model extends ORM_MPTT {
$data["resize_url"] = $tmp;
}
$data["thumb_url"] = $this->thumb_url(true);
+ $data["can_edit"] = access::can("edit", $this);
// Elide some internal-only data that is going to cause confusion in the client.
foreach (array("relative_path_cache", "relative_url_cache", "left_ptr", "right_ptr",
diff --git a/modules/gallery/tests/File_Structure_Test.php b/modules/gallery/tests/File_Structure_Test.php
index 39df9f06..96e0b758 100644
--- a/modules/gallery/tests/File_Structure_Test.php
+++ b/modules/gallery/tests/File_Structure_Test.php
@@ -23,13 +23,18 @@ class File_Structure_Test extends Gallery_Unit_Test_Case {
public function no_trailing_closing_php_tag_test() {
$dir = new GalleryCodeFilterIterator(
new RecursiveIteratorIterator(new RecursiveDirectoryIterator(DOCROOT)));
+ $count = 0;
foreach ($dir as $file) {
+ $count++;
if (!preg_match("|\.html\.php$|", $file->getPathname())) {
$this->assert_false(
preg_match('/\?\>\s*$/', file_get_contents($file)),
"{$file->getPathname()} ends in ?>");
}
}
+
+ $this->assert_true($count > 500, "We should have analyzed at least this 500 files");
+ $this->assert_true($count < 1000, "We shouldn't be shipping 1000 files!");
}
public function view_files_correct_suffix_test() {
@@ -42,8 +47,8 @@ class File_Structure_Test extends Gallery_Unit_Test_Case {
if (strpos($file, "views")) {
$this->assert_true(
- preg_match("#/views/.*?(\.html|mrss|txt)\.php$#", $file->getPathname()),
- "{$file->getPathname()} should end in .{html,mrss,txt}.php");
+ preg_match("#/views/.*?\.(html|mrss|txt|json)\.php$#", $file->getPathname()),
+ "{$file->getPathname()} should end in .{html,mrss,txt,json}.php");
}
}
}
diff --git a/modules/gallery/tests/Gallery_Filters.php b/modules/gallery/tests/Gallery_Filters.php
index 4e32553b..052990d5 100644
--- a/modules/gallery/tests/Gallery_Filters.php
+++ b/modules/gallery/tests/Gallery_Filters.php
@@ -28,8 +28,11 @@ class GalleryCodeFilterIterator extends FilterIterator {
public function accept() {
// Skip anything that we didn"t write
$path_name = $this->getInnerIterator()->getPathName();
+ $file_name = $this->getInnerIterator()->getFileName();
return !(
- strpos($path_name, ".svn") ||
+ $file_name == "." ||
+ $file_name == ".." ||
+ strpos($path_name, DOCROOT . ".git") !== false ||
strpos($path_name, DOCROOT . "test") !== false ||
strpos($path_name, DOCROOT . "var") !== false ||
strpos($path_name, MODPATH . "forge") !== false ||
diff --git a/modules/gallery/tests/Item_Helper_Test.php b/modules/gallery/tests/Item_Helper_Test.php
index 4771b11a..eb2458cb 100644
--- a/modules/gallery/tests/Item_Helper_Test.php
+++ b/modules/gallery/tests/Item_Helper_Test.php
@@ -41,6 +41,11 @@ class Item_Helper_Test extends Gallery_Unit_Test_Case {
ORM::factory("item")->viewable()->where("id", "=", $item->id)->count_all());
}
+ public function convert_filename_to_title_test() {
+ $this->assert_equal("foo", item::convert_filename_to_title("foo.jpg"));
+ $this->assert_equal("foo.bar", item::convert_filename_to_title("foo.bar.jpg"));
+ }
+
public function convert_filename_to_slug_test() {
$this->assert_equal("foo", item::convert_filename_to_slug("{[foo]}"));
$this->assert_equal("foo-bar", item::convert_filename_to_slug("{[foo!@#!$@#^$@($!(@bar]}"));
@@ -106,15 +111,18 @@ class Item_Helper_Test extends Gallery_Unit_Test_Case {
$this->assert_not_same($rand, $photo2->slug);
}
- public function delete_cover_photo_picks_new_album_cover() {
- $album = test::random_album();
+ public function delete_cover_photo_picks_new_album_cover_test() {
+ $parent = test::random_album();
+ $album = test::random_album($parent);
$photo1 = test::random_photo($album);
// At this point, $photo1 is the album cover. We verify this in
// Item_Model_Test::first_photo_becomes_album_cover
$photo2 = test::random_photo($album);
$photo1->delete();
$album->reload();
+ $parent->reload();
$this->assert_same($photo2->id, $album->album_cover_item_id);
+ $this->assert_same($photo2->id, $parent->album_cover_item_id);
}
}
diff --git a/modules/gallery/tests/Item_Model_Test.php b/modules/gallery/tests/Item_Model_Test.php
index 15aa2d8c..907cfe24 100644
--- a/modules/gallery/tests/Item_Model_Test.php
+++ b/modules/gallery/tests/Item_Model_Test.php
@@ -18,6 +18,10 @@
* Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA.
*/
class Item_Model_Test extends Gallery_Unit_Test_Case {
+ public function teardown() {
+ identity::set_active_user(identity::admin_user());
+ }
+
public function saving_sets_created_and_updated_dates_test() {
$item = test::random_photo();
$this->assert_true(!empty($item->created));
@@ -364,6 +368,15 @@ class Item_Model_Test extends Gallery_Unit_Test_Case {
$this->assert_true(!array_key_exists("album_cover_item_id", $result));
}
+ public function as_restful_array_with_edit_bit_test() {
+ $response = item::root()->as_restful_array(true);
+ $this->assert_true($response["can_edit"]);
+
+ identity::set_active_user(identity::guest());
+ $response = item::root()->as_restful_array(true);
+ $this->assert_false($response["can_edit"]);
+ }
+
public function first_photo_becomes_album_cover() {
$album = test::random_album();
$photo = test::random_photo($album);
diff --git a/modules/gallery/tests/Item_Rest_Helper_Test.php b/modules/gallery/tests/Item_Rest_Helper_Test.php
index 0b5e0471..a2ab534b 100644
--- a/modules/gallery/tests/Item_Rest_Helper_Test.php
+++ b/modules/gallery/tests/Item_Rest_Helper_Test.php
@@ -43,6 +43,8 @@ class Item_Rest_Helper_Test extends Gallery_Unit_Test_Case {
array("url" => rest::url("item", $album1),
"entity" => $album1->as_restful_array(),
"relationships" => array(
+ "comments" => array(
+ "url" => rest::url("item_comments", $album1)),
"tags" => array(
"url" => rest::url("item_tags", $album1),
"members" => array())),
@@ -58,6 +60,8 @@ class Item_Rest_Helper_Test extends Gallery_Unit_Test_Case {
array("url" => rest::url("item", $album1),
"entity" => $album1->as_restful_array(),
"relationships" => array(
+ "comments" => array(
+ "url" => rest::url("item_comments", $album1)),
"tags" => array(
"url" => rest::url("item_tags", $album1),
"members" => array())),
@@ -73,6 +77,8 @@ class Item_Rest_Helper_Test extends Gallery_Unit_Test_Case {
array("url" => rest::url("item", $album1),
"entity" => $album1->as_restful_array(),
"relationships" => array(
+ "comments" => array(
+ "url" => rest::url("item_comments", $album1)),
"tags" => array(
"url" => rest::url("item_tags", $album1),
"members" => array())),
@@ -100,6 +106,8 @@ class Item_Rest_Helper_Test extends Gallery_Unit_Test_Case {
array("url" => rest::url("item", $album1),
"entity" => $album1->as_restful_array(),
"relationships" => array(
+ "comments" => array(
+ "url" => rest::url("item_comments", $album1)),
"tags" => array(
"url" => rest::url("item_tags", $album1),
"members" => array())),
@@ -123,6 +131,8 @@ class Item_Rest_Helper_Test extends Gallery_Unit_Test_Case {
array("url" => rest::url("item", $album1),
"entity" => $album1->as_restful_array(),
"relationships" => array(
+ "comments" => array(
+ "url" => rest::url("item_comments", $album1)),
"tags" => array(
"url" => rest::url("item_tags", $album1),
"members" => array())),
diff --git a/modules/gallery/tests/Items_Rest_Helper_Test.php b/modules/gallery/tests/Items_Rest_Helper_Test.php
new file mode 100644
index 00000000..8e53110a
--- /dev/null
+++ b/modules/gallery/tests/Items_Rest_Helper_Test.php
@@ -0,0 +1,206 @@
+<?php defined("SYSPATH") or die("No direct script access.");
+/**
+ * Gallery - a web based photo album viewer and editor
+ * Copyright (C) 2000-2010 Bharat Mediratta
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+class Items_Rest_Helper_Test extends Gallery_Unit_Test_Case {
+ public function get_url_test() {
+ $album1 = test::random_album();
+ $photo1 = test::random_photo($album1);
+ $album2 = test::random_album($album1);
+ $photo2 = test::random_photo($album2);
+ $album1->reload();
+ $album2->reload();
+
+ $request = new stdClass();
+ $request->params = new stdClass();
+ $request->params->urls = json_encode(array(
+ rest::url("item", $photo1),
+ rest::url("item", $album2)));
+ $this->assert_equal_array(
+ array(
+ array("url" => rest::url("item", $photo1),
+ "entity" => $photo1->as_restful_array(),
+ "relationships" => array(
+ "comments" => array(
+ "url" => rest::url("item_comments", $photo1)),
+ "tags" => array(
+ "url" => rest::url("item_tags", $photo1),
+ "members" => array()))),
+ array("url" => rest::url("item", $album2),
+ "entity" => $album2->as_restful_array(),
+ "relationships" => array(
+ "comments" => array(
+ "url" => rest::url("item_comments", $album2)),
+ "tags" => array(
+ "url" => rest::url("item_tags", $album2),
+ "members" => array())),
+ "members" => array(
+ rest::url("item", $photo2)))),
+ items_rest::get($request));
+ }
+
+ public function get_url_filter_album_test() {
+ $album1 = test::random_album();
+ $photo1 = test::random_photo($album1);
+ $album2 = test::random_album($album1);
+ $photo2 = test::random_photo($album2);
+ $album1->reload();
+ $album2->reload();
+
+ $request = new stdClass();
+ $request->params = new stdClass();
+ $request->params->urls = json_encode(array(
+ rest::url("item", $photo1),
+ rest::url("item", $album2)));
+ $request->params->type = "album";
+ $this->assert_equal_array(
+ array(
+ array("url" => rest::url("item", $album2),
+ "entity" => $album2->as_restful_array(),
+ "relationships" => array(
+ "comments" => array(
+ "url" => rest::url("item_comments", $album2)),
+ "tags" => array(
+ "url" => rest::url("item_tags", $album2),
+ "members" => array())),
+ "members" => array(
+ rest::url("item", $photo2)))),
+ items_rest::get($request));
+ }
+
+ public function get_url_filter_photo_test() {
+ $album1 = test::random_album();
+ $photo1 = test::random_photo($album1);
+ $album2 = test::random_album($album1);
+ $photo2 = test::random_photo($album2);
+ $album1->reload();
+ $album2->reload();
+
+ $request = new stdClass();
+ $request->params = new stdClass();
+ $request->params->urls = json_encode(array(
+ rest::url("item", $photo1),
+ rest::url("item", $album2)));
+ $request->params->type = "photo";
+ $this->assert_equal_array(
+ array(
+ array("url" => rest::url("item", $photo1),
+ "entity" => $photo1->as_restful_array(),
+ "relationships" => array(
+ "comments" => array(
+ "url" => rest::url("item_comments", $photo1)),
+ "tags" => array(
+ "url" => rest::url("item_tags", $photo1),
+ "members" => array())))),
+ items_rest::get($request));
+ }
+
+ public function get_url_filter_albums_photos_test() {
+ $album1 = test::random_album();
+ $photo1 = test::random_photo($album1);
+ $album2 = test::random_album($album1);
+ $photo2 = test::random_photo($album2);
+ $album1->reload();
+ $album2->reload();
+
+ $request = new stdClass();
+ $request->params = new stdClass();
+ $request->params->urls = json_encode(array(
+ rest::url("item", $photo1),
+ rest::url("item", $album2)));
+ $request->params->type = "photo,album";
+ $this->assert_equal_array(
+ array(
+ array("url" => rest::url("item", $photo1),
+ "entity" => $photo1->as_restful_array(),
+ "relationships" => array(
+ "comments" => array(
+ "url" => rest::url("item_comments", $photo1)),
+ "tags" => array(
+ "url" => rest::url("item_tags", $photo1),
+ "members" => array()))),
+ array("url" => rest::url("item", $album2),
+ "entity" => $album2->as_restful_array(),
+ "relationships" => array(
+ "comments" => array(
+ "url" => rest::url("item_comments", $album2)),
+ "tags" => array(
+ "url" => rest::url("item_tags", $album2),
+ "members" => array())),
+ "members" => array(
+ rest::url("item", $photo2)))),
+ items_rest::get($request));
+ }
+
+ public function get_ancestors_test() {
+ $album1 = test::random_album();
+ $photo1 = test::random_photo($album1);
+ $album2 = test::random_album($album1);
+ $photo2 = test::random_photo($album2);
+ $album1->reload();
+ $album2->reload();
+
+ $root = ORM::factory("item", 1);
+ $restful_root = array(
+ "url" => rest::url("item", $root),
+ "entity" => $root->as_restful_array(),
+ "relationships" => rest::relationships("item", $root));
+ $restful_root["members"] = array();
+ foreach ($root->children() as $child) {
+ $restful_root["members"][] = rest::url("item", $child);
+ }
+
+ $request = new stdClass();
+ $request->params = new stdClass();
+ $request->params->ancestors_for = rest::url("item", $photo2);
+ $this->assert_equal_array(
+ array(
+ $restful_root,
+ array("url" => rest::url("item", $album1),
+ "entity" => $album1->as_restful_array(),
+ "relationships" => array(
+ "comments" => array(
+ "url" => rest::url("item_comments", $album1)),
+ "tags" => array(
+ "url" => rest::url("item_tags", $album1),
+ "members" => array())),
+ "members" => array(
+ rest::url("item", $photo1),
+ rest::url("item", $album2)),
+ ),
+ array("url" => rest::url("item", $album2),
+ "entity" => $album2->as_restful_array(),
+ "relationships" => array(
+ "comments" => array(
+ "url" => rest::url("item_comments", $album2)),
+ "tags" => array(
+ "url" => rest::url("item_tags", $album2),
+ "members" => array())),
+ "members" => array(
+ rest::url("item", $photo2))),
+ array("url" => rest::url("item", $photo2),
+ "entity" => $photo2->as_restful_array(),
+ "relationships" => array(
+ "comments" => array(
+ "url" => rest::url("item_comments", $photo2)),
+ "tags" => array(
+ "url" => rest::url("item_tags", $photo2),
+ "members" => array())))),
+ items_rest::get($request));
+ }
+}
diff --git a/modules/gallery/tests/controller_auth_data.txt b/modules/gallery/tests/controller_auth_data.txt
index 0aa26057..f7ceed90 100644
--- a/modules/gallery/tests/controller_auth_data.txt
+++ b/modules/gallery/tests/controller_auth_data.txt
@@ -1,4 +1,4 @@
-modules/comment/controllers/admin_comments.php queue DIRTY_CSRF
+modules/comment/controllers/admin_manage_comments.php queue DIRTY_CSRF
modules/comment/helpers/comment_rss.php feed DIRTY_AUTH
modules/digibug/controllers/digibug.php print_proxy DIRTY_CSRF|DIRTY_AUTH
modules/digibug/controllers/digibug.php close_window DIRTY_AUTH
@@ -9,6 +9,8 @@ modules/gallery/controllers/albums.php show
modules/gallery/controllers/combined.php javascript DIRTY_AUTH
modules/gallery/controllers/combined.php css DIRTY_AUTH
modules/gallery/controllers/file_proxy.php __call DIRTY_CSRF|DIRTY_AUTH
+modules/gallery/controllers/flash_uploader.php start DIRTY_AUTH
+modules/gallery/controllers/flash_uploader.php finish DIRTY_AUTH
modules/gallery/controllers/login.php ajax DIRTY_AUTH
modules/gallery/controllers/login.php auth_ajax DIRTY_AUTH
modules/gallery/controllers/login.php html DIRTY_AUTH
@@ -16,13 +18,13 @@ modules/gallery/controllers/login.php auth_html
modules/gallery/controllers/logout.php index DIRTY_AUTH
modules/gallery/controllers/maintenance.php index DIRTY_AUTH
modules/gallery/controllers/quick.php form_edit DIRTY_CSRF
-modules/gallery/controllers/simple_uploader.php start DIRTY_AUTH
-modules/gallery/controllers/simple_uploader.php finish DIRTY_AUTH
modules/gallery/controllers/upgrader.php index DIRTY_AUTH
modules/gallery/controllers/user_profile.php show DIRTY_AUTH
modules/gallery/controllers/user_profile.php contact DIRTY_AUTH
modules/gallery/controllers/user_profile.php send DIRTY_AUTH
modules/gallery/controllers/welcome_message.php index DIRTY_AUTH
+modules/organize/controllers/organize.php dialog DIRTY_CSRF
+modules/organize/controllers/organize.php add_album_fields DIRTY_AUTH
modules/rest/controllers/rest.php index DIRTY_CSRF|DIRTY_AUTH
modules/rest/controllers/rest.php __call DIRTY_CSRF|DIRTY_AUTH
modules/rss/controllers/rss.php feed DIRTY_CSRF|DIRTY_AUTH
diff --git a/modules/gallery/tests/xss_data.txt b/modules/gallery/tests/xss_data.txt
index afad9e13..26edaebc 100644
--- a/modules/gallery/tests/xss_data.txt
+++ b/modules/gallery/tests/xss_data.txt
@@ -4,21 +4,22 @@ modules/akismet/views/admin_akismet_stats.html.php 9 DIRTY_ATTR urle
modules/comment/views/admin_block_recent_comments.html.php 4 DIRTY_ATTR text::alternate("g-even","g-odd")
modules/comment/views/admin_block_recent_comments.html.php 5 DIRTY_ATTR $comment->author()->avatar_url(32,$theme->url(,true))
modules/comment/views/admin_block_recent_comments.html.php 10 DIRTY gallery::date_time($comment->created)
-modules/comment/views/admin_comments.html.php 43 DIRTY $menu->render()
-modules/comment/views/admin_comments.html.php 107 DIRTY_ATTR $comment->id
-modules/comment/views/admin_comments.html.php 107 DIRTY_ATTR text::alternate("g-odd","g-even")
-modules/comment/views/admin_comments.html.php 110 DIRTY_ATTR $comment->author()->avatar_url(40,$theme->url(,true))
-modules/comment/views/admin_comments.html.php 123 DIRTY_JS $item->url()
-modules/comment/views/admin_comments.html.php 125 DIRTY_ATTR $item->thumb_url()
-modules/comment/views/admin_comments.html.php 127 DIRTY photo::img_dimensions($item->thumb_width,$item->thumb_height,75)
-modules/comment/views/admin_comments.html.php 135 DIRTY gallery::date($comment->created)
-modules/comment/views/admin_comments.html.php 142 DIRTY_JS $comment->id
-modules/comment/views/admin_comments.html.php 151 DIRTY_JS $comment->id
-modules/comment/views/admin_comments.html.php 160 DIRTY_JS $comment->id
-modules/comment/views/admin_comments.html.php 169 DIRTY_JS $comment->id
-modules/comment/views/admin_comments.html.php 176 DIRTY_JS $comment->id
-modules/comment/views/admin_comments.html.php 184 DIRTY_JS $comment->id
-modules/comment/views/admin_comments.html.php 197 DIRTY $pager
+modules/comment/views/admin_comments.html.php 5 DIRTY $form
+modules/comment/views/admin_manage_comments.html.php 43 DIRTY $menu->render()
+modules/comment/views/admin_manage_comments.html.php 107 DIRTY_ATTR $comment->id
+modules/comment/views/admin_manage_comments.html.php 107 DIRTY_ATTR text::alternate("g-odd","g-even")
+modules/comment/views/admin_manage_comments.html.php 110 DIRTY_ATTR $comment->author()->avatar_url(40,$theme->url(,true))
+modules/comment/views/admin_manage_comments.html.php 123 DIRTY_JS $item->url()
+modules/comment/views/admin_manage_comments.html.php 125 DIRTY_ATTR $item->thumb_url()
+modules/comment/views/admin_manage_comments.html.php 127 DIRTY photo::img_dimensions($item->thumb_width,$item->thumb_height,75)
+modules/comment/views/admin_manage_comments.html.php 135 DIRTY gallery::date($comment->created)
+modules/comment/views/admin_manage_comments.html.php 142 DIRTY_JS $comment->id
+modules/comment/views/admin_manage_comments.html.php 151 DIRTY_JS $comment->id
+modules/comment/views/admin_manage_comments.html.php 160 DIRTY_JS $comment->id
+modules/comment/views/admin_manage_comments.html.php 169 DIRTY_JS $comment->id
+modules/comment/views/admin_manage_comments.html.php 176 DIRTY_JS $comment->id
+modules/comment/views/admin_manage_comments.html.php 184 DIRTY_JS $comment->id
+modules/comment/views/admin_manage_comments.html.php 197 DIRTY $pager
modules/comment/views/comment.html.php 2 DIRTY_ATTR $comment->id;
modules/comment/views/comment.html.php 5 DIRTY_ATTR $comment->author()->avatar_url(40,$theme->url(,true))
modules/comment/views/comment.mrss.php 10 DIRTY $feed->uri
@@ -27,13 +28,13 @@ modules/comment/views/comment.mrss.php 16 DIRTY_JS $feed-
modules/comment/views/comment.mrss.php 19 DIRTY_JS $feed->next_page_uri
modules/comment/views/comment.mrss.php 21 DIRTY $pub_date
modules/comment/views/comment.mrss.php 22 DIRTY $pub_date
-modules/comment/views/comment.mrss.php 28 DIRTY $child->item_uri
-modules/comment/views/comment.mrss.php 29 DIRTY $child->pub_date
-modules/comment/views/comment.mrss.php 34 DIRTY_ATTR $child->thumb_url
-modules/comment/views/comment.mrss.php 35 DIRTY_ATTR $child->thumb_height
-modules/comment/views/comment.mrss.php 35 DIRTY_ATTR $child->thumb_width
-modules/comment/views/comments.html.php 18 DIRTY_ATTR $comment->id
-modules/comment/views/comments.html.php 21 DIRTY_ATTR $comment->author()->avatar_url(40,$theme->url(,true))
+modules/comment/views/comment.mrss.php 28 DIRTY $comment->item_uri
+modules/comment/views/comment.mrss.php 29 DIRTY $comment->pub_date
+modules/comment/views/comment.mrss.php 34 DIRTY_ATTR $comment->thumb_url
+modules/comment/views/comment.mrss.php 35 DIRTY_ATTR $comment->thumb_height
+modules/comment/views/comment.mrss.php 35 DIRTY_ATTR $comment->thumb_width
+modules/comment/views/comments.html.php 28 DIRTY_ATTR $comment->id
+modules/comment/views/comments.html.php 31 DIRTY_ATTR $comment->author()->avatar_url(40,$theme->url(,true))
modules/comment/views/user_profile_comments.html.php 5 DIRTY_ATTR $comment->id
modules/comment/views/user_profile_comments.html.php 10 DIRTY_JS $comment->item()->url()
modules/comment/views/user_profile_comments.html.php 11 DIRTY $comment->item()->thumb_img(array(),50)
@@ -108,7 +109,7 @@ modules/gallery/views/admin_sidebar.html.php 50 DIRTY $avail
modules/gallery/views/admin_sidebar.html.php 58 DIRTY $active
modules/gallery/views/admin_sidebar_blocks.html.php 4 DIRTY_ATTR $ref
modules/gallery/views/admin_sidebar_blocks.html.php 4 DIRTY $text
-modules/gallery/views/admin_theme_options.html.php 6 DIRTY $form
+modules/gallery/views/admin_theme_options.html.php 36 DIRTY $form
modules/gallery/views/admin_themes.html.php 3 DIRTY_JS url::site("admin/themes/choose")
modules/gallery/views/admin_themes.html.php 5 DIRTY_JS $csrf
modules/gallery/views/admin_themes.html.php 22 DIRTY $themes[$site]->name
@@ -119,10 +120,54 @@ modules/gallery/views/admin_themes.html.php 60 DIRTY $theme
modules/gallery/views/admin_themes.html.php 62 DIRTY $themes[$admin]->description
modules/gallery/views/admin_themes.html.php 76 DIRTY $info->name
modules/gallery/views/admin_themes.html.php 78 DIRTY $info->description
-modules/gallery/views/admin_themes_preview.html.php 7 DIRTY_ATTR $url
+modules/gallery/views/admin_themes_preview.html.php 8 DIRTY_ATTR $url
modules/gallery/views/error_404.html.php 14 DIRTY $login_form
+modules/gallery/views/error_admin.html.php 150 DIRTY $type
+modules/gallery/views/error_admin.html.php 150 DIRTY $code
+modules/gallery/views/error_admin.html.php 153 DIRTY $message
+modules/gallery/views/error_admin.html.php 156 DIRTY_ATTR $error_id
+modules/gallery/views/error_admin.html.php 161 DIRTY Kohana_Exception::debug_path($file)
+modules/gallery/views/error_admin.html.php 161 DIRTY $line
+modules/gallery/views/error_admin.html.php 166 DIRTY_ATTR ($num==$line)?"highlight":""
+modules/gallery/views/error_admin.html.php 166 DIRTY $num
+modules/gallery/views/error_admin.html.php 166 DIRTY htmlspecialchars($row,ENT_NOQUOTES,Kohana::CHARSET)
+modules/gallery/views/error_admin.html.php 178 DIRTY_ATTR $source_id
+modules/gallery/views/error_admin.html.php 178 DIRTY_JS $source_id
+modules/gallery/views/error_admin.html.php 178 DIRTY Kohana_Exception::debug_path($step["file"])
+modules/gallery/views/error_admin.html.php 178 DIRTY $step["line"]
+modules/gallery/views/error_admin.html.php 180 DIRTY Kohana_Exception::debug_path($step["file"])
+modules/gallery/views/error_admin.html.php 180 DIRTY $step["line"]
+modules/gallery/views/error_admin.html.php 187 DIRTY $step["function"]
+modules/gallery/views/error_admin.html.php 188 DIRTY_ATTR $args_id
+modules/gallery/views/error_admin.html.php 188 DIRTY_JS $args_id
+modules/gallery/views/error_admin.html.php 192 DIRTY_ATTR $args_id
+modules/gallery/views/error_admin.html.php 197 DIRTY $name
+modules/gallery/views/error_admin.html.php 200 DIRTY Kohana_Exception::safe_dump($arg,$name)
+modules/gallery/views/error_admin.html.php 208 DIRTY_ATTR $source_id
+modules/gallery/views/error_admin.html.php 208 DIRTY_ATTR ($num==$step["line"])?"highlight":""
+modules/gallery/views/error_admin.html.php 208 DIRTY $num
+modules/gallery/views/error_admin.html.php 208 DIRTY htmlspecialchars($row,ENT_NOQUOTES,Kohana::CHARSET)
+modules/gallery/views/error_admin.html.php 218 DIRTY_ATTR $env_id=$error_id."environment"
+modules/gallery/views/error_admin.html.php 218 DIRTY_JS $env_id
+modules/gallery/views/error_admin.html.php 220 DIRTY_ATTR $env_id
+modules/gallery/views/error_admin.html.php 222 DIRTY_ATTR $env_id=$error_id."environment_included"
+modules/gallery/views/error_admin.html.php 222 DIRTY_JS $env_id
+modules/gallery/views/error_admin.html.php 222 DIRTY count($included)
+modules/gallery/views/error_admin.html.php 223 DIRTY_ATTR $env_id
+modules/gallery/views/error_admin.html.php 228 DIRTY Kohana_Exception::debug_path($file)
+modules/gallery/views/error_admin.html.php 235 DIRTY_ATTR $env_id=$error_id."environment_loaded"
+modules/gallery/views/error_admin.html.php 235 DIRTY_JS $env_id
+modules/gallery/views/error_admin.html.php 235 DIRTY count($included)
+modules/gallery/views/error_admin.html.php 236 DIRTY_ATTR $env_id
+modules/gallery/views/error_admin.html.php 241 DIRTY Kohana_Exception::debug_path($file)
+modules/gallery/views/error_admin.html.php 249 DIRTY_ATTR $env_id="$error_id.environment".strtolower($var)
+modules/gallery/views/error_admin.html.php 250 DIRTY_JS $env_id
+modules/gallery/views/error_admin.html.php 250 DIRTY $var
+modules/gallery/views/error_admin.html.php 251 DIRTY_ATTR $env_id
+modules/gallery/views/error_admin.html.php 257 DIRTY $key
+modules/gallery/views/error_admin.html.php 261 DIRTY Kohana_Exception::safe_dump($value,$key)
modules/gallery/views/form_uploadify.html.php 9 DIRTY_JS url::file("lib/uploadify/uploadify.swf")
-modules/gallery/views/form_uploadify.html.php 10 DIRTY_JS url::site("simple_uploader/add_photo/{$album->id}")
+modules/gallery/views/form_uploadify.html.php 10 DIRTY_JS url::site("flash_uploader/add_photo/{$album->id}")
modules/gallery/views/form_uploadify.html.php 14 DIRTY_JS url::file("lib/uploadify/cancel.png")
modules/gallery/views/form_uploadify.html.php 15 DIRTY_JS $simultaneous_upload_limit
modules/gallery/views/in_place_edit.html.php 2 DIRTY form::open($action,array("method"=>"post","id"=>"g-in-place-edit-form","class"=>"g-short-form"))
@@ -145,7 +190,7 @@ modules/gallery/views/l10n_client.html.php 58 DIRTY form::
modules/gallery/views/l10n_client.html.php 62 DIRTY form::textarea("l10n-edit-plural-translation-many","",' rows="2"')
modules/gallery/views/l10n_client.html.php 67 DIRTY form::textarea("l10n-edit-plural-translation-other","",' rows="2"')
modules/gallery/views/login_ajax.html.php 6 DIRTY_JS url::site("password/reset")
-modules/gallery/views/login_ajax.html.php 37 DIRTY $form
+modules/gallery/views/login_ajax.html.php 44 DIRTY $form
modules/gallery/views/maintenance.html.php 46 DIRTY auth::get_login_form("login/auth_html")
modules/gallery/views/menu.html.php 4 DIRTY $menu->css_id?"id='$menu->css_id'":""
modules/gallery/views/menu.html.php 4 DIRTY_ATTR $menu->css_class
@@ -175,7 +220,7 @@ modules/gallery/views/move_tree.html.php 15 DIRTY_JS $child
modules/gallery/views/movieplayer.html.php 2 DIRTY html::anchor($item->file_url(true),"",$attrs)
modules/gallery/views/movieplayer.html.php 5 DIRTY_JS $attrs["id"]
modules/gallery/views/movieplayer.html.php 7 DIRTY_JS url::abs_file("lib/flowplayer.swf")
-modules/gallery/views/movieplayer.html.php 13 DIRTY_JS url::abs_file("lib/flowplayer.h264streaming.swf")
+modules/gallery/views/movieplayer.html.php 14 DIRTY_JS url::abs_file("lib/flowplayer.pseudostreaming.swf")
modules/gallery/views/permissions_browse.html.php 3 DIRTY_JS url::site("permissions/form/__ITEM__")
modules/gallery/views/permissions_browse.html.php 16 DIRTY_JS url::site("permissions/change/__CMD__/__GROUP__/__PERM__/__ITEM__?csrf=$csrf")
modules/gallery/views/permissions_browse.html.php 43 DIRTY_ATTR $parent->id
@@ -234,27 +279,16 @@ modules/notification/views/item_updated.html.php 20 DIRTY_JS $item-
modules/notification/views/item_updated.html.php 20 DIRTY $item->abs_url()
modules/notification/views/user_profile_notification.html.php 5 DIRTY_ATTR $subscription->id
modules/notification/views/user_profile_notification.html.php 6 DIRTY_JS $subscription->url
-modules/organize/views/organize_dialog.html.php 3 DIRTY_JS url::site("organize/move_to/__ALBUM_ID__?csrf=$csrf")
-modules/organize/views/organize_dialog.html.php 4 DIRTY_JS url::site("organize/rearrange/__TARGET_ID__/__BEFORE__?csrf=$csrf")
-modules/organize/views/organize_dialog.html.php 5 DIRTY_JS url::site("organize/sort_order/__ALBUM_ID__/__COL__/__DIR__?csrf=$csrf")
-modules/organize/views/organize_dialog.html.php 6 DIRTY_JS url::site("organize/tree/__ALBUM_ID__")
-modules/organize/views/organize_dialog.html.php 14 DIRTY $album_tree
-modules/organize/views/organize_dialog.html.php 23 DIRTY $micro_thumb_grid
-modules/organize/views/organize_dialog.html.php 32 DIRTY form::dropdown(array("id"=>"g-organize-sort-column"),album::get_sort_order_options(),$album->sort_column)
-modules/organize/views/organize_thumb_grid.html.php 3 DIRTY_ATTR $child->is_album()?"g-album":"g-photo"
-modules/organize/views/organize_thumb_grid.html.php 4 DIRTY_ATTR $child->id
-modules/organize/views/organize_thumb_grid.html.php 5 DIRTY $child->thumb_img(array("class"=>"g-thumbnail","ref"=>$child->id),90,true)
-modules/organize/views/organize_thumb_grid.html.php 6 DIRTY $child->is_album()?" class=\"ui-icon ui-icon-note\"":""
-modules/organize/views/organize_thumb_grid.html.php 13 DIRTY_JS url::site("organize/album/$album->id/".($offset+25))
-modules/organize/views/organize_tree.html.php 2 DIRTY_ATTR access::can("edit",$album)?"":"g-view-only"
-modules/organize/views/organize_tree.html.php 3 DIRTY_ATTR $album->id
-modules/organize/views/organize_tree.html.php 6 DIRTY_ATTR $selected&&$album->id==$selected->id?"ui-state-focus":""
-modules/organize/views/organize_tree.html.php 7 DIRTY_ATTR $album->id
-modules/organize/views/organize_tree.html.php 15 DIRTY View::factory("organize_tree.html",array("selected"=>$selected,"album"=>$child));
-modules/organize/views/organize_tree.html.php 17 DIRTY_ATTR access::can("edit",$child)?"":"g-view-only"
-modules/organize/views/organize_tree.html.php 18 DIRTY_ATTR $child->id
-modules/organize/views/organize_tree.html.php 20 DIRTY_ATTR $selected&&$child->id==$selected->id?"ui-state-focus":""
-modules/organize/views/organize_tree.html.php 20 DIRTY_ATTR $child->id
+modules/organize/views/organize_dialog.html.php 90 DIRTY_JS $domain
+modules/organize/views/organize_dialog.html.php 91 DIRTY_JS $access_key
+modules/organize/views/organize_dialog.html.php 92 DIRTY_JS request::protocol()
+modules/organize/views/organize_dialog.html.php 93 DIRTY_JS $file_filter
+modules/organize/views/organize_dialog.html.php 94 DIRTY_JS $sort_order
+modules/organize/views/organize_dialog.html.php 95 DIRTY_JS $sort_fields
+modules/organize/views/organize_dialog.html.php 96 DIRTY_JS $album->id
+modules/organize/views/organize_dialog.html.php 97 DIRTY_JS $rest_uri
+modules/organize/views/organize_dialog.html.php 98 DIRTY_JS $controller_uri
+modules/organize/views/organize_dialog.html.php 122 DIRTY_JS $swf_uri
modules/recaptcha/views/admin_recaptcha.html.php 11 DIRTY $form
modules/recaptcha/views/admin_recaptcha.html.php 23 DIRTY_JS $public_key
modules/recaptcha/views/form_recaptcha.html.php 7 DIRTY_JS $public_key
@@ -264,26 +298,26 @@ modules/rss/views/feed.mrss.php 16 DIRTY_JS $feed-
modules/rss/views/feed.mrss.php 19 DIRTY_JS $feed->next_page_uri
modules/rss/views/feed.mrss.php 21 DIRTY $pub_date
modules/rss/views/feed.mrss.php 22 DIRTY $pub_date
-modules/rss/views/feed.mrss.php 28 DIRTY date("D, d M Y H:i:s T",$child->created);
-modules/rss/views/feed.mrss.php 35 DIRTY_ATTR $child->resize_url(true)
-modules/rss/views/feed.mrss.php 37 DIRTY_ATTR $child->resize_height
-modules/rss/views/feed.mrss.php 37 DIRTY_ATTR $child->resize_width
-modules/rss/views/feed.mrss.php 40 DIRTY_ATTR $child->thumb_url(true)
-modules/rss/views/feed.mrss.php 42 DIRTY_ATTR $child->thumb_height
-modules/rss/views/feed.mrss.php 42 DIRTY_ATTR $child->thumb_width
-modules/rss/views/feed.mrss.php 48 DIRTY_ATTR $child->thumb_url(true)
-modules/rss/views/feed.mrss.php 49 DIRTY_ATTR $child->thumb_height
-modules/rss/views/feed.mrss.php 50 DIRTY_ATTR $child->thumb_width
-modules/rss/views/feed.mrss.php 57 DIRTY_ATTR $child->resize_url(true)
-modules/rss/views/feed.mrss.php 58 DIRTY_ATTR @filesize($child->resize_path())
-modules/rss/views/feed.mrss.php 59 DIRTY_ATTR $child->mime_type
-modules/rss/views/feed.mrss.php 60 DIRTY_ATTR $child->resize_height
-modules/rss/views/feed.mrss.php 61 DIRTY_ATTR $child->resize_width
-modules/rss/views/feed.mrss.php 65 DIRTY_ATTR $child->file_url(true)
-modules/rss/views/feed.mrss.php 66 DIRTY_ATTR @filesize($child->file_path())
-modules/rss/views/feed.mrss.php 67 DIRTY_ATTR $child->mime_type
-modules/rss/views/feed.mrss.php 68 DIRTY_ATTR $child->height
-modules/rss/views/feed.mrss.php 69 DIRTY_ATTR $child->width
+modules/rss/views/feed.mrss.php 28 DIRTY date("D, d M Y H:i:s T",$item->created);
+modules/rss/views/feed.mrss.php 35 DIRTY_ATTR $item->resize_url(true)
+modules/rss/views/feed.mrss.php 37 DIRTY_ATTR $item->resize_height
+modules/rss/views/feed.mrss.php 37 DIRTY_ATTR $item->resize_width
+modules/rss/views/feed.mrss.php 40 DIRTY_ATTR $item->thumb_url(true)
+modules/rss/views/feed.mrss.php 42 DIRTY_ATTR $item->thumb_height
+modules/rss/views/feed.mrss.php 42 DIRTY_ATTR $item->thumb_width
+modules/rss/views/feed.mrss.php 48 DIRTY_ATTR $item->thumb_url(true)
+modules/rss/views/feed.mrss.php 49 DIRTY_ATTR $item->thumb_height
+modules/rss/views/feed.mrss.php 50 DIRTY_ATTR $item->thumb_width
+modules/rss/views/feed.mrss.php 57 DIRTY_ATTR $item->resize_url(true)
+modules/rss/views/feed.mrss.php 58 DIRTY_ATTR @filesize($item->resize_path())
+modules/rss/views/feed.mrss.php 59 DIRTY_ATTR $item->mime_type
+modules/rss/views/feed.mrss.php 60 DIRTY_ATTR $item->resize_height
+modules/rss/views/feed.mrss.php 61 DIRTY_ATTR $item->resize_width
+modules/rss/views/feed.mrss.php 65 DIRTY_ATTR $item->file_url(true)
+modules/rss/views/feed.mrss.php 66 DIRTY_ATTR @filesize($item->file_path())
+modules/rss/views/feed.mrss.php 67 DIRTY_ATTR $item->mime_type
+modules/rss/views/feed.mrss.php 68 DIRTY_ATTR $item->height
+modules/rss/views/feed.mrss.php 69 DIRTY_ATTR $item->width
modules/rss/views/rss_block.html.php 6 DIRTY_JS rss::url($url)
modules/search/views/search.html.php 27 DIRTY_ATTR $item_class
modules/search/views/search.html.php 28 DIRTY_JS $item->url()
@@ -320,20 +354,19 @@ modules/user/views/admin_users_group.html.php 24 DIRTY_JS $group
modules/watermark/views/admin_watermarks.html.php 20 DIRTY_ATTR $width
modules/watermark/views/admin_watermarks.html.php 20 DIRTY_ATTR $height
modules/watermark/views/admin_watermarks.html.php 20 DIRTY_ATTR $url
-themes/admin_wind/views/admin.html.php 9 DIRTY $page_title
themes/admin_wind/views/admin.html.php 22 DIRTY_JS $theme->url()
themes/admin_wind/views/admin.html.php 39 DIRTY $theme->admin_head()
themes/admin_wind/views/admin.html.php 43 DIRTY $theme->admin_page_top()
themes/admin_wind/views/admin.html.php 51 DIRTY $theme->admin_header_top()
themes/admin_wind/views/admin.html.php 52 DIRTY_JS item::root()->url()
themes/admin_wind/views/admin.html.php 55 DIRTY $theme->user_menu()
-themes/admin_wind/views/admin.html.php 57 DIRTY $theme->admin_menu()
-themes/admin_wind/views/admin.html.php 59 DIRTY $theme->admin_header_bottom()
-themes/admin_wind/views/admin.html.php 66 DIRTY $content
-themes/admin_wind/views/admin.html.php 72 DIRTY $sidebar
-themes/admin_wind/views/admin.html.php 77 DIRTY $theme->admin_footer()
-themes/admin_wind/views/admin.html.php 79 DIRTY $theme->admin_credits()
-themes/admin_wind/views/admin.html.php 83 DIRTY $theme->admin_page_bottom()
+themes/admin_wind/views/admin.html.php 58 DIRTY $theme->admin_menu()
+themes/admin_wind/views/admin.html.php 61 DIRTY $theme->admin_header_bottom()
+themes/admin_wind/views/admin.html.php 68 DIRTY $content
+themes/admin_wind/views/admin.html.php 74 DIRTY $sidebar
+themes/admin_wind/views/admin.html.php 79 DIRTY $theme->admin_footer()
+themes/admin_wind/views/admin.html.php 81 DIRTY $theme->admin_credits()
+themes/admin_wind/views/admin.html.php 85 DIRTY $theme->admin_page_bottom()
themes/admin_wind/views/block.html.php 3 DIRTY_ATTR $anchor
themes/admin_wind/views/block.html.php 5 DIRTY $id
themes/admin_wind/views/block.html.php 5 DIRTY_ATTR $css_id
@@ -363,7 +396,7 @@ themes/wind/views/dynamic.html.php 16 DIRTY_ATTR $chi
themes/wind/views/dynamic.html.php 17 DIRTY_ATTR $child->thumb_height
themes/wind/views/dynamic.html.php 29 DIRTY $theme->paginator()
themes/wind/views/movie.html.php 5 DIRTY $theme->paginator()
-themes/wind/views/movie.html.php 8 DIRTY $item->movie_img(array("class"=>"g-movie","id"=>"g-movie-id-{$item->id}"))
+themes/wind/views/movie.html.php 9 DIRTY $item->movie_img(array("class"=>"g-movie","id"=>"g-item-id-{$item->id}"))
themes/wind/views/page.html.php 9 DIRTY $page_title
themes/wind/views/page.html.php 33 DIRTY_JS $theme->url()
themes/wind/views/page.html.php 42 DIRTY $new_width
@@ -373,9 +406,9 @@ themes/wind/views/page.html.php 81 DIRTY $heade
themes/wind/views/page.html.php 83 DIRTY_JS item::root()->url()
themes/wind/views/page.html.php 87 DIRTY $theme->user_menu()
themes/wind/views/page.html.php 108 DIRTY_JS $parent->url($parent==$theme->item()->parent()?"show={$theme->item()->id}":null)
-themes/wind/views/page.html.php 124 DIRTY $content
-themes/wind/views/page.html.php 130 DIRTY newView("sidebar.html")
-themes/wind/views/page.html.php 137 DIRTY $footer_text
+themes/wind/views/page.html.php 126 DIRTY $content
+themes/wind/views/page.html.php 132 DIRTY newView("sidebar.html")
+themes/wind/views/page.html.php 139 DIRTY $footer_text
themes/wind/views/paginator.html.php 33 DIRTY_JS $first_page_url
themes/wind/views/paginator.html.php 42 DIRTY_JS $previous_page_url
themes/wind/views/paginator.html.php 70 DIRTY_JS $next_page_url
@@ -384,4 +417,4 @@ themes/wind/views/photo.html.php 8 DIRTY_JS $theme
themes/wind/views/photo.html.php 8 DIRTY_JS $theme->item()->height
themes/wind/views/photo.html.php 18 DIRTY $theme->paginator()
themes/wind/views/photo.html.php 23 DIRTY_JS $item->file_url()
-themes/wind/views/photo.html.php 25 DIRTY $item->resize_img(array("id"=>"g-photo-id-{$item->id}","class"=>"g-resize"))
+themes/wind/views/photo.html.php 25 DIRTY $item->resize_img(array("id"=>"g-item-id-{$item->id}","class"=>"g-resize"))
diff --git a/modules/gallery/views/admin_modules.html.php b/modules/gallery/views/admin_modules.html.php
index c5015e68..4d6fe5f0 100644
--- a/modules/gallery/views/admin_modules.html.php
+++ b/modules/gallery/views/admin_modules.html.php
@@ -52,7 +52,7 @@
<table>
<tr>
<th> <?= t("Installed") ?> </th>
- <th> <?= t("Name") ?> </th>
+ <th style="width: 8em"> <?= t("Name") ?> </th>
<th> <?= t("Version") ?> </th>
<th> <?= t("Description") ?> </th>
</tr>
diff --git a/modules/gallery/views/admin_theme_options.html.php b/modules/gallery/views/admin_theme_options.html.php
index a4bf1c4e..b4a90682 100644
--- a/modules/gallery/views/admin_theme_options.html.php
+++ b/modules/gallery/views/admin_theme_options.html.php
@@ -1,7 +1,37 @@
<?php defined("SYSPATH") or die("No direct script access.") ?>
-<div class="g-block">
- <h1> <?= t("Theme Options") ?> </h1>
+<script type="text/javascript">
+ $("#g-theme-options-form").ready(function() {
+ var contents = $("#g-theme-options-form fieldset:not(:last-child)");
+ if (contents.length > 1) {
+ $("<div id='g-theme-options-form-tabs'>" +
+ " <ul class='tabnav'></ul>" +
+ "</div>").insertBefore("#g-theme-options-form fieldset:last-child");
+ $(contents).each(function(index) {
+ var text = $("legend", this).text();
+ var tabId = "tab_" + index;
+ var tabContentId = "tab_content_" + index;
+ if (text == "") {
+ text = <?= t("Tab_")->for_js() ?> + index;
+ }
+ $(".tabnav").append(
+ "<li><a id='" + tabId + "' href='#" + tabContentId + "'>" + text + "</a></li>");
+ $("#g-theme-options-form-tabs").append(
+ "<div id='" + tabContentId + "' class='tabdiv'></div>");
+ if ($("li.g-error", this).length > 0) {
+ $("#" + tabId).addClass("g-error");
+ }
+ $("#" + tabContentId).append($("ul", this));
+ $(this).remove();
+ });
+ $("#g-theme-options-form-tabs").tabs({});
+ } else {
+ $("#g-theme-options-form fieldset:first legend").hide();
+ }
+ });
+</script>
+<div class="g-block">
+ <h1> <?= t("Theme options") ?> </h1>
<div class="g-block-content">
<?= $form ?>
</div>
diff --git a/modules/gallery/views/admin_themes_preview.html.php b/modules/gallery/views/admin_themes_preview.html.php
index a7aea172..80a6158b 100644
--- a/modules/gallery/views/admin_themes_preview.html.php
+++ b/modules/gallery/views/admin_themes_preview.html.php
@@ -1,4 +1,5 @@
<?php defined("SYSPATH") or die("No direct script access.") ?>
+<h1><?= t("Preview of the %theme_name theme", array("theme_name" => $info->name)) ?></h1>
<p>
<a href="<?= url::site("admin/themes/choose/$type/$theme_name?csrf=$csrf") ?>">
<?= t("Activate <strong>%theme_name</strong>", array("theme_name" => $info->name)) ?>
diff --git a/modules/gallery/views/error_404.html.php b/modules/gallery/views/error_404.html.php
index 4b037a79..42f62b6c 100644
--- a/modules/gallery/views/error_404.html.php
+++ b/modules/gallery/views/error_404.html.php
@@ -12,10 +12,15 @@
<?= t("Please sign in to find out.") ?>
</p>
<?= $login_form ?>
+ <script type="text/javascript">
+ $(document).ready(function() {
+ $("#g-username").focus();
+ });
+ </script>
<? else: ?>
<p>
<?= t("Maybe the page exists, but is only visible to authorized users.") ?>
<?= t("If you think this is an error, talk to your Gallery administrator!") ?>
</p>
<? endif; ?>
-</div> \ No newline at end of file
+</div>
diff --git a/modules/gallery/views/error_admin.html.php b/modules/gallery/views/error_admin.html.php
new file mode 100644
index 00000000..40eb7374
--- /dev/null
+++ b/modules/gallery/views/error_admin.html.php
@@ -0,0 +1,272 @@
+<?php defined("SYSPATH") or die("No direct script access.") ?>
+<? $error_id = uniqid("error") ?>
+<? if (!function_exists("t")) { function t($msg) { return $msg; } } ?>
+<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
+ <head>
+ <style type="text/css">
+ body {
+ background: #fff;
+ font-size: 14px;
+ line-height: 130%;
+ }
+
+ div.big_box {
+ padding: 10px;
+ background: #eee;
+ border: solid 1px #ccc;
+ font-family: sans-serif;
+ color: #111;
+ width: 60em;
+ margin: 20px auto;
+ }
+
+ div#framework_error {
+ text-align: center;
+ }
+
+ div#error_details {
+ text-align: left;
+ }
+
+ code {
+ font-family: monospace;
+ font-size: 12px;
+ margin: 20px 20px 20px 0px;
+ color: #333;
+ white-space: pre-wrap;
+ white-space: -moz-pre-wrap;
+ word-wrap: break-word;
+ }
+
+ code .line {
+ padding-left: 10px;
+ }
+
+ h3 {
+ font-family: sans-serif;
+ margin: 2px 0px 0px 0px;
+ padding: 8px 0px 0px 0px;
+ border-top: 1px solid #ddd;
+ }
+
+ p {
+ padding: 0px;
+ margin: 0px 0px 10px 0px;
+ }
+
+ li, pre {
+ padding: 0px;
+ margin: 0px;
+ }
+
+ .collapsed {
+ display: none;
+ }
+
+ .highlight {
+ font-weight: bold;
+ color: darkred;
+ }
+
+ #kohana_error .message {
+ display: block;
+ padding-bottom: 10px;
+ }
+
+ .source {
+ border: solid 1px #ccc;
+ background: #efe;
+ margin-bottom: 5px;
+ }
+
+ table {
+ width: 100%;
+ display: block;
+ margin: 0 0 0.4em;
+ padding: 0;
+ border-collapse: collapse;
+ background: #efe;
+ }
+
+ table td {
+ border: solid 1px #ddd;
+ text-align: left;
+ vertical-align: top;
+ padding: 0.4em;
+ }
+
+ .args table td.key {
+ width: 200px;
+ }
+
+ .number {
+ padding-right: 1em;
+ }
+ </style>
+ <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
+ <title><?= t("Something went wrong!") ?></title>
+
+ <script type="text/javascript">
+ function koggle(elem) {
+ elem = document.getElementById(elem);
+ if (elem.style && elem.style["display"]) {
+ // Only works with the "style" attr
+ var disp = elem.style["display"];
+ } else {
+ if (elem.currentStyle) {
+ // For MSIE, naturally
+ var disp = elem.currentStyle["display"];
+ } else {
+ if (window.getComputedStyle) {
+ // For most other browsers
+ var disp = document.defaultView.getComputedStyle(elem, null).getPropertyValue('display');
+ }
+ }
+ }
+
+ // Toggle the state of the "display" style
+ elem.style.display = disp == 'block' ? 'none' : 'block';
+ return false;
+ }
+ </script>
+ </head>
+ <body>
+ <? try { $user = identity::active_user(); } catch (Exception $e) { } ?>
+ <div class="big_box" id="framework_error">
+ <h1>
+ <?= t("Dang... Something went wrong!") ?>
+ </h1>
+ <h2>
+ <?= t("We tried really hard, but it's broken.") ?>
+ </h2>
+ </div>
+ <div class="big_box" id="error_details">
+ <h2>
+ <?= t("Hey wait, you're an admin! We can tell you stuff.") ?>
+ </h2>
+ <div id="kohana_error">
+ <h3>
+ <span class="type">
+ <?= $type?> [ <?= $code ?> ]:
+ </span>
+ <span class="message">
+ <?= $message?>
+ </span>
+ </h3>
+ <div id="<?= $error_id ?>" class="content">
+ <ol class="trace">
+ <li class="snippet">
+ <p>
+ <span class="file">
+ <?= Kohana_Exception::debug_path($file)?>[ <?= $line?> ]
+ </span>
+ </p>
+
+ <div class="source">
+ <? if (Kohana_Exception::$source_output and $source_code = Kohana_Exception::debug_source($file, $line)): ?><code><? foreach ($source_code as $num => $row): ?><span class="line <?= ($num == $line) ? "highlight" : ""?>"><span class="number"><?= $num ?></span><?= htmlspecialchars($row, ENT_NOQUOTES, Kohana::CHARSET) ?></span><? endforeach ?></code>
+ <? endif ?>
+ </div>
+ </li>
+
+ <? if (Kohana_Exception::$trace_output): ?>
+ <? foreach (Kohana_Exception::trace($trace) as $i => $step): ?>
+ <li class="snippet">
+ <p>
+ <span class="file">
+ <? if ($step["file"]): $source_id = "$error_id.source.$i" ?>
+ <? if (Kohana_Exception::$source_output and $step["source"]): ?>
+ <a href="#<?= $source_id ?>" onclick="return koggle('<?= $source_id ?>')"><?= Kohana_Exception::debug_path($step["file"])?>[ <?= $step["line"]?> ]</a>
+ <? else: ?>
+ <span class="file"><?= Kohana_Exception::debug_path($step["file"])?>[ <?= $step["line"]?> ]</span>
+ <? endif ?>
+ <? else: ?>
+ {<?= t("PHP internal call")?>}
+ <? endif?>
+ </span>
+ &raquo;
+ <?= $step["function"]?>(<? if ($step["args"]): $args_id = "$error_id.args.$i" ?>
+ <a href="#<?= $args_id ?>" onclick="return koggle('<?= $args_id ?>')"><?= t("arguments")?></a>
+ <? endif?>)
+ </p>
+ <? if (isset($args_id)): ?>
+ <div id="<?= $args_id ?>" class="args collapsed">
+ <table cellspacing="0">
+ <? foreach ($step["args"] as $name => $arg): ?>
+ <tr>
+ <td class="key">
+ <pre><?= $name?></pre>
+ </td>
+ <td class="value">
+ <pre><?= Kohana_Exception::safe_dump($arg, $name) ?></pre>
+ </td>
+ </tr>
+ <? endforeach?>
+ </table>
+ </div>
+ <? endif?>
+ <? if (Kohana_Exception::$source_output and $step["source"] and isset($source_id)): ?>
+ <pre id="<?= $source_id ?>" class="source collapsed"><code><? foreach ($step["source"] as $num => $row): ?><span class="line <?= ($num == $step["line"]) ? "highlight" : "" ?>"><span class="number"><?= $num ?></span><?= htmlspecialchars($row, ENT_NOQUOTES, Kohana::CHARSET) ?></span><? endforeach ?></code></pre>
+ <? endif?>
+ </li>
+ <? unset($args_id, $source_id) ?>
+ <? endforeach?>
+ </ol>
+ <? endif ?>
+
+ </div>
+ <h2>
+ <a href="#<?= $env_id = $error_id."environment" ?>" onclick="return koggle('<?= $env_id ?>')"><?= t("Environment")?></a>
+ </h2>
+ <div id="<?= $env_id ?>" class="content collapsed">
+ <? $included = get_included_files()?>
+ <h3><a href="#<?= $env_id = $error_id."environment_included" ?>" onclick="return koggle('<?= $env_id ?>')"><?= t("Included files")?></a>(<?= count($included)?>)</h3>
+ <div id="<?= $env_id ?>" class="collapsed">
+ <table cellspacing="0">
+ <? foreach ($included as $file): ?>
+ <tr>
+ <td>
+ <pre><?= Kohana_Exception::debug_path($file)?></pre>
+ </td>
+ </tr>
+ <? endforeach?>
+ </table>
+ </div>
+ <? $included = get_loaded_extensions()?>
+ <h3><a href="#<?= $env_id = $error_id."environment_loaded" ?>" onclick="return koggle('<?= $env_id ?>')"><?= t("Loaded extensions")?></a>(<?= count($included)?>)</h3>
+ <div id="<?= $env_id ?>" class="collapsed">
+ <table cellspacing="0">
+ <? foreach ($included as $file): ?>
+ <tr>
+ <td>
+ <pre><?= Kohana_Exception::debug_path($file)?></pre>
+ </td>
+ </tr>
+ <? endforeach?>
+ </table>
+ </div>
+ <? foreach (array("_SESSION", "_GET", "_POST", "_FILES", "_COOKIE", "_SERVER") as $var): ?>
+ <? if ( empty($GLOBALS[$var]) OR ! is_array($GLOBALS[$var])) continue ?>
+ <h3><a href="#<?= $env_id = "$error_id.environment" . strtolower($var) ?>"
+ onclick="return koggle('<?= $env_id ?>')">$<?= $var?></a></h3>
+ <div id="<?= $env_id ?>" class="collapsed">
+ <table cellspacing="0">
+ <? foreach ($GLOBALS[$var] as $key => $value): ?>
+ <tr>
+ <td class="key">
+ <code>
+ <?= $key?>
+ </code>
+ </td>
+ <td class="value">
+ <pre><?= Kohana_Exception::safe_dump($value, $key) ?></pre>
+ </td>
+ </tr>
+ <? endforeach?>
+ </table>
+ </div>
+ <? endforeach?>
+ </div>
+ </div>
+ </div>
+ </body>
+</html>
diff --git a/modules/gallery/views/error_cli.txt.php b/modules/gallery/views/error_cli.txt.php
new file mode 100644
index 00000000..9f476f54
--- /dev/null
+++ b/modules/gallery/views/error_cli.txt.php
@@ -0,0 +1,3 @@
+<?php defined("SYSPATH") or die("No direct script access.") ?>
+<? echo Kohana_Exception::text($e), "\n";
+
diff --git a/modules/gallery/views/error_user.html.php b/modules/gallery/views/error_user.html.php
new file mode 100644
index 00000000..74c6a8fb
--- /dev/null
+++ b/modules/gallery/views/error_user.html.php
@@ -0,0 +1,42 @@
+<?php defined("SYSPATH") or die("No direct script access.") ?>
+<? if (!function_exists("t")) { function t($msg) { return $msg; } } ?>
+<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
+ <head>
+ <style type="text/css">
+ body {
+ background: #fff;
+ font-size: 14px;
+ line-height: 130%;
+ }
+
+ div.big_box {
+ padding: 10px;
+ background: #eee;
+ border: solid 1px #ccc;
+ font-family: sans-serif;
+ color: #111;
+ width: 60em;
+ margin: 20px auto;
+ }
+
+ div#framework_error {
+ text-align: center;
+ }
+ </style>
+ <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
+ <title><?= t("Something went wrong!") ?></title>
+ </head>
+ <body>
+ <div class="big_box" id="framework_error">
+ <h1>
+ <?= t("Dang... Something went wrong!") ?>
+ </h1>
+ <h2>
+ <?= t("We tried really hard, but it's broken.") ?>
+ </h2>
+ <p>
+ <?= t("Talk to your Gallery administrator for help fixing this!") ?>
+ </p>
+ </div>
+ </body>
+</html>
diff --git a/modules/gallery/views/form_uploadify.html.php b/modules/gallery/views/form_uploadify.html.php
index d811f913..588fa16d 100644
--- a/modules/gallery/views/form_uploadify.html.php
+++ b/modules/gallery/views/form_uploadify.html.php
@@ -7,7 +7,7 @@
width: 150,
height: 33,
uploader: "<?= url::file("lib/uploadify/uploadify.swf") ?>",
- script: "<?= url::site("simple_uploader/add_photo/{$album->id}") ?>",
+ script: "<?= url::site("flash_uploader/add_photo/{$album->id}") ?>",
scriptData: <?= json_encode($script_data) ?>,
fileExt: "*.gif;*.jpg;*.jpeg;*.png;*.flv;*.mp4;*.GIF;*.JPG;*.JPEG;*.PNG;*.FLV;*.MP4",
fileDesc: <?= t("Photos and movies")->for_js() ?>,
diff --git a/modules/gallery/views/kohana/error.php b/modules/gallery/views/kohana/error.php
index d55105a0..cc9d2e84 100644
--- a/modules/gallery/views/kohana/error.php
+++ b/modules/gallery/views/kohana/error.php
@@ -1,280 +1,42 @@
<?php defined("SYSPATH") or die("No direct script access.") ?>
-<? $error_id = uniqid("error") ?>
-<? if (!function_exists("t")) { function t($msg) { return $msg; } } ?>
-<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
- <head>
- <style type="text/css">
- body {
- background: #fff;
- font-size: 14px;
- line-height: 130%;
- }
-
- div.big_box {
- padding: 10px;
- background: #eee;
- border: solid 1px #ccc;
- font-family: sans-serif;
- color: #111;
- width: 60em;
- margin: 20px auto;
- }
-
- div#framework_error {
- text-align: center;
- }
-
- div#error_details {
- text-align: left;
- }
-
- code {
- font-family: monospace;
- font-size: 12px;
- margin: 20px 20px 20px 0px;
- color: #333;
- white-space: pre-wrap;
- white-space: -moz-pre-wrap;
- word-wrap: break-word;
- }
-
- code .line {
- padding-left: 10px;
- }
-
- h3 {
- font-family: sans-serif;
- margin: 2px 0px 0px 0px;
- padding: 8px 0px 0px 0px;
- border-top: 1px solid #ddd;
- }
-
- p {
- padding: 0px;
- margin: 0px 0px 10px 0px;
- }
-
- li, pre {
- padding: 0px;
- margin: 0px;
- }
-
- .collapsed {
- display: none;
- }
-
- .highlight {
- font-weight: bold;
- color: darkred;
- }
-
- #kohana_error .message {
- display: block;
- padding-bottom: 10px;
- }
-
- .source {
- border: solid 1px #ccc;
- background: #efe;
- margin-bottom: 5px;
- }
-
- table {
- width: 100%;
- display: block;
- margin: 0 0 0.4em;
- padding: 0;
- border-collapse: collapse;
- background: #efe;
- }
-
- table td {
- border: solid 1px #ddd;
- text-align: left;
- vertical-align: top;
- padding: 0.4em;
- }
-
- .args table td.key {
- width: 200px;
- }
-
- .number {
- padding-right: 1em;
- }
- </style>
- <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
- <title><?= t("Something went wrong!") ?></title>
-
- <script type="text/javascript">
- function koggle(elem) {
- elem = document.getElementById(elem);
- if (elem.style && elem.style["display"]) {
- // Only works with the "style" attr
- var disp = elem.style["display"];
- } else {
- if (elem.currentStyle) {
- // For MSIE, naturally
- var disp = elem.currentStyle["display"];
- } else {
- if (window.getComputedStyle) {
- // For most other browsers
- var disp = document.defaultView.getComputedStyle(elem, null).getPropertyValue('display');
- }
- }
- }
-
- // Toggle the state of the "display" style
- elem.style.display = disp == 'block' ? 'none' : 'block';
- return false;
- }
- </script>
- </head>
- <body>
- <? try { $user = identity::active_user(); } catch (Exception $e) { } ?>
- <? $admin = php_sapi_name() == "cli" || (class_exists("User_Model") && isset($user) && $user->admin) ?>
- <div class="big_box" id="framework_error">
- <h1>
- <?= t("Dang... Something went wrong!") ?>
- </h1>
- <h2>
- <?= t("We tried really hard, but it's broken.") ?>
- </h2>
- <? if (!$admin): ?>
- <p>
- <?= t("Talk to your Gallery administrator for help fixing this!") ?>
- </p>
- <? endif ?>
- </div>
- <? if ($admin): ?>
- <div class="big_box" id="error_details">
- <h2>
- <?= t("Hey wait, you're an admin! We can tell you stuff.") ?>
- </h2>
- <div id="kohana_error">
- <h3>
- <span class="type">
- <?= $type?> [ <?= $code ?> ]:
- </span>
- <span class="message">
- <?= $message?>
- </span>
- </h3>
- <div id="<?= $error_id ?>" class="content">
- <ol class="trace">
- <li class="snippet">
- <p>
- <span class="file">
- <?= Kohana_Exception::debug_path($file)?>[ <?= $line?> ]
- </span>
- </p>
-
- <div class="source">
- <? if (Kohana_Exception::$source_output and $source_code = Kohana_Exception::debug_source($file, $line)): ?><code><? foreach ($source_code as $num => $row): ?><span class="line <?= ($num == $line) ? "highlight" : ""?>"><span class="number"><?= $num ?></span><?= htmlspecialchars($row, ENT_NOQUOTES, Kohana::CHARSET) ?></span><? endforeach ?></code>
- <? endif ?>
- </div>
- </li>
-
- <? if (Kohana_Exception::$trace_output): ?>
- <? foreach (Kohana_Exception::trace($trace) as $i => $step): ?>
- <li class="snippet">
- <p>
- <span class="file">
- <? if ($step["file"]): $source_id = "$error_id.source.$i" ?>
- <? if (Kohana_Exception::$source_output and $step["source"]): ?>
- <a href="#<?= $source_id ?>" onclick="return koggle('<?= $source_id ?>')"><?= Kohana_Exception::debug_path($step["file"])?>[ <?= $step["line"]?> ]</a>
- <? else: ?>
- <span class="file"><?= Kohana_Exception::debug_path($step["file"])?>[ <?= $step["line"]?> ]</span>
- <? endif ?>
- <? else: ?>
- {<?= t("PHP internal call")?>}
- <? endif?>
- </span>
- &raquo;
- <?= $step["function"]?>(<? if ($step["args"]): $args_id = "$error_id.args.$i" ?>
- <a href="#<?= $args_id ?>" onclick="return koggle('<?= $args_id ?>')"><?= t("arguments")?></a>
- <? endif?>)
- </p>
- <? if (isset($args_id)): ?>
- <div id="<?= $args_id ?>" class="args collapsed">
- <table cellspacing="0">
- <? foreach ($step["args"] as $name => $arg): ?>
- <tr>
- <td class="key">
- <pre><?= $name?></pre>
- </td>
- <td class="value">
- <pre><?= Kohana_Exception::safe_dump($arg, $name) ?></pre>
- </td>
- </tr>
- <? endforeach?>
- </table>
- </div>
- <? endif?>
- <? if (Kohana_Exception::$source_output and $step["source"] and isset($source_id)): ?>
- <pre id="<?= $source_id ?>" class="source collapsed"><code><? foreach ($step["source"] as $num => $row): ?><span class="line <?= ($num == $step["line"]) ? "highlight" : "" ?>"><span class="number"><?= $num ?></span><?= htmlspecialchars($row, ENT_NOQUOTES, Kohana::CHARSET) ?></span><? endforeach ?></code></pre>
- <? endif?>
- </li>
- <? unset($args_id, $source_id) ?>
- <? endforeach?>
- </ol>
- <? endif ?>
-
- </div>
- <h2>
- <a href="#<?= $env_id = $error_id."environment" ?>" onclick="return koggle('<?= $env_id ?>')"><?= t("Environment")?></a>
- </h2>
- <div id="<?= $env_id ?>" class="content collapsed">
- <? $included = get_included_files()?>
- <h3><a href="#<?= $env_id = $error_id."environment_included" ?>" onclick="return koggle('<?= $env_id ?>')"><?= t("Included files")?></a>(<?= count($included)?>)</h3>
- <div id="<?= $env_id ?>" class="collapsed">
- <table cellspacing="0">
- <? foreach ($included as $file): ?>
- <tr>
- <td>
- <pre><?= Kohana_Exception::debug_path($file)?></pre>
- </td>
- </tr>
- <? endforeach?>
- </table>
- </div>
- <? $included = get_loaded_extensions()?>
- <h3><a href="#<?= $env_id = $error_id."environment_loaded" ?>" onclick="return koggle('<?= $env_id ?>')"><?= t("Loaded extensions")?></a>(<?= count($included)?>)</h3>
- <div id="<?= $env_id ?>" class="collapsed">
- <table cellspacing="0">
- <? foreach ($included as $file): ?>
- <tr>
- <td>
- <pre><?= Kohana_Exception::debug_path($file)?></pre>
- </td>
- </tr>
- <? endforeach?>
- </table>
- </div>
- <? foreach (array("_SESSION", "_GET", "_POST", "_FILES", "_COOKIE", "_SERVER") as $var): ?>
- <? if ( empty($GLOBALS[$var]) OR ! is_array($GLOBALS[$var])) continue ?>
- <h3><a href="#<?= $env_id = "$error_id.environment" . strtolower($var) ?>"
- onclick="return koggle('<?= $env_id ?>')">$<?= $var?></a></h3>
- <div id="<?= $env_id ?>" class="collapsed">
- <table cellspacing="0">
- <? foreach ($GLOBALS[$var] as $key => $value): ?>
- <tr>
- <td class="key">
- <code>
- <?= $key?>
- </code>
- </td>
- <td class="value">
- <pre><?= Kohana_Exception::safe_dump($value, $key) ?></pre>
- </td>
- </tr>
- <? endforeach?>
- </table>
- </div>
- <? endforeach?>
- </div>
- </div>
- </div>
- <? endif ?>
- </body>
-</html>
+<?
+// This is the template for all HTML errors. If you're throwing an exception and you want your
+// error to appear differently, extend Kohana_Exception and specify a different template.
+
+// Log validation exceptions to ease debugging
+if ($e instanceof ORM_Validation_Exception) {
+ Kohana_Log::add("error", "Validation errors: " . print_r($e->validation->errors(), 1));
+}
+
+if (php_sapi_name() == "cli") {
+ include Kohana::find_file("views", "error_cli.txt");
+ return;
+}
+
+try {
+ // Admins get a special error page
+ $user = identity::active_user();
+ if ($user && $user->admin) {
+ include Kohana::find_file("views", "error_admin.html");
+ return;
+ }
+} catch (Exception $ignored) {
+}
+
+// Try to show a themed error page for 404 errors
+if ($e instanceof Kohana_404_Exception) {
+ $view = new Theme_View("page.html", "other", "error");
+ $view->page_title = t("Dang... Page not found!");
+ $view->content = new View("error_404.html");
+ $user = identity::active_user();
+ $view->content->is_guest = $user && $user->guest;
+ if ($view->content->is_guest) {
+ $view->content->login_form = new View("login_ajax.html");
+ $view->content->login_form->form = auth::get_login_form("login/auth_html");
+ }
+ print $view;
+ return;
+}
+
+header("HTTP/1.1 500 Internal Server Error");
+include Kohana::find_file("views", "error_user.html");
diff --git a/modules/gallery/views/login_ajax.html.php b/modules/gallery/views/login_ajax.html.php
index 36647f9d..88fe2389 100644
--- a/modules/gallery/views/login_ajax.html.php
+++ b/modules/gallery/views/login_ajax.html.php
@@ -10,9 +10,16 @@
$(".submit").addClass("g-button ui-state-default ui-corner-all");
$(".submit").gallery_hover_init();
ajaxify_login_reset_form();
+
+ // See comment about IE7 below
+ setTimeout('$("#g-name").focus()', 100);
}
});
});
+
+ // Setting the focus here doesn't work on IE7, perhaps because the field is
+ // not ready yet? So set a timeout and do it the next time we're idle
+ setTimeout('$("#g-username").focus()', 100);
});
function ajaxify_login_reset_form() {