From d8d1155615739a9e6f1f12d4f1ce2ec7cc9cd444 Mon Sep 17 00:00:00 2001
From: Andy Staudacher
Date: Sat, 6 Feb 2010 14:20:19 -0800
Subject: Fix maintenance view, which was broken when the g2_import module was
installed but not configured correctly.
---
modules/g2_import/helpers/g2_import_task.php | 5 +++--
1 file changed, 3 insertions(+), 2 deletions(-)
(limited to 'modules/g2_import/helpers')
diff --git a/modules/g2_import/helpers/g2_import_task.php b/modules/g2_import/helpers/g2_import_task.php
index e0212b33..2e81adef 100644
--- a/modules/g2_import/helpers/g2_import_task.php
+++ b/modules/g2_import/helpers/g2_import_task.php
@@ -19,14 +19,15 @@
*/
class g2_import_task_Core {
static function available_tasks() {
+ $version = '';
g2_import::lower_error_reporting();
if (g2_import::is_configured()) {
g2_import::init();
+ $version = g2_import::version();
}
- $version = g2_import::version();
g2_import::restore_error_reporting();
- if (class_exists("GalleryCoreApi")) {
+ if (g2_import::is_initialized()) {
return array(Task_Definition::factory()
->callback("g2_import_task::import")
->name(t("Import from Gallery 2"))
--
cgit v1.2.3
From 33b39efb491d730c8653ca3c06a22297338aa8b8 Mon Sep 17 00:00:00 2001
From: Andy Staudacher
Date: Sat, 6 Feb 2010 15:46:13 -0800
Subject: Add core.DownloadItem redirect for G2's Photo and Movie items (was
previously omitted, but we already had core.DownloadItem redirects for
derivatives)
---
modules/g2_import/controllers/g2.php | 1 +
modules/g2_import/helpers/g2_import.php | 4 ++++
2 files changed, 5 insertions(+)
(limited to 'modules/g2_import/helpers')
diff --git a/modules/g2_import/controllers/g2.php b/modules/g2_import/controllers/g2.php
index 70461600..8260cf9f 100644
--- a/modules/g2_import/controllers/g2.php
+++ b/modules/g2_import/controllers/g2.php
@@ -64,6 +64,7 @@ class G2_Controller extends Controller {
case "resize":
url::redirect($item->resize_url(true));
+ case "file":
case "full":
url::redirect($item->file_url(true));
diff --git a/modules/g2_import/helpers/g2_import.php b/modules/g2_import/helpers/g2_import.php
index 0fcc0539..f13c63b1 100644
--- a/modules/g2_import/helpers/g2_import.php
+++ b/modules/g2_import/helpers/g2_import.php
@@ -541,6 +541,10 @@ class g2_import_Core {
$item->save();
self::set_map($g2_item_id, $item->id, "item", $g2_item_url);
+
+ self::set_map($g2_item_id, $item->id, "file",
+ self::g2_url(array("view" => "core.DownloadItem", "itemId" => $g2_item_id)));
+
$derivatives = g2(GalleryCoreApi::fetchDerivativesByItemIds(array($g2_item_id)));
if (!empty($derivatives[$g2_item_id])) {
foreach ($derivatives[$g2_item_id] as $derivative) {
--
cgit v1.2.3
From a6170dc065856c6c4b6f69a4571fe19dee87d0ee Mon Sep 17 00:00:00 2001
From: Andy Staudacher
Date: Sat, 6 Feb 2010 18:37:25 -0800
Subject: Fix maintenance view for the case when g2_import is configured and
the user replaced the original g2 directory with the .htaccess file only.
---
modules/g2_import/helpers/g2_import_task.php | 6 +++++-
1 file changed, 5 insertions(+), 1 deletion(-)
(limited to 'modules/g2_import/helpers')
diff --git a/modules/g2_import/helpers/g2_import_task.php b/modules/g2_import/helpers/g2_import_task.php
index 2e81adef..1ec6870e 100644
--- a/modules/g2_import/helpers/g2_import_task.php
+++ b/modules/g2_import/helpers/g2_import_task.php
@@ -23,7 +23,11 @@ class g2_import_task_Core {
g2_import::lower_error_reporting();
if (g2_import::is_configured()) {
g2_import::init();
- $version = g2_import::version();
+ // Guard from common case where the import has been
+ // completed and the original files have been removed.
+ if (class_exists("GalleryCoreApi")) {
+ $version = g2_import::version();
+ }
}
g2_import::restore_error_reporting();
--
cgit v1.2.3
From bca3eeb92399093214ac0f5a74a380b14ffd0405 Mon Sep 17 00:00:00 2001
From: Andy Staudacher
Date: Sun, 7 Feb 2010 21:39:26 -0800
Subject: Import G2 permissions in the import process. Ignores user and item
specific permissions.
---
modules/g2_import/helpers/g2_import.php | 190 +++++++++++++++++++----
modules/g2_import/helpers/g2_import_task.php | 13 +-
modules/g2_import/views/admin_g2_import.html.php | 2 +-
3 files changed, 162 insertions(+), 43 deletions(-)
(limited to 'modules/g2_import/helpers')
diff --git a/modules/g2_import/helpers/g2_import.php b/modules/g2_import/helpers/g2_import.php
index f13c63b1..31368a5b 100644
--- a/modules/g2_import/helpers/g2_import.php
+++ b/modules/g2_import/helpers/g2_import.php
@@ -357,45 +357,48 @@ class g2_import_Core {
}
if ($g2_album->getParentId() == null) {
- return t("Skipping Gallery 2 root album");
- }
- $parent_album = ORM::factory("item", self::map($g2_album->getParentId()));
-
- $album = ORM::factory("item");
- $album->type = "album";
- $album->parent_id = self::map($g2_album->getParentId());
- $album->name = $g2_album->getPathComponent();
- $album->title = self::_decode_html_special_chars($g2_album->getTitle());
- $album->description = self::_decode_html_special_chars(self::extract_description($g2_album));
- $album->owner_id = self::map($g2_album->getOwnerId());
- $album->view_count = g2(GalleryCoreApi::fetchItemViewCount($g2_album_id));
- $album->created = $g2_album->getCreationTimestamp();
-
- $order_map = array(
- "originationTimestamp" => "captured",
- "creationTimestamp" => "created",
- "description" => "description",
- "modificationTimestamp" => "updated",
- "orderWeight" => "weight",
- "pathComponent" => "name",
- "summary" => "description",
- "title" => "title",
- "viewCount" => "view_count");
- $direction_map = array(
- ORDER_ASCENDING => "asc",
- ORDER_DESCENDING => "desc");
- if (array_key_exists($g2_order = $g2_album->getOrderBy(), $order_map)) {
- $album->sort_column = $order_map[$g2_order];
- $album->sort_order = $direction_map[$g2_album->getOrderDirection()];
- }
- $album->save();
-
- self::import_keywords_as_tags($g2_album->getKeywords(), $album);
+ $album = item::root();
+ } else {
+ $parent_album = ORM::factory("item", self::map($g2_album->getParentId()));
+
+ $album = ORM::factory("item");
+ $album->type = "album";
+ $album->parent_id = self::map($g2_album->getParentId());
+ $album->name = $g2_album->getPathComponent();
+ $album->title = self::_decode_html_special_chars($g2_album->getTitle());
+ $album->description = self::_decode_html_special_chars(self::extract_description($g2_album));
+ $album->owner_id = self::map($g2_album->getOwnerId());
+ $album->view_count = g2(GalleryCoreApi::fetchItemViewCount($g2_album_id));
+ $album->created = $g2_album->getCreationTimestamp();
+
+ $order_map = array(
+ "originationTimestamp" => "captured",
+ "creationTimestamp" => "created",
+ "description" => "description",
+ "modificationTimestamp" => "updated",
+ "orderWeight" => "weight",
+ "pathComponent" => "name",
+ "summary" => "description",
+ "title" => "title",
+ "viewCount" => "view_count");
+ $direction_map = array(
+ ORDER_ASCENDING => "asc",
+ ORDER_DESCENDING => "desc");
+ if (array_key_exists($g2_order = $g2_album->getOrderBy(), $order_map)) {
+ $album->sort_column = $order_map[$g2_order];
+ $album->sort_order = $direction_map[$g2_album->getOrderDirection()];
+ }
+ $album->save();
+
+ self::import_keywords_as_tags($g2_album->getKeywords(), $album);
+ }
self::set_map(
$g2_album_id, $album->id,
"album",
self::g2_url(array("view" => "core.ShowItem", "itemId" => $g2_album->getId())));
+
+ self::_import_permissions($g2_album, $album);
}
/**
@@ -590,6 +593,125 @@ class g2_import_Core {
array("&", "\"", "<", ">"), $value);
}
+ private static $_permission_map = array(
+ "core.view" => "view",
+ "core.viewSource" => "view_full",
+ "core.edit" => "edit",
+ "core.addDataItem" => "add",
+ "core.addAlbumItem" => "add");
+
+ /**
+ * Imports G2 permissions, mapping G2's permission model to G3's
+ * much simplified permissions.
+ *
+ * - Ignores user permissions, G3 only supports group permissions.
+ * - Ignores item permissions, G3 only supports album permissions.
+ *
+ * G2 permission -> G3 permission
+ * ---------------------------------
+ * core.view view
+ * core.viewSource view_full
+ * core.edit edit
+ * core.addDataItem add
+ * core.addAlbumItem add
+ * core.viewResizes
+ * core.delete
+ * comment.*
+ */
+ private static function _import_permissions($g2_album, $g3_album) {
+ // No need to do anything if this album has the same G2 ACL as its parent.
+ if ($g2_album->getParentId() != null &&
+ g2(GalleryCoreApi::fetchAccessListId($g2_album->getId())) ==
+ g2(GalleryCoreApi::fetchAccessListId($g2_album->getParentId()))) {
+ return;
+ }
+
+ $granted_permissions = self::_map_permissions($g2_album->getId());
+
+ if ($g2_album->getParentId() == null) {
+ // Compare to current permissions, and change them if necessary.
+ $g3_parent_album = item::root();
+ } else {
+ $g3_parent_album = $g3_album->parent();
+ }
+ $granted_parent_permissions = array();
+ $perm_ids = array_unique(array_values(self::$_permission_map));
+ foreach (identity::groups() as $group) {
+ $granted_parent_permissions[$group->id] = array();
+ foreach ($perm_ids as $perm_id) {
+ if (access::group_can($group, $perm_id, $g3_parent_album)) {
+ $granted_parent_permissions[$group->id][$perm_id] = 1;
+ }
+ }
+ }
+
+ // Note: Only registering permissions if they're not the same as
+ // the inherited ones.
+ foreach ($granted_permissions as $group_id => $permissions) {
+ if (!isset($granted_parent_permissions[$group_id])) {
+ foreach (array_keys($permissions) as $perm_id) {
+ access::allow(identity::lookup_group($group_id), $perm_id, $g3_album);
+ }
+ } else if ($permissions != $granted_parent_permissions[$group_id]) {
+ $parent_permissions = $granted_parent_permissions[$group_id];
+ // @todo Probably worth caching the group instances.
+ $group = identity::lookup_group($group_id);
+ // Note: Cannot use array_diff_key.
+ foreach (array_keys($permissions) as $perm_id) {
+ if (!isset($parent_permissions[$perm_id])) {
+ access::allow($group, $perm_id, $g3_album);
+ }
+ }
+ foreach (array_keys($parent_permissions) as $perm_id) {
+ if (!isset($permissions[$perm_id])) {
+ access::deny($group, $perm_id, $g3_album);
+ }
+ }
+ }
+ }
+
+ foreach ($granted_parent_permissions as $group_id => $parent_permissions) {
+ if (isset($granted_permissions[$group_id])) {
+ continue; // handled above
+ }
+ $group = identity::lookup_group($group_id);
+ foreach (array_keys($parent_permissions) as $perm_id) {
+ access::deny($group, $perm_id, $g3_album);
+ }
+ }
+ }
+
+ /**
+ * Loads all the granted group G2 permissions for a specific
+ * album and returns an array with G3 groups ids and G3 permission ids.
+ */
+ private static function _map_permissions($g2_album_id) {
+ $g2_permissions = g2(GalleryCoreApi::fetchAllPermissionsForItem($g2_album_id));
+ $permissions = array();
+ foreach ($g2_permissions as $entry) {
+ // @todo Do something about user permissions? E.g. map G2's user albums
+ // to a user-specific group in G3?
+ if (!isset($entry["groupId"])) {
+ continue;
+ }
+ $g2_permission_id = $entry["permission"];
+ if (!isset(self::$_permission_map[$g2_permission_id])) {
+ continue;
+ }
+ $group_id = self::map($entry["groupId"]);
+ if ($group_id == null) {
+ // E.g. the G2 admin group isn't mapped.
+ continue;
+ }
+ $permission_id = self::$_permission_map[$g2_permission_id];
+ if (!isset($permissions[$group_id])) {
+ $permissions[$group_id] = array();
+ }
+ $permissions[$group_id][$permission_id] = 1;
+ }
+ return $permissions;
+ }
+
/**
* Import a single comment.
*/
diff --git a/modules/g2_import/helpers/g2_import_task.php b/modules/g2_import/helpers/g2_import_task.php
index 1ec6870e..b1179e22 100644
--- a/modules/g2_import/helpers/g2_import_task.php
+++ b/modules/g2_import/helpers/g2_import_task.php
@@ -73,13 +73,8 @@ class g2_import_task_Core {
}
$task->set("done", $done);
- $root_g2_id = g2(GalleryCoreApi::getDefaultAlbumId());
- $root = ORM::factory("g2_map")->where("g2_id", "=", $root_g2_id)->find();
- if (!$root->loaded()) {
- $root->g2_id = $root_g2_id;
- $root->g3_id = 1;
- $root->save();
- }
+ // Ensure G2 ACLs are compacted to speed up import.
+ g2(GalleryCoreApi::compactAccessLists());
}
$modes = array("groups", "users", "albums", "items", "comments", "tags", "highlights", "done");
@@ -128,7 +123,9 @@ class g2_import_task_Core {
case "albums":
if (empty($queue)) {
- $task->set("queue", $queue = g2(GalleryCoreApi::fetchAlbumTree()));
+ $g2_root_id = g2(GalleryCoreApi::getDefaultAlbumId());
+ $tree = g2(GalleryCoreApi::fetchAlbumTree());
+ $task->set("queue", $queue = array($g2_root_id => $tree));
}
$log_message = g2_import::import_album($queue);
if ($log_message) {
diff --git a/modules/g2_import/views/admin_g2_import.html.php b/modules/g2_import/views/admin_g2_import.html.php
index 41ef7f85..3b7afec2 100644
--- a/modules/g2_import/views/admin_g2_import.html.php
+++ b/modules/g2_import/views/admin_g2_import.html.php
@@ -13,7 +13,7 @@
-
- = t("Permissions are not imported. You will have to set them again manually (for now).") ?>
+ = t("Please review album permissions after the import! Permissions are imported, but user specific and item specific permissions are not supported in Gallery 3 and thus ignored.") ?>
-
= t("The only supported file formats are JPG, PNG and GIF, FLV and MP4. Other formats will be skipped.") ?>
--
cgit v1.2.3
From 42bc1279257268e2c68b5f4b06e62e95ca8228d4 Mon Sep 17 00:00:00 2001
From: Andy Staudacher
Date: Tue, 9 Feb 2010 00:46:09 -0800
Subject: Fix g2_import bugs related to item and user model validation.
---
modules/g2_import/helpers/g2_import.php | 9 ++++++++-
1 file changed, 8 insertions(+), 1 deletion(-)
(limited to 'modules/g2_import/helpers')
diff --git a/modules/g2_import/helpers/g2_import.php b/modules/g2_import/helpers/g2_import.php
index 31368a5b..3b0f966a 100644
--- a/modules/g2_import/helpers/g2_import.php
+++ b/modules/g2_import/helpers/g2_import.php
@@ -304,7 +304,11 @@ class g2_import_Core {
if ($user) {
$message = t("Loaded existing user: '%name'.", array("name" => $user->name));
} else {
- $user = identity::create_user($g2_user->getUsername(), $g2_user->getfullname(), "");
+ $user = identity::create_user($g2_user->getUsername(), $g2_user->getfullname(),
+ // Note: The API expects a password in cleartext.
+ // Just use the hashed password as an unpredictable
+ // value here. The user will have to reset the password.
+ $g2_user->getHashedPassword(), $g2_user->getEmail());
$message = t("Created user: '%name'.", array("name" => $user->name));
}
@@ -366,6 +370,7 @@ class g2_import_Core {
$album->parent_id = self::map($g2_album->getParentId());
$album->name = $g2_album->getPathComponent();
$album->title = self::_decode_html_special_chars($g2_album->getTitle());
+ $album->title or $album->title = $album->name;
$album->description = self::_decode_html_special_chars(self::extract_description($g2_album));
$album->owner_id = self::map($g2_album->getOwnerId());
$album->view_count = g2(GalleryCoreApi::fetchItemViewCount($g2_album_id));
@@ -491,6 +496,7 @@ class g2_import_Core {
$item->set_data_file($g2_path);
$item->name = $g2_item->getPathComponent();
$item->title = self::_decode_html_special_chars($g2_item->getTitle());
+ $item->title or $item->title = $item->name;
$item->description = self::_decode_html_special_chars(self::extract_description($g2_item));
$item->owner_id = self::map($g2_item->getOwnerId());
$item->save();
@@ -512,6 +518,7 @@ class g2_import_Core {
$item->set_data_file($g2_path);
$item->name = $g2_item->getPathComponent();
$item->title = self::_decode_html_special_chars($g2_item->getTitle());
+ $item->title or $item->title = $item->name;
$item->description = self::_decode_html_special_chars(self::extract_description($g2_item));
$item->owner_id = self::map($g2_item->getOwnerId());
} catch (Exception $e) {
--
cgit v1.2.3
From 55d1ce7fb7c3872295c1e7dbab41de94dd7e06d8 Mon Sep 17 00:00:00 2001
From: Andy Staudacher
Date: Tue, 9 Feb 2010 01:51:04 -0800
Subject: More g2_import model validation fixes, and make import less noisy
(don't copy each comment text to the import log).
---
modules/g2_import/helpers/g2_import.php | 19 ++++++++++++-------
1 file changed, 12 insertions(+), 7 deletions(-)
(limited to 'modules/g2_import/helpers')
diff --git a/modules/g2_import/helpers/g2_import.php b/modules/g2_import/helpers/g2_import.php
index 3b0f966a..80feb7d0 100644
--- a/modules/g2_import/helpers/g2_import.php
+++ b/modules/g2_import/helpers/g2_import.php
@@ -732,6 +732,12 @@ class g2_import_Core {
array("id" => $g2_comment_id, "exception" => (string)$e));
}
+ $item_id = self::map($g2_comment->getParentId());
+ if (empty($item_id)) {
+ // Item was not mapped.
+ return;
+ }
+
$text = $g2_comment->getSubject();
if ($text) {
$text .= " ";
@@ -742,18 +748,17 @@ class g2_import_Core {
// we don't trigger spam filtering events
$comment = ORM::factory("comment");
$comment->author_id = self::map($g2_comment->getCommenterId());
- $comment->guest_name = $g2_comment->getAuthor();
- $comment->item_id = self::map($g2_comment->getParentId());
+ $comment->guest_name = "";
+ if ($comment->author_id == identity::guest()->id) {
+ $comment->guest_name = $g2_comment->getAuthor();
+ $comment->guest_name or $comment->guest_name = (string) t("Anonymous coward");
+ }
+ $comment->item_id = $item_id;
$comment->text = self::_transform_bbcode($text);
$comment->state = "published";
$comment->server_http_host = $g2_comment->getHost();
$comment->created = $g2_comment->getDate();
$comment->save();
-
- self::map($g2_comment->getId(), $comment->id);
- return t("Imported comment '%comment' for item with id: %id",
- array("id" => $comment->item_id,
- "comment" => text::limit_words(nl2br(html::purify($comment->text)), 50)));
}
/**
--
cgit v1.2.3
From dcee225935007fea06360591ab31546ac8495784 Mon Sep 17 00:00:00 2001
From: Andy Staudacher
Date: Tue, 9 Feb 2010 10:17:48 -0800
Subject: Better handling of G2's multi level sort order in g2_import
---
modules/g2_import/helpers/g2_import.php | 9 +++++++--
1 file changed, 7 insertions(+), 2 deletions(-)
(limited to 'modules/g2_import/helpers')
diff --git a/modules/g2_import/helpers/g2_import.php b/modules/g2_import/helpers/g2_import.php
index 80feb7d0..d3ed92e8 100644
--- a/modules/g2_import/helpers/g2_import.php
+++ b/modules/g2_import/helpers/g2_import.php
@@ -389,9 +389,14 @@ class g2_import_Core {
$direction_map = array(
ORDER_ASCENDING => "asc",
ORDER_DESCENDING => "desc");
- if (array_key_exists($g2_order = $g2_album->getOrderBy(), $order_map)) {
+ // Only consider G2's first sort order
+ $g2_order = explode("|", $g2_album->getOrderBy() . "");
+ $g2_order = $g2_order[0];
+ $g2_order_direction = explode("|", $g2_album->getOrderDirection() . "");
+ $g2_order_direction = $g2_order_direction[0];
+ if (array_key_exists($g2_order, $order_map)) {
$album->sort_column = $order_map[$g2_order];
- $album->sort_order = $direction_map[$g2_album->getOrderDirection()];
+ $album->sort_order = $direction_map[$g2_order_direction];
}
$album->save();
--
cgit v1.2.3
From 157872434dc659cecf9e26acbe8006b2f0bc4e5f Mon Sep 17 00:00:00 2001
From: Andy Staudacher
Date: Tue, 9 Feb 2010 13:41:35 -0800
Subject: Import hashed passwords from G2 (which will only work if they're
PasswordHash passwords, not if they're G2 style md5 / salted md5).
---
modules/g2_import/helpers/g2_import.php | 4 ++++
1 file changed, 4 insertions(+)
(limited to 'modules/g2_import/helpers')
diff --git a/modules/g2_import/helpers/g2_import.php b/modules/g2_import/helpers/g2_import.php
index d3ed92e8..faf08291 100644
--- a/modules/g2_import/helpers/g2_import.php
+++ b/modules/g2_import/helpers/g2_import.php
@@ -309,6 +309,10 @@ class g2_import_Core {
// Just use the hashed password as an unpredictable
// value here. The user will have to reset the password.
$g2_user->getHashedPassword(), $g2_user->getEmail());
+ if (class_exists("User_Model") && $user instanceof User_Model) {
+ // This will work if G2's password is a PasswordHash password as well.
+ $user->hashed_password = $g2_user->getHashedPassword();
+ }
$message = t("Created user: '%name'.", array("name" => $user->name));
}
--
cgit v1.2.3