aboutsummaryrefslogtreecommitdiffstats
path: root/apps/files/lib/Listener
diff options
context:
space:
mode:
authorMaxence Lange <maxence@artificial-owl.com>2023-12-11 12:20:16 -0100
committerMaxence Lange <maxence@artificial-owl.com>2023-12-11 12:20:25 -0100
commite0a78dd2fe856c44cab481ae4163c321dc073ee6 (patch)
treed96fd55c9b565010a0d87e353861057d2983193e /apps/files/lib/Listener
parent9e10b1d5b920678f22484365aae5e9ac4779796a (diff)
downloadnextcloud-server-e0a78dd2fe856c44cab481ae4163c321dc073ee6.tar.gz
nextcloud-server-e0a78dd2fe856c44cab481ae4163c321dc073ee6.zip
fix rename
Signed-off-by: Maxence Lange <maxence@artificial-owl.com>
Diffstat (limited to 'apps/files/lib/Listener')
-rw-r--r--apps/files/lib/Listener/SyncLivePhotosListener.php47
1 files changed, 17 insertions, 30 deletions
diff --git a/apps/files/lib/Listener/SyncLivePhotosListener.php b/apps/files/lib/Listener/SyncLivePhotosListener.php
index 32dcdc81084..b188ad24073 100644
--- a/apps/files/lib/Listener/SyncLivePhotosListener.php
+++ b/apps/files/lib/Listener/SyncLivePhotosListener.php
@@ -32,7 +32,6 @@ use OCP\EventDispatcher\IEventListener;
use OCP\Files\Cache\CacheEntryRemovedEvent;
use OCP\Files\Events\Node\BeforeNodeDeletedEvent;
use OCP\Files\Events\Node\BeforeNodeRenamedEvent;
-use OCP\Files\File;
use OCP\Files\Folder;
use OCP\Files\Node;
use OCP\Files\NotFoundException;
@@ -46,11 +45,11 @@ use OCP\IUserSession;
*/
class SyncLivePhotosListener implements IEventListener {
/** @var Array<int, string> */
- private $pendingRenames = [];
+ private array $pendingRenames = [];
/** @var Array<int, bool> */
- private $pendingDeletion = [];
+ private array $pendingDeletion = [];
/** @var Array<int, bool> */
- private $pendingRestores = [];
+ private array $pendingRestores = [];
public function __construct(
private ?Folder $userFolder,
@@ -78,7 +77,7 @@ class SyncLivePhotosListener implements IEventListener {
}
if ($peerFile === null) {
- return;
+ return; // not a Live Photo
}
if ($event instanceof BeforeNodeRenamedEvent) {
@@ -95,12 +94,9 @@ class SyncLivePhotosListener implements IEventListener {
/**
* During rename events, which also include move operations,
* we rename the peer file using the same name.
- * This means that a move operation on the .jpg will trigger
- * another recursive one for the .mov.
- * Move operations on the .mov file directly are currently blocked.
* The event listener being singleton, we can store the current state
* of pending renames inside the 'pendingRenames' property,
- * to prevent infinite recursivity.
+ * to prevent infinite recursive.
*/
private function handleMove(BeforeNodeRenamedEvent $event, Node $peerFile): void {
$sourceFile = $event->getSource();
@@ -111,44 +107,35 @@ class SyncLivePhotosListener implements IEventListener {
$targetName = $targetFile->getName();
$targetPath = $targetFile->getPath();
- // Prevent rename of the .mov file if the peer file do not have the same path.
- if ($sourceFile->getMimetype() === 'video/quicktime') {
- $peerFilePath = $this->pendingRenames[$peerFile->getId()] ?? $peerFile->getPath();
- $targetPathWithoutExtension = preg_replace("/\.$sourceExtension$/", '', $targetPath);
- $peerFilePathWithoutExtension = preg_replace("/\.$peerFileExtension$/", '', $peerFilePath);
-
- if ($targetPathWithoutExtension !== $peerFilePathWithoutExtension) {
- $event->abortOperation(new NotPermittedException("The video part of a live photo need to have the same name as the image"));
- }
-
- unset($this->pendingRenames[$peerFile->getId()]);
- return;
- }
-
if (!str_ends_with($targetName, ".".$sourceExtension)) {
- $event->abortOperation(new NotPermittedException("Cannot change the extension of a live photo"));
+ $event->abortOperation(new NotPermittedException("Cannot change the extension of a Live Photo"));
}
try {
$targetParent->get($targetName);
- $event->abortOperation(new NotPermittedException("A file already exist at destination path"));
+ $event->abortOperation(new NotPermittedException("A file already exist at destination path of the Live Photo"));
} catch (NotFoundException $ex) {
}
+
+ $peerTargetName = substr($targetName, 0, -strlen($sourceExtension)) . $peerFileExtension;
try {
- $peerTargetName = preg_replace("/\.$sourceExtension$/", '.mov', $targetName);
$targetParent->get($peerTargetName);
- $event->abortOperation(new NotPermittedException("A file already exist at destination path"));
+ $event->abortOperation(new NotPermittedException("A file already exist at destination path of the Live Photo"));
} catch (NotFoundException $ex) {
}
- $peerTargetPath = preg_replace("/\.$sourceExtension$/", '.mov', $targetPath);
+ // in case the rename was initiated from this listener, we stop right now
+ if (array_key_exists($peerFile->getId(), $this->pendingRenames)) {
+ return;
+ }
+
$this->pendingRenames[$sourceFile->getId()] = $targetPath;
try {
- $peerFile->move($peerTargetPath);
+ $peerFile->move($targetParent->getPath() . '/' . $peerTargetName);
} catch (\Throwable $ex) {
$event->abortOperation($ex);
}
- return;
+ unset($this->pendingRenames[$sourceFile->getId()]);
}
/**