summaryrefslogtreecommitdiff
path: root/modules/server_add
diff options
context:
space:
mode:
Diffstat (limited to 'modules/server_add')
-rw-r--r--modules/server_add/controllers/admin_server_add.php15
-rw-r--r--modules/server_add/controllers/server_add.php22
-rw-r--r--modules/server_add/helpers/server_add_event.php3
-rw-r--r--modules/server_add/js/server_add.js179
-rw-r--r--modules/server_add/views/server_add_tree.html.php12
-rw-r--r--modules/server_add/views/server_add_tree_dialog.html.php21
6 files changed, 159 insertions, 93 deletions
diff --git a/modules/server_add/controllers/admin_server_add.php b/modules/server_add/controllers/admin_server_add.php
index fac2aa44..38190fee 100644
--- a/modules/server_add/controllers/admin_server_add.php
+++ b/modules/server_add/controllers/admin_server_add.php
@@ -34,15 +34,17 @@ class Admin_Server_Add_Controller extends Admin_Controller {
$form = $this->_get_admin_form();
$paths = unserialize(module::get_var("server_add", "authorized_paths", "a:0:{}"));
if ($form->validate()) {
- if (is_readable($form->add_path->path->value)) {
+ if (is_link($form->add_path->path->value)) {
+ $form->add_path->path->add_error("is_symlink", 1);
+ } else if (!is_readable($form->add_path->path->value)) {
+ $form->add_path->path->add_error("not_readable", 1);
+ } else {
$path = $form->add_path->path->value;
$paths[$path] = 1;
module::set_var("server_add", "authorized_paths", serialize($paths));
message::success(t("Added path %path", array("path" => $path)));
server_add::check_config($paths);
url::redirect("admin/server_add");
- } else {
- $form->add_path->path->add_error("not_readable", 1);
}
}
@@ -71,7 +73,7 @@ class Admin_Server_Add_Controller extends Admin_Controller {
$directories = array();
$path_prefix = $this->input->get("q");
foreach (glob("{$path_prefix}*") as $file) {
- if (is_dir($file)) {
+ if (is_dir($file) && !is_link($file)) {
$directories[] = $file;
}
}
@@ -84,9 +86,10 @@ class Admin_Server_Add_Controller extends Admin_Controller {
array("id" => "gServerAddAdminForm"));
$add_path = $form->group("add_path");
$add_path->input("path")->label(t("Path"))->rules("required")
- ->error_messages("not_readable", t("This directory is not readable by the webserver"));
+ ->error_messages("not_readable", t("This directory is not readable by the webserver"))
+ ->error_messages("is_symlink", t("Symbolic links are not allowed"));
$add_path->submit("add")->value(t("Add Path"));
return $form;
}
-} \ No newline at end of file
+}
diff --git a/modules/server_add/controllers/server_add.php b/modules/server_add/controllers/server_add.php
index 26b3bd08..9769cd6f 100644
--- a/modules/server_add/controllers/server_add.php
+++ b/modules/server_add/controllers/server_add.php
@@ -137,17 +137,25 @@ class Server_Add_Controller extends Admin_Controller {
// form [path, parent_id] where the parent_id refers to another Server_Add_File_Model. We
// have this extra level of abstraction because we don't know its Item_Model id yet.
$queue = $task->get("queue");
+ $paths = unserialize(module::get_var("server_add", "authorized_paths"));
+
while ($queue && microtime(true) - $start < 0.5) {
list($file, $parent_entry_id) = array_shift($queue);
- $entry = ORM::factory("server_add_file");
- $entry->task_id = $task->id;
- $entry->file = $file;
- $entry->parent_id = $parent_entry_id;
- $entry->save();
+ // Ignore the staging directories as directories to be imported.
+ if (empty($paths[$file])) {
+ $entry = ORM::factory("server_add_file");
+ $entry->task_id = $task->id;
+ $entry->file = $file;
+ $entry->parent_id = $parent_entry_id;
+ $entry->save();
+ $entry_id = $entry->id;
+ } else {
+ $entry_id = null;
+ }
foreach (glob("$file/*") as $child) {
if (is_dir($child)) {
- $queue[] = array($child, $entry->id);
+ $queue[] = array($child, $entry_id);
} else {
$ext = strtolower(pathinfo($child, PATHINFO_EXTENSION));
if (in_array($ext, array("gif", "jpeg", "jpg", "png", "flv", "mp4")) &&
@@ -155,7 +163,7 @@ class Server_Add_Controller extends Admin_Controller {
$child_entry = ORM::factory("server_add_file");
$child_entry->task_id = $task->id;
$child_entry->file = $child;
- $child_entry->parent_id = $entry->id;
+ $child_entry->parent_id = $entry_id;
$child_entry->save();
}
}
diff --git a/modules/server_add/helpers/server_add_event.php b/modules/server_add/helpers/server_add_event.php
index b9dd8c28..4db83f74 100644
--- a/modules/server_add/helpers/server_add_event.php
+++ b/modules/server_add/helpers/server_add_event.php
@@ -30,7 +30,8 @@ class server_add_event_Core {
$item = $theme->item();
$paths = unserialize(module::get_var("server_add", "authorized_paths"));
- if ($item && user::active()->admin && $item->is_album() && !empty($paths)) {
+ if ($item && user::active()->admin && $item->is_album() && !empty($paths) &&
+ is_writable($item->is_album() ? $item->file_path() : $item->parent()->file_path())) {
$menu->get("add_menu")
->append(Menu::factory("dialog")
->id("server_add")
diff --git a/modules/server_add/js/server_add.js b/modules/server_add/js/server_add.js
index 51ef41a7..50a8c36b 100644
--- a/modules/server_add/js/server_add.js
+++ b/modules/server_add/js/server_add.js
@@ -1,64 +1,125 @@
-/**
- * Manage file selection state.
- */
-function select_file(li) {
- $(li).toggleClass("selected");
- if ($("#gServerAdd span.selected").length) {
- $("#gServerAddAddButton").enable(true).removeClass("ui-state-disabled");
- } else {
- $("#gServerAddAddButton").enable(false).addClass("ui-state-disabled");
- }
-}
+(function($) {
+ $.widget("ui.gallery_server_add", {
+ _init: function() {
+ var self = this;
+ $("#gServerAddAddButton", this.element).click(function(event) {
+ event.preventDefault();
+ $(".gProgressBar", this.element).
+ progressbar().
+ progressbar("value", 0);
+ $("#gServerAddProgress", this.element).slideDown("fast", function() { self.start_add(); });
+ });
+ $("#gServerAddPauseButton", this.element).click(function(event) {
+ self.pause = true;
+ $("#gServerAddPauseButton", this.element).hide();
+ $("#gServerAddContinueButton", this.element).show();
+ });
+ $("#gServerAddContinueButton", this.element).click(function(event) {
+ self.pause = false;
+ $("#gServerAddPauseButton", this.element).show();
+ $("#gServerAddContinueButton", this.element).hide();
+ self.run_add();
+ });
+ $("#gServerAddCloseButton", this.element).click(function(event) {
+ $("#gDialog").dialog("close");
+ window.location.reload();
+ });
+ $("#gServerAddTree span.gDirectory", this.element).dblclick(function(event) {
+ self.open_dir(event);
+ });
+ $("#gServerAddTree span.gFile, #gServerAddTree span.gDirectory", this.element).click(function(event) {
+ self.select_file(event);
+ });
+ $("#gServerAddTree span.gDirectory", this.element).dblclick(function(event) {
+ self.open_dir(event);
+ });
+ $("#gDialog").bind("dialogclose", function(event, ui) {
+ window.location.reload();
+ });
+ },
-/**
- * Load a new directory
- */
-function open_dir(path) {
- $.ajax({
- url: GET_CHILDREN_URL.replace("__PATH__", path),
- success: function(data, textStatus) {
- $("#gServerAddTree").html(data);
- }
- });
-}
+ taskURL: null,
+ pause: false,
-function start_add() {
- var paths = [];
- $.each($("#gServerAdd span.selected"),
- function () {
- paths.push($(this).attr("file"));
- }
- );
+ start_add: function() {
+ var self = this;
+ var paths = [];
+ $.each($("span.selected", self.element), function () {
+ paths.push($(this).attr("ref"));
+ });
- $.ajax({
- url: START_URL,
- type: "POST",
- async: false,
- data: { "paths[]": paths },
- dataType: "json",
- success: function(data, textStatus) {
- $("#gStatus").html(data.status);
- $("#gServerAdd .gProgressBar").progressbar("value", data.percent_complete);
- setTimeout(function() { run_add(data.url); }, 0);
- }
- });
- return false;
-}
+ $("#gServerAddAddButton", this.element).hide();
+ $("#gServerAddPauseButton", this.element).show();
-function run_add(url) {
- $.ajax({
- url: url,
- async: false,
- dataType: "json",
- success: function(data, textStatus) {
- $("#gStatus").html(data.status);
- $("#gServerAdd .gProgressBar").progressbar("value", data.percent_complete);
- if (data.done) {
- $("#gServerAddProgress").slideUp();
- } else {
- setTimeout(function() { run_add(url); }, 0);
- }
- }
- });
-}
+ $.ajax({
+ url: START_URL,
+ type: "POST",
+ async: false,
+ data: { "paths[]": paths },
+ dataType: "json",
+ success: function(data, textStatus) {
+ $("#gStatus").html(data.status);
+ $(".gProgressBar", self.element).progressbar("value", data.percent_complete);
+ self.taskURL = data.url;
+ setTimeout(function() { self.run_add(); }, 25);
+ }
+ });
+ return false;
+ },
+ run_add: function () {
+ var self = this;
+ $.ajax({
+ url: self.taskURL,
+ async: false,
+ dataType: "json",
+ success: function(data, textStatus) {
+ $("#gStatus").html(data.status);
+ $(".gProgressBar", self.element).progressbar("value", data.percent_complete);
+ if (data.done) {
+ $("#gServerAddProgress", this.element).slideUp();
+ $("#gServerAddAddButton", this.element).show();
+ $("#gServerAddPauseButton", this.element).hide();
+ $("#gServerAddContinueButton", this.element).hide();
+ } else {
+ if (!self.pause) {
+ setTimeout(function() { self.run_add(); }, 25);
+ }
+ }
+ }
+ });
+ },
+
+ /**
+ * Load a new directory
+ */
+ open_dir: function(event) {
+ var self = this;
+ var path = $(event.target).attr("ref");
+ $.ajax({
+ url: GET_CHILDREN_URL.replace("__PATH__", path),
+ success: function(data, textStatus) {
+ $("#gServerAddTree", self.element).html(data);
+ $("#gServerAddTree span.gDirectory", self.element).dblclick(function(event) {
+ self.open_dir(event);
+ });
+ $("#gServerAddTree span.gFile, #gServerAddTree span.gDirectory", this.element).click(function(event) {
+ self.select_file(event);
+ });
+ }
+ });
+ },
+
+ /**
+ * Manage file selection state.
+ */
+ select_file: function (event) {
+ $(event.target).toggleClass("selected");
+ if ($("#gServerAdd span.selected").length) {
+ $("#gServerAddAddButton").enable(true).removeClass("ui-state-disabled");
+ } else {
+ $("#gServerAddAddButton").enable(false).addClass("ui-state-disabled");
+ }
+ }
+ });
+})(jQuery);
diff --git a/modules/server_add/views/server_add_tree.html.php b/modules/server_add/views/server_add_tree.html.php
index 918fbdc7..4e5bf601 100644
--- a/modules/server_add/views/server_add_tree.html.php
+++ b/modules/server_add/views/server_add_tree.html.php
@@ -1,7 +1,7 @@
<?php defined("SYSPATH") or die("No direct script access.") ?>
<li class="ui-icon-left">
<span class="ui-icon ui-icon-folder-open"></span>
- <span ondblclick="open_dir('')">
+ <span class="gDirectory" ref="">
<?= t("All") ?>
</span>
<ul>
@@ -9,7 +9,7 @@
<? foreach ($parents as $dir): ?>
<li class="ui-icon-left">
<span class="ui-icon ui-icon-folder-open"></span>
- <span ondblclick='open_dir(<?= html::js_string($dir) ?>)'>
+ <span class="gDirectory" ref="<?= html::clean_attribute($dir) ?>">
<?= html::clean(basename($dir)) ?>
</span>
<ul>
@@ -18,12 +18,8 @@
<? foreach ($files as $file): ?>
<li class="ui-icon-left">
<span class="ui-icon <?= is_dir($file) ? "ui-icon-folder-collapsed" : "ui-icon-document" ?>"></span>
- <span onclick="select_file(this)"
- <? if (is_dir($file)): ?>
- ondblclick="open_dir($(this).attr('file'))"
- <? endif ?>
- file="<?= html::clean_attribute($file) ?>"
- >
+ <span class="<?= is_dir($file) ? "gDirectory" : "gFile" ?>"
+ ref="<?= html::clean_attribute($file) ?>" >
<?= html::clean(basename($file)) ?>
</span>
</li>
diff --git a/modules/server_add/views/server_add_tree_dialog.html.php b/modules/server_add/views/server_add_tree_dialog.html.php
index 8eb6e4df..fdb66d1c 100644
--- a/modules/server_add/views/server_add_tree_dialog.html.php
+++ b/modules/server_add/views/server_add_tree_dialog.html.php
@@ -33,24 +33,21 @@
disabled="disabled">
<?= t("Add") ?>
</button>
+ <button id="gServerAddPauseButton" class="ui-state-default ui-corner-all" style="display:none">
+ <?= t("Pause") ?>
+ </button>
+ <button id="gServerAddContinueButton" class="ui-state-default ui-corner-all" style="display:none">
+ <?= t("Continue") ?>
+ </button>
- <button id="gServerCloseButton" class="ui-state-default ui-corner-all">
+ <button id="gServerAddCloseButton" class="ui-state-default ui-corner-all">
<?= t("Close") ?>
</button>
</span>
<script type="text/javascript">
- $("#gServerAddAddButton").ready(function() {
- $("#gServerAddAddButton").click(function(event) {
- event.preventDefault();
- $("#gServerAdd .gProgressBar").
- progressbar().
- progressbar("value", 0);
- $("#gServerAddProgress").slideDown("fast", function() { start_add() });
- });
- $("#gServerCloseButton").click(function(event) {
- $("#gDialog").dialog("close");
- });
+ $("#gServerAdd").ready(function() {
+ $("#gServerAdd").gallery_server_add();
});
</script>