0.9.6.24: WebDAV ohne Migrationspaarung

This commit is contained in:
Terranom674
2026-08-19 18:27:44 +02:00
parent 82af31435e
commit 0f85958dff

View File

@@ -5,57 +5,8 @@ if (!defined('PHPWG_ROOT_PATH'))
}
/**
* Link a WebDAV successor with the exact legacy connection selected for migration.
* The caller must execute this inside the same transaction that creates the successor.
*/
function bratonien_tools_nc_connector_pair_migration_fallback($legacy_id, $webdav_id, array &$webdav_config, $now)
{
$legacy_id = (int)$legacy_id;
$webdav_id = (int)$webdav_id;
if ($legacy_id < 1 || $webdav_id < 1 || $legacy_id === $webdav_id)
{
throw new RuntimeException('Die Migrationszuordnung ist ungueltig.');
}
$legacy = bratonien_tools_nc_connector_connection($legacy_id, false);
if (!$legacy || (string)$legacy['adapter'] !== 'local')
{
throw new RuntimeException('Die ausgewaehlte Legacy-Verbindung fuer die Migration ist nicht mehr verfuegbar.');
}
$legacy_config = isset($legacy['config']) && is_array($legacy['config']) ? $legacy['config'] : array();
$webdav_config['migration'] = array(
'role'=>'webdav-primary-candidate',
'legacy_fallback_connection_id'=>$legacy_id,
'fallback_policy'=>'keep-running',
'paired_at'=>(string)$now,
'cutover_state'=>'parallel',
);
$legacy_config['migration'] = array(
'role'=>'legacy-fallback',
'webdav_successor_connection_id'=>$webdav_id,
'fallback_policy'=>'keep-running',
'paired_at'=>(string)$now,
'cutover_state'=>'parallel',
);
$legacy_json = json_encode($legacy_config, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES);
if (!is_string($legacy_json))
{
throw new RuntimeException('Die bestehende Verbindung konnte nicht als Migrations-Fallback markiert werden.');
}
$table = bratonien_tools_nc_connector_table();
pwg_query("UPDATE `$table` SET config_json='".pwg_db_real_escape_string($legacy_json)."', updated='".pwg_db_real_escape_string((string)$now)."' WHERE id=".$legacy_id." AND adapter='local' LIMIT 1");
return $legacy_id;
}
/**
* Create or update a WebDAV-backed connector from the user-facing wizard.
*
* Remote connections are updated in place. A legacy connection is paired only
* when the wizard was explicitly opened in migration mode for that connection.
* Create or update one independent WebDAV connector connection.
* No migration pair, successor or implicit legacy fallback is created.
*/
function bratonien_tools_nc_connector_create_webdav_placeholder_from_wizard()
{
@@ -80,13 +31,20 @@ function bratonien_tools_nc_connector_create_webdav_placeholder_from_wizard()
$selected_ids = isset($state['directory_selected_fileids']) && is_array($state['directory_selected_fileids'])
? $state['directory_selected_fileids']
: array();
if (!$selected) throw new RuntimeException('Bitte mindestens ein Nextcloud-Verzeichnis auswaehlen.');
if (!$selected)
{
$selected = array('');
}
$roots = array();
foreach ($selected as $path)
{
$fileid = isset($selected_ids[$path]) ? (int)$selected_ids[$path] : 0;
if ($fileid < 1) throw new RuntimeException('Fuer ein ausgewaehltes Nextcloud-Verzeichnis fehlt die eindeutige Datei-ID.');
if ($fileid < 1)
{
throw new RuntimeException('Fuer ein ausgewaehltes Nextcloud-Verzeichnis fehlt die eindeutige Datei-ID.');
}
$display_name = $path === ''
? (trim((string)($state['display_name'] ?? '')) !== '' ? trim((string)$state['display_name']) : $username)
: basename($path);
@@ -115,13 +73,10 @@ function bratonien_tools_nc_connector_create_webdav_placeholder_from_wizard()
&& (string)$editing_connection['adapter'] === 'remote'
&& (string)($editing_connection['config']['source_mode'] ?? '') === 'webdav-placeholder'
&& $editing_mode === 'update';
$migrating_legacy = $editing_connection
&& (string)$editing_connection['adapter'] === 'local'
&& $editing_mode === 'migrate';
if ($editing_mode === 'migrate' && !$migrating_legacy)
if ($editing_mode === 'migrate')
{
throw new RuntimeException('Die fuer die Migration ausgewaehlte Legacy-Verbindung ist nicht mehr verfuegbar.');
throw new RuntimeException('Die Migrationsfunktion wurde entfernt. Bitte eine normale WebDAV-Verbindung anlegen.');
}
$config = array(
@@ -138,7 +93,6 @@ function bratonien_tools_nc_connector_create_webdav_placeholder_from_wizard()
'quiet_seconds'=>120,
'max_wait_seconds'=>900,
'full_sync_seconds'=>86400,
'parallel_test'=>true,
'piwigo_auth'=>'connection-scoped',
'api_enabled'=>$api_enabled,
);
@@ -146,7 +100,7 @@ function bratonien_tools_nc_connector_create_webdav_placeholder_from_wizard()
if ($editing_remote)
{
$old_config = is_array($editing_connection['config'] ?? null) ? $editing_connection['config'] : array();
foreach (array('state_dir','status_file','parallel_gallery_root','source_fingerprint','runtime','migration') as $preserve)
foreach (array('state_dir','status_file','parallel_gallery_root','source_fingerprint','runtime') as $preserve)
{
if (array_key_exists($preserve, $old_config)) $config[$preserve] = $old_config[$preserve];
}
@@ -191,7 +145,7 @@ function bratonien_tools_nc_connector_create_webdav_placeholder_from_wizard()
return array(
'connection_id'=>$editing_id,
'message'=>'WebDAV-Verbindung #'.$editing_id.' wurde gespeichert. Der naechste Connector-Lauf verwendet die neuen Einstellungen.',
'message'=>'WebDAV-Verbindung wurde gespeichert.',
);
}
@@ -199,12 +153,6 @@ function bratonien_tools_nc_connector_create_webdav_placeholder_from_wizard()
if (!is_string($config_json)) throw new RuntimeException('WebDAV-Konfiguration konnte nicht serialisiert werden.');
$connection_key = 'webdav-'.bin2hex(random_bytes(12));
$legacy_fallback_id = null;
$id = 0;
pwg_query('START TRANSACTION');
try
{
pwg_query("INSERT INTO `$table` (connection_key,name,adapter,enabled,takeover_state,config_json,secret_blob,created,updated) VALUES ('"
.pwg_db_real_escape_string($connection_key)."','"
.pwg_db_real_escape_string($name)."','remote',0,'disabled','"
@@ -218,36 +166,12 @@ function bratonien_tools_nc_connector_create_webdav_placeholder_from_wizard()
$config['state_dir'] = '/var/lib/bratonien-tools/nc-connector/connection-'.$id;
$config['status_file'] = $config['state_dir'].'/connector-status.json';
if ($migrating_legacy)
{
$legacy_fallback_id = bratonien_tools_nc_connector_pair_migration_fallback($editing_id, $id, $config, $now);
}
$config_json = json_encode($config, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES);
if (!is_string($config_json))
{
throw new RuntimeException('Die WebDAV-Verbindung konnte nach dem Anlegen nicht serialisiert werden.');
}
if (!is_string($config_json)) throw new RuntimeException('WebDAV-Konfiguration konnte nach dem Anlegen nicht serialisiert werden.');
pwg_query("UPDATE `$table` SET config_json='".pwg_db_real_escape_string($config_json)."' WHERE id=".$id." AND adapter='remote' LIMIT 1");
pwg_query('COMMIT');
}
catch (Throwable $e)
{
pwg_query('ROLLBACK');
throw $e;
}
unset($_SESSION['bratonien_nc_wizard']);
if ($legacy_fallback_id !== null)
{
return array(
'connection_id'=>$id,
'legacy_fallback_connection_id'=>$legacy_fallback_id,
'message'=>'WebDAV-Nachfolger wurde angelegt. Die bestehende lokale Verbindung #'.$legacy_fallback_id.' bleibt als Fallback erhalten.',
);
}
return array(
'connection_id'=>$id,
'message'=>'WebDAV-Verbindung wurde angelegt.',