summaryrefslogtreecommitdiff
path: root/modules/gallery/helpers
diff options
context:
space:
mode:
Diffstat (limited to 'modules/gallery/helpers')
-rw-r--r--modules/gallery/helpers/MY_html.php6
-rw-r--r--modules/gallery/helpers/MY_remote.php5
-rw-r--r--modules/gallery/helpers/access.php64
-rw-r--r--modules/gallery/helpers/auth.php4
-rw-r--r--modules/gallery/helpers/block_manager.php20
-rw-r--r--modules/gallery/helpers/gallery.php16
-rw-r--r--modules/gallery/helpers/gallery_block.php8
-rw-r--r--modules/gallery/helpers/gallery_installer.php7
-rw-r--r--modules/gallery/helpers/gallery_task.php14
-rw-r--r--modules/gallery/helpers/gallery_theme.php6
-rw-r--r--modules/gallery/helpers/graphics.php8
-rw-r--r--modules/gallery/helpers/identity.php5
-rw-r--r--modules/gallery/helpers/item.php8
-rw-r--r--modules/gallery/helpers/item_rest.php11
-rw-r--r--modules/gallery/helpers/items_rest.php43
-rw-r--r--modules/gallery/helpers/l10n_client.php14
-rw-r--r--modules/gallery/helpers/locales.php10
-rw-r--r--modules/gallery/helpers/log.php16
-rw-r--r--modules/gallery/helpers/message.php18
-rw-r--r--modules/gallery/helpers/module.php91
-rw-r--r--modules/gallery/helpers/movie.php4
-rw-r--r--modules/gallery/helpers/site_status.php10
22 files changed, 208 insertions, 180 deletions
diff --git a/modules/gallery/helpers/MY_html.php b/modules/gallery/helpers/MY_html.php
index cf130401..d15bd816 100644
--- a/modules/gallery/helpers/MY_html.php
+++ b/modules/gallery/helpers/MY_html.php
@@ -26,7 +26,7 @@ class html extends html_Core {
* unescaped HTML which is assumed to be safe.
*
* Example:<pre>
- * <div><?= html::clean($php_var) ?>
+ * <div><?= html::clean($php_var) ?>
* </pre>
*/
static function clean($html) {
@@ -39,7 +39,7 @@ class html extends html_Core {
* only non-malicious HTML.
*
* Example:<pre>
- * <div><?= html::purify($item->title) ?>
+ * <div><?= html::purify($item->title) ?>
* </pre>
*/
static function purify($html) {
@@ -86,6 +86,6 @@ class html extends html_Core {
* @return the string escaped for use in HTML attributes.
*/
static function clean_attribute($string) {
- return self::clean($string)->for_html_attr();
+ return html::clean($string)->for_html_attr();
}
}
diff --git a/modules/gallery/helpers/MY_remote.php b/modules/gallery/helpers/MY_remote.php
index 3e13ba8d..a1d2a3d1 100644
--- a/modules/gallery/helpers/MY_remote.php
+++ b/modules/gallery/helpers/MY_remote.php
@@ -24,7 +24,7 @@ class remote extends remote_Core {
/* Read the web page into a buffer */
list ($response_status, $response_headers, $response_body) =
- self::do_request($url, 'POST', $extra_headers, $post_data_raw);
+ remote::do_request($url, 'POST', $extra_headers, $post_data_raw);
return array($response_body, $response_status, $response_headers);
}
@@ -63,6 +63,9 @@ class remote extends remote_Core {
* WebHelper_simple::_parseLocation logic.
*/
static function do_request($url, $method='GET', $headers=array(), $body='') {
+ if (!array_key_exists("User-Agent", $headers)) {
+ $headers["User-Agent"] = "Gallery3";
+ }
/* Convert illegal characters */
$url = str_replace(' ', '%20', $url);
diff --git a/modules/gallery/helpers/access.php b/modules/gallery/helpers/access.php
index 52a36298..0b0dcbc1 100644
--- a/modules/gallery/helpers/access.php
+++ b/modules/gallery/helpers/access.php
@@ -79,7 +79,7 @@ class access_Core {
* @return boolean
*/
static function can($perm_name, $item) {
- return self::user_can(identity::active_user(), $perm_name, $item);
+ return access::user_can(identity::active_user(), $perm_name, $item);
}
/**
@@ -102,7 +102,7 @@ class access_Core {
$resource = $perm_name == "view" ?
$item : model_cache::get("access_cache", $item->id, "item_id");
foreach ($user->groups() as $group) {
- if ($resource->__get("{$perm_name}_{$group->id}") === self::ALLOW) {
+ if ($resource->__get("{$perm_name}_{$group->id}") === access::ALLOW) {
return true;
}
}
@@ -117,12 +117,12 @@ class access_Core {
* @return boolean
*/
static function required($perm_name, $item) {
- if (!self::can($perm_name, $item)) {
+ if (!access::can($perm_name, $item)) {
if ($perm_name == "view") {
// Treat as if the item didn't exist, don't leak any information.
throw new Kohana_404_Exception();
} else {
- self::forbidden();
+ access::forbidden();
}
}
}
@@ -138,7 +138,7 @@ class access_Core {
static function group_can($group, $perm_name, $item) {
$resource = $perm_name == "view" ?
$item : model_cache::get("access_cache", $item->id, "item_id");
- return $resource->__get("{$perm_name}_{$group->id}") === self::ALLOW;
+ return $resource->__get("{$perm_name}_{$group->id}") === access::ALLOW;
}
/**
@@ -168,14 +168,14 @@ class access_Core {
return null;
}
- // For view permissions, if any parent is self::DENY, then those parents lock this one.
+ // For view permissions, if any parent is access::DENY, then those parents lock this one.
// Return
$lock = ORM::factory("item")
->where("left_ptr", "<=", $item->left_ptr)
->where("right_ptr", ">=", $item->right_ptr)
->where("items.id", "<>", $item->id)
->join("access_intents", "items.id", "access_intents.item_id")
- ->where("access_intents.view_$group->id", "=", self::DENY)
+ ->where("access_intents.view_$group->id", "=", access::DENY)
->order_by("level", "DESC")
->limit(1)
->find();
@@ -222,7 +222,7 @@ class access_Core {
self::_update_access_non_view_cache($group, $perm_name, $album);
}
- self::update_htaccess_files($album, $group, $perm_name, $value);
+ access::update_htaccess_files($album, $group, $perm_name, $value);
model_cache::clear();
}
@@ -414,7 +414,7 @@ class access_Core {
static function verify_csrf() {
$input = Input::instance();
if ($input->post("csrf", $input->get("csrf", null)) !== Session::instance()->get("csrf")) {
- self::forbidden();
+ access::forbidden();
}
}
@@ -437,7 +437,7 @@ class access_Core {
* @return string
*/
static function csrf_form_field() {
- return "<input type=\"hidden\" name=\"csrf\" value=\"" . self::csrf_token() . "\"/>";
+ return "<input type=\"hidden\" name=\"csrf\" value=\"" . access::csrf_token() . "\"/>";
}
/**
@@ -488,7 +488,7 @@ class access_Core {
"ALTER TABLE {access_intents} ADD `$field` BINARY DEFAULT NULL");
db::build()
->update("access_intents")
- ->set($field, self::DENY)
+ ->set($field, access::DENY)
->where("item_id", "=", 1)
->execute();
model_cache::clear();
@@ -517,12 +517,12 @@ class access_Core {
// DENY and this ALLOW cannot be obeyed. So in that case, back up the tree and find any
// non-DEFAULT and non-ALLOW parent and propagate from there. If we can't find a matching
// item, then its safe to propagate from here.
- if ($access->$field !== self::DENY) {
+ if ($access->$field !== access::DENY) {
$tmp_item = ORM::factory("item")
->where("left_ptr", "<", $item->left_ptr)
->where("right_ptr", ">", $item->right_ptr)
->join("access_intents", "access_intents.item_id", "items.id")
- ->where("access_intents.$field", "=", self::DENY)
+ ->where("access_intents.$field", "=", access::DENY)
->order_by("left_ptr", "DESC")
->limit(1)
->find();
@@ -537,7 +537,7 @@ class access_Core {
// that we can tell which permissions have been changed, and which ones need to be updated.
db::build()
->update("items")
- ->set($field, self::UNKNOWN)
+ ->set($field, access::UNKNOWN)
->where("left_ptr", ">=", $item->left_ptr)
->where("right_ptr", "<=", $item->right_ptr)
->execute();
@@ -548,20 +548,20 @@ class access_Core {
->where("left_ptr", ">=", $item->left_ptr)
->where("right_ptr", "<=", $item->right_ptr)
->where("type", "=", "album")
- ->where("access_intents.$field", "IS NOT", self::INHERIT)
+ ->where("access_intents.$field", "IS NOT", access::INHERIT)
->order_by("level", "DESC")
->find_all();
foreach ($query as $row) {
- if ($row->$field == self::ALLOW) {
+ if ($row->$field == access::ALLOW) {
// Propagate ALLOW for any row that is still UNKNOWN.
db::build()
->update("items")
->set($field, $row->$field)
- ->where($field, "IS", self::UNKNOWN) // UNKNOWN is NULL so we have to use IS
+ ->where($field, "IS", access::UNKNOWN) // UNKNOWN is NULL so we have to use IS
->where("left_ptr", ">=", $row->left_ptr)
->where("right_ptr", "<=", $row->right_ptr)
->execute();
- } else if ($row->$field == self::DENY) {
+ } else if ($row->$field == access::DENY) {
// DENY overwrites everything below it
db::build()
->update("items")
@@ -577,8 +577,8 @@ class access_Core {
// the hierarchy, and all of those are safe to change to ALLOW.
db::build()
->update("items")
- ->set($field, self::ALLOW)
- ->where($field, "IS", self::UNKNOWN) // UNKNOWN is NULL so we have to use IS
+ ->set($field, access::ALLOW)
+ ->where($field, "IS", access::UNKNOWN) // UNKNOWN is NULL so we have to use IS
->where("left_ptr", ">=", $item->left_ptr)
->where("right_ptr", "<=", $item->right_ptr)
->execute();
@@ -605,12 +605,12 @@ class access_Core {
//
// @todo To optimize this, we wouldn't need to propagate from the parent, we could just
// propagate from here with the parent's intent.
- if ($access->$field === self::INHERIT) {
+ if ($access->$field === access::INHERIT) {
$tmp_item = ORM::factory("item")
->join("access_intents", "items.id", "access_intents.item_id")
->where("left_ptr", "<", $item->left_ptr)
->where("right_ptr", ">", $item->right_ptr)
- ->where($field, "IS NOT", self::UNKNOWN) // UNKNOWN is NULL so we have to use IS NOT
+ ->where($field, "IS NOT", access::UNKNOWN) // UNKNOWN is NULL so we have to use IS NOT
->order_by("left_ptr", "DESC")
->limit(1)
->find();
@@ -626,11 +626,11 @@ class access_Core {
->join("items", "items.id", "access_intents.item_id")
->where("left_ptr", ">=", $item->left_ptr)
->where("right_ptr", "<=", $item->right_ptr)
- ->where($field, "IS NOT", self::INHERIT)
+ ->where($field, "IS NOT", access::INHERIT)
->order_by("level", "ASC")
->find_all();
foreach ($query as $row) {
- $value = ($row->$field === self::ALLOW) ? true : false;
+ $value = ($row->$field === access::ALLOW) ? true : false;
db::build()
->update("access_caches")
->set($field, $value)
@@ -683,7 +683,7 @@ class access_Core {
}
foreach ($dirs as $dir) {
- if ($value === self::DENY) {
+ if ($value === access::DENY) {
$fp = fopen("$dir/.htaccess", "w+");
fwrite($fp, "<IfModule mod_rewrite.c>\n");
fwrite($fp, " RewriteEngine On\n");
@@ -727,8 +727,18 @@ class access_Core {
fclose($fp);
}
- list ($response) = remote::do_request(url::abs_file("var/security_test/verify"));
- $works = $response == "HTTP/1.1 200 OK";
+ // Proxy our authorization headers so that if the entire Gallery is covered by Basic Auth
+ // this callback will still work.
+ $headers = array();
+ if (function_exists("apache_request_headers")) {
+ $arh = apache_request_headers();
+ if (!empty($arh["Authorization"])) {
+ $headers["Authorization"] = $arh["Authorization"];
+ }
+ }
+ list ($status, $headers, $body) =
+ remote::do_request(url::abs_file("var/security_test/verify"), "GET", $headers);
+ $works = ($status == "HTTP/1.1 200 OK") && ($body == "success");
} catch (Exception $e) {
@dir::unlink(VARPATH . "security_test");
throw $e;
diff --git a/modules/gallery/helpers/auth.php b/modules/gallery/helpers/auth.php
index 48b5fc32..fa6242b9 100644
--- a/modules/gallery/helpers/auth.php
+++ b/modules/gallery/helpers/auth.php
@@ -74,13 +74,13 @@ class auth_Core {
}
static function validate_too_many_failed_logins($name_input) {
- if (self::too_many_failures($name_input->value)) {
+ if (auth::too_many_failures($name_input->value)) {
$name_input->add_error("too_many_failed_logins", 1);
}
}
static function validate_too_many_failed_auth_attempts($form_input) {
- if (self::too_many_failures(identity::active_user()->name)) {
+ if (auth::too_many_failures(identity::active_user()->name)) {
$form_input->add_error("too_many_failed_auth_attempts", 1);
}
}
diff --git a/modules/gallery/helpers/block_manager.php b/modules/gallery/helpers/block_manager.php
index 4dcd6c32..2237b702 100644
--- a/modules/gallery/helpers/block_manager.php
+++ b/modules/gallery/helpers/block_manager.php
@@ -27,10 +27,10 @@ class block_manager_Core {
}
static function add($location, $module_name, $block_id) {
- $blocks = self::get_active($location);
+ $blocks = block_manager::get_active($location);
$blocks[rand()] = array($module_name, $block_id);
- self::set_active($location, $blocks);
+ block_manager::set_active($location, $blocks);
}
static function activate_blocks($module_name) {
@@ -38,25 +38,25 @@ class block_manager_Core {
if (method_exists($block_class, "get_site_list")) {
$blocks = call_user_func(array($block_class, "get_site_list"));
foreach (array_keys($blocks) as $block_id) {
- self::add("site_sidebar", $module_name, $block_id);
+ block_manager::add("site_sidebar", $module_name, $block_id);
}
}
}
static function remove($location, $block_id) {
- $blocks = self::get_active($location);
+ $blocks = block_manager::get_active($location);
unset($blocks[$block_id]);
- self::set_active($location, $blocks);
+ block_manager::set_active($location, $blocks);
}
static function remove_blocks_for_module($location, $module_name) {
- $blocks = self::get_active($location);
+ $blocks = block_manager::get_active($location);
foreach ($blocks as $key => $block) {
if ($block[0] == $module_name) {
unset($blocks[$key]);
}
}
- self::set_active($location, $blocks);
+ block_manager::set_active($location, $blocks);
}
static function deactivate_blocks($module_name) {
@@ -64,14 +64,14 @@ class block_manager_Core {
if (method_exists($block_class, "get_site_list")) {
$blocks = call_user_func(array($block_class, "get_site_list"));
foreach (array_keys($blocks) as $block_id) {
- self::remove_blocks_for_module("site_sidebar", $module_name);
+ block_manager::remove_blocks_for_module("site_sidebar", $module_name);
}
}
if (method_exists($block_class, "get_admin_list")) {
$blocks = call_user_func(array($block_class, "get_admin_list"));
foreach (array("dashboard_sidebar", "dashboard_center") as $location) {
- self::remove_blocks_for_module($location, $module_name);
+ block_manager::remove_blocks_for_module($location, $module_name);
}
}
}
@@ -99,7 +99,7 @@ class block_manager_Core {
}
static function get_html($location, $theme=null) {
- $active = self::get_active($location);
+ $active = block_manager::get_active($location);
$result = "";
foreach ($active as $id => $desc) {
if (method_exists("$desc[0]_block", "get")) {
diff --git a/modules/gallery/helpers/gallery.php b/modules/gallery/helpers/gallery.php
index 3cf0eacd..2bb55ccb 100644
--- a/modules/gallery/helpers/gallery.php
+++ b/modules/gallery/helpers/gallery.php
@@ -18,13 +18,17 @@
* Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA.
*/
class gallery_Core {
- const VERSION = "3.0 RC2 (Santa Fe)";
+ const VERSION = "3.0+ (git)";
/**
* If Gallery is in maintenance mode, then force all non-admins to get routed to a "This site is
* down for maintenance" page.
*/
static function maintenance_mode() {
+ // @todo: we need a mechanism here to identify controllers that are still legally accessible
+ // when the entire Gallery is in maintenance mode. Perhaps a controller class function or
+ // method?
+ // https://sourceforge.net/apps/trac/gallery/ticket/1411
if (Router::$controller != "login" &&
Router::$controller != "combined" &&
module::get_var("gallery", "maintenance_mode", 0) &&
@@ -41,8 +45,13 @@ class gallery_Core {
* the login page.
*/
static function private_gallery() {
+ // @todo: we need a mechanism here to identify controllers that are still legally accessible
+ // when the entire Gallery is private. Perhaps a controller class function or method?
+ // https://sourceforge.net/apps/trac/gallery/ticket/1411
if (Router::$controller != "login" &&
Router::$controller != "combined" &&
+ Router::$controller != "digibug" &&
+ Router::$controller != "rest" &&
identity::active_user()->guest &&
!access::user_can(identity::guest(), "view", item::root()) &&
php_sapi_name() != "cli") {
@@ -66,6 +75,11 @@ class gallery_Core {
* request should implement the <module>_event::gallery_ready() handler.
*/
static function ready() {
+ // Don't keep a session for robots; it's a waste of database space.
+ if (request::user_agent("robot")) {
+ Session::instance()->abort_save();
+ }
+
module::event("gallery_ready");
}
diff --git a/modules/gallery/helpers/gallery_block.php b/modules/gallery/helpers/gallery_block.php
index cb28cbcd..1d92d66d 100644
--- a/modules/gallery/helpers/gallery_block.php
+++ b/modules/gallery/helpers/gallery_block.php
@@ -70,12 +70,6 @@ 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") && $first_line = current(@file("/proc/loadavg"))) {
- $block->content->load_average =
- join(" ", array_slice(explode(" ", $first_line), 0, 3));
- } else {
- $block->content->load_average = t("Unavailable");
- }
break;
case "project_news":
@@ -88,7 +82,7 @@ class gallery_block_Core {
case "block_adder":
$block->css_id = "g-block-adder";
$block->title = t("Dashboard content");
- $block->content = self::get_add_block_form();
+ $block->content = gallery_block::get_add_block_form();
break;
case "language":
diff --git a/modules/gallery/helpers/gallery_installer.php b/modules/gallery/helpers/gallery_installer.php
index 83961d6b..3d82bc69 100644
--- a/modules/gallery/helpers/gallery_installer.php
+++ b/modules/gallery/helpers/gallery_installer.php
@@ -309,7 +309,7 @@ class gallery_installer {
module::set_var("gallery", "show_user_profiles_to", "registered_users");
module::set_var("gallery", "extra_binary_paths", "/usr/local/bin:/opt/local/bin:/opt/bin");
- module::set_version("gallery", 40);
+ module::set_version("gallery", 41);
}
static function upgrade($version) {
@@ -637,6 +637,11 @@ class gallery_installer {
module::set_var("gallery", "extra_binary_paths", "/usr/local/bin:/opt/local/bin:/opt/bin");
module::set_version("gallery", $version = 40);
}
+
+ if ($version == 40) {
+ module::clear_var("gallery", "_cache");
+ module::set_version("gallery", $version = 41);
+ }
}
static function uninstall() {
diff --git a/modules/gallery/helpers/gallery_task.php b/modules/gallery/helpers/gallery_task.php
index 3b173928..e69ff91a 100644
--- a/modules/gallery/helpers/gallery_task.php
+++ b/modules/gallery/helpers/gallery_task.php
@@ -71,7 +71,12 @@ class gallery_task_Core {
static function rebuild_dirty_images($task) {
$errors = array();
try {
- $result = graphics::find_dirty_images_query()->select("id")->execute();
+ // Choose the dirty images in a random order so that if we run this task multiple times
+ // concurrently each task is rebuilding different images simultaneously.
+ $result = graphics::find_dirty_images_query()->select("id")
+ ->select(new Database_Expression("RAND() as r"))
+ ->order_by("r", "ASC")
+ ->execute();
$total_count = $task->get("total_count", $result->count());
$mode = $task->get("mode", "init");
if ($mode == "init") {
@@ -84,6 +89,13 @@ class gallery_task_Core {
$ignored = $task->get("ignored", array());
$i = 0;
+
+ // If there's no work left to do, skip to the end. This can happen if we resume a task long
+ // after the work got done in some other task.
+ if (!$result->count()) {
+ $completed = $total_count;
+ }
+
foreach ($result as $row) {
if (array_key_exists($row->id, $ignored)) {
continue;
diff --git a/modules/gallery/helpers/gallery_theme.php b/modules/gallery/helpers/gallery_theme.php
index 0d7cc44a..978c69a6 100644
--- a/modules/gallery/helpers/gallery_theme.php
+++ b/modules/gallery/helpers/gallery_theme.php
@@ -93,7 +93,7 @@ class gallery_theme_Core {
}
// Redirect to the root album when the admin session expires.
- $admin_session_redirect_check = '<script type="text/javascript">
+ $content = '<script type="text/javascript">
var adminReauthCheck = function() {
$.ajax({url: "' . url::site("admin?reauth_check=1") . '",
dataType: "json",
@@ -105,11 +105,11 @@ class gallery_theme_Core {
};
setInterval("adminReauthCheck();", 60 * 1000);
</script>';
- print $admin_session_redirect_check;
if ($session->get("l10n_mode", false)) {
- return L10n_Client_Controller::l10n_form();
+ $content .= "\n" . L10n_Client_Controller::l10n_form();
}
+ return $content;
}
static function credits() {
diff --git a/modules/gallery/helpers/graphics.php b/modules/gallery/helpers/graphics.php
index dd521d84..edba6b76 100644
--- a/modules/gallery/helpers/graphics.php
+++ b/modules/gallery/helpers/graphics.php
@@ -50,7 +50,7 @@ class graphics_Core {
$rule->active = true;
$rule->save();
- self::mark_dirty($target == "thumb", $target == "resize");
+ graphics::mark_dirty($target == "thumb", $target == "resize");
}
/**
@@ -67,7 +67,7 @@ class graphics_Core {
->where("operation", "=", $operation)
->execute();
- self::mark_dirty($target == "thumb", $target == "resize");
+ graphics::mark_dirty($target == "thumb", $target == "resize");
}
/**
@@ -80,7 +80,7 @@ class graphics_Core {
->where("module_name", "=", $module_name)
->execute();
if (count($status)) {
- self::mark_dirty(true, true);
+ graphics::mark_dirty(true, true);
}
}
@@ -252,7 +252,7 @@ class graphics_Core {
$db->execute();
}
- $count = self::find_dirty_images_query()->count_records();
+ $count = graphics::find_dirty_images_query()->count_records();
if ($count) {
site_status::warning(
t2("One of your photos is out of date. <a %attrs>Click here to fix it</a>",
diff --git a/modules/gallery/helpers/identity.php b/modules/gallery/helpers/identity.php
index 5ca024e9..f45f72c3 100644
--- a/modules/gallery/helpers/identity.php
+++ b/modules/gallery/helpers/identity.php
@@ -61,7 +61,7 @@ class identity_Core {
$session = Session::instance();
if (!($user = $session->get("user"))) {
- self::set_active_user($user = self::guest());
+ identity::set_active_user($user = identity::guest());
}
// The installer cannot set a user into the session, so it just sets an id which we should
@@ -69,6 +69,7 @@ class identity_Core {
// @todo set the user name into the session instead of 2 and then use it to get the
// user object
if ($user === 2) {
+ $session->delete("user"); // delete it so that identity code isn't confused by the integer
auth::login(IdentityProvider::instance()->admin_user());
}
@@ -127,7 +128,7 @@ class identity_Core {
$session = Session::instance();
$session->set("user", $user);
$session->delete("group_ids");
- self::load_user();
+ identity::load_user();
}
/**
diff --git a/modules/gallery/helpers/item.php b/modules/gallery/helpers/item.php
index 092904a5..052b1c8e 100644
--- a/modules/gallery/helpers/item.php
+++ b/modules/gallery/helpers/item.php
@@ -218,7 +218,13 @@ class item_Core {
}
/**
- * Return a query to get a random Item_Model, with optional filters
+ * Return a query to get a random Item_Model, with optional filters.
+ * Usage: item::random_query()->execute();
+ *
+ * Note: You can add your own ->where() clauses but if your Gallery is
+ * small or your where clauses are over-constrained you may wind up with
+ * no item. You should try running this a few times in a loop if you
+ * don't get an item back.
*/
static function random_query() {
// Pick a random number and find the item that's got nearest smaller number.
diff --git a/modules/gallery/helpers/item_rest.php b/modules/gallery/helpers/item_rest.php
index 10f9e16a..a8bc36ad 100644
--- a/modules/gallery/helpers/item_rest.php
+++ b/modules/gallery/helpers/item_rest.php
@@ -23,18 +23,19 @@ class item_rest_Core {
* query the collection. You can specify them in any combination.
*
* scope=direct
- * only return items that are immediately under this one
+ * Only return items that are immediately under this one
* scope=all
- * return items anywhere under this one
+ * Return items anywhere under this one
*
* name=<substring>
- * only return items where the name contains this substring
+ * Only return items where the name contains this substring
*
* random=true
- * return a single random item
+ * Return a single random item
*
* type=<comma separate list of photo, movie or album>
- * limit the type to types in this list. eg, "type=photo,movie"
+ * Limit the type to types in this list, eg: "type=photo,movie".
+ * Also limits the types returned in the member collections (same behaviour as item_rest).
*/
static function get($request) {
$item = rest::resolve($request->url);
diff --git a/modules/gallery/helpers/items_rest.php b/modules/gallery/helpers/items_rest.php
index f0b68d63..08aa3279 100644
--- a/modules/gallery/helpers/items_rest.php
+++ b/modules/gallery/helpers/items_rest.php
@@ -25,31 +25,34 @@ class items_rest_Core {
* 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
+ * 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
+ * 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"
+ * Limit the type to types in this list, eg: "type=photo,movie".
+ * Also limits the types returned in the member collections (same behaviour as item_rest).
+ * Ignored if ancestors_for is set.
*/
static function get($request) {
$items = array();
+ $types = array();
+
if (isset($request->params->urls)) {
+ if (isset($request->params->type)) {
+ $types = explode(",", $request->params->type);
+ }
+
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)) {
- if (isset($types)) {
- if (in_array($item->type, $types)) {
- $items[] = items_rest::_format_restful_item($item);
- }
- } else {
- $items[] = items_rest::_format_restful_item($item);
- }
+ if (!access::can("view", $item)) {
+ continue;
+ }
+
+ if (empty($types) || in_array($item->type, $types)) {
+ $items[] = items_rest::_format_restful_item($item, $types);
}
}
} else if (isset($request->params->ancestors_for)) {
@@ -57,9 +60,9 @@ class items_rest_Core {
if (!access::can("view", $item)) {
throw new Kohana_404_Exception();
}
- $items[] = items_rest::_format_restful_item($item);
+ $items[] = items_rest::_format_restful_item($item, $types);
while (($item = $item->parent()) != null) {
- array_unshift($items, items_rest::_format_restful_item($item));
+ array_unshift($items, items_rest::_format_restful_item($item, $types));
};
}
@@ -74,14 +77,16 @@ class items_rest_Core {
return $item;
}
- private static function _format_restful_item($item) {
+ private static function _format_restful_item($item, $types) {
$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->viewable()->children() as $child) {
- $members[] = rest::url("item", $child);
+ if (empty($types) || in_array($child->type, $types)) {
+ $members[] = rest::url("item", $child);
+ }
}
$item_rest["members"] = $members;
}
diff --git a/modules/gallery/helpers/l10n_client.php b/modules/gallery/helpers/l10n_client.php
index 43cc2036..8c2685a8 100644
--- a/modules/gallery/helpers/l10n_client.php
+++ b/modules/gallery/helpers/l10n_client.php
@@ -40,14 +40,14 @@ class l10n_client_Core {
}
static function server_uid($api_key=null) {
- $api_key = $api_key == null ? self::api_key() : $api_key;
+ $api_key = $api_key == null ? l10n_client::api_key() : $api_key;
$parts = explode(":", $api_key);
return empty($parts) ? 0 : $parts[0];
}
private static function _sign($payload, $api_key=null) {
- $api_key = $api_key == null ? self::api_key() : $api_key;
- return md5($api_key . $payload . self::client_token());
+ $api_key = $api_key == null ? l10n_client::api_key() : $api_key;
+ return md5($api_key . $payload . l10n_client::client_token());
}
static function validate_api_key($api_key) {
@@ -57,9 +57,9 @@ class l10n_client_Core {
list ($response_data, $response_status) = remote::post(
$url, array("version" => $version,
- "client_token" => self::client_token(),
+ "client_token" => l10n_client::client_token(),
"signature" => $signature,
- "uid" => self::server_uid($api_key)));
+ "uid" => l10n_client::server_uid($api_key)));
if (!remote::success($response_status)) {
return false;
}
@@ -215,9 +215,9 @@ class l10n_client_Core {
list ($response_data, $response_status) = remote::post(
$url, array("data" => $request_data,
- "client_token" => self::client_token(),
+ "client_token" => l10n_client::client_token(),
"signature" => $signature,
- "uid" => self::server_uid()));
+ "uid" => l10n_client::server_uid()));
if (!remote::success($response_status)) {
throw new Exception("@todo TRANSLATIONS_SUBMISSION_FAILED " . $response_status);
diff --git a/modules/gallery/helpers/locales.php b/modules/gallery/helpers/locales.php
index d1e72260..565e9da8 100644
--- a/modules/gallery/helpers/locales.php
+++ b/modules/gallery/helpers/locales.php
@@ -62,11 +62,14 @@ class locales_Core {
}
// @todo Might want to add a localizable language name as well.
+ // ref: http://cldr.unicode.org/
+ // ref: http://cldr.unicode.org/index/cldr-spec/picking-the-right-language-code
private static function _init_language_data() {
$l["af_ZA"] = "Afrikaans"; // Afrikaans
$l["ar_SA"] = "العربية"; // Arabic
$l["be_BY"] = "Беларускі"; // Belarusian
$l["bg_BG"] = "български"; // Bulgarian
+ $l["bn_BD"] = "বাংলা"; // Bengali
$l["ca_ES"] = "Catalan"; // Catalan
$l["cs_CZ"] = "čeština"; // Czech
$l["da_DK"] = "Dansk"; // Danish
@@ -92,6 +95,7 @@ class locales_Core {
$l["ko_KR"] = "한국어"; // Korean
$l["lt_LT"] = "Lietuvių"; // Lithuanian
$l["lv_LV"] = "Latviešu"; // Latvian
+ $l["ms_MY"] = "Bahasa Melayu"; // Malay
$l["mk_MK"] = "Македонски јазик"; // Macedonian
$l["nl_NL"] = "Nederlands"; // Dutch
$l["no_NO"] = "Norsk bokmål"; // Norwegian
@@ -208,7 +212,7 @@ class locales_Core {
}
private static function _locale_match_score($requested_locale, $qvalue, $adjustment_factor) {
- $installed = self::installed();
+ $installed = locales::installed();
if (isset($installed[$requested_locale])) {
return array($requested_locale, $qvalue);
}
@@ -223,14 +227,14 @@ class locales_Core {
static function set_request_locale() {
// 1. Check the session specific preference (cookie)
- $locale = self::cookie_locale();
+ $locale = locales::cookie_locale();
// 2. Check the user's preference
if (!$locale) {
$locale = identity::active_user()->locale;
}
// 3. Check the browser's / OS' preference
if (!$locale) {
- $locale = self::locale_from_http_request();
+ $locale = locales::locale_from_http_request();
}
// If we have any preference, override the site's default locale
if ($locale) {
diff --git a/modules/gallery/helpers/log.php b/modules/gallery/helpers/log.php
index 26f70480..37154522 100644
--- a/modules/gallery/helpers/log.php
+++ b/modules/gallery/helpers/log.php
@@ -30,7 +30,7 @@ class log_Core {
* @param string $html an html snippet presented alongside the log message to aid the admin
*/
static function success($category, $message, $html="") {
- self::_add($category, $message, $html, self::SUCCESS);
+ self::_add($category, $message, $html, log::SUCCESS);
}
/**
@@ -40,7 +40,7 @@ class log_Core {
* @param string $html an html snippet presented alongside the log message to aid the admin
*/
static function info($category, $message, $html="") {
- self::_add($category, $message, $html, self::INFO);
+ self::_add($category, $message, $html, log::INFO);
}
/**
@@ -50,7 +50,7 @@ class log_Core {
* @param string $html an html snippet presented alongside the log message to aid the admin
*/
static function warning($category, $message, $html="") {
- self::_add($category, $message, $html, self::WARNING);
+ self::_add($category, $message, $html, log::WARNING);
}
/**
@@ -60,7 +60,7 @@ class log_Core {
* @param string $html an html snippet presented alongside the log message to aid the admin
*/
static function error($category, $message, $html="") {
- self::_add($category, $message, $html, self::ERROR);
+ self::_add($category, $message, $html, log::ERROR);
}
/**
@@ -92,16 +92,16 @@ class log_Core {
*/
static function severity_class($severity) {
switch($severity) {
- case self::SUCCESS:
+ case log::SUCCESS:
return "g-success";
- case self::INFO:
+ case log::INFO:
return "g-info";
- case self::WARNING:
+ case log::WARNING:
return "g-warning";
- case self::ERROR:
+ case log::ERROR:
return "g-error";
}
}
diff --git a/modules/gallery/helpers/message.php b/modules/gallery/helpers/message.php
index 1f69e2a9..64dd703c 100644
--- a/modules/gallery/helpers/message.php
+++ b/modules/gallery/helpers/message.php
@@ -28,7 +28,7 @@ class message_Core {
* @param string $msg a detailed message
*/
static function success($msg) {
- self::_add($msg, self::SUCCESS);
+ self::_add($msg, message::SUCCESS);
}
/**
@@ -36,7 +36,7 @@ class message_Core {
* @param string $msg a detailed message
*/
static function info($msg) {
- self::_add($msg, self::INFO);
+ self::_add($msg, message::INFO);
}
/**
@@ -44,7 +44,7 @@ class message_Core {
* @param string $msg a detailed message
*/
static function warning($msg) {
- self::_add($msg, self::WARNING);
+ self::_add($msg, message::WARNING);
}
/**
@@ -52,7 +52,7 @@ class message_Core {
* @param string $msg a detailed message
*/
static function error($msg) {
- self::_add($msg, self::ERROR);
+ self::_add($msg, message::ERROR);
}
/**
@@ -79,7 +79,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>";
+ $buf[] = "<li class=\"" . message::severity_class($msg[1]) . "\">$msg[0]</li>";
}
if ($buf) {
return "<ul id=\"g-action-status\" class=\"g-message-block\">" . implode("", $buf) . "</ul>";
@@ -93,16 +93,16 @@ class message_Core {
*/
static function severity_class($severity) {
switch($severity) {
- case self::SUCCESS:
+ case message::SUCCESS:
return "g-success";
- case self::INFO:
+ case message::INFO:
return "g-info";
- case self::WARNING:
+ case message::WARNING:
return "g-warning";
- case self::ERROR:
+ case message::ERROR:
return "g-error";
}
}
diff --git a/modules/gallery/helpers/module.php b/modules/gallery/helpers/module.php
index 7863520e..2b446daa 100644
--- a/modules/gallery/helpers/module.php
+++ b/modules/gallery/helpers/module.php
@@ -35,7 +35,7 @@ class module_Core {
* @param integer $version
*/
static function set_version($module_name, $version) {
- $module = self::get($module_name);
+ $module = module::get($module_name);
if (!$module->loaded()) {
$module->name = $module_name;
$module->active = $module_name == "gallery"; // only gallery is active by default
@@ -62,7 +62,7 @@ class module_Core {
* not found
*/
static function info($module_name) {
- $module_list = self::available();
+ $module_list = module::available();
return isset($module_list->$module_name) ? $module_list->$module_name : false;
}
@@ -94,10 +94,10 @@ class module_Core {
$modules->$module_name =
new ArrayObject(parse_ini_file($file), ArrayObject::ARRAY_AS_PROPS);
$m =& $modules->$module_name;
- $m->installed = self::is_installed($module_name);
- $m->active = self::is_active($module_name);
+ $m->installed = module::is_installed($module_name);
+ $m->active = module::is_active($module_name);
$m->code_version = $m->version;
- $m->version = self::get_version($module_name);
+ $m->version = module::get_version($module_name);
$m->locked = false;
if ($m->active && $m->version != $m->code_version) {
@@ -107,7 +107,7 @@ class module_Core {
// Lock certain modules
$modules->gallery->locked = true;
- $identity_module = self::get_var("gallery", "identity_provider", "user");
+ $identity_module = module::get_var("gallery", "identity_provider", "user");
$modules->$identity_module->locked = true;
$modules->ksort();
self::$available = $modules;
@@ -258,7 +258,7 @@ class module_Core {
call_user_func_array(array($installer_class, "activate"), array());
}
- $module = self::get($module_name);
+ $module = module::get($module_name);
if ($module->loaded()) {
$module->active = true;
$module->save();
@@ -285,7 +285,7 @@ class module_Core {
call_user_func_array(array($installer_class, "deactivate"), array());
}
- $module = self::get($module_name);
+ $module = module::get($module_name);
if ($module->loaded()) {
$module->active = false;
$module->save();
@@ -312,7 +312,7 @@ class module_Core {
}
graphics::remove_rules($module_name);
- $module = self::get($module_name);
+ $module = module::get($module_name);
if ($module->loaded()) {
$module->delete();
}
@@ -425,48 +425,21 @@ class module_Core {
* @return the value
*/
static function get_var($module_name, $name, $default_value=null) {
- // We cache all vars in gallery._cache so that we can load all vars at once for
- // performance.
+ // We cache vars so we can load them all at once for performance.
if (empty(self::$var_cache)) {
- $row = db::build()
- ->select("value")
- ->from("vars")
- ->where("module_name", "=", "gallery")
- ->where("name", "=", "_cache")
- ->execute()
- ->current();
- if ($row) {
- self::$var_cache = unserialize($row->value);
- } else {
- // gallery._cache doesn't exist. Create it now.
+ self::$var_cache = Cache::instance()->get("var_cache");
+ if (empty(self::$var_cache)) {
+ // Cache doesn't exist, create it now.
foreach (db::build()
->select("module_name", "name", "value")
->from("vars")
->order_by("module_name")
->order_by("name")
->execute() as $row) {
- if ($row->module_name == "gallery" && $row->name == "_cache") {
- // This could happen if there's a race condition
- continue;
- }
// Mute the "Creating default object from empty value" warning below
@self::$var_cache->{$row->module_name}->{$row->name} = $row->value;
}
- $cache = ORM::factory("var");
- $cache->module_name = "gallery";
- $cache->name = "_cache";
- $cache->value = serialize(self::$var_cache);
- try {
- $cache->save();
- } catch (Database_Exception $e) {
- // There's a potential race condition here. Don't fail if that happens because it's
- // bound to be transient and not a huge deal, but at least put something in the logs.
- if (stristr($e->getMessage(), "duplicate entry")) {
- Kohana_Log::add("error", "Failed to cache vars");
- } else {
- throw $e;
- }
- }
+ Cache::instance()->set("var_cache", self::$var_cache, array("vars"));
}
}
@@ -495,11 +468,7 @@ class module_Core {
$var->value = $value;
$var->save();
- db::build()
- ->delete("vars")
- ->where("module_name", "=", "gallery")
- ->where("name", "=", "_cache")
- ->execute();
+ Cache::instance()->delete("var_cache");
self::$var_cache = null;
}
@@ -524,11 +493,7 @@ class module_Core {
->where("name", "=", $name)
->execute();
- db::build()
- ->delete("vars")
- ->where("module_name", "=", "gallery")
- ->where("name", "=", "_cache")
- ->execute();
+ Cache::instance()->delete("var_cache");
self::$var_cache = null;
}
@@ -538,19 +503,27 @@ class module_Core {
* @param string $name
*/
static function clear_var($module_name, $name) {
- $var = ORM::factory("var")
+ db::build()
+ ->delete("vars")
->where("module_name", "=", $module_name)
->where("name", "=", $name)
- ->find();
- if ($var->loaded()) {
- $var->delete();
- }
+ ->execute();
+
+ Cache::instance()->delete("var_cache");
+ self::$var_cache = null;
+ }
+ /**
+ * Remove all variables for this module.
+ * @param string $module_name
+ */
+ static function clear_all_vars($module_name) {
db::build()
->delete("vars")
- ->where("module_name", "=", "gallery")
- ->where("name", "=", "_cache")
+ ->where("module_name", "=", $module_name)
->execute();
+
+ Cache::instance()->delete("var_cache");
self::$var_cache = null;
}
@@ -559,6 +532,6 @@ class module_Core {
* @param string $module_name
*/
static function get_version($module_name) {
- return self::get($module_name)->version;
+ return module::get($module_name)->version;
}
}
diff --git a/modules/gallery/helpers/movie.php b/modules/gallery/helpers/movie.php
index 78358b6b..0895c5f4 100644
--- a/modules/gallery/helpers/movie.php
+++ b/modules/gallery/helpers/movie.php
@@ -58,7 +58,7 @@ class movie_Core {
}
static function extract_frame($input_file, $output_file) {
- $ffmpeg = self::find_ffmpeg();
+ $ffmpeg = movie::find_ffmpeg();
if (empty($ffmpeg)) {
throw new Exception("@todo MISSING_FFMPEG");
}
@@ -103,7 +103,7 @@ class movie_Core {
* Return the width, height, mime_type and extension of the given movie file.
*/
static function get_file_metadata($file_path) {
- $ffmpeg = self::find_ffmpeg();
+ $ffmpeg = movie::find_ffmpeg();
if (empty($ffmpeg)) {
throw new Exception("@todo MISSING_FFMPEG");
}
diff --git a/modules/gallery/helpers/site_status.php b/modules/gallery/helpers/site_status.php
index 13c42dda..85f30dba 100644
--- a/modules/gallery/helpers/site_status.php
+++ b/modules/gallery/helpers/site_status.php
@@ -101,7 +101,7 @@ class site_status_Core {
$buf = array();
foreach (ORM::factory("message")->find_all() as $msg) {
$value = str_replace("__CSRF__", access::csrf_token(), $msg->value);
- $buf[] = "<li class=\"" . self::severity_class($msg->severity) . "\">$value</li>";
+ $buf[] = "<li class=\"" . site_status::severity_class($msg->severity) . "\">$value</li>";
}
if ($buf) {
@@ -116,16 +116,16 @@ class site_status_Core {
*/
static function severity_class($severity) {
switch($severity) {
- case self::SUCCESS:
+ case site_status::SUCCESS:
return "g-success";
- case self::INFO:
+ case site_status::INFO:
return "g-info";
- case self::WARNING:
+ case site_status::WARNING:
return "g-warning";
- case self::ERROR:
+ case site_status::ERROR:
return "g-error";
}
}