Merge branch 'remote' of git://github.com/the0ne/gallery3-contrib
This commit is contained in:
commit
30e750ad6e
@ -1,3 +1 @@
|
||||
This is a preliminary work. To use it, you need to apply the changes
|
||||
in the patches directory. It's got limited functionality and is only
|
||||
the beginning of the effort.
|
||||
To use this module you need to apply the changes in the patches directory.
|
||||
|
28
3.0/modules/remote/controllers/admin_remote.php
Normal file
28
3.0/modules/remote/controllers/admin_remote.php
Normal file
@ -0,0 +1,28 @@
|
||||
<?php defined("SYSPATH") or die("No direct script access.");
|
||||
/**
|
||||
* Gallery - a web based photo album viewer and editor
|
||||
* Copyright (C) 2000-2011 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 Admin_remote_Controller extends Admin_Controller {
|
||||
public function index() {
|
||||
|
||||
$view = new Admin_View('admin.html');
|
||||
$view->page_title = t('Gallery Remote Protocol 2');
|
||||
$view->content = new View('admin_remote.html');
|
||||
print $view;
|
||||
}
|
||||
}
|
@ -19,27 +19,578 @@
|
||||
*/
|
||||
class Gallery_Remote_Controller extends Controller {
|
||||
public function index() {
|
||||
gallery_remote::check_protocol_version();
|
||||
|
||||
$input = Input::instance();
|
||||
// TODO: Validate protocol version here
|
||||
switch($input->post("cmd")) {
|
||||
case "login":
|
||||
print "#__GR2PROTO__\n";
|
||||
$uname = $input->post("uname");
|
||||
$reply = GalleryRemoteReply::factory(gallery_remote::GR_STAT_SUCCESS);
|
||||
|
||||
if($this->_check_protocol($input, $reply)) {
|
||||
$reply->set('debug_gallery_version', gallery::version_string());
|
||||
$reply->set('debug_user', identity::active_user()->name);
|
||||
$reply->set('debug_user_type', 'Gallery_User');
|
||||
$reply->set('debug_user_already_logged_in', identity::active_user()->id != identity::guest()->id ? '1':'');
|
||||
$reply->set('server_version', '2.15');
|
||||
|
||||
$cmd = trim($input->post('cmd'));
|
||||
if($cmd == 'login') {
|
||||
$this->_login($input, $reply);
|
||||
}
|
||||
else if( self::isloggedin() ) {
|
||||
switch($cmd) {
|
||||
case 'no-op':
|
||||
$reply->set('status_text', 'Noop command successful.');
|
||||
$reply->send();
|
||||
break;
|
||||
case 'fetch-albums':
|
||||
case 'fetch-albums-prune':
|
||||
$this->_fetch_albums_prune($input, $reply);
|
||||
break;
|
||||
case 'new-album':
|
||||
$this->_new_album($input, $reply);
|
||||
break;
|
||||
case 'album-properties':
|
||||
$this->_album_properties($input, $reply);
|
||||
break;
|
||||
case 'add-item':
|
||||
$this->_add_item($input, $reply);
|
||||
break;
|
||||
case 'move-album':
|
||||
$this->_move_album($input, $reply);
|
||||
break;
|
||||
case 'increment-view-count':
|
||||
$this->_increment_view_count($input, $reply);
|
||||
break;
|
||||
case 'image-properties':
|
||||
$this->_image_properties($input, $reply);
|
||||
break;
|
||||
case 'fetch-album-images':
|
||||
$this->_fetch_album_images($input, $reply);
|
||||
break;
|
||||
default:
|
||||
$reply->send(gallery_remote::UNKNOWN_CMD);
|
||||
}
|
||||
}
|
||||
else {
|
||||
$reply->send(gallery_remote::LOGIN_MISSING);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private function _check_protocol(&$input, &$reply) {
|
||||
$version = trim($input->post('protocol_version'));
|
||||
$reply->set('status_text', 'Minimum protocol version required: '.gallery_remote::GR_PROT_MAJ.'.'.gallery_remote::GR_PROT_MIN.' - your client\'s protocol version: '.$version);
|
||||
if($version=='') {
|
||||
$reply->send(gallery_remote::PROTO_VER_MISSING);
|
||||
return false;
|
||||
}
|
||||
else if(!is_numeric($version)) {
|
||||
$reply->send(gallery_remote::PROTO_MAJ_FMT_INVAL);
|
||||
return false;
|
||||
}
|
||||
else if($version<gallery_remote::GR_PROT_MAJ) {
|
||||
$reply->send(gallery_remote::PROTO_MAJ_VER_INVAL);
|
||||
return false;
|
||||
}
|
||||
else if(strpos($version, '.')===false) {
|
||||
$reply->send(gallery_remote::PROTO_MAJ_FMT_INVAL);
|
||||
return false;
|
||||
}
|
||||
else {
|
||||
$ver = explode('.', $version);
|
||||
if($ver[0]==gallery_remote::GR_PROT_MAJ && $ver[1]<gallery_remote::GR_PROT_MIN) {
|
||||
$reply->send(gallery_remote::PROTO_MIN_VER_INVAL);
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
private static function isloggedin()
|
||||
{
|
||||
return identity::active_user()->id != identity::guest()->id;
|
||||
}
|
||||
|
||||
private static function get_mime_type($filename, $mimePath = '/etc') {
|
||||
$fileext = substr(strrchr($filename, '.'), 1);
|
||||
if (empty($fileext)) return (false);
|
||||
$regex = "/^([\w\+\-\.\/]+)\s+(\w+\s)*($fileext\s)/i";
|
||||
$lines = file("$mimePath/mime.types");
|
||||
foreach($lines as $line) {
|
||||
if (substr($line, 0, 1) == '#') continue; // skip comments
|
||||
$line = rtrim($line) . ' ';
|
||||
if (!preg_match($regex, $line, $matches)) continue; // no match to the extension
|
||||
return ($matches[1]);
|
||||
}
|
||||
return (false); // no match at all
|
||||
}
|
||||
|
||||
private static function decode($input) {
|
||||
return html_entity_decode(trim($input), ENT_COMPAT, 'UTF-8');
|
||||
}
|
||||
|
||||
private function _login(&$input, &$reply) {
|
||||
$uname = trim($input->post('uname'));
|
||||
if (empty($uname)) {
|
||||
print "status=202\n";
|
||||
$reply->send(gallery_remote::LOGIN_MISSING);
|
||||
} else {
|
||||
$user = user::lookup_by_name($uname);
|
||||
$password = $input->post("password");
|
||||
$password = trim($input->post('password'));
|
||||
if ($user && user::is_correct_password($user, $password)) {
|
||||
print "status=0\n";
|
||||
user::login($user);
|
||||
auth::login($user);
|
||||
Session::instance()->regenerate();
|
||||
|
||||
$reply->set('debug_user', $user->name);
|
||||
$reply->set('status_text', 'Login successful.');
|
||||
$reply->send();
|
||||
|
||||
} else {
|
||||
print "status=201\n";
|
||||
}
|
||||
}
|
||||
print "server_version=2.15\n";
|
||||
$reply->send(gallery_remote::PASSWD_WRONG);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private function _fetch_albums_prune(&$input, &$reply) {
|
||||
$root = item::root();
|
||||
$perms = trim($input->post('no_perms'));
|
||||
$use_permissions = ($perms != 'no');
|
||||
|
||||
$thumb_size = module::get_var('gallery', 'thumb_size');
|
||||
$resize_size = module::get_var('gallery', 'resize_size');
|
||||
|
||||
//* <FIXME duplication>
|
||||
$count = 1;
|
||||
$item = &$root;
|
||||
$reply->set('album.name.'.$count, $item->id);
|
||||
$reply->set('album.title.'.$count, $item->title);
|
||||
$reply->set('album.summary.'.$count, 'Gallery Remote Interface by Thomas E. Horner');
|
||||
$reply->set('album.parent.'.$count, '0');
|
||||
$reply->set('album.resize_size.'.$count, $resize_size);
|
||||
$reply->set('album.max_size.'.$count, '0');
|
||||
$reply->set('album.thumb_size.'.$count, $thumb_size);
|
||||
if($use_permissions) {
|
||||
$reply->set('album.perms.add.'.$count, access::can('add', $item) ? 'true':'false');
|
||||
$reply->set('album.perms.write.'.$count, access::can('add', $item) ? 'true':'false');
|
||||
$reply->set('album.perms.del_item.'.$count, access::can('edit', $item) ? 'true':'false');
|
||||
$reply->set('album.perms.del_alb.'.$count, access::can('edit', $item) ? 'true':'false');
|
||||
$reply->set('album.perms.create_sub.'.$count, access::can('add', $item) ? 'true':'false');
|
||||
}
|
||||
$reply->set('album.info.extrafields.'.$count, 'Summary');
|
||||
// </FIXME> */
|
||||
|
||||
foreach( $root->descendants(null, null, array(array("type", "=", "album"))) as $item )
|
||||
{
|
||||
if(!$use_permissions || access::can('view', $item))
|
||||
{
|
||||
$count++;
|
||||
|
||||
$reply->set('album.name.'.$count, $item->id);
|
||||
$reply->set('album.title.'.$count, $item->title);
|
||||
$reply->set('album.summary.'.$count, $item->description);
|
||||
$reply->set('album.parent.'.$count, $item->parent()->id == $root->id ? '0' : $item->parent()->id);
|
||||
$reply->set('album.resize_size.'.$count, $resize_size);
|
||||
$reply->set('album.max_size.'.$count, '0');
|
||||
$reply->set('album.thumb_size.'.$count, $thumb_size);
|
||||
if($use_permissions) {
|
||||
$reply->set('album.perms.add.'.$count, access::can('add', $item) ? 'true':'false');
|
||||
$reply->set('album.perms.write.'.$count, access::can('add', $item) ? 'true':'false');
|
||||
$reply->set('album.perms.del_item.'.$count, access::can('edit', $item) ? 'true':'false');
|
||||
$reply->set('album.perms.del_alb.'.$count, access::can('edit', $item) ? 'true':'false');
|
||||
$reply->set('album.perms.create_sub.'.$count, access::can('add', $item) ? 'true':'false');
|
||||
}
|
||||
$reply->set('album.info.extrafields.'.$count, 'Summary');
|
||||
}
|
||||
}
|
||||
$reply->set('album_count', $count);
|
||||
if($use_permissions) {
|
||||
$reply->set('can_create_root', access::can('add', $root) ? 'yes':'no');
|
||||
}
|
||||
$reply->set('status_text', 'Fetch albums successful.');
|
||||
$reply->send();
|
||||
}
|
||||
|
||||
private function _new_album(&$input, &$reply) {
|
||||
$album = trim($input->post('set_albumName'));
|
||||
$name = $this->decode($input->post('newAlbumName'));
|
||||
$title = $this->decode($input->post('newAlbumTitle'));
|
||||
$desc = $this->decode($input->post('newAlbumDesc'));
|
||||
|
||||
if($album=='0') $parent = item::root();
|
||||
else $parent = ORM::factory("item")->where("id", "=", $album)->find();
|
||||
|
||||
if(isset($parent) && $parent->loaded() && $parent->id!='') {
|
||||
$album = ORM::factory('item');
|
||||
$album->type = 'album';
|
||||
$album->parent_id = $parent->id;
|
||||
|
||||
$album->name = $name;
|
||||
$album->slug = item::convert_filename_to_slug($name); // <= verification fails if this property has not been set!!!
|
||||
$album->title = $title;
|
||||
$album->title or $album->title = $album->name;
|
||||
$album->description = $desc;
|
||||
$album->view_count = 0;
|
||||
$album->sort_column = 'weight';
|
||||
$album->sort_order = 'ASC';
|
||||
|
||||
try {
|
||||
$album->validate();
|
||||
|
||||
try {
|
||||
$album->save();
|
||||
|
||||
$reply->set('album_name', $album->id);
|
||||
$reply->set('status_text', 'New album created successfuly.');
|
||||
$reply->send();
|
||||
|
||||
} catch (Exception $e) {
|
||||
$reply->set('status_text', t('Failed to save album with name %name.', array('name' => $name)));
|
||||
$reply->send(gallery_remote::CREATE_ALBUM_FAILED);
|
||||
}
|
||||
|
||||
} catch (ORM_Validation_Exception $e) {
|
||||
$reply->set('status_text', t('Failed to validate album with name %name.', array('name' => $name)));
|
||||
$reply->send(gallery_remote::CREATE_ALBUM_FAILED);
|
||||
}
|
||||
}
|
||||
else {
|
||||
$reply->set('status_text', t('Failed to load album with name %name.', array('name' => $album)));
|
||||
$reply->send(gallery_remote::CREATE_ALBUM_FAILED);
|
||||
}
|
||||
}
|
||||
|
||||
private function _album_properties(&$input, &$reply) {
|
||||
$album = trim($input->post('set_albumName'));
|
||||
$resize_size = module::get_var('gallery', 'resize_size');
|
||||
|
||||
if($album=='0') $parent = item::root();
|
||||
else $parent = ORM::factory("item")->where("id", "=", $album)->find();
|
||||
|
||||
if(isset($parent) && $parent->loaded() && $parent->id!='') {
|
||||
$reply->set('auto_resize', $resize_size); //resize size is the same for all g3 albums
|
||||
$reply->set('max_size', '0'); //not supported by g3
|
||||
$reply->set('add_to_beginning', 'no'); //g3 will add images to the end
|
||||
$reply->set('extrafields', 'Summary');
|
||||
$reply->set('title', $parent->title);
|
||||
$reply->set('status_text', 'Album properties queried successfuly.');
|
||||
$reply->send();
|
||||
}
|
||||
else {
|
||||
$reply->set('status_text', t('Failed to load album with name %name.', array('name' => $album)));
|
||||
$reply->send(gallery_remote::NO_VIEW_PERMISSION);
|
||||
}
|
||||
}
|
||||
|
||||
private function _add_item(&$input, &$reply) {
|
||||
$album = trim($input->post('set_albumName'));
|
||||
$userfilename = $this->decode($input->post('userfile_name'));
|
||||
$title = $this->decode($input->post('caption'));
|
||||
$forcefilename = $this->decode($input->post('force_filename'));
|
||||
$autorotate = trim($input->post('auto_rotate'));
|
||||
|
||||
if($album=='0') $parent = item::root();
|
||||
else $parent = ORM::factory("item")->where("id", "=", $album)->find();
|
||||
|
||||
if(isset($parent) && $parent->loaded() && $parent->id!='') {
|
||||
|
||||
if(function_exists('mime_content_type'))
|
||||
$type = mime_content_type($_FILES['userfile']['tmp_name']);
|
||||
else
|
||||
$type = self::get_mime_type($_FILES['userfile']['name']);
|
||||
|
||||
|
||||
/* <any ugly idea is welcome here> */
|
||||
if($type=='')
|
||||
{
|
||||
if(function_exists('getimagesize')) {
|
||||
$size = getimagesize($_FILES['userfile']['tmp_name']);
|
||||
$type = $size['mime'];
|
||||
}
|
||||
else if(function_exists('exif_imagetype') && function_exists('image_type_to_mime_type')) {
|
||||
$type = image_type_to_mime_type(exif_imagetype($_FILES['userfile']['tmp_name']));
|
||||
}
|
||||
}
|
||||
/* </any ugly idea is welcome here> */
|
||||
|
||||
|
||||
if ($type!='' && !in_array($type, array('image/jpeg', 'image/gif', 'image/png'))) {
|
||||
$reply->set('status_text', t("'%path' is an unsupported image type '%type'", array('path' => $_FILES['userfile']['tmp_name'], 'type' => $type)));
|
||||
$reply->send(gallery_remote::UPLOAD_PHOTO_FAIL);
|
||||
return;
|
||||
}
|
||||
|
||||
if($forcefilename!='') $filename = $forcefilename;
|
||||
else if($userfilename!='') $filename = $userfilename;
|
||||
else $filename = $_FILES['userfile']['name'];
|
||||
|
||||
$slug = $filename;
|
||||
$pos = strpos($slug, '.');
|
||||
if($pos!==false)
|
||||
$slug = substr($slug, 0, $pos);
|
||||
|
||||
//*/ fix for a gallery remote bug...
|
||||
$filename = str_replace('.JPG.jpeg', '.jpeg', $filename);
|
||||
//*/
|
||||
|
||||
//*/ suddenly gallery fails because the uploaded(!) file (of cause!) doesn't contain a file extension
|
||||
if(strpos($_FILES['userfile']['tmp_name'], '.')===false) {
|
||||
$moveto = $_FILES['userfile']['tmp_name'].'.'.substr($type, strpos($type, '/')+1);
|
||||
rename($_FILES['userfile']['tmp_name'], $moveto);
|
||||
$_FILES['userfile']['tmp_name'] = $moveto;
|
||||
}
|
||||
//*/
|
||||
|
||||
try {
|
||||
$item = ORM::factory('item');
|
||||
$item->type = 'photo';
|
||||
$item->parent_id = $parent->id;
|
||||
$item->set_data_file($_FILES['userfile']['tmp_name']);
|
||||
$item->name = $filename;
|
||||
$item->slug = item::convert_filename_to_slug($slug);
|
||||
$item->mime_type = $type;
|
||||
$item->title = $title;
|
||||
$item->title or $item->title = ' '; //don't use $item->name as this clutters up the UI
|
||||
//$item->description =
|
||||
$item->view_count = 0;
|
||||
|
||||
try {
|
||||
$item->validate();
|
||||
|
||||
try {
|
||||
$item->save();
|
||||
|
||||
$reply->set('item_name', $item->id);
|
||||
$reply->set('status_text', 'New item created successfuly.');
|
||||
$reply->send();
|
||||
|
||||
}
|
||||
catch (ORM_Validation_Exception $e) {
|
||||
$validation = $e->validation;
|
||||
//print_r($validation->errors()); exit;
|
||||
$reply->set('status_text', t('Failed to validate item %item: %errors', array('item' => $filename, 'errors' => str_replace("\n", ' ', print_r($validation->errors(),true))) ));
|
||||
$reply->send(gallery_remote::UPLOAD_PHOTO_FAIL); //FIXME gallery remote ignores this return value and continues to wait
|
||||
}
|
||||
catch (Exception $e) {
|
||||
$reply->set('status_text', t('Failed to add item %item.', array('item' => $filename)));
|
||||
$reply->send(gallery_remote::UPLOAD_PHOTO_FAIL); //FIXME gallery remote ignores this return value and continues to wait
|
||||
}
|
||||
|
||||
} catch (ORM_Validation_Exception $e) {
|
||||
$validation = $e->validation;
|
||||
//print_r($validation->errors()); exit;
|
||||
$reply->set('status_text', t('Failed to validate item %item: %errors', array('item' => $filename, 'errors' => str_replace("\n", ' ', print_r($validation->errors(),true))) ));
|
||||
$reply->send(gallery_remote::UPLOAD_PHOTO_FAIL); //FIXME gallery remote ignores this return value and continues to wait
|
||||
}
|
||||
|
||||
} catch (Exception $e) {
|
||||
$reply->set('status_text', t("Corrupt image '%path'", array('path' => $_FILES['userfile']['tmp_name'])));
|
||||
$reply->send(gallery_remote::UPLOAD_PHOTO_FAIL); //FIXME gallery remote ignores this return value and continues to wait
|
||||
}
|
||||
|
||||
}
|
||||
else {
|
||||
$reply->set('status_text', t('Failed to load album with name %name.', array('name' => $album)));
|
||||
$reply->send(gallery_remote::UPLOAD_PHOTO_FAIL); //FIXME gallery remote ignores this return value and continues to wait
|
||||
}
|
||||
}
|
||||
|
||||
private function _move_album(&$input, &$reply) {
|
||||
$name = trim($input->post('set_albumName'));
|
||||
$destination = trim($input->post('set_destalbumName'));
|
||||
|
||||
$album = ORM::factory("item")->where("id", "=", $name)->find();
|
||||
|
||||
if($destination=='0') $parent = item::root();
|
||||
else $parent = ORM::factory("item")->where("id", "=", $destination)->find();
|
||||
|
||||
if(isset($parent) && $parent->loaded() && $parent->id!='' && isset($album) && $album->loaded() && $album->id!='') {
|
||||
|
||||
$album->parent_id = $parent->id;
|
||||
try {
|
||||
$album->validate();
|
||||
|
||||
try {
|
||||
$album->save();
|
||||
|
||||
$reply->set('status_text', 'Album moved successfuly.');
|
||||
$reply->send();
|
||||
|
||||
} catch (Exception $e) {
|
||||
$reply->set('status_text', t('Failed to save album with name %name.', array('name' => $name)));
|
||||
$reply->send(gallery_remote::MOVE_ALBUM_FAILED);
|
||||
}
|
||||
|
||||
} catch (ORM_Validation_Exception $e) {
|
||||
$reply->set('status_text', t('Failed to validate album with name %name.', array('name' => $name)));
|
||||
$reply->send(gallery_remote::MOVE_ALBUM_FAILED);
|
||||
}
|
||||
}
|
||||
else {
|
||||
$reply->set('status_text', t('Failed to load album with name %album or destination with name %dest.', array('name' => $name, 'dest' => $destination)));
|
||||
$reply->send(gallery_remote::MOVE_ALBUM_FAILED);
|
||||
}
|
||||
}
|
||||
|
||||
private function _increment_view_count(&$input, &$reply) {
|
||||
$name = trim($input->post('itemId'));
|
||||
|
||||
if($name=='0') $item = item::root();
|
||||
else $item = ORM::factory("item")->where("id", "=", $name)->find();
|
||||
|
||||
if(isset($item) && $item->loaded() && $item->id!='') {
|
||||
|
||||
$item->view_count = $item->view_count + 1;
|
||||
|
||||
try {
|
||||
$item->validate();
|
||||
|
||||
try {
|
||||
$item->save();
|
||||
|
||||
$reply->set('item_name', $item->id);
|
||||
$reply->set('status_text', 'Item view count incremented successfuly.');
|
||||
$reply->send();
|
||||
|
||||
} catch (Exception $e) {
|
||||
$reply->set('status_text', t('Failed to save item %item.', array('item' => $name)));
|
||||
$reply->send(gallery_remote::NO_WRITE_PERMISSION);
|
||||
}
|
||||
|
||||
} catch (ORM_Validation_Exception $e) {
|
||||
$validation = $e->validation;
|
||||
//print_r($validation->errors()); exit;
|
||||
$reply->set('status_text', t('Failed to validate item %item.', array('item' => $name)).str_replace("\n", ' ', print_r($validation->errors(),true)) );
|
||||
$reply->send(gallery_remote::NO_WRITE_PERMISSION);
|
||||
}
|
||||
|
||||
}
|
||||
else {
|
||||
$reply->set('status_text', t('Failed to load album with name %name.', array('name' => $name)));
|
||||
$reply->send(gallery_remote::NO_WRITE_PERMISSION);
|
||||
}
|
||||
}
|
||||
|
||||
private function _image_properties(&$input, &$reply) {
|
||||
$name = trim($input->post('itemId'));
|
||||
|
||||
if($name=='0') $item = item::root();
|
||||
else $item = ORM::factory("item")->where("id", "=", $name)->find();
|
||||
|
||||
if(isset($item) && $item->loaded() && $item->id!='') {
|
||||
$info = pathinfo($item->file_path());
|
||||
|
||||
$reply->set('status_text', 'Item properties queried successfuly.');
|
||||
$reply->set('image.name', $item->id);
|
||||
$reply->set('image.raw_width', $item->width);
|
||||
$reply->set('image.raw_height', $item->height);
|
||||
$reply->set('image.raw_filesize', filesize($item->file_path()));
|
||||
$reply->set('image.resizedName', $item->name); //g3 stores resizes and thumbs different than g1
|
||||
$reply->set('image.resized_width', $item->resize_width);
|
||||
$reply->set('image.resized_height', $item->resize_height);
|
||||
$reply->set('image.thumbName', $item->name); //g3 stores resizes and thumbs different than g1
|
||||
$reply->set('image.thumb_width', $item->thumb_width);
|
||||
$reply->set('image.thumb_height', $item->thumb_height);
|
||||
$reply->set('image.caption', $item->title);
|
||||
$reply->set('image.title', $item->name);
|
||||
$reply->set('image.forceExtension', $info['extension']);
|
||||
$reply->set('image.hidden', access::user_can(identity::guest(), 'view', $item) ? 'no' : 'yes');
|
||||
$reply->send();
|
||||
}
|
||||
else {
|
||||
$reply->set('status_text', t('Failed to load album with name %name.', array('name' => $name)));
|
||||
$reply->send(gallery_remote::NO_VIEW_PERMISSION);
|
||||
}
|
||||
}
|
||||
|
||||
private function _fetch_album_images(&$input, &$reply) {
|
||||
$name = trim($input->post('set_albumName'));
|
||||
$albums = trim($input->post('albums_too')); //yes/no [optional, since 2.13]
|
||||
$random = trim($input->post('random')); //yes/no [optional, G2 since ***]
|
||||
$limit = trim($input->post('limit')); //number-of-images [optional, G2 since ***]
|
||||
$extra = trim($input->post('extrafields')); //yes/no [optional, G2 since 2.12]
|
||||
$sizes = trim($input->post('all_sizes')); //yes/no [optional, G2 since 2.14]
|
||||
|
||||
if($name=='0') $album = item::root();
|
||||
$album = ORM::factory("item")->where("id", "=", $name)->find();
|
||||
|
||||
if(isset($album) && $album->loaded() && $album->id!='' && access::can('view', $album)) {
|
||||
|
||||
if($albums!='no') $iterator = ORM::factory("item")->where("parent_id", "=", $album->id)->find_all();
|
||||
else $iterator = ORM::factory("item")->where("parent_id", "=", $album->id)->where("type", "<>", "album")->find_all();
|
||||
|
||||
$reply->set('status_text', 'Album images query successful.');
|
||||
$reply->set('album.caption', $album->title);
|
||||
$reply->set('album.extrafields', 'Summary');
|
||||
|
||||
/*
|
||||
$reply->set('image_count', '0');
|
||||
$reply->send();
|
||||
return;
|
||||
//*/
|
||||
|
||||
$count = 0;
|
||||
foreach($iterator as $item) {
|
||||
|
||||
if(access::can('view', $item)) {
|
||||
|
||||
$count++;
|
||||
if($item->type != "album") {
|
||||
$info = pathinfo($item->file_path());
|
||||
|
||||
$reply->set('image.name.'.$count, $item->id);
|
||||
$reply->set('image.raw_width.'.$count, $item->width);
|
||||
$reply->set('image.raw_height.'.$count, $item->height);
|
||||
$reply->set('image.raw_filesize.'.$count, filesize($item->file_path()));
|
||||
$reply->set('image.resizedName.'.$count, $item->name); //g3 stores resizes and thumbs different than g1
|
||||
$reply->set('image.resized_width.'.$count, $item->resize_width);
|
||||
$reply->set('image.resized_height.'.$count, $item->resize_height);
|
||||
/*
|
||||
$reply->set('image.resizedNum.'.$count, 'the number of resized versions for this image [since 2.14]');
|
||||
$reply->set('image.resized.resized-num.name.'.$count, 'filename of the resized-numth resize [G2 since 2.14]');
|
||||
$reply->set('image.resized.resized-num.width.'.$count, 'the width of the resized-numth resize [G2 since 2.14]');
|
||||
$reply->set('image.resized.resized-num.height.'.$count, 'the height of the resized-numth resize [G2 since 2.14]');
|
||||
//*/
|
||||
$reply->set('image.thumbName.'.$count, $item->name); //g3 stores resizes and thumbs different than g1
|
||||
$reply->set('image.thumb_width.'.$count, $item->thumb_width);
|
||||
$reply->set('image.thumb_height.'.$count, $item->thumb_height);
|
||||
$reply->set('image.caption.'.$count, $item->title);
|
||||
$reply->set('image.title.'.$count, $item->name);
|
||||
//$reply->set('image.extrafield.fieldname.'.$count, 'value of the extra field of key fieldname');
|
||||
$reply->set('image.extrafield.summary.'.$count, $item->description);
|
||||
$reply->set('image.clicks.'.$count, $item->view_count);
|
||||
$reply->set('image.capturedate.year.'.$count, date("Y", $item->captured));
|
||||
$reply->set('image.capturedate.mon.'.$count, date("m", $item->captured));
|
||||
$reply->set('image.capturedate.mday.'.$count, date("d", $item->captured));
|
||||
$reply->set('image.capturedate.hours.'.$count, date("H", $item->captured));
|
||||
$reply->set('image.capturedate.minutes.'.$count, date("i", $item->captured));
|
||||
$reply->set('image.capturedate.seconds.'.$count, date("s", $item->captured));
|
||||
$reply->set('image.forceExtension.'.$count, $info['extension']);
|
||||
$reply->set('image.hidden.'.$count, access::user_can(identity::guest(), 'view', $item) ? 'no' : 'yes');
|
||||
}
|
||||
else {
|
||||
$reply->set('album.name.'.$count, $item->id);
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
$reply->set('image_count', $count);
|
||||
//* The baseurl contains a fully-qualified URL. A URL to each image
|
||||
// can be obtained by appending the filename of the image to this.
|
||||
if(isset($item) && $item->loaded()) {
|
||||
$url = $item->file_url(true);
|
||||
$pos = strrpos($url, '/');
|
||||
$reply->set('baseurl', ($pos!==false ? substr($url, 0, $pos+1) : $url) );
|
||||
}
|
||||
else {
|
||||
$reply->set('baseurl', $album->abs_url());
|
||||
}
|
||||
//*/
|
||||
$reply->send();
|
||||
|
||||
}
|
||||
else {
|
||||
$reply->set('status_text', t('Failed to load album with name %name.', array('name' => $name)));
|
||||
$reply->send(gallery_remote::NO_VIEW_PERMISSION);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
@ -18,6 +18,9 @@
|
||||
* Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA.
|
||||
*/
|
||||
class gallery_remote_Core {
|
||||
const GR_PROT_MAJ = 2;
|
||||
const GR_PROT_MIN = 3;
|
||||
|
||||
const GR_STAT_SUCCESS = 0;
|
||||
const PROTO_MAJ_VER_INVAL = 101;
|
||||
const PROTO_MIN_VER_INVAL= 102;
|
||||
|
29
3.0/modules/remote/helpers/remote_event.php
Normal file
29
3.0/modules/remote/helpers/remote_event.php
Normal file
@ -0,0 +1,29 @@
|
||||
<?php defined("SYSPATH") or die("No direct script access.");
|
||||
/**
|
||||
* Gallery - a web based photo album viewer and editor
|
||||
* Copyright (C) 2000-2011 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 remote_event_Core {
|
||||
static function admin_menu($menu, $theme) {
|
||||
$menu
|
||||
->get("settings_menu")
|
||||
->append(Menu::factory("link")
|
||||
->id("remote")
|
||||
->label(t("Gallery Remote"))
|
||||
->url(url::site("admin/remote")));
|
||||
}
|
||||
}
|
@ -19,22 +19,39 @@
|
||||
*/
|
||||
|
||||
class GalleryRemoteReply_Core {
|
||||
private $values = array();
|
||||
private $nl = "\n";
|
||||
/**
|
||||
* Constructor.
|
||||
* @param int $status a Gallery Remote status code
|
||||
*/
|
||||
public static function factory($status) {
|
||||
public static function factory($status='') {
|
||||
$reply = new GalleryRemoteReply();
|
||||
$reply->status = $status;
|
||||
$reply->set('status', $status);
|
||||
$reply->set('status_text', '');
|
||||
return $reply;
|
||||
}
|
||||
|
||||
public function clear() {
|
||||
$this->values = array();
|
||||
}
|
||||
|
||||
/**
|
||||
* Set a property on this reply
|
||||
* @chainable
|
||||
*/
|
||||
public static function set($key, $value) {
|
||||
$this->$key = $value;
|
||||
public function set($key, $value) {
|
||||
$this->values[$key] = $value;
|
||||
return $this;
|
||||
}
|
||||
|
||||
public function send($status='') {
|
||||
if($status!='') $this->set('status', $status);
|
||||
//ksort($this->values);
|
||||
|
||||
echo '#__GR2PROTO__'.$this->nl;
|
||||
foreach($this->values as $key => $value) {
|
||||
echo $key.'='.$value.$this->nl;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -1,7 +1,7 @@
|
||||
name = "Gallery Remote"
|
||||
description = "Use Gallery Remote and other similar applications to control your Gallery"
|
||||
description = "Use Gallery Remote and other similar applications to control Gallery 3"
|
||||
version = 1
|
||||
author_name = ""
|
||||
author_url = ""
|
||||
info_url = "http://codex.gallery2.org/Gallery3:Modules:remote"
|
||||
author_name = "Thomas E. Horner"
|
||||
author_url = "http://www.t-horner.com"
|
||||
info_url = "http://www.t-horner.com/g3_remote"
|
||||
discuss_url = "http://gallery.menalto.com/forum_module_remote"
|
||||
|
@ -1,13 +1,11 @@
|
||||
diff --git a/system/helpers/cookie.php b/system/helpers/cookie.php
|
||||
index 901b6d8..df276ee 100644
|
||||
--- a/system/helpers/cookie.php
|
||||
+++ b/system/helpers/cookie.php
|
||||
@@ -45,7 +45,7 @@ class cookie_Core {
|
||||
// Expiration timestamp
|
||||
$expire = ($expire == 0) ? 0 : time() + (int) $expire;
|
||||
|
||||
- return setcookie($name, $value, $expire, $path, $domain, $secure, $httponly);
|
||||
+ return setcookie($name, $value, $expire, $path, $domain, $secure, 0);
|
||||
}
|
||||
|
||||
/**
|
||||
diff --git a/modules/gallery/config/cookie.php b/modules/gallery/config/cookie.php
|
||||
index a865231..a2a0af7 100644
|
||||
--- a/modules/gallery/config/cookie.php
|
||||
+++ b/modules/gallery/config/cookie.php
|
||||
@@ -45,4 +45,4 @@ $config['secure'] = !empty($_SERVER['HTTPS']) && $_SERVER['HTTPS'] === 'on';
|
||||
* Enable this option to disable the cookie from being accessed when using a
|
||||
* secure protocol. This option is only available in PHP 5.2 and above.
|
||||
*/
|
||||
-$config['httponly'] = true;
|
||||
\ No newline at end of file
|
||||
+$config['httponly'] = false;
|
||||
|
@ -1,4 +0,0 @@
|
||||
<?
|
||||
$_GET["kohana_uri"] = "/gallery_remote";
|
||||
include("index.php");
|
||||
?>
|
@ -1,15 +1,21 @@
|
||||
diff --git a/.htaccess b/.htaccess
|
||||
index 1d8bcb3..8229928 100644
|
||||
index d255efa..68b66bb 100644
|
||||
--- a/.htaccess
|
||||
+++ b/.htaccess
|
||||
@@ -56,3 +56,10 @@
|
||||
# RewriteRule ^(.*)$ index.php?kohana_uri=$1 [QSA,PT,L]
|
||||
# RewriteRule ^$ index.php?kohana_uri=$1 [QSA,PT,L]
|
||||
# </IfModule>
|
||||
+
|
||||
@@ -22,6 +84,16 @@
|
||||
SecFilterScanPOST Off
|
||||
</IfModule>
|
||||
|
||||
+# URL rewriting for Gallery Remote
|
||||
+#<IfModule mod_rewrite.c>
|
||||
+# RewriteEngine On
|
||||
+# RewriteBase /~bharat/gallery3/
|
||||
+# RewriteRule ^gallery_remote2.php$ index.php?kohana_uri=/remote [QSA,PT,L]
|
||||
+#</IfModule>
|
||||
+<IfModule mod_rewrite.c>
|
||||
+ Options +FollowSymLinks
|
||||
+ RewriteEngine On
|
||||
+ RewriteBase /gallery/
|
||||
+ ErrorDocument 404 default
|
||||
+ RewriteRule ^main.php(.*)$ / [QSA,L,R=404]
|
||||
+ RewriteRule ^gallery_remote2.php(.*)$ index.php?kohana_uri=/gallery_remote$1 [QSA,PT,L]
|
||||
+</IfModule>
|
||||
+
|
||||
# Increase security by uncommenting this block. It keeps browsers
|
||||
# from seeing support files that they shouldn't have access to. We
|
||||
# comment this out because Apache2 requires some minor configuration
|
||||
|
65
3.0/modules/remote/views/admin_remote.html.php
Normal file
65
3.0/modules/remote/views/admin_remote.html.php
Normal file
@ -0,0 +1,65 @@
|
||||
<?php defined("SYSPATH") or die("No direct script access.") ?>
|
||||
<div id="g-admin-remote" class="g-block">
|
||||
<h1> <?= t("Gallery Remote Protocol 2") ?> </h1>
|
||||
<p>
|
||||
<?= t("Use your Gallery 1 & 2 tools like GalleryRemote, etc. with your new Gallery 3 installation.") ?>
|
||||
</p>
|
||||
|
||||
<script type="text/javascript">
|
||||
$(document).ready(function() {
|
||||
$("#g-admin-remote-tabs").tabs();
|
||||
// Show the tabs after the page has loaded to prevent Firefox from rendering the
|
||||
// unstyled page and then flashing.
|
||||
$("#g-admin-remote-tabs").show();
|
||||
});
|
||||
</script>
|
||||
<div id="g-admin-remote-tabs" class="g-block-content" style="display: none">
|
||||
<ul>
|
||||
<li>
|
||||
<a href="#g-admin-remote-notes"><?= t("Notes") ?></a>
|
||||
</li>
|
||||
<li>
|
||||
<form action="https://www.paypal.com/cgi-bin/webscr" target="_blank" method="post">
|
||||
<input type="hidden" name="cmd" value="_s-xclick">
|
||||
<input type="hidden" name="encrypted" value="-----BEGIN PKCS7-----MIIHNwYJKoZIhvcNAQcEoIIHKDCCByQCAQExggEwMIIBLAIBADCBlDCBjjELMAkGA1UEBhMCVVMxCzAJBgNVBAgTAkNBMRYwFAYDVQQHEw1Nb3VudGFpbiBWaWV3MRQwEgYDVQQKEwtQYXlQYWwgSW5jLjETMBEGA1UECxQKbGl2ZV9jZXJ0czERMA8GA1UEAxQIbGl2ZV9hcGkxHDAaBgkqhkiG9w0BCQEWDXJlQHBheXBhbC5jb20CAQAwDQYJKoZIhvcNAQEBBQAEgYCL10Oka8+wcBeWJRZ7V/CtX59Nqts2BZJT7EAdRnDvsMcO8k/RMeEaGnkU5YC2H2h9ANhbVryW7OIHhf1xhT8xAB/jSdFLE9rieEe9oT04Q4bYB6TVKRnP2G5ePy85dw2BWmvG1FzQ7VcV0I45RGdQQY4RJ/4YRd1IN/nrl2GHQjELMAkGBSsOAwIaBQAwgbQGCSqGSIb3DQEHATAUBggqhkiG9w0DBwQIYPlLiCOLDAGAgZAwTMBsLDiZwmYKo+hYc+/Pl8gOuSDOlBS18qbDeak+onKhK9GDJREWtgRc0eh3g5Yi9g4wsu1K6y1X1+JeqgHk3Oba7hTXrIeFjLF0xmwsJhU9h6Nltt+rKiC3k/jQjybmQCoAJZNLpnnRFUNedp8h53CiJfDMr/EZuGVk1Q2MgEOwzMdbY3angNHZcgPIg1ugggOHMIIDgzCCAuygAwIBAgIBADANBgkqhkiG9w0BAQUFADCBjjELMAkGA1UEBhMCVVMxCzAJBgNVBAgTAkNBMRYwFAYDVQQHEw1Nb3VudGFpbiBWaWV3MRQwEgYDVQQKEwtQYXlQYWwgSW5jLjETMBEGA1UECxQKbGl2ZV9jZXJ0czERMA8GA1UEAxQIbGl2ZV9hcGkxHDAaBgkqhkiG9w0BCQEWDXJlQHBheXBhbC5jb20wHhcNMDQwMjEzMTAxMzE1WhcNMzUwMjEzMTAxMzE1WjCBjjELMAkGA1UEBhMCVVMxCzAJBgNVBAgTAkNBMRYwFAYDVQQHEw1Nb3VudGFpbiBWaWV3MRQwEgYDVQQKEwtQYXlQYWwgSW5jLjETMBEGA1UECxQKbGl2ZV9jZXJ0czERMA8GA1UEAxQIbGl2ZV9hcGkxHDAaBgkqhkiG9w0BCQEWDXJlQHBheXBhbC5jb20wgZ8wDQYJKoZIhvcNAQEBBQADgY0AMIGJAoGBAMFHTt38RMxLXJyO2SmS+Ndl72T7oKJ4u4uw+6awntALWh03PewmIJuzbALScsTS4sZoS1fKciBGoh11gIfHzylvkdNe/hJl66/RGqrj5rFb08sAABNTzDTiqqNpJeBsYs/c2aiGozptX2RlnBktH+SUNpAajW724Nv2Wvhif6sFAgMBAAGjge4wgeswHQYDVR0OBBYEFJaffLvGbxe9WT9S1wob7BDWZJRrMIG7BgNVHSMEgbMwgbCAFJaffLvGbxe9WT9S1wob7BDWZJRroYGUpIGRMIGOMQswCQYDVQQGEwJVUzELMAkGA1UECBMCQ0ExFjAUBgNVBAcTDU1vdW50YWluIFZpZXcxFDASBgNVBAoTC1BheVBhbCBJbmMuMRMwEQYDVQQLFApsaXZlX2NlcnRzMREwDwYDVQQDFAhsaXZlX2FwaTEcMBoGCSqGSIb3DQEJARYNcmVAcGF5cGFsLmNvbYIBADAMBgNVHRMEBTADAQH/MA0GCSqGSIb3DQEBBQUAA4GBAIFfOlaagFrl71+jq6OKidbWFSE+Q4FqROvdgIONth+8kSK//Y/4ihuE4Ymvzn5ceE3S/iBSQQMjyvb+s2TWbQYDwcp129OPIbD9epdr4tJOUNiSojw7BHwYRiPh58S1xGlFgHFXwrEBb3dgNbMUa+u4qectsMAXpVHnD9wIyfmHMYIBmjCCAZYCAQEwgZQwgY4xCzAJBgNVBAYTAlVTMQswCQYDVQQIEwJDQTEWMBQGA1UEBxMNTW91bnRhaW4gVmlldzEUMBIGA1UEChMLUGF5UGFsIEluYy4xEzARBgNVBAsUCmxpdmVfY2VydHMxETAPBgNVBAMUCGxpdmVfYXBpMRwwGgYJKoZIhvcNAQkBFg1yZUBwYXlwYWwuY29tAgEAMAkGBSsOAwIaBQCgXTAYBgkqhkiG9w0BCQMxCwYJKoZIhvcNAQcBMBwGCSqGSIb3DQEJBTEPFw0xMTA2MjAxMDQxMDZaMCMGCSqGSIb3DQEJBDEWBBSuGj5QrqLx1Oino/zoU3oJ/X/zUjANBgkqhkiG9w0BAQEFAASBgGzIs8ATmWaLCHrnvW1W+xnSJDFutjw7EU0l6wRD2Kx2cheqbfIDe06aMJUiv4FV7ZYuRYxn/j2VYmHDi15XTEfen2S5ag6HIqAjEkQxTRnyoWVtD7iY37qV8CwAgYgkIhMRw3+rwHnuPcCprUtO7CmxvNqZrNS3X0oogdOfxAQN-----END PKCS7-----">
|
||||
<input type="image" src="https://www.paypalobjects.com/WEBSCR-640-20110429-1/en_GB/i/btn/btn_donate_SM.gif" border="0" name="submit" alt="PayPal - The safer, easier way to pay online." style="background-color: transparent">
|
||||
<img alt="" border="0" src="https://www.paypalobjects.com/WEBSCR-640-20110429-1/de_DE/i/scr/pixel.gif" width="1" height="1">
|
||||
</form>
|
||||
</li>
|
||||
</ul>
|
||||
<div id="g-admin-remote-notes" class="g-text">
|
||||
<ul>
|
||||
<li>
|
||||
<p>
|
||||
<?= t("To use GalleryRemote 1.5.1 you need to edit %file and change line <br />%from <br />to line <br />%to",
|
||||
array( "file" => 'modules/gallery/config/cookie.php'
|
||||
,"from" => '$config[\'httponly\'] = true;'
|
||||
,"to" => '$config[\'httponly\'] = false;') ) ?>
|
||||
</p>
|
||||
</li>
|
||||
<li>
|
||||
<p>
|
||||
<?= t("In any case you need to enable the G3 Gallery Remote interface: <br />Put the following block at the top of %path and the Gallery Remote module will be available",
|
||||
array("path" => '.htaccess') ) ?>
|
||||
</p>
|
||||
|
||||
<textarea id="g-remote-redirect-rules" rows="4" cols="60"><IfModule mod_rewrite.c>
|
||||
Options +FollowSymLinks
|
||||
RewriteEngine On
|
||||
RewriteBase /gallery/
|
||||
ErrorDocument 404 default
|
||||
RewriteRule ^main.php(.*)$ / [QSA,L,R=404]
|
||||
RewriteRule ^gallery_remote2.php(.*)$ index.php?kohana_uri=/gallery_remote$1 [QSA,PT,L]
|
||||
</IfModule></textarea>
|
||||
<script type="text/javascript">
|
||||
$(document).ready(function() {
|
||||
$("#g-remote-redirect-rules").click(function(event) {
|
||||
this.select();
|
||||
});
|
||||
});
|
||||
</script>
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
Reference in New Issue
Block a user