mirror of
https://github.com/Terranom674/Piwigo_Bratonien_Tools.git
synced 2026-09-19 21:04:33 +00:00
Compare commits
26 Commits
fix/09716-
...
0adcc5ca54
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
0adcc5ca54 | ||
|
|
61988db337 | ||
|
|
bdfea105cf | ||
|
|
6f64cb9fe6 | ||
|
|
65b068814f | ||
|
|
e58d2c700a | ||
|
|
afaea3b424 | ||
|
|
7a763ba62a | ||
|
|
31e29db7c2 | ||
|
|
ab116d29c2 | ||
|
|
46924db618 | ||
|
|
6e96b0adc3 | ||
|
|
b8f3ed44a3 | ||
|
|
cb3b2f258c | ||
|
|
ef1c1265a9 | ||
|
|
47d7000cc8 | ||
|
|
c358c157e4 | ||
|
|
1d62dc17e8 | ||
|
|
ad4c281fdc | ||
|
|
a43a15a9d3 | ||
|
|
31b8590e4a | ||
|
|
c772010137 | ||
|
|
d075d05708 | ||
|
|
a4fb7421f0 | ||
|
|
9da08b5d8e | ||
|
|
f28365b0ca |
@@ -4,42 +4,84 @@ if (!defined('PHPWG_ROOT_PATH'))
|
|||||||
die('Hacking attempt!');
|
die('Hacking attempt!');
|
||||||
}
|
}
|
||||||
|
|
||||||
function bratonien_tools_nc_connector_webdav_site_id(array $connection)
|
function bratonien_tools_nc_connector_db_prefix_from_absolute($path)
|
||||||
{
|
{
|
||||||
$config = isset($connection['config']) && is_array($connection['config']) ? $connection['config'] : array();
|
$path = rtrim(str_replace('\\', '/', (string)$path), '/');
|
||||||
if ((string)($connection['adapter'] ?? '') !== 'remote') return 0;
|
$piwigo_root = rtrim(str_replace('\\', '/', PHPWG_ROOT_PATH), '/');
|
||||||
if ((string)($config['source_mode'] ?? '') !== 'webdav-placeholder') return 0;
|
if ($path === '' || strpos($path, $piwigo_root.'/') !== 0) return '';
|
||||||
|
|
||||||
$gallery_root = rtrim((string)($config['parallel_gallery_root'] ?? ''), '/');
|
$relative = ltrim(substr($path, strlen($piwigo_root)), '/');
|
||||||
$piwigo_root = rtrim(PHPWG_ROOT_PATH, '/');
|
return $relative === '' ? '' : './'.rtrim($relative, '/').'/';
|
||||||
if ($gallery_root === '' || strpos($gallery_root, $piwigo_root.'/') !== 0) return 0;
|
}
|
||||||
|
|
||||||
$relative = ltrim(substr($gallery_root, strlen($piwigo_root)), '/');
|
function bratonien_tools_nc_connector_owned_db_prefixes(array $connection)
|
||||||
if ($relative === '') return 0;
|
{
|
||||||
$site_url = './'.rtrim($relative, '/').'/';
|
$id = (int)($connection['id'] ?? 0);
|
||||||
|
if ($id < 1) return array();
|
||||||
|
|
||||||
$result = pwg_query(
|
$prefixes = array(
|
||||||
"SELECT id FROM ".SITES_TABLE.
|
'./_data/bratonien-tools/nc-webdav-gallery/connection-'.$id.'/',
|
||||||
" WHERE galleries_url='".pwg_db_real_escape_string($site_url)."' LIMIT 1"
|
'./_data/bratonien-tools/nc-webdav-source/connection-'.$id.'/',
|
||||||
|
'./galleries/bratonien-webdav-'.$id.'/',
|
||||||
);
|
);
|
||||||
if (!pwg_db_num_rows($result)) return 0;
|
|
||||||
|
|
||||||
$row = pwg_db_fetch_assoc($result);
|
$config = isset($connection['config']) && is_array($connection['config']) ? $connection['config'] : array();
|
||||||
return (int)$row['id'];
|
$configured = bratonien_tools_nc_connector_db_prefix_from_absolute($config['parallel_gallery_root'] ?? '');
|
||||||
|
if ($configured !== '') $prefixes[] = $configured;
|
||||||
|
|
||||||
|
return array_values(array_unique($prefixes));
|
||||||
|
}
|
||||||
|
|
||||||
|
function bratonien_tools_nc_connector_owned_site_urls(array $connection)
|
||||||
|
{
|
||||||
|
$id = (int)($connection['id'] ?? 0);
|
||||||
|
if ($id < 1) return array();
|
||||||
|
|
||||||
|
$urls = array(
|
||||||
|
'./_data/bratonien-tools/nc-webdav-gallery/connection-'.$id.'/',
|
||||||
|
'./galleries/bratonien-webdav-'.$id.'/',
|
||||||
|
);
|
||||||
|
|
||||||
|
$config = isset($connection['config']) && is_array($connection['config']) ? $connection['config'] : array();
|
||||||
|
$configured = bratonien_tools_nc_connector_db_prefix_from_absolute($config['parallel_gallery_root'] ?? '');
|
||||||
|
if ($configured !== '') $urls[] = $configured;
|
||||||
|
|
||||||
|
return array_values(array_unique($urls));
|
||||||
}
|
}
|
||||||
|
|
||||||
function bratonien_tools_nc_connector_remove_webdav_piwigo_content(array $connection)
|
function bratonien_tools_nc_connector_remove_webdav_piwigo_content(array $connection)
|
||||||
{
|
{
|
||||||
$site_id = bratonien_tools_nc_connector_webdav_site_id($connection);
|
|
||||||
if ($site_id < 1) return array('site_id'=>0, 'images'=>0);
|
|
||||||
|
|
||||||
include_once(PHPWG_ROOT_PATH.'admin/include/functions.php');
|
include_once(PHPWG_ROOT_PATH.'admin/include/functions.php');
|
||||||
|
|
||||||
|
$prefixes = bratonien_tools_nc_connector_owned_db_prefixes($connection);
|
||||||
|
if (!$prefixes) return array('sites'=>0, 'images'=>0);
|
||||||
|
|
||||||
|
$where = array();
|
||||||
|
foreach ($prefixes as $prefix)
|
||||||
|
{
|
||||||
|
$escaped = pwg_db_real_escape_string(addcslashes($prefix, '_%\\'));
|
||||||
|
$where[] = "path LIKE '".$escaped."%' ESCAPE '\\\\'";
|
||||||
|
}
|
||||||
|
|
||||||
$image_rows = array();
|
$image_rows = array();
|
||||||
$query = '\nSELECT DISTINCT i.id, i.path, i.representative_ext\n FROM '.IMAGES_TABLE.' AS i\n LEFT JOIN '.CATEGORIES_TABLE.' AS sc ON sc.id = i.storage_category_id\n LEFT JOIN '.IMAGE_CATEGORY_TABLE.' AS ic ON ic.image_id = i.id\n LEFT JOIN '.CATEGORIES_TABLE.' AS vc ON vc.id = ic.category_id\n WHERE sc.site_id = '.$site_id.' OR vc.site_id = '.$site_id.'\n;';
|
$result = pwg_query(
|
||||||
$result = pwg_query($query);
|
'SELECT id, path, representative_ext FROM '.IMAGES_TABLE.
|
||||||
|
' WHERE '.implode(' OR ', $where)
|
||||||
|
);
|
||||||
while ($row = pwg_db_fetch_assoc($result))
|
while ($row = pwg_db_fetch_assoc($result))
|
||||||
{
|
{
|
||||||
|
$path = (string)$row['path'];
|
||||||
|
$owned = false;
|
||||||
|
foreach ($prefixes as $prefix)
|
||||||
|
{
|
||||||
|
if (strpos($path, $prefix) === 0)
|
||||||
|
{
|
||||||
|
$owned = true;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (!$owned) continue;
|
||||||
|
|
||||||
$row['id'] = (int)$row['id'];
|
$row['id'] = (int)$row['id'];
|
||||||
$image_rows[$row['id']] = $row;
|
$image_rows[$row['id']] = $row;
|
||||||
}
|
}
|
||||||
@@ -56,24 +98,28 @@ function bratonien_tools_nc_connector_remove_webdav_piwigo_content(array $connec
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
delete_site($site_id);
|
|
||||||
|
|
||||||
if ($image_rows)
|
if ($image_rows)
|
||||||
{
|
{
|
||||||
$ids = array_keys($image_rows);
|
delete_elements(array_map('intval', array_keys($image_rows)), false);
|
||||||
$remaining = query2array(
|
}
|
||||||
'SELECT id FROM '.IMAGES_TABLE.' WHERE id IN ('.implode(',', array_map('intval', $ids)).')',
|
|
||||||
null,
|
$site_count = 0;
|
||||||
'id'
|
foreach (bratonien_tools_nc_connector_owned_site_urls($connection) as $site_url)
|
||||||
|
{
|
||||||
|
$result = pwg_query(
|
||||||
|
"SELECT id FROM ".SITES_TABLE.
|
||||||
|
" WHERE galleries_url='".pwg_db_real_escape_string($site_url)."'"
|
||||||
);
|
);
|
||||||
if ($remaining)
|
while ($row = pwg_db_fetch_assoc($result))
|
||||||
{
|
{
|
||||||
delete_elements(array_map('intval', $remaining), false);
|
delete_site((int)$row['id']);
|
||||||
|
$site_count++;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
update_category('all');
|
||||||
invalidate_user_cache(true);
|
invalidate_user_cache(true);
|
||||||
return array('site_id'=>$site_id, 'images'=>count($image_rows));
|
return array('sites'=>$site_count, 'images'=>count($image_rows));
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -89,7 +135,7 @@ function bratonien_tools_nc_connector_delete_safe()
|
|||||||
throw new RuntimeException('Connector-Verbindung wurde nicht gefunden.');
|
throw new RuntimeException('Connector-Verbindung wurde nicht gefunden.');
|
||||||
}
|
}
|
||||||
|
|
||||||
$cleanup = array('site_id'=>0, 'images'=>0);
|
$cleanup = array('sites'=>0, 'images'=>0);
|
||||||
if (
|
if (
|
||||||
(string)($connection['adapter'] ?? '') === 'remote'
|
(string)($connection['adapter'] ?? '') === 'remote'
|
||||||
&& (string)($connection['config']['source_mode'] ?? '') === 'webdav-placeholder'
|
&& (string)($connection['config']['source_mode'] ?? '') === 'webdav-placeholder'
|
||||||
@@ -110,14 +156,7 @@ function bratonien_tools_nc_connector_delete_safe()
|
|||||||
@file_put_contents($status_dir.'/deleted-'.$id, date('c')."\n", LOCK_EX);
|
@file_put_contents($status_dir.'/deleted-'.$id, date('c')."\n", LOCK_EX);
|
||||||
}
|
}
|
||||||
|
|
||||||
if ((int)$cleanup['site_id'] > 0)
|
|
||||||
{
|
|
||||||
return array(
|
|
||||||
'message'=>'Verbindung wurde gelöscht. Die zugehörigen Piwigo-Alben und '.(int)$cleanup['images'].' Bilder wurden aus Piwigo entfernt. Nextcloud-Dateien blieben unverändert.',
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
return array(
|
return array(
|
||||||
'message'=>'Verbindung wurde gelöscht. Verbliebene Laufzeitdaten werden automatisch bereinigt. Quelldateien blieben unverändert.',
|
'message'=>'Verbindung wurde gelöscht. '.(int)$cleanup['images'].' eindeutig zu dieser Verbindung gehörende Bilder wurden aus Piwigo entfernt. Nextcloud-Dateien blieben unverändert.',
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,115 +0,0 @@
|
|||||||
<?php
|
|
||||||
if (!defined('PHPWG_ROOT_PATH'))
|
|
||||||
{
|
|
||||||
die('Hacking attempt!');
|
|
||||||
}
|
|
||||||
|
|
||||||
function bratonien_tools_nc_legacy_remove_tree($path, $allowed_root)
|
|
||||||
{
|
|
||||||
$path = rtrim(str_replace('\\', '/', (string)$path), '/');
|
|
||||||
$allowed_root = rtrim(str_replace('\\', '/', (string)$allowed_root), '/');
|
|
||||||
if ($path === '' || $allowed_root === '' || $path === $allowed_root || strpos($path, $allowed_root.'/') !== 0)
|
|
||||||
{
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
if (!file_exists($path) && !is_link($path)) return 0;
|
|
||||||
|
|
||||||
if (is_link($path) || is_file($path))
|
|
||||||
{
|
|
||||||
return @unlink($path) ? 1 : 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
$removed = 0;
|
|
||||||
$items = @scandir($path);
|
|
||||||
if (is_array($items))
|
|
||||||
{
|
|
||||||
foreach ($items as $item)
|
|
||||||
{
|
|
||||||
if ($item === '.' || $item === '..') continue;
|
|
||||||
$removed += bratonien_tools_nc_legacy_remove_tree($path.'/'.$item, $allowed_root);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (@rmdir($path)) $removed++;
|
|
||||||
return $removed;
|
|
||||||
}
|
|
||||||
|
|
||||||
function bratonien_tools_nc_legacy_remove_state_files($state_root)
|
|
||||||
{
|
|
||||||
$removed = 0;
|
|
||||||
foreach (glob(rtrim($state_root, '/').'/connection-*') ?: array() as $connection_dir)
|
|
||||||
{
|
|
||||||
if (!is_dir($connection_dir)) continue;
|
|
||||||
foreach (array('webdav-map.json', 'webdav-manifest.tsv', 'webdav-shadow-map.json') as $name)
|
|
||||||
{
|
|
||||||
$path = $connection_dir.'/'.$name;
|
|
||||||
if (is_file($path) && @unlink($path)) $removed++;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return $removed;
|
|
||||||
}
|
|
||||||
|
|
||||||
function bratonien_tools_nc_reset_legacy_imports()
|
|
||||||
{
|
|
||||||
include_once(PHPWG_ROOT_PATH.'admin/include/functions.php');
|
|
||||||
|
|
||||||
$ids = array();
|
|
||||||
$result = pwg_query(
|
|
||||||
"SELECT id FROM ".IMAGES_TABLE.
|
|
||||||
" WHERE path LIKE '%nc-webdav-source/connection-%'"
|
|
||||||
);
|
|
||||||
while ($row = pwg_db_fetch_assoc($result))
|
|
||||||
{
|
|
||||||
$ids[] = (int)$row['id'];
|
|
||||||
}
|
|
||||||
|
|
||||||
if ($ids)
|
|
||||||
{
|
|
||||||
delete_elements($ids, false);
|
|
||||||
}
|
|
||||||
|
|
||||||
$data_root = rtrim(PHPWG_ROOT_PATH, '/').'/_data';
|
|
||||||
$tool_root = $data_root.'/bratonien-tools';
|
|
||||||
$removed_files = 0;
|
|
||||||
foreach (array(
|
|
||||||
$tool_root.'/nc-webdav-source',
|
|
||||||
$tool_root.'/nc-webdav-preview',
|
|
||||||
$tool_root.'/nc-webdav-gallery',
|
|
||||||
) as $generated_root)
|
|
||||||
{
|
|
||||||
$removed_files += bratonien_tools_nc_legacy_remove_tree($generated_root, $data_root);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (defined('PWG_DERIVATIVE_DIR'))
|
|
||||||
{
|
|
||||||
$derivative_root = rtrim(PHPWG_ROOT_PATH.PWG_DERIVATIVE_DIR, '/');
|
|
||||||
foreach (array(
|
|
||||||
$derivative_root.'/_data/bratonien-tools/nc-webdav-source',
|
|
||||||
$derivative_root.'/_data/bratonien-tools/nc-webdav-gallery',
|
|
||||||
) as $generated_derivative_root)
|
|
||||||
{
|
|
||||||
$removed_files += bratonien_tools_nc_legacy_remove_tree($generated_derivative_root, $derivative_root);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
$removed_state_files = bratonien_tools_nc_legacy_remove_state_files($tool_root.'/nc-connector-state');
|
|
||||||
|
|
||||||
if ($ids)
|
|
||||||
{
|
|
||||||
update_category('all');
|
|
||||||
invalidate_user_cache(true);
|
|
||||||
}
|
|
||||||
|
|
||||||
$result = array(
|
|
||||||
'timestamp'=>time(),
|
|
||||||
'removed_image_records'=>count($ids),
|
|
||||||
'removed_generated_entries'=>$removed_files,
|
|
||||||
'removed_state_files'=>$removed_state_files,
|
|
||||||
);
|
|
||||||
|
|
||||||
if (function_exists('conf_update_param'))
|
|
||||||
{
|
|
||||||
conf_update_param('bratonien_nc_legacy_reset_0977', json_encode($result));
|
|
||||||
}
|
|
||||||
|
|
||||||
return $result;
|
|
||||||
}
|
|
||||||
@@ -23,7 +23,6 @@ function bratonien_tools_watermark_engine_enabled()
|
|||||||
// Piwigo recalculates use_watermark for custom derivatives from the native
|
// Piwigo recalculates use_watermark for custom derivatives from the native
|
||||||
// watermark file itself. Therefore an active Bratonien engine must keep the
|
// watermark file itself. Therefore an active Bratonien engine must keep the
|
||||||
// native watermark file empty, not only the stored use_watermark flags false.
|
// native watermark file empty, not only the stored use_watermark flags false.
|
||||||
// This initialization is required only once per PHP request.
|
|
||||||
if ($enabled)
|
if ($enabled)
|
||||||
{
|
{
|
||||||
bratonien_tools_disable_piwigo_watermarks();
|
bratonien_tools_disable_piwigo_watermarks();
|
||||||
|
|||||||
@@ -27,72 +27,6 @@ function bratonien_tools_runtime_category_id()
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
function bratonien_tools_watermark_album_cover_category($src_image, $category_id=null)
|
|
||||||
{
|
|
||||||
static $map = null;
|
|
||||||
|
|
||||||
if ($map === null)
|
|
||||||
{
|
|
||||||
$map = new SplObjectStorage();
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!is_object($src_image))
|
|
||||||
{
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
if ($category_id !== null)
|
|
||||||
{
|
|
||||||
$category_id = (int)$category_id;
|
|
||||||
if ($category_id > 0)
|
|
||||||
{
|
|
||||||
$map[$src_image] = $category_id;
|
|
||||||
}
|
|
||||||
return $category_id;
|
|
||||||
}
|
|
||||||
|
|
||||||
return $map->contains($src_image) ? (int)$map[$src_image] : 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
function bratonien_tools_watermark_prepare_album_overview($thumbnails)
|
|
||||||
{
|
|
||||||
if (!is_array($thumbnails))
|
|
||||||
{
|
|
||||||
return $thumbnails;
|
|
||||||
}
|
|
||||||
|
|
||||||
foreach ($thumbnails as &$thumbnail)
|
|
||||||
{
|
|
||||||
$category_id = (int)($thumbnail['id'] ?? $thumbnail['ID'] ?? 0);
|
|
||||||
if ($category_id < 1 || empty($thumbnail['representative']['src_image']) || !is_object($thumbnail['representative']['src_image']))
|
|
||||||
{
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Ein Repraesentantenbild kann fuer mehrere Alben verwendet werden. Piwigo
|
|
||||||
// reicht in der Albumuebersicht aber nur das SrcImage an get_derivative_url
|
|
||||||
// weiter. Deshalb bekommt jedes Album-Cover eine eigene SrcImage-Instanz,
|
|
||||||
// damit seine konkrete Albumregel erhalten bleibt.
|
|
||||||
$src_image = clone $thumbnail['representative']['src_image'];
|
|
||||||
$thumbnail['representative']['src_image'] = $src_image;
|
|
||||||
bratonien_tools_watermark_album_cover_category($src_image, $category_id);
|
|
||||||
}
|
|
||||||
unset($thumbnail);
|
|
||||||
|
|
||||||
return $thumbnails;
|
|
||||||
}
|
|
||||||
|
|
||||||
function bratonien_tools_runtime_derivative_category_id($src_image)
|
|
||||||
{
|
|
||||||
$category_id = bratonien_tools_runtime_category_id();
|
|
||||||
if ($category_id > 0)
|
|
||||||
{
|
|
||||||
return $category_id;
|
|
||||||
}
|
|
||||||
|
|
||||||
return bratonien_tools_watermark_album_cover_category($src_image);
|
|
||||||
}
|
|
||||||
|
|
||||||
function bratonien_tools_runtime_effective_rule($category_id)
|
function bratonien_tools_runtime_effective_rule($category_id)
|
||||||
{
|
{
|
||||||
static $categories = null;
|
static $categories = null;
|
||||||
@@ -296,7 +230,7 @@ function bratonien_tools_filter_derivative_url($url, $params, $src_image, $rel_u
|
|||||||
return $url;
|
return $url;
|
||||||
}
|
}
|
||||||
|
|
||||||
$rule = bratonien_tools_runtime_effective_rule(bratonien_tools_runtime_derivative_category_id($src_image));
|
$rule = bratonien_tools_runtime_effective_rule(bratonien_tools_runtime_category_id());
|
||||||
if ($rule['mode'] !== 'profile' || empty($rule['profile_id']))
|
if ($rule['mode'] !== 'profile' || empty($rule['profile_id']))
|
||||||
{
|
{
|
||||||
return $url;
|
return $url;
|
||||||
|
|||||||
@@ -1,94 +1,6 @@
|
|||||||
(function () {
|
(function () {
|
||||||
'use strict';
|
'use strict';
|
||||||
|
|
||||||
function initNcRouteStatus() {
|
|
||||||
var section = document.getElementById('nc-connector');
|
|
||||||
if (!section) return;
|
|
||||||
|
|
||||||
var statusCard = section.querySelector('.bratonien-grid .bratonien-card');
|
|
||||||
if (!statusCard) return;
|
|
||||||
|
|
||||||
var grid = statusCard.querySelector('.bratonien-form-grid');
|
|
||||||
if (!grid) return;
|
|
||||||
|
|
||||||
var routeLabel = document.createElement('span');
|
|
||||||
routeLabel.className = 'bratonien-label';
|
|
||||||
routeLabel.textContent = 'Aktiver Datenweg';
|
|
||||||
|
|
||||||
var routeValue = document.createElement('strong');
|
|
||||||
routeValue.setAttribute('data-nc-route-status', '');
|
|
||||||
routeValue.textContent = 'Noch kein Lauf erfasst';
|
|
||||||
|
|
||||||
var routeTimeLabel = document.createElement('span');
|
|
||||||
routeTimeLabel.className = 'bratonien-label';
|
|
||||||
routeTimeLabel.textContent = 'Datenweg zuletzt';
|
|
||||||
|
|
||||||
var routeTimeValue = document.createElement('strong');
|
|
||||||
routeTimeValue.setAttribute('data-nc-route-time', '');
|
|
||||||
routeTimeValue.textContent = 'Nicht verfügbar';
|
|
||||||
|
|
||||||
grid.appendChild(routeLabel);
|
|
||||||
grid.appendChild(routeValue);
|
|
||||||
grid.appendChild(routeTimeLabel);
|
|
||||||
grid.appendChild(routeTimeValue);
|
|
||||||
|
|
||||||
var detail = document.createElement('p');
|
|
||||||
detail.className = 'bratonien-base-note';
|
|
||||||
detail.setAttribute('data-nc-route-detail', '');
|
|
||||||
detail.textContent = 'Der Datenweg wird nach dem nächsten Connector-Lauf angezeigt.';
|
|
||||||
statusCard.appendChild(detail);
|
|
||||||
|
|
||||||
var basePath = window.location.pathname.replace(/admin\.php.*$/, '');
|
|
||||||
var statusUrl = basePath + '_data/bratonien-tools/nc-connector-status/route-status.json';
|
|
||||||
|
|
||||||
function formatTime(timestamp) {
|
|
||||||
if (!timestamp) return 'Nicht verfügbar';
|
|
||||||
var date = new Date(Number(timestamp) * 1000);
|
|
||||||
if (Number.isNaN(date.getTime())) return 'Nicht verfügbar';
|
|
||||||
return date.toLocaleString('de-DE');
|
|
||||||
}
|
|
||||||
|
|
||||||
function render(data) {
|
|
||||||
var label = data && data.label ? String(data.label) : 'Unbekannt';
|
|
||||||
var route = data && data.route ? String(data.route) : '';
|
|
||||||
routeValue.textContent = label;
|
|
||||||
routeTimeValue.textContent = formatTime(data && data.timestamp);
|
|
||||||
|
|
||||||
if (route === 'webdav') {
|
|
||||||
routeValue.textContent = 'WEBDAV PRIMÄR';
|
|
||||||
detail.textContent = 'Portierung läuft über WebDAV. Legacy wurde in diesem Lauf nicht benutzt.';
|
|
||||||
} else if (route === 'legacy_fallback') {
|
|
||||||
routeValue.textContent = 'LEGACY-FALLBACK AKTIV';
|
|
||||||
detail.textContent = 'WebDAV war nicht erfolgreich. Dieser Lauf wurde über die alte Struktur abgefangen.';
|
|
||||||
} else if (route === 'failed') {
|
|
||||||
routeValue.textContent = 'FEHLER - KEIN ERFOLGREICHER DATENWEG';
|
|
||||||
detail.textContent = data && data.detail ? String(data.detail) : 'WebDAV und Fallback sind fehlgeschlagen.';
|
|
||||||
} else {
|
|
||||||
detail.textContent = data && data.detail ? String(data.detail) : 'Unbekannter Datenweg.';
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
function refresh() {
|
|
||||||
fetch(statusUrl + '?t=' + Date.now(), {
|
|
||||||
cache: 'no-store',
|
|
||||||
credentials: 'same-origin'
|
|
||||||
})
|
|
||||||
.then(function (response) {
|
|
||||||
if (!response.ok) throw new Error('status unavailable');
|
|
||||||
return response.json();
|
|
||||||
})
|
|
||||||
.then(render)
|
|
||||||
.catch(function () {
|
|
||||||
routeValue.textContent = 'Noch kein Lauf erfasst';
|
|
||||||
routeTimeValue.textContent = 'Nicht verfügbar';
|
|
||||||
detail.textContent = 'Nach dem nächsten Connector-Lauf wird hier WebDAV oder Legacy-Fallback angezeigt.';
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
refresh();
|
|
||||||
window.setInterval(refresh, 10000);
|
|
||||||
}
|
|
||||||
|
|
||||||
function initBratonienTabs() {
|
function initBratonienTabs() {
|
||||||
var admin = document.querySelector('.bratonien-admin');
|
var admin = document.querySelector('.bratonien-admin');
|
||||||
if (!admin) return;
|
if (!admin) return;
|
||||||
@@ -201,14 +113,9 @@
|
|||||||
activate(initial, false);
|
activate(initial, false);
|
||||||
}
|
}
|
||||||
|
|
||||||
function init() {
|
|
||||||
initBratonienTabs();
|
|
||||||
initNcRouteStatus();
|
|
||||||
}
|
|
||||||
|
|
||||||
if (document.readyState === 'loading') {
|
if (document.readyState === 'loading') {
|
||||||
document.addEventListener('DOMContentLoaded', init);
|
document.addEventListener('DOMContentLoaded', initBratonienTabs);
|
||||||
} else {
|
} else {
|
||||||
init();
|
initBratonienTabs();
|
||||||
}
|
}
|
||||||
})();
|
})();
|
||||||
|
|||||||
@@ -1,236 +1,6 @@
|
|||||||
(function () {
|
(function () {
|
||||||
'use strict';
|
'use strict';
|
||||||
|
// 0.9.7.18: Die parallele AJAX-Editor-Schicht ist absichtlich deaktiviert.
|
||||||
function ready(callback) {
|
// Der NC Connector benutzt wieder ausschliesslich die vorhandenen
|
||||||
if (document.readyState === 'loading') document.addEventListener('DOMContentLoaded', callback);
|
// Piwigo-Formulare, die Tool-Registry und den WebDAV-Wizard.
|
||||||
else callback();
|
|
||||||
}
|
|
||||||
|
|
||||||
ready(function () {
|
|
||||||
var section = document.getElementById('nc-connector');
|
|
||||||
if (!section) return;
|
|
||||||
|
|
||||||
var tokenInput = section.querySelector('input[name="pwg_token"]');
|
|
||||||
var pwgToken = tokenInput ? tokenInput.value : '';
|
|
||||||
|
|
||||||
var technicalButton = document.getElementById('bratonien-nc-technical-open');
|
|
||||||
if (technicalButton) technicalButton.remove();
|
|
||||||
var technicalCreate = document.getElementById('bratonien-nc-technical-create');
|
|
||||||
if (technicalCreate) technicalCreate.remove();
|
|
||||||
|
|
||||||
var statusHeading = Array.prototype.find.call(section.querySelectorAll('h4'), function (heading) {
|
|
||||||
return heading.textContent.trim() === 'Status';
|
|
||||||
});
|
|
||||||
var statusCard = statusHeading ? statusHeading.closest('.bratonien-card') : null;
|
|
||||||
if (statusCard && pwgToken && !statusCard.querySelector('[data-nc-run-now]')) {
|
|
||||||
var runForm = document.createElement('form');
|
|
||||||
runForm.method = 'post';
|
|
||||||
runForm.className = 'bratonien-actions';
|
|
||||||
runForm.style.marginTop = '1rem';
|
|
||||||
runForm.setAttribute('data-nc-run-now', '1');
|
|
||||||
runForm.innerHTML = '<input type="hidden" name="pwg_token" value="'+escapeHtml(pwgToken)+'">'
|
|
||||||
+ '<button class="buttonLike" type="submit" name="bratonien_tool" value="nc_connector_run_now">Jetzt abgleichen</button>';
|
|
||||||
runForm.addEventListener('submit', function () {
|
|
||||||
var button = runForm.querySelector('button');
|
|
||||||
if (button) {
|
|
||||||
button.disabled = true;
|
|
||||||
button.textContent = 'Abgleich wird gestartet …';
|
|
||||||
}
|
|
||||||
});
|
|
||||||
statusCard.appendChild(runForm);
|
|
||||||
}
|
|
||||||
|
|
||||||
function escapeHtml(value) {
|
|
||||||
return String(value == null ? '' : value).replace(/[&<>"']/g, function (c) {
|
|
||||||
return {'&':'&','<':'<','>':'>','"':'"',"'":'''}[c];
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
function loadConnection(id) {
|
|
||||||
return fetch('plugins/bratonien_tools/nc-connector-edit-data.php?connection_id='+encodeURIComponent(id)+'&_='+Date.now(), {
|
|
||||||
credentials:'same-origin', cache:'no-store', headers:{'Accept':'application/json'}
|
|
||||||
}).then(function (response) {
|
|
||||||
return response.json().then(function (data) {
|
|
||||||
if (!response.ok) throw new Error(data.error || ('HTTP '+response.status));
|
|
||||||
return data;
|
|
||||||
});
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
function createPostForm(label, tool, id) {
|
|
||||||
var form = document.createElement('form');
|
|
||||||
form.method = 'post';
|
|
||||||
form.style.display = 'inline';
|
|
||||||
form.innerHTML = '<input type="hidden" name="pwg_token" value="'+escapeHtml(pwgToken)+'">'
|
|
||||||
+ '<input type="hidden" name="connection_id" value="'+escapeHtml(id)+'">'
|
|
||||||
+ '<button class="buttonLike" type="submit" name="bratonien_tool" value="'+escapeHtml(tool)+'">'+escapeHtml(label)+'</button>';
|
|
||||||
return form;
|
|
||||||
}
|
|
||||||
|
|
||||||
function dialog() {
|
|
||||||
var node = document.getElementById('bratonien-nc-connection-edit-v2');
|
|
||||||
if (node) return node;
|
|
||||||
node = document.createElement('dialog');
|
|
||||||
node.id = 'bratonien-nc-connection-edit-v2';
|
|
||||||
node.className = 'bratonien-edit-dialog';
|
|
||||||
node.innerHTML = '<div class="bratonien-edit-dialog__body">'
|
|
||||||
+ '<div style="display:flex;align-items:flex-start;justify-content:space-between;gap:1rem">'
|
|
||||||
+ '<div><h4 style="margin:0">Verbindung bearbeiten</h4><p class="bratonien-base-note" style="margin:.35rem 0 0">Die Einstellungen gelten nur für diese Verbindung.</p></div>'
|
|
||||||
+ '<button type="button" class="buttonLike" data-edit-close>Schließen</button></div>'
|
|
||||||
+ '<div data-edit-content style="margin-top:1rem"></div></div>';
|
|
||||||
document.body.appendChild(node);
|
|
||||||
node.querySelector('[data-edit-close]').addEventListener('click', function () { node.close(); });
|
|
||||||
node.addEventListener('click', function (event) { if (event.target === node) node.close(); });
|
|
||||||
return node;
|
|
||||||
}
|
|
||||||
|
|
||||||
function storageRow(storage) {
|
|
||||||
storage = storage || {};
|
|
||||||
return '<div class="bratonien-storage-row" data-storage-row>'
|
|
||||||
+ '<label>Storage-ID<input name="nc_storage_id[]" value="'+escapeHtml(storage.storage_id || '')+'" required></label>'
|
|
||||||
+ '<label>Quellordner<input name="nc_source_prefix[]" value="'+escapeHtml(storage.source_prefix || '')+'" placeholder="optional"></label>'
|
|
||||||
+ '<label>Lokaler Speicherpfad<input name="nc_local_mount[]" value="'+escapeHtml(storage.local_mount || '')+'" required></label>'
|
|
||||||
+ '<button type="button" class="buttonLike" data-remove-storage>Entfernen</button></div>';
|
|
||||||
}
|
|
||||||
|
|
||||||
function showError(form, data) {
|
|
||||||
var old = form.querySelector('[data-edit-error]');
|
|
||||||
if (old) old.remove();
|
|
||||||
var box = document.createElement('div');
|
|
||||||
box.dataset.editError = '1';
|
|
||||||
box.className = 'bratonien-main-cache__warning';
|
|
||||||
box.style.margin = '0 0 1rem';
|
|
||||||
box.textContent = (data && data.message) ? data.message : 'Die Verbindung konnte nicht gespeichert werden.';
|
|
||||||
form.insertBefore(box, form.firstChild);
|
|
||||||
}
|
|
||||||
|
|
||||||
function submitLocal(form, editDialog) {
|
|
||||||
if (!form.reportValidity()) return;
|
|
||||||
var button = form.querySelector('button[type="submit"]');
|
|
||||||
if (button) button.disabled = true;
|
|
||||||
fetch('plugins/bratonien_tools/nc-connector-edit-save.php', {
|
|
||||||
method:'POST', credentials:'same-origin', cache:'no-store', headers:{'Accept':'application/json'}, body:new FormData(form)
|
|
||||||
}).then(function (response) {
|
|
||||||
return response.json().then(function (data) {
|
|
||||||
if (!response.ok || !data.ok) { showError(form, data); return; }
|
|
||||||
editDialog.close();
|
|
||||||
window.location.reload();
|
|
||||||
});
|
|
||||||
}).catch(function (error) {
|
|
||||||
showError(form, {message:error.message || String(error)});
|
|
||||||
}).finally(function () {
|
|
||||||
if (button) button.disabled = false;
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
function openLocalEditor(id) {
|
|
||||||
var editDialog = dialog();
|
|
||||||
var content = editDialog.querySelector('[data-edit-content]');
|
|
||||||
content.innerHTML = '<p class="bratonien-base-note">Verbindung wird geladen …</p>';
|
|
||||||
if (typeof editDialog.showModal === 'function') editDialog.showModal();
|
|
||||||
else editDialog.setAttribute('open', 'open');
|
|
||||||
|
|
||||||
loadConnection(id).then(function (data) {
|
|
||||||
if (data.adapter !== 'local') throw new Error('Diese Verbindung wird über den WebDAV-Assistenten bearbeitet.');
|
|
||||||
var legacy = data.legacy || {};
|
|
||||||
var webdav = data.webdav || {};
|
|
||||||
var storages = Array.isArray(legacy.storages) ? legacy.storages : [];
|
|
||||||
var rows = storages.map(storageRow).join('') || storageRow({});
|
|
||||||
|
|
||||||
content.innerHTML = '<form method="post" data-edit-form>'
|
|
||||||
+ '<input type="hidden" name="pwg_token" value="'+escapeHtml(pwgToken)+'">'
|
|
||||||
+ '<input type="hidden" name="connection_id" value="'+escapeHtml(data.id)+'">'
|
|
||||||
+ '<h5>Verbindung</h5><div class="bratonien-form-grid">'
|
|
||||||
+ '<label class="bratonien-label">Name</label><input name="connection_name" value="'+escapeHtml(data.name)+'" required>'
|
|
||||||
+ '</div>'
|
|
||||||
+ '<h5 style="margin-top:1.2rem">Nextcloud</h5><div class="bratonien-form-grid">'
|
|
||||||
+ '<label class="bratonien-label">Nextcloud-Adresse</label><input name="nc_nextcloud_url" value="'+escapeHtml(webdav.nextcloud_url || '')+'">'
|
|
||||||
+ '<label class="bratonien-label">Nextcloud-Benutzer</label><input name="nc_nextcloud_user" value="'+escapeHtml(webdav.nextcloud_user || '')+'" autocomplete="username">'
|
|
||||||
+ '<label class="bratonien-label">Nextcloud-Passwort</label><input name="nc_nextcloud_password" type="password" autocomplete="current-password" placeholder="'+(webdav.has_nextcloud_password ? 'gespeichert – leer = unverändert' : 'noch nicht gespeichert')+'">'
|
|
||||||
+ '</div>'
|
|
||||||
+ '<h5 style="margin-top:1.2rem">Piwigo-Zugang</h5><div class="bratonien-form-grid">'
|
|
||||||
+ '<label class="bratonien-label">API-Schlüssel-ID</label><input name="nc_connection_api_key_id" value="'+escapeHtml(webdav.api_key_id || '')+'" autocomplete="off">'
|
|
||||||
+ '<label class="bratonien-label">API-Geheimnis</label><input name="nc_connection_api_key_secret" type="password" autocomplete="new-password" placeholder="'+(webdav.has_api_key_secret ? 'gespeichert – leer = unverändert' : 'noch nicht gespeichert')+'">'
|
|
||||||
+ '<label class="bratonien-label">Fallback-Benutzer</label><input name="nc_fallback_user" value="'+escapeHtml(webdav.fallback_user || '')+'" autocomplete="username">'
|
|
||||||
+ '<label class="bratonien-label">Fallback-Passwort</label><input name="nc_fallback_password" type="password" autocomplete="current-password" placeholder="'+(webdav.has_fallback_password ? 'gespeichert – leer = unverändert' : 'noch nicht gespeichert')+'">'
|
|
||||||
+ '</div>'
|
|
||||||
+ '<h5 style="margin-top:1.2rem">Lokaler Connector</h5><div class="bratonien-form-grid">'
|
|
||||||
+ '<label class="bratonien-label">Datenbank-Server</label><input name="nc_host" value="'+escapeHtml(legacy.host)+'" required>'
|
|
||||||
+ '<label class="bratonien-label">Port</label><input name="nc_port" type="number" min="1" max="65535" value="'+escapeHtml(legacy.port || 5432)+'" required>'
|
|
||||||
+ '<label class="bratonien-label">Datenbank</label><input name="nc_database" value="'+escapeHtml(legacy.database)+'" required>'
|
|
||||||
+ '<label class="bratonien-label">Reader-Benutzer</label><input name="nc_user" value="'+escapeHtml(legacy.user)+'" required>'
|
|
||||||
+ '<label class="bratonien-label">Reader-Passwort</label><input name="nc_db_password" type="password" autocomplete="new-password" placeholder="'+(legacy.has_db_password ? 'gespeichert – leer = unverändert' : 'noch nicht gespeichert')+'">'
|
|
||||||
+ '</div>'
|
|
||||||
+ '<h5 style="margin-top:1.2rem">Speicherorte</h5><div data-storage-list>'+rows+'</div>'
|
|
||||||
+ '<button type="button" class="buttonLike" data-add-storage>Speicherort hinzufügen</button>'
|
|
||||||
+ '<details style="margin-top:1rem"><summary>Erweiterte Einstellungen</summary><div class="bratonien-form-grid" style="margin-top:.75rem">'
|
|
||||||
+ '<label class="bratonien-label">Source-View</label><input name="nc_source_view" value="'+escapeHtml(legacy.source_view)+'" required>'
|
|
||||||
+ '<label class="bratonien-label">Activity-View</label><input name="nc_activity_view" value="'+escapeHtml(legacy.activity_view)+'" required>'
|
|
||||||
+ '<label class="bratonien-label">Piwigo-Galerieordner</label><input name="nc_gallery_root" value="'+escapeHtml(legacy.gallery_root)+'" required>'
|
|
||||||
+ '<label class="bratonien-label">Ruhezeit (Sek.)</label><input name="nc_quiet_seconds" type="number" min="0" value="'+escapeHtml(legacy.quiet_seconds)+'">'
|
|
||||||
+ '<label class="bratonien-label">Maximale Wartezeit (Sek.)</label><input name="nc_max_wait_seconds" type="number" min="60" value="'+escapeHtml(legacy.max_wait_seconds)+'">'
|
|
||||||
+ '<label class="bratonien-label">Vollprüfung nach (Sek.)</label><input name="nc_full_sync_seconds" type="number" min="300" value="'+escapeHtml(legacy.full_sync_seconds)+'">'
|
|
||||||
+ '</div></details>'
|
|
||||||
+ '<div class="bratonien-actions" style="margin-top:1rem"><button class="buttonLike" type="submit">Änderungen prüfen und speichern</button><button class="buttonLike" type="button" data-cancel>Abbrechen</button></div>'
|
|
||||||
+ '</form>';
|
|
||||||
|
|
||||||
var form = content.querySelector('[data-edit-form]');
|
|
||||||
form.querySelector('[data-cancel]').addEventListener('click', function () { editDialog.close(); });
|
|
||||||
form.querySelector('[data-add-storage]').addEventListener('click', function () {
|
|
||||||
form.querySelector('[data-storage-list]').insertAdjacentHTML('beforeend', storageRow({}));
|
|
||||||
});
|
|
||||||
form.addEventListener('click', function (event) {
|
|
||||||
var remove = event.target.closest('[data-remove-storage]');
|
|
||||||
if (remove) {
|
|
||||||
var row = remove.closest('[data-storage-row]');
|
|
||||||
if (row) row.remove();
|
|
||||||
}
|
|
||||||
});
|
|
||||||
form.addEventListener('submit', function (event) {
|
|
||||||
event.preventDefault();
|
|
||||||
submitLocal(form, editDialog);
|
|
||||||
});
|
|
||||||
}).catch(function (error) {
|
|
||||||
content.innerHTML = '<p class="bratonien-main-cache__warning"><strong>Bearbeiten nicht möglich:</strong> '+escapeHtml(error.message || String(error))+'</p>';
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
[].slice.call(section.querySelectorAll('button[value="nc_connector_edit_start"]')).forEach(function (button) {
|
|
||||||
var form = button.closest('form');
|
|
||||||
if (form) form.remove();
|
|
||||||
});
|
|
||||||
|
|
||||||
[].slice.call(section.querySelectorAll('button[value="nc_connector_migrate_start"]')).forEach(function (button) {
|
|
||||||
var form = button.closest('form');
|
|
||||||
if (form) form.remove();
|
|
||||||
});
|
|
||||||
|
|
||||||
[].slice.call(section.querySelectorAll('button[value="nc_connector_delete"]')).forEach(function (deleteButton) {
|
|
||||||
var deleteForm = deleteButton.closest('form');
|
|
||||||
if (!deleteForm || !deleteForm.parentElement) return;
|
|
||||||
var idInput = deleteForm.querySelector('input[name="connection_id"]');
|
|
||||||
if (!idInput) return;
|
|
||||||
var id = idInput.value;
|
|
||||||
var actions = deleteForm.parentElement;
|
|
||||||
|
|
||||||
loadConnection(id).then(function (data) {
|
|
||||||
var edit;
|
|
||||||
if (data.adapter === 'local') {
|
|
||||||
edit = document.createElement('button');
|
|
||||||
edit.type = 'button';
|
|
||||||
edit.className = 'buttonLike';
|
|
||||||
edit.textContent = 'Bearbeiten';
|
|
||||||
edit.addEventListener('click', function () { openLocalEditor(id); });
|
|
||||||
} else {
|
|
||||||
edit = createPostForm('Bearbeiten', 'nc_connector_edit_start', id);
|
|
||||||
}
|
|
||||||
actions.insertBefore(edit, deleteForm);
|
|
||||||
}).catch(function (error) {
|
|
||||||
var info = document.createElement('span');
|
|
||||||
info.className = 'bratonien-main-cache__warning';
|
|
||||||
info.textContent = 'Verbindung konnte nicht geladen werden: '+(error.message || String(error));
|
|
||||||
actions.insertBefore(info, deleteForm);
|
|
||||||
});
|
|
||||||
});
|
|
||||||
});
|
|
||||||
})();
|
})();
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
<?php
|
<?php
|
||||||
/*
|
/*
|
||||||
Plugin Name: Bratonien Tools
|
Plugin Name: Bratonien Tools
|
||||||
Version: 0.9.7.16
|
Version: 0.9.7.18
|
||||||
Description: Erweiterbare Administrationswerkzeuge fuer die Bratonien-Piwigo-Installation.
|
Description: Erweiterbare Administrationswerkzeuge fuer die Bratonien-Piwigo-Installation.
|
||||||
Plugin URI: https://github.com/Terranom674/Piwigo_Bratonien_Tools
|
Plugin URI: https://github.com/Terranom674/Piwigo_Bratonien_Tools
|
||||||
Author: Bratonien
|
Author: Bratonien
|
||||||
@@ -27,12 +27,10 @@ require_once(BRATONIEN_TOOLS_PATH . 'include/nc_productive_ws.inc.php');
|
|||||||
require_once(BRATONIEN_TOOLS_PATH . 'include/nc_connector_scheduler.inc.php');
|
require_once(BRATONIEN_TOOLS_PATH . 'include/nc_connector_scheduler.inc.php');
|
||||||
|
|
||||||
add_event_handler('get_admin_plugin_menu_links', 'bratonien_tools_admin_menu');
|
add_event_handler('get_admin_plugin_menu_links', 'bratonien_tools_admin_menu');
|
||||||
add_event_handler('loc_end_index_category_thumbnails', 'bratonien_tools_watermark_prepare_album_overview');
|
|
||||||
add_event_handler('get_derivative_url', 'bratonien_tools_filter_derivative_url', EVENT_HANDLER_PRIORITY_NEUTRAL, 4);
|
add_event_handler('get_derivative_url', 'bratonien_tools_filter_derivative_url', EVENT_HANDLER_PRIORITY_NEUTRAL, 4);
|
||||||
add_event_handler('get_src_image_url', 'bratonien_tools_filter_webdav_src_url', EVENT_HANDLER_PRIORITY_NEUTRAL + 50, 2);
|
add_event_handler('get_src_image_url', 'bratonien_tools_filter_webdav_src_url', EVENT_HANDLER_PRIORITY_NEUTRAL + 50, 2);
|
||||||
add_event_handler('loc_end_element_set_global', 'bratonien_tools_batch_titles_register_action');
|
add_event_handler('loc_end_element_set_global', 'bratonien_tools_batch_titles_register_action');
|
||||||
add_event_handler('element_set_global_action', 'bratonien_tools_batch_titles_apply', EVENT_HANDLER_PRIORITY_NEUTRAL, 2);
|
add_event_handler('element_set_global_action', 'bratonien_tools_batch_titles_apply', EVENT_HANDLER_PRIORITY_NEUTRAL, 2);
|
||||||
add_event_handler('init', 'bratonien_tools_watermark_cache_upgrade', EVENT_HANDLER_PRIORITY_NEUTRAL - 40);
|
|
||||||
add_event_handler('init', 'bratonien_tools_prepare_connector_private_import', EVENT_HANDLER_PRIORITY_NEUTRAL - 30);
|
add_event_handler('init', 'bratonien_tools_prepare_connector_private_import', EVENT_HANDLER_PRIORITY_NEUTRAL - 30);
|
||||||
add_event_handler('init', 'bratonien_tools_prepare_private_album_permissions', EVENT_HANDLER_PRIORITY_NEUTRAL - 20);
|
add_event_handler('init', 'bratonien_tools_prepare_private_album_permissions', EVENT_HANDLER_PRIORITY_NEUTRAL - 20);
|
||||||
add_event_handler('init', 'bratonien_tools_preserve_private_album_access', EVENT_HANDLER_PRIORITY_NEUTRAL - 10);
|
add_event_handler('init', 'bratonien_tools_preserve_private_album_access', EVENT_HANDLER_PRIORITY_NEUTRAL - 10);
|
||||||
|
|||||||
@@ -9,7 +9,6 @@ require_once(dirname(__FILE__) . '/include/database.class.php');
|
|||||||
require_once(dirname(__FILE__) . '/tools/watermark_profiles.inc.php');
|
require_once(dirname(__FILE__) . '/tools/watermark_profiles.inc.php');
|
||||||
require_once(dirname(__FILE__) . '/include/dependencies.inc.php');
|
require_once(dirname(__FILE__) . '/include/dependencies.inc.php');
|
||||||
require_once(dirname(__FILE__) . '/include/nc_connector_scheduler.inc.php');
|
require_once(dirname(__FILE__) . '/include/nc_connector_scheduler.inc.php');
|
||||||
require_once(dirname(__FILE__) . '/include/nc_legacy_reset.inc.php');
|
|
||||||
|
|
||||||
class bratonien_tools_maintain extends PluginMaintain
|
class bratonien_tools_maintain extends PluginMaintain
|
||||||
{
|
{
|
||||||
@@ -52,18 +51,6 @@ class bratonien_tools_maintain extends PluginMaintain
|
|||||||
public function update($old_version, $new_version, &$errors = array())
|
public function update($old_version, $new_version, &$errors = array())
|
||||||
{
|
{
|
||||||
$this->prepare($errors);
|
$this->prepare($errors);
|
||||||
|
|
||||||
if (version_compare((string)$old_version, '0.9.7.7', '<') && version_compare((string)$new_version, '0.9.7.7', '>='))
|
|
||||||
{
|
|
||||||
try
|
|
||||||
{
|
|
||||||
bratonien_tools_nc_reset_legacy_imports();
|
|
||||||
}
|
|
||||||
catch (Throwable $e)
|
|
||||||
{
|
|
||||||
$errors[] = 'Connector-Altbestand konnte nicht vollständig bereinigt werden: '.$e->getMessage();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public function uninstall()
|
public function uninstall()
|
||||||
|
|||||||
@@ -1,93 +0,0 @@
|
|||||||
<?php
|
|
||||||
$piwigo_root = realpath(dirname(__DIR__, 2));
|
|
||||||
if ($piwigo_root === false)
|
|
||||||
{
|
|
||||||
http_response_code(500);
|
|
||||||
exit;
|
|
||||||
}
|
|
||||||
define('PHPWG_ROOT_PATH', rtrim($piwigo_root, DIRECTORY_SEPARATOR).DIRECTORY_SEPARATOR);
|
|
||||||
include_once(PHPWG_ROOT_PATH.'include/common.inc.php');
|
|
||||||
|
|
||||||
header('Content-Type: application/json; charset=utf-8');
|
|
||||||
header('Cache-Control: no-store, max-age=0');
|
|
||||||
|
|
||||||
if (!defined('BRATONIEN_TOOLS_PATH'))
|
|
||||||
{
|
|
||||||
http_response_code(404);
|
|
||||||
echo json_encode(array('error'=>'Bratonien Tools ist nicht aktiv.'));
|
|
||||||
exit;
|
|
||||||
}
|
|
||||||
if (!function_exists('is_admin') || !is_admin())
|
|
||||||
{
|
|
||||||
http_response_code(403);
|
|
||||||
echo json_encode(array('error'=>'Administratorrechte erforderlich.'));
|
|
||||||
exit;
|
|
||||||
}
|
|
||||||
|
|
||||||
require_once(BRATONIEN_TOOLS_PATH.'include/nc_connector.inc.php');
|
|
||||||
require_once(BRATONIEN_TOOLS_PATH.'include/nc_connector_manage.inc.php');
|
|
||||||
require_once(BRATONIEN_TOOLS_PATH.'include/nc_connector_connection_scope.inc.php');
|
|
||||||
|
|
||||||
$id = (int)($_GET['connection_id'] ?? 0);
|
|
||||||
$connection = bratonien_tools_nc_connector_connection($id, true);
|
|
||||||
if (!$connection)
|
|
||||||
{
|
|
||||||
http_response_code(404);
|
|
||||||
echo json_encode(array('error'=>'Connector-Verbindung wurde nicht gefunden.'));
|
|
||||||
exit;
|
|
||||||
}
|
|
||||||
|
|
||||||
$config = isset($connection['config']) && is_array($connection['config']) ? $connection['config'] : array();
|
|
||||||
$credentials = array();
|
|
||||||
try
|
|
||||||
{
|
|
||||||
$credentials = bratonien_tools_nc_connector_scoped_secret($connection);
|
|
||||||
}
|
|
||||||
catch (Throwable $e)
|
|
||||||
{
|
|
||||||
$credentials = array();
|
|
||||||
}
|
|
||||||
|
|
||||||
$storages = array();
|
|
||||||
foreach ((array)($config['storages'] ?? array()) as $storage)
|
|
||||||
{
|
|
||||||
$storages[] = array(
|
|
||||||
'storage_id'=>(string)($storage['storage_id'] ?? ''),
|
|
||||||
'source_prefix'=>(string)($storage['source_prefix'] ?? ''),
|
|
||||||
'local_mount'=>(string)($storage['local_mount'] ?? ''),
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
$payload = array(
|
|
||||||
'id'=>(int)$connection['id'],
|
|
||||||
'name'=>(string)$connection['name'],
|
|
||||||
'adapter'=>(string)$connection['adapter'],
|
|
||||||
'enabled'=>(bool)$connection['enabled'],
|
|
||||||
'takeover_state'=>(string)$connection['takeover_state'],
|
|
||||||
'source_mode'=>(string)($config['source_mode'] ?? ''),
|
|
||||||
'legacy'=>array(
|
|
||||||
'host'=>(string)($config['host'] ?? ''),
|
|
||||||
'port'=>(string)($config['port'] ?? '5432'),
|
|
||||||
'database'=>(string)($config['database'] ?? ''),
|
|
||||||
'user'=>(string)($config['user'] ?? ''),
|
|
||||||
'has_db_password'=>trim((string)($credentials['db_password'] ?? '')) !== '',
|
|
||||||
'source_view'=>(string)($config['source_view'] ?? ''),
|
|
||||||
'activity_view'=>(string)($config['activity_view'] ?? ''),
|
|
||||||
'gallery_root'=>(string)($config['gallery_root'] ?? ''),
|
|
||||||
'quiet_seconds'=>(int)($config['quiet_seconds'] ?? 120),
|
|
||||||
'max_wait_seconds'=>(int)($config['max_wait_seconds'] ?? 900),
|
|
||||||
'full_sync_seconds'=>(int)($config['full_sync_seconds'] ?? 86400),
|
|
||||||
'storages'=>$storages,
|
|
||||||
),
|
|
||||||
'webdav'=>array(
|
|
||||||
'nextcloud_url'=>(string)($config['nextcloud_url'] ?? ''),
|
|
||||||
'nextcloud_user'=>(string)($credentials['nextcloud_user'] ?? $config['nextcloud_access_user'] ?? $config['access_user'] ?? ''),
|
|
||||||
'has_nextcloud_password'=>(string)($credentials['nextcloud_password'] ?? '') !== '',
|
|
||||||
'api_key_id'=>(string)($credentials['api_key_id'] ?? ''),
|
|
||||||
'has_api_key_secret'=>trim((string)($credentials['api_key_secret'] ?? '')) !== '',
|
|
||||||
'fallback_user'=>(string)($credentials['piwigo_user'] ?? ''),
|
|
||||||
'has_fallback_password'=>(string)($credentials['piwigo_password'] ?? '') !== '',
|
|
||||||
),
|
|
||||||
);
|
|
||||||
|
|
||||||
echo json_encode($payload, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES);
|
|
||||||
@@ -1,356 +0,0 @@
|
|||||||
<?php
|
|
||||||
$piwigo_root = realpath(dirname(__DIR__, 2));
|
|
||||||
if ($piwigo_root === false)
|
|
||||||
{
|
|
||||||
http_response_code(500);
|
|
||||||
exit;
|
|
||||||
}
|
|
||||||
define('PHPWG_ROOT_PATH', rtrim($piwigo_root, DIRECTORY_SEPARATOR).DIRECTORY_SEPARATOR);
|
|
||||||
include_once(PHPWG_ROOT_PATH.'include/common.inc.php');
|
|
||||||
|
|
||||||
header('Content-Type: application/json; charset=utf-8');
|
|
||||||
header('Cache-Control: no-store, max-age=0');
|
|
||||||
|
|
||||||
function bratonien_tools_nc_edit_json($status, array $payload)
|
|
||||||
{
|
|
||||||
http_response_code((int)$status);
|
|
||||||
echo json_encode($payload, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES);
|
|
||||||
exit;
|
|
||||||
}
|
|
||||||
|
|
||||||
function bratonien_tools_nc_edit_fail($message, array $fields = array(), $stage = '', $detail = '')
|
|
||||||
{
|
|
||||||
$visible = trim((string)$message);
|
|
||||||
if ($stage !== '') $visible = 'Bereich: '.$stage.' — '.$visible;
|
|
||||||
if ($detail !== '') $visible .= ' Technische Ursache: '.$detail;
|
|
||||||
|
|
||||||
bratonien_tools_nc_edit_json(422, array(
|
|
||||||
'ok'=>false,
|
|
||||||
'message'=>$visible,
|
|
||||||
'stage'=>(string)$stage,
|
|
||||||
'detail'=>(string)$detail,
|
|
||||||
'fields'=>array_values(array_unique($fields)),
|
|
||||||
));
|
|
||||||
}
|
|
||||||
|
|
||||||
function bratonien_tools_nc_edit_probe($url, $username = '', $password = '', array $headers = array())
|
|
||||||
{
|
|
||||||
if (!function_exists('curl_init'))
|
|
||||||
{
|
|
||||||
return array('ok'=>false, 'http'=>0, 'errno'=>-1, 'error'=>'cURL ist in PHP nicht verfügbar.', 'body'=>'');
|
|
||||||
}
|
|
||||||
|
|
||||||
$ch = curl_init($url);
|
|
||||||
$options = array(
|
|
||||||
CURLOPT_RETURNTRANSFER=>true,
|
|
||||||
CURLOPT_FOLLOWLOCATION=>true,
|
|
||||||
CURLOPT_MAXREDIRS=>3,
|
|
||||||
CURLOPT_CONNECTTIMEOUT=>8,
|
|
||||||
CURLOPT_TIMEOUT=>15,
|
|
||||||
CURLOPT_HTTPHEADER=>array_merge(array('Accept: application/json'), $headers),
|
|
||||||
CURLOPT_USERAGENT=>'Bratonien-Tools-NC-Editor/'.(function_exists('bratonien_tools_current_version') ? bratonien_tools_current_version() : 'dev'),
|
|
||||||
);
|
|
||||||
if ($username !== '')
|
|
||||||
{
|
|
||||||
$options[CURLOPT_HTTPAUTH] = CURLAUTH_BASIC;
|
|
||||||
$options[CURLOPT_USERPWD] = $username.':'.$password;
|
|
||||||
}
|
|
||||||
curl_setopt_array($ch, $options);
|
|
||||||
$body = curl_exec($ch);
|
|
||||||
$errno = curl_errno($ch);
|
|
||||||
$error = curl_error($ch);
|
|
||||||
$http = (int)curl_getinfo($ch, CURLINFO_HTTP_CODE);
|
|
||||||
curl_close($ch);
|
|
||||||
|
|
||||||
return array(
|
|
||||||
'ok'=>$body !== false && $errno === 0,
|
|
||||||
'http'=>$http,
|
|
||||||
'errno'=>$errno,
|
|
||||||
'error'=>$error,
|
|
||||||
'body'=>$body === false ? '' : (string)$body,
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!defined('BRATONIEN_TOOLS_PATH'))
|
|
||||||
{
|
|
||||||
bratonien_tools_nc_edit_json(404, array('ok'=>false, 'message'=>'Bratonien Tools ist nicht aktiv.', 'fields'=>array()));
|
|
||||||
}
|
|
||||||
if (!function_exists('is_admin') || !is_admin())
|
|
||||||
{
|
|
||||||
bratonien_tools_nc_edit_json(403, array('ok'=>false, 'message'=>'Administratorrechte erforderlich.', 'fields'=>array()));
|
|
||||||
}
|
|
||||||
if (($_SERVER['REQUEST_METHOD'] ?? '') !== 'POST')
|
|
||||||
{
|
|
||||||
bratonien_tools_nc_edit_json(405, array('ok'=>false, 'message'=>'Nur POST ist erlaubt.', 'fields'=>array()));
|
|
||||||
}
|
|
||||||
|
|
||||||
try
|
|
||||||
{
|
|
||||||
check_pwg_token();
|
|
||||||
require_once(BRATONIEN_TOOLS_PATH.'include/tool_registry.inc.php');
|
|
||||||
|
|
||||||
$id = (int)($_POST['connection_id'] ?? 0);
|
|
||||||
$connection = bratonien_tools_nc_connector_connection($id, true);
|
|
||||||
if (!$connection)
|
|
||||||
{
|
|
||||||
bratonien_tools_nc_edit_fail('Die zu bearbeitende Verbindung wurde nicht gefunden.', array(), 'Verbindung');
|
|
||||||
}
|
|
||||||
|
|
||||||
$config = isset($connection['config']) && is_array($connection['config']) ? $connection['config'] : array();
|
|
||||||
$credentials = bratonien_tools_nc_connector_scoped_secret($connection);
|
|
||||||
|
|
||||||
$nextcloud_input = trim((string)($_POST['nc_nextcloud_url'] ?? ($config['nextcloud_url'] ?? '')));
|
|
||||||
$nextcloud_user = trim((string)($_POST['nc_nextcloud_user'] ?? ($credentials['nextcloud_user'] ?? '')));
|
|
||||||
$submitted_nc_password = (string)($_POST['nc_nextcloud_password'] ?? '');
|
|
||||||
$nextcloud_password = $submitted_nc_password !== '' ? $submitted_nc_password : (string)($credentials['nextcloud_password'] ?? '');
|
|
||||||
|
|
||||||
$has_any_nextcloud = $nextcloud_input !== '' || $nextcloud_user !== '' || $nextcloud_password !== '';
|
|
||||||
if ($has_any_nextcloud)
|
|
||||||
{
|
|
||||||
$missing = array();
|
|
||||||
if ($nextcloud_input === '') $missing[] = 'nc_nextcloud_url';
|
|
||||||
if ($nextcloud_user === '') $missing[] = 'nc_nextcloud_user';
|
|
||||||
if ($nextcloud_password === '') $missing[] = 'nc_nextcloud_password';
|
|
||||||
if ($missing)
|
|
||||||
{
|
|
||||||
bratonien_tools_nc_edit_fail(
|
|
||||||
'Die WebDAV-Daten sind unvollständig. Adresse, Benutzer und Passwort werden gemeinsam benötigt.',
|
|
||||||
$missing,
|
|
||||||
'Nextcloud / WebDAV'
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
try
|
|
||||||
{
|
|
||||||
$candidate_urls = bratonien_tools_nc_wizard_candidate_urls($nextcloud_input);
|
|
||||||
}
|
|
||||||
catch (Throwable $e)
|
|
||||||
{
|
|
||||||
bratonien_tools_nc_edit_fail($e->getMessage(), array('nc_nextcloud_url'), 'Nextcloud / WebDAV');
|
|
||||||
}
|
|
||||||
|
|
||||||
$nextcloud_url = '';
|
|
||||||
$last_probe = null;
|
|
||||||
$last_status_url = '';
|
|
||||||
foreach ($candidate_urls as $candidate_url)
|
|
||||||
{
|
|
||||||
$status_url = $candidate_url.'/status.php';
|
|
||||||
$probe = bratonien_tools_nc_edit_probe($status_url);
|
|
||||||
$last_probe = $probe;
|
|
||||||
$last_status_url = $status_url;
|
|
||||||
|
|
||||||
if (!$probe['ok'] || $probe['http'] < 200 || $probe['http'] >= 300)
|
|
||||||
{
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
$status = json_decode($probe['body'], true);
|
|
||||||
if (!is_array($status) || empty($status['installed']))
|
|
||||||
{
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
$nextcloud_url = $candidate_url;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
if ($nextcloud_url === '')
|
|
||||||
{
|
|
||||||
$attempts = array();
|
|
||||||
foreach ($candidate_urls as $candidate_url)
|
|
||||||
{
|
|
||||||
$attempts[] = $candidate_url.'/status.php';
|
|
||||||
}
|
|
||||||
if (is_array($last_probe) && !$last_probe['ok'])
|
|
||||||
{
|
|
||||||
$technical = $last_probe['errno'] >= 0
|
|
||||||
? 'cURL '.$last_probe['errno'].($last_probe['error'] !== '' ? ': '.$last_probe['error'] : '')
|
|
||||||
: $last_probe['error'];
|
|
||||||
bratonien_tools_nc_edit_fail(
|
|
||||||
'Die Nextcloud-Adresse ist vom Piwigo-Server aus nicht erreichbar. Ohne angegebenes Protokoll wurden HTTPS und HTTP geprüft.',
|
|
||||||
array('nc_nextcloud_url'),
|
|
||||||
'Nextcloud / WebDAV – Erreichbarkeit',
|
|
||||||
$technical.' · Geprüft: '.implode(' ; ', $attempts)
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
bratonien_tools_nc_edit_fail(
|
|
||||||
'Unter der angegebenen Adresse wurde keine erreichbare installierte Nextcloud gefunden. Ohne angegebenes Protokoll wurden HTTPS und HTTP geprüft.',
|
|
||||||
array('nc_nextcloud_url'),
|
|
||||||
'Nextcloud / WebDAV – Erkennung',
|
|
||||||
'Geprüft: '.implode(' ; ', $attempts).($last_probe ? ' · Letzter HTTP-Status: '.$last_probe['http'] : '')
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
$_POST['nc_nextcloud_url'] = $nextcloud_url;
|
|
||||||
|
|
||||||
$user_url = $nextcloud_url.'/ocs/v2.php/cloud/user?format=json';
|
|
||||||
$user_probe = bratonien_tools_nc_edit_probe($user_url, $nextcloud_user, $nextcloud_password, array('OCS-APIRequest: true'));
|
|
||||||
if (!$user_probe['ok'])
|
|
||||||
{
|
|
||||||
$technical = $user_probe['errno'] >= 0
|
|
||||||
? 'cURL '.$user_probe['errno'].($user_probe['error'] !== '' ? ': '.$user_probe['error'] : '')
|
|
||||||
: $user_probe['error'];
|
|
||||||
bratonien_tools_nc_edit_fail(
|
|
||||||
'Die Nextcloud-Anmeldung konnte technisch nicht geprüft werden.',
|
|
||||||
array('nc_nextcloud_url','nc_nextcloud_user','nc_nextcloud_password'),
|
|
||||||
'Nextcloud / WebDAV – Anmeldung',
|
|
||||||
$technical.' · Ziel: '.$user_url
|
|
||||||
);
|
|
||||||
}
|
|
||||||
if ($user_probe['http'] === 401 || $user_probe['http'] === 403)
|
|
||||||
{
|
|
||||||
bratonien_tools_nc_edit_fail(
|
|
||||||
'Nextcloud hat Benutzername oder Passwort abgelehnt.',
|
|
||||||
array('nc_nextcloud_user','nc_nextcloud_password'),
|
|
||||||
'Nextcloud / WebDAV – Anmeldung',
|
|
||||||
'HTTP '.$user_probe['http']
|
|
||||||
);
|
|
||||||
}
|
|
||||||
if ($user_probe['http'] < 200 || $user_probe['http'] >= 300)
|
|
||||||
{
|
|
||||||
bratonien_tools_nc_edit_fail(
|
|
||||||
'Nextcloud ist erreichbar, aber die Benutzerprüfung wurde vom Server abgelehnt.',
|
|
||||||
array('nc_nextcloud_user','nc_nextcloud_password'),
|
|
||||||
'Nextcloud / WebDAV – Anmeldung',
|
|
||||||
'HTTP '.$user_probe['http'].' · Ziel: '.$user_url
|
|
||||||
);
|
|
||||||
}
|
|
||||||
try
|
|
||||||
{
|
|
||||||
bratonien_tools_nc_wizard_ocs_data($user_probe['body']);
|
|
||||||
}
|
|
||||||
catch (Throwable $e)
|
|
||||||
{
|
|
||||||
bratonien_tools_nc_edit_fail(
|
|
||||||
'Nextcloud antwortet auf die Benutzerprüfung, die Antwort ist aber nicht gültig: '.$e->getMessage(),
|
|
||||||
array('nc_nextcloud_user','nc_nextcloud_password'),
|
|
||||||
'Nextcloud / WebDAV – Anmeldung'
|
|
||||||
);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
$api_key_id = trim((string)($_POST['nc_connection_api_key_id'] ?? ($credentials['api_key_id'] ?? '')));
|
|
||||||
$submitted_api_secret = trim((string)($_POST['nc_connection_api_key_secret'] ?? ''));
|
|
||||||
$api_key_secret = $submitted_api_secret !== '' ? $submitted_api_secret : trim((string)($credentials['api_key_secret'] ?? ''));
|
|
||||||
if (($api_key_id === '') !== ($api_key_secret === ''))
|
|
||||||
{
|
|
||||||
$missing = $api_key_id === '' ? array('nc_connection_api_key_id') : array('nc_connection_api_key_secret');
|
|
||||||
bratonien_tools_nc_edit_fail(
|
|
||||||
'API-Schlüssel-ID und API-Geheimnis müssen gemeinsam vollständig sein.',
|
|
||||||
$missing,
|
|
||||||
'Piwigo API'
|
|
||||||
);
|
|
||||||
}
|
|
||||||
if ($api_key_id !== '')
|
|
||||||
{
|
|
||||||
try
|
|
||||||
{
|
|
||||||
bratonien_tools_nc_connector_validate_scoped_api($api_key_id, $api_key_secret);
|
|
||||||
}
|
|
||||||
catch (Throwable $e)
|
|
||||||
{
|
|
||||||
bratonien_tools_nc_edit_fail(
|
|
||||||
'Der Piwigo-API-Zugang konnte nicht bestätigt werden: '.$e->getMessage(),
|
|
||||||
array('nc_connection_api_key_id','nc_connection_api_key_secret'),
|
|
||||||
'Piwigo API'
|
|
||||||
);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
$fallback_user = trim((string)($_POST['nc_fallback_user'] ?? ($credentials['piwigo_user'] ?? '')));
|
|
||||||
$submitted_fallback_password = (string)($_POST['nc_fallback_password'] ?? '');
|
|
||||||
$fallback_password = $submitted_fallback_password !== '' ? $submitted_fallback_password : (string)($credentials['piwigo_password'] ?? '');
|
|
||||||
if (($fallback_user === '') !== ($fallback_password === ''))
|
|
||||||
{
|
|
||||||
bratonien_tools_nc_edit_fail(
|
|
||||||
'Fallback-Benutzer und Fallback-Passwort müssen gemeinsam vollständig sein.',
|
|
||||||
array('nc_fallback_user','nc_fallback_password'),
|
|
||||||
'Piwigo-Fallback'
|
|
||||||
);
|
|
||||||
}
|
|
||||||
if ($fallback_user !== '')
|
|
||||||
{
|
|
||||||
try
|
|
||||||
{
|
|
||||||
bratonien_tools_nc_connector_validate_fallback_credentials($fallback_user, $fallback_password);
|
|
||||||
}
|
|
||||||
catch (Throwable $e)
|
|
||||||
{
|
|
||||||
bratonien_tools_nc_edit_fail(
|
|
||||||
'Der Piwigo-Fallback wurde abgelehnt: '.$e->getMessage(),
|
|
||||||
array('nc_fallback_user','nc_fallback_password'),
|
|
||||||
'Piwigo-Fallback'
|
|
||||||
);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
$result = bratonien_tools_nc_connector_update_local_friendly();
|
|
||||||
|
|
||||||
if (array_key_exists('nc_fallback_user', $_POST) || array_key_exists('nc_fallback_password', $_POST))
|
|
||||||
{
|
|
||||||
$updated = bratonien_tools_nc_connector_connection($id, true);
|
|
||||||
if (!$updated) throw new RuntimeException('Die Verbindung konnte nach dem Speichern nicht erneut geladen werden.');
|
|
||||||
$updated_credentials = bratonien_tools_nc_connector_scoped_secret($updated);
|
|
||||||
$updated_credentials['piwigo_user'] = $fallback_user;
|
|
||||||
$updated_credentials['piwigo_password'] = $fallback_password;
|
|
||||||
bratonien_tools_nc_connector_store_scoped_secret($id, $updated, $updated_credentials);
|
|
||||||
}
|
|
||||||
|
|
||||||
bratonien_tools_nc_edit_json(200, array(
|
|
||||||
'ok'=>true,
|
|
||||||
'message'=>(string)($result['message'] ?? 'Verbindung wurde gespeichert.'),
|
|
||||||
'fields'=>array(),
|
|
||||||
));
|
|
||||||
}
|
|
||||||
catch (Throwable $e)
|
|
||||||
{
|
|
||||||
$message = trim($e->getMessage());
|
|
||||||
if ($message === '') $message = 'Die Verbindung konnte nicht gespeichert werden.';
|
|
||||||
|
|
||||||
$fields = array();
|
|
||||||
$stage = 'Verbindung';
|
|
||||||
$add = function($name) use (&$fields)
|
|
||||||
{
|
|
||||||
if (!in_array($name, $fields, true)) $fields[] = $name;
|
|
||||||
};
|
|
||||||
|
|
||||||
if (stripos($message, 'Name') !== false && stripos($message, 'Datenbankname') === false) $add('connection_name');
|
|
||||||
if (stripos($message, 'Datenbank-Server') !== false) { $add('nc_host'); $stage = 'Legacy-Datenbank'; }
|
|
||||||
if (stripos($message, 'Datenbank-Port') !== false) { $add('nc_port'); $stage = 'Legacy-Datenbank'; }
|
|
||||||
if (stripos($message, 'Datenbankname') !== false) { $add('nc_database'); $stage = 'Legacy-Datenbank'; }
|
|
||||||
if (stripos($message, 'Reader-Benutzer') !== false) { $add('nc_user'); $stage = 'Legacy-Datenbank'; }
|
|
||||||
if (stripos($message, 'Datenbankpasswort') !== false) { $add('nc_db_password'); $stage = 'Legacy-Datenbank'; }
|
|
||||||
if (stripos($message, 'Storage-ID') !== false) { $add('nc_storage_id[]'); $stage = 'Speicherorte'; }
|
|
||||||
if (stripos($message, 'lokaler Pfad') !== false || stripos($message, 'Speicherort') !== false) { $add('nc_local_mount[]'); $stage = 'Speicherorte'; }
|
|
||||||
if (stripos($message, 'Galerieordner') !== false) { $add('nc_gallery_root'); $stage = 'Erweiterte Legacy-Einstellungen'; }
|
|
||||||
if (stripos($message, 'Datenbankansichten') !== false || stripos($message, 'Source-View') !== false) { $add('nc_source_view'); $stage = 'Erweiterte Legacy-Einstellungen'; }
|
|
||||||
if (stripos($message, 'Datenbankansichten') !== false || stripos($message, 'Activity-View') !== false) { $add('nc_activity_view'); $stage = 'Erweiterte Legacy-Einstellungen'; }
|
|
||||||
|
|
||||||
if (stripos($message, 'Nextcloud') !== false)
|
|
||||||
{
|
|
||||||
$stage = 'Nextcloud / WebDAV';
|
|
||||||
if (stripos($message, 'Adresse') !== false) $add('nc_nextcloud_url');
|
|
||||||
if (stripos($message, 'Benutzer') !== false) $add('nc_nextcloud_user');
|
|
||||||
if (stripos($message, 'Passwort') !== false) $add('nc_nextcloud_password');
|
|
||||||
}
|
|
||||||
if (stripos($message, 'API') !== false)
|
|
||||||
{
|
|
||||||
$stage = 'Piwigo API';
|
|
||||||
$add('nc_connection_api_key_id');
|
|
||||||
$add('nc_connection_api_key_secret');
|
|
||||||
}
|
|
||||||
if (stripos($message, 'Fallback') !== false)
|
|
||||||
{
|
|
||||||
$stage = 'Piwigo-Fallback';
|
|
||||||
$add('nc_fallback_user');
|
|
||||||
$add('nc_fallback_password');
|
|
||||||
}
|
|
||||||
|
|
||||||
bratonien_tools_nc_edit_fail(
|
|
||||||
$message,
|
|
||||||
$fields,
|
|
||||||
$stage,
|
|
||||||
'Interne Prüfung: '.get_class($e)
|
|
||||||
);
|
|
||||||
}
|
|
||||||
@@ -1,104 +0,0 @@
|
|||||||
<?php
|
|
||||||
$piwigo_root = realpath(dirname(__DIR__, 2));
|
|
||||||
if ($piwigo_root === false)
|
|
||||||
{
|
|
||||||
http_response_code(500);
|
|
||||||
exit;
|
|
||||||
}
|
|
||||||
define('PHPWG_ROOT_PATH', rtrim($piwigo_root, DIRECTORY_SEPARATOR).DIRECTORY_SEPARATOR);
|
|
||||||
include_once(PHPWG_ROOT_PATH.'include/common.inc.php');
|
|
||||||
|
|
||||||
header('Content-Type: application/json; charset=utf-8');
|
|
||||||
header('Cache-Control: no-store, max-age=0');
|
|
||||||
|
|
||||||
function bratonien_tools_nc_source_picker_json($status, array $payload)
|
|
||||||
{
|
|
||||||
http_response_code((int)$status);
|
|
||||||
echo json_encode($payload, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES);
|
|
||||||
exit;
|
|
||||||
}
|
|
||||||
|
|
||||||
function bratonien_tools_nc_source_picker_fail($message, array $fields = array())
|
|
||||||
{
|
|
||||||
bratonien_tools_nc_source_picker_json(422, array(
|
|
||||||
'ok'=>false,
|
|
||||||
'message'=>(string)$message,
|
|
||||||
'fields'=>array_values(array_unique($fields)),
|
|
||||||
));
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!defined('BRATONIEN_TOOLS_PATH'))
|
|
||||||
{
|
|
||||||
bratonien_tools_nc_source_picker_json(404, array('ok'=>false, 'message'=>'Bratonien Tools ist nicht aktiv.', 'fields'=>array()));
|
|
||||||
}
|
|
||||||
if (!function_exists('is_admin') || !is_admin())
|
|
||||||
{
|
|
||||||
bratonien_tools_nc_source_picker_json(403, array('ok'=>false, 'message'=>'Administratorrechte erforderlich.', 'fields'=>array()));
|
|
||||||
}
|
|
||||||
if (($_SERVER['REQUEST_METHOD'] ?? '') !== 'POST')
|
|
||||||
{
|
|
||||||
bratonien_tools_nc_source_picker_json(405, array('ok'=>false, 'message'=>'Nur POST ist erlaubt.', 'fields'=>array()));
|
|
||||||
}
|
|
||||||
|
|
||||||
try
|
|
||||||
{
|
|
||||||
check_pwg_token();
|
|
||||||
require_once(BRATONIEN_TOOLS_PATH.'include/tool_registry.inc.php');
|
|
||||||
|
|
||||||
$id = (int)($_POST['connection_id'] ?? 0);
|
|
||||||
$connection = bratonien_tools_nc_connector_connection($id, true);
|
|
||||||
if (!$connection)
|
|
||||||
{
|
|
||||||
bratonien_tools_nc_source_picker_fail('Die zu bearbeitende Verbindung wurde nicht gefunden.');
|
|
||||||
}
|
|
||||||
if ((string)$connection['adapter'] !== 'local')
|
|
||||||
{
|
|
||||||
bratonien_tools_nc_source_picker_fail('Die automatische Migrationsauswahl ist nur für die bestehende Legacy-Verbindung vorgesehen.');
|
|
||||||
}
|
|
||||||
|
|
||||||
$config = isset($connection['config']) && is_array($connection['config']) ? $connection['config'] : array();
|
|
||||||
$credentials = bratonien_tools_nc_connector_scoped_secret($connection);
|
|
||||||
|
|
||||||
$base_url = trim((string)($config['nextcloud_url'] ?? ''));
|
|
||||||
$username = trim((string)($credentials['nextcloud_user'] ?? ''));
|
|
||||||
$password = (string)($credentials['nextcloud_password'] ?? '');
|
|
||||||
|
|
||||||
$missing = array();
|
|
||||||
if ($base_url === '') $missing[] = 'nc_nextcloud_url';
|
|
||||||
if ($username === '') $missing[] = 'nc_nextcloud_user';
|
|
||||||
if ($password === '') $missing[] = 'nc_nextcloud_password';
|
|
||||||
if ($missing)
|
|
||||||
{
|
|
||||||
bratonien_tools_nc_source_picker_fail(
|
|
||||||
'Für die automatische Ordnerauswahl müssen Nextcloud-Adresse, Benutzer und Passwort gespeichert sein.',
|
|
||||||
$missing
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
bratonien_tools_nc_connector_prepare_webdav_wizard_from_connection($connection, 'migrate');
|
|
||||||
|
|
||||||
$state = bratonien_tools_nc_wizard_state();
|
|
||||||
if ((int)($state['step'] ?? 0) !== 2 || empty($state['scan_ok']) || empty($state['directory_selection_ready']))
|
|
||||||
{
|
|
||||||
$detail = trim((string)($state['technical_error'] ?? ''));
|
|
||||||
bratonien_tools_nc_source_picker_fail(
|
|
||||||
$detail !== '' ? 'Die Nextcloud-Ordner konnten nicht geladen werden: '.$detail : 'Die Nextcloud-Ordner konnten nicht geladen werden.',
|
|
||||||
array('nc_nextcloud_url','nc_nextcloud_user','nc_nextcloud_password')
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
bratonien_tools_nc_source_picker_json(200, array(
|
|
||||||
'ok'=>true,
|
|
||||||
'message'=>'Nextcloud-Ordner wurden geladen. Die Auswahl wird geöffnet.',
|
|
||||||
'fields'=>array(),
|
|
||||||
));
|
|
||||||
}
|
|
||||||
catch (Throwable $e)
|
|
||||||
{
|
|
||||||
$message = trim($e->getMessage());
|
|
||||||
if ($message === '') $message = 'Die Nextcloud-Ordnerauswahl konnte nicht vorbereitet werden.';
|
|
||||||
bratonien_tools_nc_source_picker_fail(
|
|
||||||
$message,
|
|
||||||
array('nc_nextcloud_url','nc_nextcloud_user','nc_nextcloud_password')
|
|
||||||
);
|
|
||||||
}
|
|
||||||
@@ -56,6 +56,15 @@ normalize_connector_cache_permissions() {
|
|||||||
# werden zumindest alle eigenen Dateien gruppenschreibbar gehalten.
|
# werden zumindest alle eigenen Dateien gruppenschreibbar gehalten.
|
||||||
normalize_connector_cache_permissions
|
normalize_connector_cache_permissions
|
||||||
|
|
||||||
|
# Dieser Medienlauf wird erst nach einem erfolgreichen WebDAV-Aufbau und einer
|
||||||
|
# erfolgreichen Piwigo-Synchronisierung gestartet. Deshalb darf erst hier aus
|
||||||
|
# "lokale Connector-Datei fehlt" auf eine in Nextcloud entfernte Freigabe/Datei
|
||||||
|
# geschlossen werden. Bei einer nicht erreichbaren Verbindung wird dieser Block
|
||||||
|
# niemals ausgeführt und der vorhandene Piwigo-Bestand bleibt unverändert.
|
||||||
|
php "$SCRIPT_DIR/cleanup-missing-webdav-images.php" \
|
||||||
|
--piwigo-root="$PIWIGO_ROOT" \
|
||||||
|
--connection-id="$CONNECTION_ID"
|
||||||
|
|
||||||
php "$SCRIPT_DIR/lib/precache-webdav-previews.php" \
|
php "$SCRIPT_DIR/lib/precache-webdav-previews.php" \
|
||||||
--mapping="$WEBDAV_MAPPING_FILE" \
|
--mapping="$WEBDAV_MAPPING_FILE" \
|
||||||
--base-url="$WEBDAV_BASE_URL" \
|
--base-url="$WEBDAV_BASE_URL" \
|
||||||
|
|||||||
142
runtime/cleanup-missing-webdav-images.php
Normal file
142
runtime/cleanup-missing-webdav-images.php
Normal file
@@ -0,0 +1,142 @@
|
|||||||
|
#!/usr/bin/env php
|
||||||
|
<?php
|
||||||
|
if (PHP_SAPI !== 'cli')
|
||||||
|
{
|
||||||
|
fwrite(STDERR, "CLI only\n");
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
|
||||||
|
$options = getopt('', array('piwigo-root:', 'connection-id:'));
|
||||||
|
$piwigo_root = rtrim((string)($options['piwigo-root'] ?? ''), '/');
|
||||||
|
$connection_id = (int)($options['connection-id'] ?? 0);
|
||||||
|
if ($piwigo_root === '' || $connection_id < 1)
|
||||||
|
{
|
||||||
|
fwrite(STDERR, "Parameter --piwigo-root und --connection-id werden benoetigt.\n");
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
|
||||||
|
$db_config = $piwigo_root.'/local/config/database.inc.php';
|
||||||
|
if (!is_readable($db_config))
|
||||||
|
{
|
||||||
|
fwrite(STDERR, "Piwigo-Datenbankkonfiguration ist nicht lesbar.\n");
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
|
||||||
|
$conf = array();
|
||||||
|
$prefixeTable = 'piwigo_';
|
||||||
|
require $db_config;
|
||||||
|
foreach (array('db_host','db_user','db_password','db_base') as $key)
|
||||||
|
{
|
||||||
|
if (!isset($conf[$key]))
|
||||||
|
{
|
||||||
|
fwrite(STDERR, "Piwigo-Datenbankkonfiguration ist unvollstaendig: $key\n");
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
$db = new mysqli($conf['db_host'], $conf['db_user'], $conf['db_password'], $conf['db_base']);
|
||||||
|
if ($db->connect_errno)
|
||||||
|
{
|
||||||
|
fwrite(STDERR, "Piwigo-Datenbank ist nicht erreichbar: ".$db->connect_error."\n");
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
$db->set_charset('utf8mb4');
|
||||||
|
|
||||||
|
$table = $prefixeTable.'bratonien_tools_nc_connections';
|
||||||
|
$result = $db->query('SELECT config_json FROM `'.$table.'` WHERE id='.$connection_id.' LIMIT 1');
|
||||||
|
if (!$result || !$result->num_rows)
|
||||||
|
{
|
||||||
|
fwrite(STDERR, "Connector-Verbindung #$connection_id wurde nicht gefunden.\n");
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
$config = json_decode((string)$result->fetch_assoc()['config_json'], true);
|
||||||
|
if (!is_array($config) || (string)($config['source_mode'] ?? '') !== 'webdav-placeholder')
|
||||||
|
{
|
||||||
|
echo "Keine WebDAV-Bereinigung erforderlich.\n";
|
||||||
|
exit(0);
|
||||||
|
}
|
||||||
|
|
||||||
|
$prefixes = array(
|
||||||
|
'./_data/bratonien-tools/nc-webdav-gallery/connection-'.$connection_id.'/',
|
||||||
|
'./_data/bratonien-tools/nc-webdav-source/connection-'.$connection_id.'/',
|
||||||
|
'./galleries/bratonien-webdav-'.$connection_id.'/',
|
||||||
|
);
|
||||||
|
|
||||||
|
$gallery_root = rtrim(str_replace('\\', '/', (string)($config['parallel_gallery_root'] ?? '')), '/');
|
||||||
|
$normalized_piwigo_root = rtrim(str_replace('\\', '/', $piwigo_root), '/');
|
||||||
|
if ($gallery_root !== '' && strpos($gallery_root, $normalized_piwigo_root.'/') === 0)
|
||||||
|
{
|
||||||
|
$relative = ltrim(substr($gallery_root, strlen($normalized_piwigo_root)), '/');
|
||||||
|
if ($relative !== '') $prefixes[] = './'.rtrim($relative, '/').'/';
|
||||||
|
}
|
||||||
|
$prefixes = array_values(array_unique($prefixes));
|
||||||
|
|
||||||
|
$where = array();
|
||||||
|
foreach ($prefixes as $prefix)
|
||||||
|
{
|
||||||
|
$escaped = $db->real_escape_string(addcslashes($prefix, "_%\\"));
|
||||||
|
$where[] = "path LIKE '{$escaped}%' ESCAPE '\\\\'";
|
||||||
|
}
|
||||||
|
|
||||||
|
$images_table = $prefixeTable.'images';
|
||||||
|
$rows = $db->query("SELECT id, path FROM `{$images_table}` WHERE ".implode(' OR ', $where));
|
||||||
|
if (!$rows)
|
||||||
|
{
|
||||||
|
fwrite(STDERR, "Connector-Bilder konnten nicht gelesen werden: ".$db->error."\n");
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
|
||||||
|
$missing_ids = array();
|
||||||
|
while ($row = $rows->fetch_assoc())
|
||||||
|
{
|
||||||
|
$path = (string)$row['path'];
|
||||||
|
$owned = false;
|
||||||
|
foreach ($prefixes as $prefix)
|
||||||
|
{
|
||||||
|
if (strpos($path, $prefix) === 0)
|
||||||
|
{
|
||||||
|
$owned = true;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (!$owned) continue;
|
||||||
|
|
||||||
|
$absolute = $piwigo_root.'/'.ltrim(preg_replace('#^\./#', '', $path), '/');
|
||||||
|
if (!is_file($absolute))
|
||||||
|
{
|
||||||
|
$missing_ids[] = (int)$row['id'];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
$db->close();
|
||||||
|
|
||||||
|
if (!$missing_ids)
|
||||||
|
{
|
||||||
|
echo "WebDAV-Bereinigung: keine fehlenden Piwigo-Bilder.\n";
|
||||||
|
exit(0);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Dieser Prozess wird ausschliesslich nach einem erfolgreich abgeschlossenen
|
||||||
|
// WebDAV-Aufbau und erfolgreicher Piwigo-Synchronisierung gestartet. Eine
|
||||||
|
// nicht erreichbare Verbindung kann deshalb niemals ueber diesen Pfad Bilder
|
||||||
|
// entfernen.
|
||||||
|
define('PHPWG_ROOT_PATH', $piwigo_root.'/');
|
||||||
|
$_SERVER['REMOTE_ADDR'] = '127.0.0.1';
|
||||||
|
$_SERVER['SERVER_ADDR'] = '127.0.0.1';
|
||||||
|
$_SERVER['SERVER_NAME'] = 'localhost';
|
||||||
|
$_SERVER['HTTP_HOST'] = 'localhost';
|
||||||
|
$_SERVER['SERVER_PORT'] = '80';
|
||||||
|
$_SERVER['REQUEST_METHOD'] = 'GET';
|
||||||
|
$_SERVER['REQUEST_URI'] = '/';
|
||||||
|
$_SERVER['SCRIPT_NAME'] = '/plugins/bratonien_tools/runtime/cleanup-missing-webdav-images.php';
|
||||||
|
$_SERVER['PHP_SELF'] = $_SERVER['SCRIPT_NAME'];
|
||||||
|
$_SERVER['QUERY_STRING'] = '';
|
||||||
|
$_SERVER['HTTPS'] = 'off';
|
||||||
|
|
||||||
|
require_once(PHPWG_ROOT_PATH.'include/common.inc.php');
|
||||||
|
include_once(PHPWG_ROOT_PATH.'admin/include/functions.php');
|
||||||
|
|
||||||
|
$deleted = delete_elements(array_values(array_unique(array_map('intval', $missing_ids))), false);
|
||||||
|
update_category('all');
|
||||||
|
invalidate_user_cache(true);
|
||||||
|
|
||||||
|
echo 'WebDAV-Bereinigung: '.(int)$deleted." nicht mehr freigegebene/vorhandene Bilder aus Piwigo entfernt.\n";
|
||||||
@@ -47,24 +47,31 @@ function bratonien_cleanup_tree($path, $allowed_root)
|
|||||||
@rmdir($path);
|
@rmdir($path);
|
||||||
}
|
}
|
||||||
|
|
||||||
function bratonien_webdav_site_images($site_id)
|
function bratonien_connection_id_from_owned_path($path)
|
||||||
{
|
{
|
||||||
$rows = array();
|
$path = (string)$path;
|
||||||
$query = '
|
foreach (array(
|
||||||
SELECT DISTINCT i.id, i.path, i.representative_ext
|
'#^\./_data/bratonien-tools/nc-webdav-gallery/connection-([0-9]+)/#',
|
||||||
FROM '.IMAGES_TABLE.' AS i
|
'#^\./_data/bratonien-tools/nc-webdav-source/connection-([0-9]+)/#',
|
||||||
LEFT JOIN '.CATEGORIES_TABLE.' AS sc ON sc.id = i.storage_category_id
|
'#^\./galleries/bratonien-webdav-([0-9]+)/#',
|
||||||
LEFT JOIN '.IMAGE_CATEGORY_TABLE.' AS ic ON ic.image_id = i.id
|
) as $pattern)
|
||||||
LEFT JOIN '.CATEGORIES_TABLE.' AS vc ON vc.id = ic.category_id
|
|
||||||
WHERE sc.site_id = '.(int)$site_id.' OR vc.site_id = '.(int)$site_id.'
|
|
||||||
;';
|
|
||||||
$result = pwg_query($query);
|
|
||||||
while ($row = pwg_db_fetch_assoc($result))
|
|
||||||
{
|
{
|
||||||
$row['id'] = (int)$row['id'];
|
if (preg_match($pattern, $path, $match)) return (int)$match[1];
|
||||||
$rows[$row['id']] = $row;
|
|
||||||
}
|
}
|
||||||
return $rows;
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
function bratonien_connection_id_from_site_url($url)
|
||||||
|
{
|
||||||
|
$url = (string)$url;
|
||||||
|
foreach (array(
|
||||||
|
'#^\./_data/bratonien-tools/nc-webdav-gallery/connection-([0-9]+)/$#',
|
||||||
|
'#^\./galleries/bratonien-webdav-([0-9]+)/$#',
|
||||||
|
) as $pattern)
|
||||||
|
{
|
||||||
|
if (preg_match($pattern, $url, $match)) return (int)$match[1];
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
try
|
try
|
||||||
@@ -84,24 +91,24 @@ try
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
$site_prefix = './_data/bratonien-tools/nc-webdav-gallery/connection-';
|
|
||||||
$result = pwg_query(
|
|
||||||
"SELECT id, galleries_url FROM ".SITES_TABLE.
|
|
||||||
" WHERE galleries_url LIKE '".pwg_db_real_escape_string($site_prefix)."%'"
|
|
||||||
);
|
|
||||||
|
|
||||||
$removed_sites = 0;
|
|
||||||
$removed_images = 0;
|
$removed_images = 0;
|
||||||
while ($site = pwg_db_fetch_assoc($result))
|
$stale_by_connection = array();
|
||||||
|
$result = pwg_query(
|
||||||
|
"SELECT id, path, representative_ext FROM ".IMAGES_TABLE.
|
||||||
|
" WHERE path LIKE './_data/bratonien-tools/nc-webdav-gallery/connection-%'".
|
||||||
|
" OR path LIKE './_data/bratonien-tools/nc-webdav-source/connection-%'".
|
||||||
|
" OR path LIKE './galleries/bratonien-webdav-%'"
|
||||||
|
);
|
||||||
|
while ($row = pwg_db_fetch_assoc($result))
|
||||||
{
|
{
|
||||||
$site_id = (int)$site['id'];
|
$connection_id = bratonien_connection_id_from_owned_path($row['path'] ?? '');
|
||||||
$site_url = (string)$site['galleries_url'];
|
|
||||||
if (!preg_match('#^\./_data/bratonien-tools/nc-webdav-gallery/connection-([0-9]+)/$#', $site_url, $match)) continue;
|
|
||||||
|
|
||||||
$connection_id = (int)$match[1];
|
|
||||||
if ($connection_id < 1 || isset($active[$connection_id])) continue;
|
if ($connection_id < 1 || isset($active[$connection_id])) continue;
|
||||||
|
$row['id'] = (int)$row['id'];
|
||||||
|
$stale_by_connection[$connection_id][$row['id']] = $row;
|
||||||
|
}
|
||||||
|
|
||||||
$images = bratonien_webdav_site_images($site_id);
|
foreach ($stale_by_connection as $connection_id=>$images)
|
||||||
|
{
|
||||||
foreach ($images as $row)
|
foreach ($images as $row)
|
||||||
{
|
{
|
||||||
try
|
try
|
||||||
@@ -114,48 +121,60 @@ try
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
delete_site($site_id);
|
delete_elements(array_map('intval', array_keys($images)), false);
|
||||||
|
|
||||||
if ($images)
|
|
||||||
{
|
|
||||||
$ids = array_keys($images);
|
|
||||||
$remaining = query2array(
|
|
||||||
'SELECT id FROM '.IMAGES_TABLE.' WHERE id IN ('.implode(',', array_map('intval', $ids)).')',
|
|
||||||
null,
|
|
||||||
'id'
|
|
||||||
);
|
|
||||||
if ($remaining)
|
|
||||||
{
|
|
||||||
delete_elements(array_map('intval', $remaining), false);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
$removed_sites++;
|
|
||||||
$removed_images += count($images);
|
$removed_images += count($images);
|
||||||
echo 'NC WebDAV: entferne verwaiste Piwigo-Site '.$site_id.' für gelöschte Verbindung '.$connection_id.".\n";
|
echo 'NC WebDAV: entferne '.count($images).' verwaiste Bilder der gelöschten Verbindung '.$connection_id.".\n";
|
||||||
|
}
|
||||||
|
|
||||||
$gallery_root = PHPWG_ROOT_PATH.'_data/bratonien-tools/nc-webdav-gallery';
|
$removed_sites = 0;
|
||||||
$source_root = PHPWG_ROOT_PATH.'_data/bratonien-tools/nc-webdav-source';
|
$result = pwg_query('SELECT id, galleries_url FROM '.SITES_TABLE);
|
||||||
$preview_root = PHPWG_ROOT_PATH.'_data/bratonien-tools/nc-webdav-preview';
|
$stale_sites = array();
|
||||||
|
while ($site = pwg_db_fetch_assoc($result))
|
||||||
|
{
|
||||||
|
$connection_id = bratonien_connection_id_from_site_url($site['galleries_url'] ?? '');
|
||||||
|
if ($connection_id < 1 || isset($active[$connection_id])) continue;
|
||||||
|
$stale_sites[] = array('id'=>(int)$site['id'], 'connection_id'=>$connection_id);
|
||||||
|
}
|
||||||
|
|
||||||
|
foreach ($stale_sites as $site)
|
||||||
|
{
|
||||||
|
delete_site($site['id']);
|
||||||
|
$removed_sites++;
|
||||||
|
echo 'NC WebDAV: entferne verwaiste Piwigo-Site '.$site['id'].' der gelöschten Verbindung '.$site['connection_id'].".\n";
|
||||||
|
}
|
||||||
|
|
||||||
|
$stale_connection_ids = array_unique(array_merge(
|
||||||
|
array_map('intval', array_keys($stale_by_connection)),
|
||||||
|
array_map(function($site) { return (int)$site['connection_id']; }, $stale_sites)
|
||||||
|
));
|
||||||
|
|
||||||
|
$gallery_root = PHPWG_ROOT_PATH.'_data/bratonien-tools/nc-webdav-gallery';
|
||||||
|
$source_root = PHPWG_ROOT_PATH.'_data/bratonien-tools/nc-webdav-source';
|
||||||
|
$preview_root = PHPWG_ROOT_PATH.'_data/bratonien-tools/nc-webdav-preview';
|
||||||
|
$legacy_root = PHPWG_ROOT_PATH.'galleries';
|
||||||
|
$state_root = '/var/lib/bratonien-tools/nc-connector';
|
||||||
|
$status_root = PHPWG_ROOT_PATH.'_data/bratonien-tools/nc-connector-status';
|
||||||
|
|
||||||
|
foreach ($stale_connection_ids as $connection_id)
|
||||||
|
{
|
||||||
|
if ($connection_id < 1) continue;
|
||||||
bratonien_cleanup_tree($gallery_root.'/connection-'.$connection_id, $gallery_root);
|
bratonien_cleanup_tree($gallery_root.'/connection-'.$connection_id, $gallery_root);
|
||||||
bratonien_cleanup_tree($source_root.'/connection-'.$connection_id, $source_root);
|
bratonien_cleanup_tree($source_root.'/connection-'.$connection_id, $source_root);
|
||||||
bratonien_cleanup_tree($preview_root.'/connection-'.$connection_id, $preview_root);
|
bratonien_cleanup_tree($preview_root.'/connection-'.$connection_id, $preview_root);
|
||||||
|
bratonien_cleanup_tree($legacy_root.'/bratonien-webdav-'.$connection_id, $legacy_root);
|
||||||
$state_root = '/var/lib/bratonien-tools/nc-connector';
|
|
||||||
bratonien_cleanup_tree($state_root.'/connection-'.$connection_id, $state_root);
|
bratonien_cleanup_tree($state_root.'/connection-'.$connection_id, $state_root);
|
||||||
|
|
||||||
foreach (glob('/etc/bratonien-tools/nc-connector/webdav-connection-'.$connection_id.'.*') ?: array() as $file)
|
foreach (glob('/etc/bratonien-tools/nc-connector/webdav-connection-'.$connection_id.'.*') ?: array() as $file)
|
||||||
{
|
{
|
||||||
@unlink($file);
|
@unlink($file);
|
||||||
}
|
}
|
||||||
|
|
||||||
$status_root = PHPWG_ROOT_PATH.'_data/bratonien-tools/nc-connector-status';
|
|
||||||
@unlink($status_root.'/connection-'.$connection_id.'.json');
|
@unlink($status_root.'/connection-'.$connection_id.'.json');
|
||||||
@unlink($status_root.'/deleted-'.$connection_id);
|
@unlink($status_root.'/deleted-'.$connection_id);
|
||||||
}
|
}
|
||||||
|
|
||||||
if ($removed_sites > 0)
|
if ($removed_sites > 0 || $removed_images > 0)
|
||||||
{
|
{
|
||||||
|
update_category('all');
|
||||||
invalidate_user_cache(true);
|
invalidate_user_cache(true);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -6,8 +6,6 @@ if (PHP_SAPI !== 'cli')
|
|||||||
exit(1);
|
exit(1);
|
||||||
}
|
}
|
||||||
|
|
||||||
const BRATONIEN_WEBDAV_DERIVATIVE_BUILDER_VERSION = '0.9.7.8';
|
|
||||||
|
|
||||||
$options = getopt('', array('piwigo-root:', 'connection-id:'));
|
$options = getopt('', array('piwigo-root:', 'connection-id:'));
|
||||||
$piwigo_root = rtrim((string)($options['piwigo-root'] ?? ''), '/');
|
$piwigo_root = rtrim((string)($options['piwigo-root'] ?? ''), '/');
|
||||||
$connection_id = (int)($options['connection-id'] ?? 0);
|
$connection_id = (int)($options['connection-id'] ?? 0);
|
||||||
@@ -33,99 +31,24 @@ $_SERVER['REQUEST_URI'] = '/';
|
|||||||
$_SERVER['SCRIPT_NAME'] = '/plugins/bratonien_tools/runtime/lib/build-webdav-derivatives.php';
|
$_SERVER['SCRIPT_NAME'] = '/plugins/bratonien_tools/runtime/lib/build-webdav-derivatives.php';
|
||||||
$_SERVER['PHP_SELF'] = $_SERVER['SCRIPT_NAME'];
|
$_SERVER['PHP_SELF'] = $_SERVER['SCRIPT_NAME'];
|
||||||
$_SERVER['QUERY_STRING'] = '';
|
$_SERVER['QUERY_STRING'] = '';
|
||||||
$_SERVER['HTTP_USER_AGENT'] = 'Bratonien-WebDAV-Derivative-Builder/'.BRATONIEN_WEBDAV_DERIVATIVE_BUILDER_VERSION;
|
|
||||||
$_SERVER['HTTPS'] = 'off';
|
$_SERVER['HTTPS'] = 'off';
|
||||||
|
|
||||||
require_once(PHPWG_ROOT_PATH.'include/common.inc.php');
|
require_once(PHPWG_ROOT_PATH.'include/common.inc.php');
|
||||||
require_once(PHPWG_ROOT_PATH.'include/derivative.inc.php');
|
|
||||||
require_once(PHPWG_ROOT_PATH.'admin/include/image.class.php');
|
|
||||||
|
|
||||||
if (!function_exists('bratonien_tools_webdav_image_source_info') || !function_exists('bratonien_tools_webdav_generate_derivative'))
|
if (!function_exists('bratonien_tools_webdav_image_source_info') || !function_exists('bratonien_tools_webdav_preview_path'))
|
||||||
{
|
{
|
||||||
fwrite(STDERR, "Bratonien WebDAV-Bildruntime ist nicht aktiv.\n");
|
fwrite(STDERR, "Bratonien WebDAV-Bildruntime ist nicht aktiv.\n");
|
||||||
exit(1);
|
exit(1);
|
||||||
}
|
}
|
||||||
|
|
||||||
function bratonien_tools_webdav_modus_config()
|
|
||||||
{
|
|
||||||
global $conf;
|
|
||||||
|
|
||||||
$modus = $conf['modus_theme'] ?? array();
|
|
||||||
if (is_string($modus) && $modus !== '')
|
|
||||||
{
|
|
||||||
$decoded = @unserialize($modus);
|
|
||||||
if (is_array($decoded)) $modus = $decoded;
|
|
||||||
}
|
|
||||||
if (!is_array($modus)) $modus = array();
|
|
||||||
|
|
||||||
return array_merge(
|
|
||||||
array(
|
|
||||||
'index_photo_deriv'=>'2small',
|
|
||||||
'index_photo_deriv_hdpi'=>'xsmall',
|
|
||||||
),
|
|
||||||
$modus
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
function bratonien_tools_webdav_gallery_base_params()
|
|
||||||
{
|
|
||||||
$modus = bratonien_tools_webdav_modus_config();
|
|
||||||
$type = trim((string)($modus['index_photo_deriv'] ?? '2small'));
|
|
||||||
$params = $type !== '' ? @ImageStdParams::get_by_type($type) : null;
|
|
||||||
if ($params) return $params;
|
|
||||||
|
|
||||||
$params = ImageStdParams::get_by_type(IMG_THUMB);
|
|
||||||
if (!$params)
|
|
||||||
{
|
|
||||||
throw new RuntimeException('Piwigo-Galeriederivat ist nicht konfiguriert.');
|
|
||||||
}
|
|
||||||
return $params;
|
|
||||||
}
|
|
||||||
|
|
||||||
function bratonien_tools_webdav_modus_gallery_params(SrcImage $src, $base_params)
|
|
||||||
{
|
|
||||||
$row_height = (int)$base_params->max_height();
|
|
||||||
$candidates = array($base_params);
|
|
||||||
|
|
||||||
foreach (ImageStdParams::get_defined_type_map() as $params)
|
|
||||||
{
|
|
||||||
if (
|
|
||||||
$params->max_height() > $row_height
|
|
||||||
&& $params->sizing->max_crop == $base_params->sizing->max_crop
|
|
||||||
)
|
|
||||||
{
|
|
||||||
$candidates[] = $params;
|
|
||||||
if (count($candidates) === 3) break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
$selected = $base_params;
|
|
||||||
foreach ($candidates as $params)
|
|
||||||
{
|
|
||||||
$selected = $params;
|
|
||||||
$probe = new DerivativeImage($params, $src);
|
|
||||||
$size = $probe->get_size();
|
|
||||||
if ((int)$size[1] >= $row_height - 2) break;
|
|
||||||
}
|
|
||||||
|
|
||||||
return $selected;
|
|
||||||
}
|
|
||||||
|
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
$gallery_base_params = bratonien_tools_webdav_gallery_base_params();
|
|
||||||
$gallery_base_type = (string)$gallery_base_params->type;
|
|
||||||
|
|
||||||
$images = 0;
|
$images = 0;
|
||||||
$generated_or_ready = 0;
|
$updated = 0;
|
||||||
$identity = 0;
|
|
||||||
$metadata_repaired = 0;
|
|
||||||
$legacy_derivatives_rebuilt = 0;
|
|
||||||
$errors = 0;
|
$errors = 0;
|
||||||
$error_lines = array();
|
$error_lines = array();
|
||||||
$variant_counts = array();
|
|
||||||
|
|
||||||
$result = pwg_query('SELECT * FROM '.IMAGES_TABLE.' ORDER BY id');
|
$result = pwg_query('SELECT id, width, height, rotation FROM '.IMAGES_TABLE.' ORDER BY id');
|
||||||
while ($row = pwg_db_fetch_assoc($result))
|
while ($row = pwg_db_fetch_assoc($result))
|
||||||
{
|
{
|
||||||
$image_id = (int)$row['id'];
|
$image_id = (int)$row['id'];
|
||||||
@@ -141,14 +64,6 @@ try
|
|||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
$preview_ext = strtolower(pathinfo($preview, PATHINFO_EXTENSION));
|
|
||||||
if (!in_array($preview_ext, array('jpg', 'jpeg', 'png', 'gif'), true))
|
|
||||||
{
|
|
||||||
$errors++;
|
|
||||||
$error_lines[] = 'Bild #'.$image_id.': Preview-Format '.$preview_ext.' ist nicht Piwigo-kompatibel; Precache muss neu erzeugt werden.';
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
$size = @getimagesize($preview);
|
$size = @getimagesize($preview);
|
||||||
if (!is_array($size) || empty($size[0]) || empty($size[1]))
|
if (!is_array($size) || empty($size[0]) || empty($size[1]))
|
||||||
{
|
{
|
||||||
@@ -157,117 +72,41 @@ try
|
|||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
$preview_width = (int)$size[0];
|
$width = (int)$size[0];
|
||||||
$preview_height = (int)$size[1];
|
$height = (int)$size[1];
|
||||||
if ((int)($row['width'] ?? 0) !== $preview_width || (int)($row['height'] ?? 0) !== $preview_height || (int)($row['rotation'] ?? 0) !== 0)
|
if ((int)($row['width'] ?? 0) === $width && (int)($row['height'] ?? 0) === $height && (int)($row['rotation'] ?? 0) === 0)
|
||||||
{
|
{
|
||||||
pwg_query(
|
continue;
|
||||||
'UPDATE '.IMAGES_TABLE.
|
|
||||||
' SET width='.$preview_width.', height='.$preview_height.', rotation=0'.
|
|
||||||
' WHERE id='.$image_id
|
|
||||||
);
|
|
||||||
$row['width'] = $preview_width;
|
|
||||||
$row['height'] = $preview_height;
|
|
||||||
$row['rotation'] = 0;
|
|
||||||
$metadata_repaired++;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
$src = new SrcImage($row);
|
pwg_query(
|
||||||
try
|
'UPDATE '.IMAGES_TABLE.
|
||||||
{
|
' SET width='.$width.', height='.$height.', rotation=0'.
|
||||||
$gallery_params = bratonien_tools_webdav_modus_gallery_params($src, $gallery_base_params);
|
' WHERE id='.$image_id
|
||||||
$variant = (string)$gallery_params->type;
|
);
|
||||||
if ($variant === '') $variant = 'custom';
|
$updated++;
|
||||||
$variant_counts[$variant] = ($variant_counts[$variant] ?? 0) + 1;
|
|
||||||
|
|
||||||
$probe = new DerivativeImage($gallery_params, $src);
|
|
||||||
if ($probe->same_as_source())
|
|
||||||
{
|
|
||||||
$identity++;
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
$target = $probe->get_path();
|
|
||||||
if ($target !== '' && is_file($target) && is_readable($target))
|
|
||||||
{
|
|
||||||
$expected_size = $gallery_params->compute_final_size(array($preview_width, $preview_height));
|
|
||||||
$existing_size = @getimagesize($target);
|
|
||||||
if (
|
|
||||||
is_array($expected_size)
|
|
||||||
&& isset($expected_size[0], $expected_size[1])
|
|
||||||
&& is_array($existing_size)
|
|
||||||
&& isset($existing_size[0], $existing_size[1])
|
|
||||||
&& ((int)$existing_size[0] !== (int)$expected_size[0] || (int)$existing_size[1] !== (int)$expected_size[1])
|
|
||||||
)
|
|
||||||
{
|
|
||||||
if (!@unlink($target))
|
|
||||||
{
|
|
||||||
$errors++;
|
|
||||||
$error_lines[] = 'Bild #'.$image_id.' Galerie: falsches Alt-Derivat konnte nicht entfernt werden: '.$target;
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
$legacy_derivatives_rebuilt++;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
$detail = '';
|
|
||||||
if (bratonien_tools_webdav_generate_derivative($gallery_params, $src, $detail))
|
|
||||||
{
|
|
||||||
$generated_or_ready++;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
$errors++;
|
|
||||||
$error_lines[] = 'Bild #'.$image_id.' Galerie: '.($detail !== '' ? $detail : 'Galeriederivat konnte nicht erzeugt werden.');
|
|
||||||
}
|
|
||||||
}
|
|
||||||
catch (Throwable $e)
|
|
||||||
{
|
|
||||||
$errors++;
|
|
||||||
$error_lines[] = 'Bild #'.$image_id.' Galerie: '.get_class($e).': '.$e->getMessage();
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if ($metadata_repaired > 0)
|
if ($updated > 0)
|
||||||
{
|
{
|
||||||
update_category('all');
|
update_category('all');
|
||||||
invalidate_user_cache(true);
|
invalidate_user_cache(true);
|
||||||
}
|
}
|
||||||
|
|
||||||
if ($errors > 0)
|
foreach (array_slice($error_lines, 0, 30) as $line)
|
||||||
{
|
{
|
||||||
foreach (array_slice($error_lines, 0, 30) as $line)
|
fwrite(STDERR, $line."\n");
|
||||||
{
|
}
|
||||||
fwrite(STDERR, $line."\n");
|
if (count($error_lines) > 30)
|
||||||
}
|
{
|
||||||
if (count($error_lines) > 30)
|
fwrite(STDERR, 'Weitere Fehler: '.(count($error_lines) - 30)."\n");
|
||||||
{
|
|
||||||
fwrite(STDERR, 'Weitere Fehler: '.(count($error_lines) - 30)."\n");
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
ksort($variant_counts);
|
echo 'WebDAV-Metadaten: bilder='.$images.' aktualisiert='.$updated.' fehler='.$errors."\n";
|
||||||
$variant_parts = array();
|
|
||||||
foreach ($variant_counts as $type=>$count)
|
|
||||||
{
|
|
||||||
$variant_parts[] = $type.':'.$count;
|
|
||||||
}
|
|
||||||
|
|
||||||
echo 'WebDAV-Derivative-Builder: version='.BRATONIEN_WEBDAV_DERIVATIVE_BUILDER_VERSION.
|
|
||||||
' bilder='.$images.
|
|
||||||
' varianten_pro_bild=1'.
|
|
||||||
' modus_basis='.$gallery_base_type.
|
|
||||||
' modus_varianten='.implode(',', $variant_parts).
|
|
||||||
' bereit='.$generated_or_ready.
|
|
||||||
' identisch='.$identity.
|
|
||||||
' metadaten_repariert='.$metadata_repaired.
|
|
||||||
' alt_derivate_neu='.$legacy_derivatives_rebuilt.
|
|
||||||
' fehler='.$errors."\n";
|
|
||||||
|
|
||||||
exit($errors > 0 ? 1 : 0);
|
exit($errors > 0 ? 1 : 0);
|
||||||
}
|
}
|
||||||
catch (Throwable $e)
|
catch (Throwable $e)
|
||||||
{
|
{
|
||||||
fwrite(STDERR, 'WebDAV-Derivate: '.get_class($e).': '.$e->getMessage()."\n");
|
fwrite(STDERR, 'WebDAV-Metadaten: '.get_class($e).': '.$e->getMessage()."\n");
|
||||||
exit(1);
|
exit(1);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -9,13 +9,7 @@
|
|||||||
.bratonien-tab-panel { width:100%; max-width:none; margin-left:0 !important; margin-right:0 !important; }
|
.bratonien-tab-panel { width:100%; max-width:none; margin-left:0 !important; margin-right:0 !important; }
|
||||||
.bratonien-tab-panel[hidden] { display:none !important; }
|
.bratonien-tab-panel[hidden] { display:none !important; }
|
||||||
.bratonien-card { margin-left:0; margin-right:0; }
|
.bratonien-card { margin-left:0; margin-right:0; }
|
||||||
.bratonien-edit-dialog { width:min(920px,calc(100vw - 3rem)); max-height:88vh; overflow:auto; background:#444; color:inherit; border:1px solid #777; border-radius:4px; padding:0; box-shadow:0 18px 60px rgba(0,0,0,.55); }
|
@media (max-width:760px) { .bratonien-tabs{gap:5px}.bratonien-tab{border-bottom:1px solid rgba(255,255,255,.16);border-radius:4px;margin-bottom:0;padding:9px 11px} }
|
||||||
.bratonien-edit-dialog::backdrop { background:rgba(0,0,0,.55); }
|
|
||||||
.bratonien-edit-dialog__body { padding:1.25rem 1.5rem; }
|
|
||||||
.bratonien-storage-row { display:grid; grid-template-columns:minmax(120px,.7fr) minmax(150px,1fr) minmax(240px,1.5fr) auto; gap:.5rem; align-items:end; margin:.5rem 0; }
|
|
||||||
.bratonien-storage-row label { display:flex; flex-direction:column; gap:.25rem; }
|
|
||||||
.bratonien-storage-row input { width:100%; box-sizing:border-box; }
|
|
||||||
@media (max-width:760px) { .bratonien-tabs{gap:5px}.bratonien-tab{border-bottom:1px solid rgba(255,255,255,.16);border-radius:4px;margin-bottom:0;padding:9px 11px}.bratonien-storage-row{grid-template-columns:1fr} }
|
|
||||||
</style>
|
</style>
|
||||||
<div id="bratonien-tabs-anchor"></div>
|
<div id="bratonien-tabs-anchor"></div>
|
||||||
<script>
|
<script>
|
||||||
@@ -59,19 +53,15 @@
|
|||||||
|
|
||||||
function token(){var input=section.querySelector('input[name="pwg_token"]');return input?input.value:'';}
|
function token(){var input=section.querySelector('input[name="pwg_token"]');return input?input.value:'';}
|
||||||
function setOpen(value){try{if(value)sessionStorage.setItem(storageKey,'1');else sessionStorage.removeItem(storageKey);}catch(e){}}
|
function setOpen(value){try{if(value)sessionStorage.setItem(storageKey,'1');else sessionStorage.removeItem(storageKey);}catch(e){}}
|
||||||
|
function setMode(value){try{if(value)sessionStorage.setItem(modeKey,value);else sessionStorage.removeItem(modeKey);}catch(e){}}
|
||||||
function mode(){try{return sessionStorage.getItem(modeKey)||'';}catch(e){return '';}}
|
function mode(){try{return sessionStorage.getItem(modeKey)||'';}catch(e){return '';}}
|
||||||
function clearMode(){try{sessionStorage.removeItem(modeKey);}catch(e){}}
|
|
||||||
function applyMode(){
|
function applyMode(){
|
||||||
if(!dialog)return;
|
if(!dialog)return;
|
||||||
var current=mode();
|
|
||||||
var heading=dialog.querySelector('h4');
|
var heading=dialog.querySelector('h4');
|
||||||
var finish=dialog.querySelector('button[value="nc_connector_wizard_finish"]');
|
var finish=dialog.querySelector('button[value="nc_connector_wizard_finish"]');
|
||||||
if(current==='edit'){
|
if(mode()==='edit'){
|
||||||
if(heading)heading.textContent='Verbindung bearbeiten';
|
if(heading)heading.textContent='Verbindung bearbeiten';
|
||||||
if(finish)finish.textContent='Änderungen speichern';
|
if(finish)finish.textContent='Änderungen speichern';
|
||||||
}else if(current==='migrate'){
|
|
||||||
if(heading)heading.textContent='Auf WebDAV migrieren';
|
|
||||||
if(finish)finish.textContent='Migration starten';
|
|
||||||
}else{
|
}else{
|
||||||
if(heading)heading.textContent='Neue Verbindung';
|
if(heading)heading.textContent='Neue Verbindung';
|
||||||
if(finish)finish.textContent='Verbindung anlegen';
|
if(finish)finish.textContent='Verbindung anlegen';
|
||||||
@@ -90,13 +80,13 @@
|
|||||||
return fetch(window.location.href,{method:'POST',credentials:'same-origin',cache:'no-store',headers:{'Content-Type':'application/x-www-form-urlencoded;charset=UTF-8'},body:body.toString()});
|
return fetch(window.location.href,{method:'POST',credentials:'same-origin',cache:'no-store',headers:{'Content-Type':'application/x-www-form-urlencoded;charset=UTF-8'},body:body.toString()});
|
||||||
}
|
}
|
||||||
function closeAfterReset(){
|
function closeAfterReset(){
|
||||||
if(resetBusy)return;resetBusy=true;setOpen(false);clearMode();
|
if(resetBusy)return;resetBusy=true;setOpen(false);setMode('');
|
||||||
resetServer().catch(function(){}).finally(function(){resetBusy=false;if(dialog){if(typeof dialog.close==='function'&&dialog.open)dialog.close();else dialog.removeAttribute('open');}});
|
resetServer().catch(function(){}).finally(function(){resetBusy=false;if(dialog){if(typeof dialog.close==='function'&&dialog.open)dialog.close();else dialog.removeAttribute('open');}});
|
||||||
}
|
}
|
||||||
|
|
||||||
if(openButton){
|
if(openButton){
|
||||||
openButton.addEventListener('click',function(event){
|
openButton.addEventListener('click',function(event){
|
||||||
event.preventDefault();event.stopImmediatePropagation();clearMode();showWizard();
|
event.preventDefault();event.stopImmediatePropagation();setMode('');showWizard();
|
||||||
},true);
|
},true);
|
||||||
}
|
}
|
||||||
if(closeButton){
|
if(closeButton){
|
||||||
@@ -105,111 +95,33 @@
|
|||||||
if(dialog){
|
if(dialog){
|
||||||
dialog.addEventListener('cancel',function(event){event.preventDefault();event.stopImmediatePropagation();closeAfterReset();},true);
|
dialog.addEventListener('cancel',function(event){event.preventDefault();event.stopImmediatePropagation();closeAfterReset();},true);
|
||||||
dialog.addEventListener('click',function(event){if(event.target===dialog){event.preventDefault();event.stopImmediatePropagation();closeAfterReset();}},true);
|
dialog.addEventListener('click',function(event){if(event.target===dialog){event.preventDefault();event.stopImmediatePropagation();closeAfterReset();}},true);
|
||||||
|
|
||||||
[].slice.call(dialog.querySelectorAll('form[data-bratonien-wizard-form]')).forEach(function(form){
|
[].slice.call(dialog.querySelectorAll('form[data-bratonien-wizard-form]')).forEach(function(form){
|
||||||
form.addEventListener('submit',function(event){
|
form.addEventListener('submit',function(event){
|
||||||
var submitter=event.submitter;
|
var submitter=event.submitter;
|
||||||
setOpen(true);
|
setOpen(true);
|
||||||
if(submitter&&submitter.hasAttribute('data-bratonien-wizard-end')){
|
if(submitter&&submitter.hasAttribute('data-bratonien-wizard-end')){
|
||||||
setOpen(false);
|
setOpen(false);
|
||||||
if(submitter.value==='nc_connector_wizard_reset')clearMode();
|
if(submitter.value==='nc_connector_wizard_reset'||submitter.value==='nc_connector_wizard_finish')setMode('');
|
||||||
}
|
}
|
||||||
},true);
|
},true);
|
||||||
});
|
});
|
||||||
|
|
||||||
|
[].slice.call(section.querySelectorAll('form')).forEach(function(form){
|
||||||
|
var editButton=form.querySelector('button[value="nc_connector_edit_start"]');
|
||||||
|
if(!editButton)return;
|
||||||
|
form.addEventListener('submit',function(event){
|
||||||
|
if(event.submitter&&event.submitter.value==='nc_connector_edit_start'){
|
||||||
|
setMode('edit');setOpen(true);
|
||||||
|
}
|
||||||
|
},true);
|
||||||
|
});
|
||||||
|
|
||||||
try{if(sessionStorage.getItem(storageKey)==='1')showWizard();}catch(e){}
|
try{if(sessionStorage.getItem(storageKey)==='1')showWizard();}catch(e){}
|
||||||
applyMode();
|
applyMode();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
function initNCConnectionEditing(){
|
|
||||||
var section=document.getElementById('nc-connector');if(!section)return;
|
|
||||||
var modeKey='bratonienNcWizardMode';
|
|
||||||
var pwgTokenInput=section.querySelector('input[name="pwg_token"]');
|
|
||||||
var pwgToken=pwgTokenInput?pwgTokenInput.value:'';
|
|
||||||
|
|
||||||
function setMode(value){try{sessionStorage.setItem(modeKey,value);}catch(e){}}
|
|
||||||
function makePostButton(label,tool,id,modeValue){
|
|
||||||
var form=document.createElement('form');form.method='post';form.style.display='inline';
|
|
||||||
var token=document.createElement('input');token.type='hidden';token.name='pwg_token';token.value=pwgToken;form.appendChild(token);
|
|
||||||
var connection=document.createElement('input');connection.type='hidden';connection.name='connection_id';connection.value=String(id);form.appendChild(connection);
|
|
||||||
var button=document.createElement('button');button.type='submit';button.className='buttonLike';button.name='bratonien_tool';button.value=tool;button.textContent=label;
|
|
||||||
if(modeValue)form.addEventListener('submit',function(){setMode(modeValue);});
|
|
||||||
form.appendChild(button);return form;
|
|
||||||
}
|
|
||||||
function escapeHtml(value){return String(value==null?'':value).replace(/[&<>"']/g,function(c){return {'&':'&','<':'<','>':'>','"':'"',"'":'''}[c];});}
|
|
||||||
function localEditorDialog(){
|
|
||||||
var dialog=document.getElementById('bratonien-nc-local-edit-dialog');
|
|
||||||
if(dialog)return dialog;
|
|
||||||
dialog=document.createElement('dialog');dialog.id='bratonien-nc-local-edit-dialog';dialog.className='bratonien-edit-dialog';
|
|
||||||
dialog.innerHTML='<div class="bratonien-edit-dialog__body"><div style="display:flex;align-items:center;justify-content:space-between;gap:1rem"><div><h4 style="margin:0">Verbindung bearbeiten</h4><p class="bratonien-base-note" style="margin:.35rem 0 0">Bestehende Legacy-Verbindung. Änderungen werden in derselben Verbindung gespeichert.</p></div><button type="button" class="buttonLike" data-local-edit-close>Schließen</button></div><div data-local-edit-content style="margin-top:1rem"></div></div>';
|
|
||||||
document.body.appendChild(dialog);
|
|
||||||
dialog.querySelector('[data-local-edit-close]').addEventListener('click',function(){dialog.close();});
|
|
||||||
dialog.addEventListener('click',function(event){if(event.target===dialog)dialog.close();});
|
|
||||||
return dialog;
|
|
||||||
}
|
|
||||||
function storageRow(storage){
|
|
||||||
return '<div class="bratonien-storage-row" data-storage-row>'+
|
|
||||||
'<label>Storage-ID<input name="nc_storage_id[]" value="'+escapeHtml(storage.storage_id||'')+'" required></label>'+
|
|
||||||
'<label>Quellordner<input name="nc_source_prefix[]" value="'+escapeHtml(storage.source_prefix||'')+'" placeholder="optional"></label>'+
|
|
||||||
'<label>Lokaler Speicherpfad<input name="nc_local_mount[]" value="'+escapeHtml(storage.local_mount||'')+'" required></label>'+
|
|
||||||
'<button type="button" class="buttonLike" data-remove-storage>Entfernen</button></div>';
|
|
||||||
}
|
|
||||||
function openLocalEditor(id){
|
|
||||||
var dialog=localEditorDialog();
|
|
||||||
var content=dialog.querySelector('[data-local-edit-content]');
|
|
||||||
content.innerHTML='<p class="bratonien-base-note">Verbindung wird geladen …</p>';
|
|
||||||
if(typeof dialog.showModal==='function')dialog.showModal();else dialog.setAttribute('open','open');
|
|
||||||
fetch('plugins/bratonien_tools/nc-connector-edit-data.php?connection_id='+encodeURIComponent(id)+'&_='+Date.now(),{credentials:'same-origin',cache:'no-store',headers:{'Accept':'application/json'}})
|
|
||||||
.then(function(response){return response.json().then(function(data){if(!response.ok)throw new Error(data.error||('HTTP '+response.status));return data;});})
|
|
||||||
.then(function(data){
|
|
||||||
if(data.adapter!=='local')throw new Error('Diese Verbindung ist keine Legacy-Verbindung.');
|
|
||||||
var legacy=data.legacy||{};var storages=Array.isArray(legacy.storages)?legacy.storages:[];
|
|
||||||
var rows=storages.map(storageRow).join('');
|
|
||||||
if(!rows)rows=storageRow({});
|
|
||||||
content.innerHTML='<form method="post" data-local-edit-form>'+
|
|
||||||
'<input type="hidden" name="pwg_token" value="'+escapeHtml(pwgToken)+'">'+
|
|
||||||
'<input type="hidden" name="connection_id" value="'+escapeHtml(data.id)+'">'+
|
|
||||||
'<div class="bratonien-form-grid">'+
|
|
||||||
'<label class="bratonien-label">Name</label><input name="connection_name" value="'+escapeHtml(data.name)+'" required>'+
|
|
||||||
'<label class="bratonien-label">Datenbank-Server</label><input name="nc_host" value="'+escapeHtml(legacy.host)+'" required>'+
|
|
||||||
'<label class="bratonien-label">Port</label><input name="nc_port" type="number" min="1" max="65535" value="'+escapeHtml(legacy.port||5432)+'" required>'+
|
|
||||||
'<label class="bratonien-label">Datenbank</label><input name="nc_database" value="'+escapeHtml(legacy.database)+'" required>'+
|
|
||||||
'<label class="bratonien-label">Reader-Benutzer</label><input name="nc_user" value="'+escapeHtml(legacy.user)+'" required>'+
|
|
||||||
'<label class="bratonien-label">Reader-Passwort</label><input name="nc_db_password" type="password" autocomplete="new-password" placeholder="leer = unverändert">'+
|
|
||||||
'</div>'+
|
|
||||||
'<h5 style="margin-top:1rem">Speicherorte</h5><p class="bratonien-base-note">Jeder Speicherort wird einzeln bearbeitet. Es ist kein Pipe-/Textformat erforderlich.</p><div data-storage-list>'+rows+'</div><button type="button" class="buttonLike" data-add-storage>Speicherort hinzufügen</button>'+
|
|
||||||
'<details style="margin-top:1rem"><summary>Erweiterte Legacy-Einstellungen</summary><div class="bratonien-form-grid" style="margin-top:.75rem">'+
|
|
||||||
'<label class="bratonien-label">Source-View</label><input name="nc_source_view" value="'+escapeHtml(legacy.source_view)+'" required>'+
|
|
||||||
'<label class="bratonien-label">Activity-View</label><input name="nc_activity_view" value="'+escapeHtml(legacy.activity_view)+'" required>'+
|
|
||||||
'<label class="bratonien-label">Piwigo-Galerieordner</label><input name="nc_gallery_root" value="'+escapeHtml(legacy.gallery_root)+'" required>'+
|
|
||||||
'<label class="bratonien-label">Ruhezeit (Sek.)</label><input name="nc_quiet_seconds" type="number" min="0" value="'+escapeHtml(legacy.quiet_seconds)+'">'+
|
|
||||||
'<label class="bratonien-label">Maximale Wartezeit (Sek.)</label><input name="nc_max_wait_seconds" type="number" min="60" value="'+escapeHtml(legacy.max_wait_seconds)+'">'+
|
|
||||||
'<label class="bratonien-label">Vollprüfung nach (Sek.)</label><input name="nc_full_sync_seconds" type="number" min="300" value="'+escapeHtml(legacy.full_sync_seconds)+'">'+
|
|
||||||
'</div></details>'+
|
|
||||||
'<div class="bratonien-actions" style="margin-top:1rem"><button class="buttonLike" type="submit" name="bratonien_tool" value="nc_connector_update_local">Änderungen speichern</button><button class="buttonLike" type="button" data-local-edit-cancel>Abbrechen</button></div></form>';
|
|
||||||
var form=content.querySelector('[data-local-edit-form]');
|
|
||||||
form.querySelector('[data-local-edit-cancel]').addEventListener('click',function(){dialog.close();});
|
|
||||||
form.querySelector('[data-add-storage]').addEventListener('click',function(){form.querySelector('[data-storage-list]').insertAdjacentHTML('beforeend',storageRow({}));});
|
|
||||||
form.addEventListener('click',function(event){var remove=event.target.closest('[data-remove-storage]');if(remove){var row=remove.closest('[data-storage-row]');if(row)row.remove();}});
|
|
||||||
})
|
|
||||||
.catch(function(error){content.innerHTML='<p class="bratonien-main-cache__warning"><strong>Bearbeiten nicht möglich:</strong> '+escapeHtml(error.message||String(error))+'</p>';});
|
|
||||||
}
|
|
||||||
|
|
||||||
[].slice.call(section.querySelectorAll('button[value="nc_connector_edit_start"]')).forEach(function(button){var form=button.closest('form');if(form)form.remove();});
|
|
||||||
|
|
||||||
[].slice.call(section.querySelectorAll('button[value="nc_connector_delete"]')).forEach(function(deleteButton){
|
|
||||||
var deleteForm=deleteButton.closest('form');var card=deleteButton.closest('details');if(!deleteForm||!card)return;
|
|
||||||
var idInput=deleteForm.querySelector('input[name="connection_id"]');if(!idInput)return;var id=idInput.value;
|
|
||||||
var actions=deleteForm.parentElement;if(!actions)return;
|
|
||||||
var text=card.textContent||'';var isLocal=text.indexOf('bestehende Legacy-Konfiguration')!==-1;
|
|
||||||
if(isLocal){
|
|
||||||
var edit=document.createElement('button');edit.type='button';edit.className='buttonLike';edit.textContent='Bearbeiten';edit.addEventListener('click',function(){openLocalEditor(id);});actions.insertBefore(edit,deleteForm);
|
|
||||||
actions.insertBefore(makePostButton('Auf WebDAV migrieren','nc_connector_migrate_start',id,'migrate'),deleteForm);
|
|
||||||
}else{
|
|
||||||
actions.insertBefore(makePostButton('Bearbeiten','nc_connector_edit_start',id,'edit'),deleteForm);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
function initNCConnectorPolling(){
|
function initNCConnectorPolling(){
|
||||||
var section=document.getElementById('nc-connector');if(!section)return;
|
var section=document.getElementById('nc-connector');if(!section)return;
|
||||||
var endpoint='plugins/bratonien_tools/nc-connector-status.php';
|
var endpoint='plugins/bratonien_tools/nc-connector-status.php';
|
||||||
@@ -262,7 +174,7 @@
|
|||||||
poll();schedule();
|
poll();schedule();
|
||||||
}
|
}
|
||||||
|
|
||||||
function initAll(){initBratonienTabs();initNCWizardLifecycle();initNCConnectionEditing();initNCConnectorPolling();}
|
function initAll(){initBratonienTabs();initNCWizardLifecycle();initNCConnectorPolling();}
|
||||||
if(document.readyState==='loading')document.addEventListener('DOMContentLoaded',initAll);else initAll();
|
if(document.readyState==='loading')document.addEventListener('DOMContentLoaded',initAll);else initAll();
|
||||||
})();
|
})();
|
||||||
</script>
|
</script>
|
||||||
|
|||||||
@@ -61,7 +61,6 @@ function bratonien_tools_save_album_rule()
|
|||||||
)));
|
)));
|
||||||
}
|
}
|
||||||
|
|
||||||
bratonien_tools_clear_watermark_cache();
|
|
||||||
return array('message'=>'Albumregel gespeichert.');
|
return array('message'=>'Albumregel gespeichert.');
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -94,34 +93,7 @@ function bratonien_tools_resolve_album_rule($category_id, array $categories, arr
|
|||||||
$by_id[(int)$category['id']] = $category;
|
$by_id[(int)$category['id']] = $category;
|
||||||
}
|
}
|
||||||
|
|
||||||
$category_id = (int)$category_id;
|
$current = (int)$category_id;
|
||||||
$root = $by_id[$category_id] ?? null;
|
|
||||||
$is_private = $root && isset($root['status']) && $root['status'] === 'private';
|
|
||||||
|
|
||||||
if ($is_private)
|
|
||||||
{
|
|
||||||
if (isset($rules[$category_id]))
|
|
||||||
{
|
|
||||||
$rule = $rules[$category_id];
|
|
||||||
if ($rule['mode'] === 'disabled')
|
|
||||||
{
|
|
||||||
return array('mode'=>'disabled','profile_id'=>null,'source'=>'album');
|
|
||||||
}
|
|
||||||
if ($rule['mode'] === 'profile')
|
|
||||||
{
|
|
||||||
return array('mode'=>'profile','profile_id'=>(int)$rule['profile_id'],'source'=>'album');
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
$profile_id = $defaults['private_profile'] ?? null;
|
|
||||||
if (empty($profile_id))
|
|
||||||
{
|
|
||||||
return array('mode'=>'disabled','profile_id'=>null,'source'=>'global');
|
|
||||||
}
|
|
||||||
return array('mode'=>'profile','profile_id'=>(int)$profile_id,'source'=>'global');
|
|
||||||
}
|
|
||||||
|
|
||||||
$current = $category_id;
|
|
||||||
$visited = array();
|
$visited = array();
|
||||||
|
|
||||||
while ($current > 0 && isset($by_id[$current]) && !isset($visited[$current]))
|
while ($current > 0 && isset($by_id[$current]) && !isset($visited[$current]))
|
||||||
@@ -144,7 +116,10 @@ function bratonien_tools_resolve_album_rule($category_id, array $categories, arr
|
|||||||
$current = (int)($by_id[$current]['id_uppercat'] ?? 0);
|
$current = (int)($by_id[$current]['id_uppercat'] ?? 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
$profile_id = $defaults['public_profile'] ?? null;
|
$root = $by_id[(int)$category_id] ?? null;
|
||||||
|
$is_private = $root && isset($root['status']) && $root['status'] === 'private';
|
||||||
|
$profile_id = $is_private ? ($defaults['private_profile'] ?? null) : ($defaults['public_profile'] ?? null);
|
||||||
|
|
||||||
if (empty($profile_id))
|
if (empty($profile_id))
|
||||||
{
|
{
|
||||||
return array('mode'=>'disabled','profile_id'=>null,'source'=>'global');
|
return array('mode'=>'disabled','profile_id'=>null,'source'=>'global');
|
||||||
|
|||||||
@@ -128,7 +128,6 @@ function bratonien_tools_save_watermark_profile()
|
|||||||
mass_inserts($table, array_keys($data), array($data));
|
mass_inserts($table, array_keys($data), array($data));
|
||||||
}
|
}
|
||||||
|
|
||||||
bratonien_tools_clear_watermark_cache();
|
|
||||||
return array('message'=>'Wasserzeichenprofil gespeichert.');
|
return array('message'=>'Wasserzeichenprofil gespeichert.');
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -159,7 +158,6 @@ function bratonien_tools_delete_watermark_profile()
|
|||||||
}
|
}
|
||||||
|
|
||||||
pwg_query('DELETE FROM '.bratonien_tools_table('watermark_profiles').' WHERE id='.$id);
|
pwg_query('DELETE FROM '.bratonien_tools_table('watermark_profiles').' WHERE id='.$id);
|
||||||
bratonien_tools_clear_watermark_cache();
|
|
||||||
return array('message'=>'Wasserzeichenprofil geloescht.');
|
return array('message'=>'Wasserzeichenprofil geloescht.');
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -176,7 +174,6 @@ function bratonien_tools_duplicate_watermark_profile()
|
|||||||
$profile['name'] .= ' (Kopie)';
|
$profile['name'] .= ' (Kopie)';
|
||||||
$profile['created'] = date('Y-m-d H:i:s');
|
$profile['created'] = date('Y-m-d H:i:s');
|
||||||
mass_inserts(bratonien_tools_table('watermark_profiles'), array_keys($profile), array($profile));
|
mass_inserts(bratonien_tools_table('watermark_profiles'), array_keys($profile), array($profile));
|
||||||
bratonien_tools_clear_watermark_cache();
|
|
||||||
|
|
||||||
return array('message'=>'Wasserzeichenprofil dupliziert.');
|
return array('message'=>'Wasserzeichenprofil dupliziert.');
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -4,59 +4,6 @@ if (!defined('PHPWG_ROOT_PATH'))
|
|||||||
die('Hacking attempt!');
|
die('Hacking attempt!');
|
||||||
}
|
}
|
||||||
|
|
||||||
function bratonien_tools_watermark_cache_dir()
|
|
||||||
{
|
|
||||||
return PHPWG_ROOT_PATH.PWG_DERIVATIVE_DIR.'bratonien-watermark';
|
|
||||||
}
|
|
||||||
|
|
||||||
function bratonien_tools_remove_tree($path)
|
|
||||||
{
|
|
||||||
$path = rtrim((string)$path, DIRECTORY_SEPARATOR);
|
|
||||||
if ($path === '' || !file_exists($path)) return;
|
|
||||||
|
|
||||||
if (is_file($path) || is_link($path))
|
|
||||||
{
|
|
||||||
@unlink($path);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
foreach (scandir($path) ?: array() as $entry)
|
|
||||||
{
|
|
||||||
if ($entry === '.' || $entry === '..') continue;
|
|
||||||
bratonien_tools_remove_tree($path.DIRECTORY_SEPARATOR.$entry);
|
|
||||||
}
|
|
||||||
@rmdir($path);
|
|
||||||
}
|
|
||||||
|
|
||||||
function bratonien_tools_clear_watermark_cache()
|
|
||||||
{
|
|
||||||
$dir = bratonien_tools_watermark_cache_dir();
|
|
||||||
$derivative_root = realpath(PHPWG_ROOT_PATH.PWG_DERIVATIVE_DIR);
|
|
||||||
$parent = realpath(dirname($dir));
|
|
||||||
|
|
||||||
if ($derivative_root === false || $parent === false || $parent !== $derivative_root)
|
|
||||||
{
|
|
||||||
throw new RuntimeException('Wasserzeichen-Cachepfad ist ungueltig.');
|
|
||||||
}
|
|
||||||
|
|
||||||
if (is_dir($dir))
|
|
||||||
{
|
|
||||||
bratonien_tools_remove_tree($dir);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
function bratonien_tools_watermark_cache_upgrade()
|
|
||||||
{
|
|
||||||
$version = '0.9.7.13';
|
|
||||||
if ((string)conf_get_param('bratonien_watermark_cache_version', '') === $version)
|
|
||||||
{
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
bratonien_tools_clear_watermark_cache();
|
|
||||||
conf_update_param('bratonien_watermark_cache_version', $version);
|
|
||||||
}
|
|
||||||
|
|
||||||
function bratonien_tools_get_watermark_defaults()
|
function bratonien_tools_get_watermark_defaults()
|
||||||
{
|
{
|
||||||
$defaults = conf_get_param('bratonien_watermark_defaults', null);
|
$defaults = conf_get_param('bratonien_watermark_defaults', null);
|
||||||
@@ -93,7 +40,6 @@ function bratonien_tools_save_watermark_defaults()
|
|||||||
);
|
);
|
||||||
|
|
||||||
conf_update_param('bratonien_watermark_defaults', json_encode($config));
|
conf_update_param('bratonien_watermark_defaults', json_encode($config));
|
||||||
bratonien_tools_clear_watermark_cache();
|
|
||||||
|
|
||||||
return array('message'=>'Globale Wasserzeichenregeln gespeichert.');
|
return array('message'=>'Globale Wasserzeichenregeln gespeichert.');
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user