diff options
Diffstat (limited to 'modules/gallery')
48 files changed, 1057 insertions, 540 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&continue=" . -                                      urlencode(url::abs_current()))) +                      ->url(url::site("logout?csrf=$csrf&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&from_id=$theme_item->id&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&from_id=$theme_item->id&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&from_id=$theme_item->id&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&from_id=$theme_item->id&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> +                » +                <?= $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%; -      } +<? +// 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. -      div.big_box { -        padding: 10px; -        background: #eee; -        border: solid 1px #ccc; -        font-family: sans-serif; -        color: #111; -        width: 60em; -        margin: 20px auto; -      } +// Log validation exceptions to ease debugging +if ($e instanceof ORM_Validation_Exception) { +  Kohana_Log::add("error", "Validation errors: " . print_r($e->validation->errors(), 1)); +} -      div#framework_error { -        text-align: center; -      } +if (php_sapi_name() == "cli") { +  include Kohana::find_file("views", "error_cli.txt"); +  return; +} -      div#error_details { -        text-align: left; -      } +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) { +} -      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; -      } +// 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; +} -      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> -                » -                <?= $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> +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() { | 
