Passed
Pull Request — vuejs (#93)
by Andreas
03:39 queued 01:49
created

AjaxController::damGetLogoutUrlAction()   A

Complexity

Conditions 2
Paths 2

Size

Total Lines 7
Code Lines 4

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
cc 2
eloc 4
nc 2
nop 0
dl 0
loc 7
rs 10
c 0
b 0
f 0
1
<?php
2
declare(strict_types = 1);
3
4
/*
5
 * This file is part of the package lns/digital-asset-management.
6
 *
7
 * For the full copyright and license information, please read the
8
 * LICENSE file that was distributed with this source code.
9
 */
10
11
namespace TYPO3\CMS\DigitalAssetManagement\Controller;
12
13
use Psr\Http\Message\ServerRequestInterface;
14
use TYPO3\CMS\Backend\Routing\UriBuilder;
15
use TYPO3\CMS\Core\Authentication\BackendUserAuthentication;
16
use TYPO3\CMS\Core\Http\JsonResponse;
17
use TYPO3\CMS\Core\Resource\DuplicationBehavior;
18
use TYPO3\CMS\Core\Resource\Exception as ResourceException;
19
use TYPO3\CMS\Core\Resource\Exception\InvalidTargetFolderException;
20
use TYPO3\CMS\Core\Resource\Exception\ResourceDoesNotExistException;
21
use TYPO3\CMS\Core\Resource\Folder;
22
use TYPO3\CMS\Core\Resource\ResourceFactory;
23
use TYPO3\CMS\Core\Utility\GeneralUtility;
24
use TYPO3\CMS\DigitalAssetManagement\Entity\FileMount;
25
use TYPO3\CMS\DigitalAssetManagement\Entity\FileOperationResult;
26
use TYPO3\CMS\DigitalAssetManagement\Entity\FolderItemFile;
27
use TYPO3\CMS\DigitalAssetManagement\Entity\FolderItemFolder;
28
use TYPO3\CMS\DigitalAssetManagement\Entity\FolderItemImage;
29
use TYPO3\CMS\DigitalAssetManagement\Entity\Storage;
30
use TYPO3\CMS\DigitalAssetManagement\Entity\TreeItemFolder;
31
use TYPO3\CMS\DigitalAssetManagement\Exception\ControllerException;
32
use TYPO3\CMS\DigitalAssetManagement\Http\FileExistsResponse;
33
use TYPO3\CMS\DigitalAssetManagement\Http\FileOperationResponse;
34
use TYPO3\CMS\DigitalAssetManagement\Http\FolderItemsResponse;
35
use TYPO3\CMS\DigitalAssetManagement\Http\JsonExceptionResponse;
36
use TYPO3\CMS\DigitalAssetManagement\Http\StoragesAndMountsResponse;
37
38
/**
39
 * Main API endpoint. These are ajax actions called by JS side.
40
 *
41
 * Look up the end points in Configuration/Backend/Routes.php: A typical
42
 * path is something like /ajax/dam/getStoragesAndMounts which maps to a method
43
 * with the same name plus word "Action": getStoragesAndMountsAction().
44
 *
45
 * All actions return a JsonResponse, if all is good, the return code is
46
 * 200. A different code, usually in 4xx range will be returned if the
47
 * client sent a bogus request, often with some exception details.
48
 */
49
class AjaxController
50
{
51
    /**
52
     * @return JsonResponse
53
     */
54
    public function getNewStorageUrlAction(): JsonResponse
55
    {
56
        $backendUser = $this->getBackendUser();
57
        if (!$backendUser->isAdmin()) {
58
            return new JsonExceptionResponse(new ControllerException('User is not admin', 1554380677));
59
        }
60
        $uriBuilder = GeneralUtility::makeInstance(UriBuilder::class);
61
        $urlParameters = [
62
            'edit' => [
63
                'sys_file_storage' => [
64
                    0 => 'new',
65
                ],
66
            ],
67
            'returnUrl' => (string)$uriBuilder->buildUriFromRoute('file_DigitalAssetManagement'),
68
        ];
69
        return new JsonResponse([ (string)$uriBuilder->buildUriFromRoute('record_edit', $urlParameters) ]);
70
    }
71
72
    /**
73
     * @return JsonResponse
74
     */
75
    public function damGetLogoutUrlAction(): JsonResponse
76
    {
77
        if (empty($this->getBackendUser()->user['uid'])) {
78
            return new JsonExceptionResponse(new ControllerException('User is not logged in', 1554380677));
79
        }
80
        $uriBuilder = GeneralUtility::makeInstance(UriBuilder::class);
81
        return new JsonResponse([ (string)$uriBuilder->buildUriFromRoute('logout') ]);
82
    }
83
84
    /**
85
     * Set module state of BE user. Send a json array as ['data'] POST
86
     *
87
     * @param ServerRequestInterface $request
88
     * @return JsonResponse
89
     */
90
    public function setStateAction(ServerRequestInterface $request): JsonResponse
91
    {
92
        $backendUser = $this->getBackendUser();
93
        $backendUser->uc['digital_asset_management'] = $request->getParsedBody()['data'] ?? [];
94
        $backendUser->writeUC();
95
        return new JsonResponse();
96
    }
97
98
    /**
99
     * @return JsonResponse
100
     */
101
    public function getStateAction(): JsonResponse
102
    {
103
        return new JsonResponse([ 'data' => $this->getBackendUser()->uc['digital_asset_management'] ?? []]);
104
    }
105
106
    /**
107
     * @param ServerRequestInterface $request
108
     *
109
     * @return JsonResponse
110
     */
111
    public function createFolderAction(ServerRequestInterface $request): JsonResponse
112
    {
113
        $identifier = $request->getQueryParams()['identifier'] ?? '';
114
        if (empty($identifier)) {
115
            return new JsonExceptionResponse(new ControllerException('Identifier needed', 1554204780));
116
        }
117
        try {
118
            $folder = $this->createFolderRecursive($identifier);
119
            return new JsonResponse([new FolderItemFolder($folder)]);
120
        } catch (ResourceException $e) {
121
            return new JsonExceptionResponse($e);
122
        }
123
    }
124
125
    /**
126
     * @param ServerRequestInterface $request
127
     *
128
     * @return JsonResponse
129
     */
130
    public function fileUploadAction(ServerRequestInterface $request): JsonResponse
131
    {
132
        $identifier = $request->getQueryParams()['identifier'] ?? '';
133
        $conflictMode = $request->getQueryParams()['conflictMode'] ?? '';
134
        $tempFilename = '';
135
        try {
136
            if (empty($identifier)) {
137
                throw new ControllerException('Identifier needed', 1554132801);
138
            }
139
            if (empty($conflictMode) || !in_array($conflictMode, ['replace', 'cancel', 'rename'], true)) {
140
                throw new ControllerException('conflictMode must be one of "replace", "cancel", "rename"');
141
            }
142
            $folderIdentifier = dirname($identifier) . '/';
143
            $fileIdentifier = basename($identifier);
144
            $resourceFactory = GeneralUtility::makeInstance(ResourceFactory::class);
145
            try {
146
                $folder = $resourceFactory->retrieveFileOrFolderObject($folderIdentifier);
147
            } catch (ResourceDoesNotExistException $e) {
148
                $folder = $this->createFolderRecursive($folderIdentifier);
149
            }
150
            $tempFilename = tempnam(sys_get_temp_dir(), 'upload_');
151
            file_put_contents($tempFilename, $request->getBody());
152
            $file = $folder->addFile($tempFilename, $fileIdentifier, (string)DuplicationBehavior::cast($conflictMode));
153
            $fileExtension = strtolower($file->getExtension());
154
            if (GeneralUtility::inList($GLOBALS['TYPO3_CONF_VARS']['GFX']['imagefile_ext'], $fileExtension)
155
                || GeneralUtility::inList($GLOBALS['TYPO3_CONF_VARS']['GFX']['mediafile_ext'], $fileExtension)
156
            ) {
157
                return new JsonResponse([new FolderItemImage($file)]);
158
            }
159
            return new JsonResponse([new FolderItemFile($file)]);
160
        } catch (ResourceException $e) {
161
            if (!empty($tempFilename) && file_exists($tempFilename)) {
162
                unlink($tempFilename);
163
            }
164
            return new JsonExceptionResponse($e);
165
        } catch (ControllerException $e) {
166
            return new JsonExceptionResponse($e);
167
        }
168
    }
169
170
    /**
171
     * @param string $folderIdentifier
172
     *
173
     * @return Folder
174
     */
175
    protected function createFolderRecursive(string $folderIdentifier): Folder
176
    {
177
        $resourceFactory = GeneralUtility::makeInstance(ResourceFactory::class);
178
        $stack = [];
179
        while (true) {
180
            $parentName = dirname($folderIdentifier);
181
            $folderName = basename($folderIdentifier);
182
            $stack[] = $folderName;
183
            try {
184
                $parentObject = $resourceFactory->retrieveFileOrFolderObject($parentName);
185
                break;
186
            } catch (ResourceDoesNotExistException $e) {
187
                $folderIdentifier = $parentName;
188
            }
189
        }
190
        while ($folderName = array_pop($stack)) {
191
            try {
192
                $parentObject = $parentObject->createFolder($folderName);
0 ignored issues
show
Comprehensibility Best Practice introduced by
The variable $parentObject does not seem to be defined for all execution paths leading up to this point.
Loading history...
193
            } catch (ResourceException $e) {
0 ignored issues
show
Coding Style Comprehensibility introduced by
Consider adding a comment why this CATCH block is empty.
Loading history...
194
            }
195
        }
196
        return $parentObject;
197
    }
198
199
    /**
200
     * @param ServerRequestInterface $request
201
     *
202
     * @return JsonResponse
203
     */
204
    public function fileExistsAction(ServerRequestInterface $request): JsonResponse
205
    {
206
        $identifier = $request->getQueryParams()['identifier'];
207
        if (empty($identifier)) {
208
            return new JsonExceptionResponse(new ControllerException('Identifier needed', 1554125449));
209
        }
210
        $resourceFactory = GeneralUtility::makeInstance(ResourceFactory::class);
211
        $folderIdentifier = dirname($identifier) . '/';
212
        $fileIdentifier = basename($identifier);
213
        try {
214
            $folder = $resourceFactory->retrieveFileOrFolderObject($folderIdentifier);
215
        } catch (ResourceDoesNotExistException $e) {
216
            return new FileExistsResponse(FileExistsResponse::PARENT_FOLDER_DOES_NOT_EXIST);
217
        }
218
        $fileName = $folder->getStorage()->sanitizeFileName($fileIdentifier, $folder);
219
        if ($folder->hasFile($fileName)) {
220
            $file = $resourceFactory->getFileObjectFromCombinedIdentifier($folderIdentifier . $fileName);
221
            // If file is an image or media, create image object, else file object
222
            $fileExtension = strtolower($file->getExtension());
223
            if (GeneralUtility::inList($GLOBALS['TYPO3_CONF_VARS']['GFX']['imagefile_ext'], $fileExtension)
224
                || GeneralUtility::inList($GLOBALS['TYPO3_CONF_VARS']['GFX']['mediafile_ext'], $fileExtension)
225
            ) {
226
                return new JsonResponse([new FolderItemImage($file)]);
227
            }
228
            return new JsonResponse([new FolderItemFile($file)]);
229
        } else {
230
            return new FileExistsResponse(FileExistsResponse::FILE_DOES_NOT_EXIST);
231
        }
232
    }
233
234
    /**
235
     * Return item list (folders, files, images) of a storage:path
236
     * FAL folder identifier. GET request with identifier argument.
237
     *
238
     * @param ServerRequestInterface $request
239
     *
240
     * @return JsonResponse
241
     */
242
    public function getFolderItemsAction(ServerRequestInterface $request): JsonResponse
243
    {
244
        try {
245
            $identifier = $request->getQueryParams()['identifier'] ?? '';
246
            if (empty($identifier)) {
247
                throw new ControllerException('Identifier needed', 1553699828);
248
            }
249
            $resourceFactory = GeneralUtility::makeInstance(ResourceFactory::class);
250
            $folderObject = $resourceFactory->getObjectFromCombinedIdentifier($identifier);
251
            if (!$folderObject instanceof Folder) {
252
                throw new ControllerException('Identifier is not a folder', 1553701684);
253
            }
254
            $subFolders = $folderObject->getSubfolders();
255
            $folders = [];
256
            foreach ($subFolders as $subFolder) {
257
                $folders[] = new FolderItemFolder($subFolder);
258
            }
259
            $allFiles = $folderObject->getFiles();
260
            $files = [];
261
            $images = [];
262
            foreach ($allFiles as $file) {
263
                // If file is an image or media, create image object, else file object
264
                $fileExtension = strtolower($file->getExtension());
265
                if (GeneralUtility::inList($GLOBALS['TYPO3_CONF_VARS']['GFX']['imagefile_ext'], $fileExtension)
266
                    || GeneralUtility::inList($GLOBALS['TYPO3_CONF_VARS']['GFX']['mediafile_ext'], $fileExtension)
267
                ) {
268
                    $images[] = new FolderItemImage($file);
269
                } else {
270
                    $files[] = new FolderItemFile($file);
271
                }
272
            }
273
            return new FolderItemsResponse($folders, $files, $images);
274
        } catch (ResourceException $e) {
275
            return new JsonExceptionResponse($e);
276
        } catch (ControllerException $e) {
277
            return new JsonExceptionResponse($e);
278
        }
279
    }
280
281
    /**
282
     * Returns list of storages (admins), or file mounts (non-admin). Admins
283
     * do NOT receive a list of file mounts, just the storages.
284
     *
285
     * Storages are returned in no particular order, file mounts are ordered
286
     * by 'sorting' DB field.
287
     *
288
     * Return structure is an array of Storage or FileMount objects.
289
     *
290
     * @return JsonResponse
291
     */
292
    public function getStoragesAndMountsAction(): JsonResponse
293
    {
294
        $backendUser = $this->getBackendUser();
295
        $storages = $backendUser->getFileStorages();
296
        $entities = [];
297
        if ($backendUser->isAdmin()) {
298
            foreach ($storages as $storage) {
299
                $entities[] = new Storage($storage);
300
            }
301
        } else {
302
            foreach ($storages as $storage) {
303
                $fileMounts = $storage->getFileMounts();
304
                foreach ($fileMounts as $fileMount) {
305
                    $entities[] = new FileMount($storage, $fileMount);
306
                }
307
            }
308
        }
309
        return new StoragesAndMountsResponse($entities);
310
    }
311
312
    /**
313
     * Returns list of folders only. No files, no images
314
     * Result is sorted by name
315
     *
316
     * Return structure is an array of TreeItemFolder objects.
317
     *
318
     * @param ServerRequestInterface $request
319
     *
320
     * @return JsonResponse
321
     */
322
    public function getTreeFoldersAction(ServerRequestInterface $request): JsonResponse
323
    {
324
        try {
325
            $identifier = $request->getQueryParams()['identifier'] ?? '';
326
            if (empty($identifier)) {
327
                throw new ControllerException('Identifier needed', 1553699828);
328
            }
329
            $resourceFactory = GeneralUtility::makeInstance(ResourceFactory::class);
330
            $folderObject = $resourceFactory->getObjectFromCombinedIdentifier($identifier);
331
            if (!$folderObject instanceof Folder) {
332
                throw new ControllerException('Identifier is not a folder', 1553701684);
333
            }
334
            $subFolders = $folderObject->getSubfolders();
335
            $folders = [];
336
            foreach ($subFolders as $subFolder) {
337
                $folders[] = new TreeItemFolder($subFolder);
338
            }
339
            return new JsonResponse($folders);
340
        } catch (ResourceException $e) {
341
            return new JsonExceptionResponse($e);
342
        } catch (ControllerException $e) {
343
            return new JsonExceptionResponse($e);
344
        }
345
    }
346
347
    /**
348
     * Copy files or folders
349
     * Query parameters
350
     *  'identifiers' array of identifier to copy
351
     *  'targetFolderIdentifier' string the target identifier. Must be a folder.
352
     *  'conflictMode' string one of: "replace", "cancel", "rename", as defined in \TYPO3\CMS\Core\Resource\DuplicationBehavior
353
     *
354
     * @param ServerRequestInterface $request
355
     *
356
     * @return JsonResponse
357
     */
358
    public function copyResourcesAction(ServerRequestInterface $request): JsonResponse
359
    {
360
        try {
361
            $identifiers = $request->getQueryParams()['identifiers'];
362
            $conflictMode = $request->getQueryParams()['conflictMode'] ?? '';
363
            $targetFolderIdentifier = $request->getQueryParams()['targetFolderIdentifier'];
364
            if (empty($identifiers)) {
365
                throw new ControllerException('Identifiers needed', 1553699828);
366
            }
367
            if (empty($conflictMode) || !in_array($conflictMode, ['replace', 'cancel', 'rename'], true)) {
368
                throw new ControllerException('conflictMode must be one of "replace", "cancel", "rename"');
369
            }
370
            if (empty($targetFolderIdentifier)) {
371
                throw new ControllerException(
372
                    'Target folder identifier needed',
373
                    1554122023
374
                );
375
            }
376
            $resourceFactory = GeneralUtility::makeInstance(ResourceFactory::class);
377
            $targetFolderObject = $resourceFactory->getObjectFromCombinedIdentifier($targetFolderIdentifier);
378
            if (!$targetFolderObject instanceof Folder) {
379
                throw new ControllerException('Target identifier is not a folder', 1553701684);
380
            }
381
        } catch (ResourceException $e) {
382
            return new JsonExceptionResponse($e);
383
        } catch (ControllerException $e) {
384
            return new JsonExceptionResponse($e);
385
        }
386
        $resources = [];
387
        foreach ($identifiers as $identifier) {
388
            $state = FileOperationResult::FAILED;
389
            $message = '';
390
            $resultEntity = null;
391
            try {
392
                $sourceObject = $resourceFactory->getObjectFromCombinedIdentifier($identifier);
393
                if ($resultObject = $sourceObject->copyTo($targetFolderObject, null, (string)DuplicationBehavior::cast($conflictMode))) {
394
                    if ($resultObject instanceof Folder) {
395
                        $resultEntity = new FolderItemFolder($resultObject);
396
                    } else {
397
                        $resultEntity = new FolderItemFile($resultObject);
398
                    }
399
                    $state = FileOperationResult::COPIED;
400
                }
401
            } catch (InvalidTargetFolderException $e) {
402
                $message = $e->getMessage();
403
            } catch (ResourceException $e) {
404
                $message = $e->getMessage();
405
            }
406
            $resources[] = new FileOperationResult($identifier, $state, $message, $resultEntity);
407
        }
408
        return new FileOperationResponse($resources);
409
    }
410
411
    /**
412
     * Move files or folders
413
     * Query parameters
414
     *  'identifiers' array of identifier to move
415
     *  'targetFolderIdentifier' string the target identifier. Must be a folder.
416
     *  'conflictMode' string one of: "replace", "cancel", "rename", as defined in \TYPO3\CMS\Core\Resource\DuplicationBehavior
417
     *
418
     * @param ServerRequestInterface $request
419
     *
420
     * @return JsonResponse
421
     */
422
    public function moveResourcesAction(ServerRequestInterface $request): JsonResponse
423
    {
424
        try {
425
            $identifiers = $request->getQueryParams()['identifiers'];
426
            $conflictMode = $request->getQueryParams()['conflictMode'] ?? '';
427
            $targetFolderIdentifier = $request->getQueryParams()['targetFolderIdentifier'];
428
            if (empty($identifiers)) {
429
                throw new ControllerException('Identifiers needed', 1553699828);
430
            }
431
            if (empty($conflictMode) || !in_array($conflictMode, ['replace', 'cancel', 'rename'], true)) {
432
                throw new ControllerException('conflictMode must be one of "replace", "cancel", "rename"');
433
            }
434
            if (empty($targetFolderIdentifier)) {
435
                throw new ControllerException('Target folder identifier needed', 1554122023);
436
            }
437
            $resourceFactory = GeneralUtility::makeInstance(ResourceFactory::class);
438
            $targetFolderObject = $resourceFactory->getObjectFromCombinedIdentifier($targetFolderIdentifier);
439
            if (!$targetFolderObject instanceof Folder) {
440
                throw new ControllerException('Target identifier is not a folder', 1553701684);
441
            }
442
        } catch (ResourceException $e) {
443
            return new JsonExceptionResponse($e);
444
        } catch (ControllerException $e) {
445
            return new JsonExceptionResponse($e);
446
        }
447
        $resources = [];
448
        foreach ($identifiers as $identifier) {
449
            $state = FileOperationResult::FAILED;
450
            $message = '';
451
            $resultEntity = null;
452
            try {
453
                $sourceObject = $resourceFactory->getObjectFromCombinedIdentifier($identifier);
454
                if ($resultObject = $sourceObject->moveTo($targetFolderObject, null, (string)DuplicationBehavior::cast($conflictMode))) {
455
                    if ($resultObject instanceof Folder) {
456
                        $resultEntity = new FolderItemFolder($resultObject);
457
                    } else {
458
                        $resultEntity = new FolderItemFile($resultObject);
459
                    }
460
                    $state = FileOperationResult::MOVED;
461
                }
462
            } catch (InvalidTargetFolderException $e) {
463
                $message = $e->getMessage();
464
            } catch (ResourceException $e) {
465
                $message = $e->getMessage();
466
            }
467
            $resources[] = new FileOperationResult($identifier, $state, $message, $resultEntity);
468
        }
469
        return new FileOperationResponse($resources);
470
    }
471
472
    /**
473
     * rename file or folder
474
     * Query parameters
475
     *  'identifier' string identifier to rename
476
     *  'targetName' string The new name of file or folder.
477
     *  'conflictMode' string one of: "replace", "cancel", "rename"
478
     *
479
     * @param ServerRequestInterface $request
480
     *
481
     * @return JsonResponse
482
     */
483
    public function renameResourcesAction(ServerRequestInterface $request): JsonResponse
484
    {
485
        try {
486
            $identifier = $request->getQueryParams()['identifier'];
487
            $targetName = $request->getQueryParams()['targetName'];
488
            $conflictMode = $request->getQueryParams()['conflictMode'] ?? '';
489
            if (empty($identifier)) {
490
                throw new ControllerException('Identifier needed', 1553699828);
491
            }
492
            if (empty($conflictMode) || !in_array($conflictMode, ['replace', 'cancel', 'rename'], true)) {
493
                throw new ControllerException('conflictMode must be one of "replace", "cancel", "rename"');
494
            }
495
            if (empty($targetName)) {
496
                throw new ControllerException('Target name needed', 1554193259);
497
            }
498
            $resourceFactory = GeneralUtility::makeInstance(ResourceFactory::class);
499
            $fileOrFolder = $resourceFactory->retrieveFileOrFolderObject($identifier);
500
        } catch (ResourceException $e) {
501
            return new JsonExceptionResponse($e);
502
        } catch (ControllerException $e) {
503
            return new JsonExceptionResponse($e);
504
        }
505
        $resources = [];
506
        $state = FileOperationResult::FAILED;
507
        $resultEntity = null;
508
        try {
509
            if ($fileOrFolder === null) {
510
                throw new ResourceException\ResourceDoesNotExistException('Resource does not exist');
511
            } else {
512
                $resultObject = $fileOrFolder->rename($targetName, (string)DuplicationBehavior::cast($conflictMode));
513
                if ($resultObject instanceof Folder) {
514
                    $resultEntity = new FolderItemFolder($resultObject);
515
                    $message = 'Folder was successfully renamed';
516
                } else {
517
                    $resultEntity = new FolderItemFile($resultObject);
518
                    $message = 'File was successfully renamed';
519
                }
520
                $state = FileOperationResult::RENAMED;
521
            }
522
        } catch (ResourceException $e) {
523
            $message = $e->getMessage();
524
        }
525
        $resources[] = new FileOperationResult($identifier, $state, $message, $resultEntity);
526
        return new JsonResponse($resources);
527
    }
528
529
    /**
530
     * delete file or folder
531
     * Query parameters
532
     *  'identifiers' array of strings identifier of file or folder to delete
533
     *
534
     * @param ServerRequestInterface $request
535
     *
536
     * @return JsonResponse
537
     */
538
    public function deleteResourcesAction(ServerRequestInterface $request): JsonResponse
539
    {
540
        try {
541
            $identifiers = $request->getQueryParams()['identifiers'];
542
            if (empty($identifiers)) {
543
                throw new ControllerException('Identifiers needed', 1553699828);
544
            }
545
        } catch (ControllerException $e) {
546
            return new JsonExceptionResponse($e);
547
        }
548
        $resourceFactory = GeneralUtility::makeInstance(ResourceFactory::class);
549
        $resources = [];
550
        foreach ($identifiers as $identifier) {
551
            try {
552
                $sourceObject = $resourceFactory->getObjectFromCombinedIdentifier($identifier);
553
                if ($sourceObject->delete(true)) {
554
                    $state = FileOperationResult::DELETED;
555
                    $message = 'Resource deleted';
556
                } else {
557
                    $state = FileOperationResult::FAILED;
558
                    $message = 'Resource could not be deleted';
559
                }
560
            } catch (ResourceException $e) {
561
                $state = FileOperationResult::FAILED;
562
                $message = $e->getMessage();
563
            }
564
            $resources[] = new FileOperationResult($identifier, $state, $message, null);
565
        }
566
        return new FileOperationResponse($resources);
567
    }
568
569
    /**
570
     * @return BackendUserAuthentication
571
     */
572
    protected function getBackendUser(): BackendUserAuthentication
573
    {
574
        return $GLOBALS['BE_USER'];
575
    }
576
}
577