* Removes the temporary chunk directory for resumable uploads. * * The folder name is expected to exactly match the "resumable_" pattern. * * @param string $folder The folder name provided (URL-decoded). * @return array Returns a status array indicating success or error. */
(string $folder)
| 1522 | * @return array Returns a status array indicating success or error. |
| 1523 | */ |
| 1524 | public static function removeChunks(string $folder): array |
| 1525 | { |
| 1526 | $folder = urldecode($folder); |
| 1527 | if (strpos($folder, 'resumable_') === 0) { |
| 1528 | $folder = substr($folder, strlen('resumable_')); |
| 1529 | } |
| 1530 | |
| 1531 | $tempFolderName = self::resumableTempFolderName($folder); |
| 1532 | if ($tempFolderName === null) { |
| 1533 | return ['error' => 'Invalid resumable identifier']; |
| 1534 | } |
| 1535 | |
| 1536 | $isLocal = self::isLocalSourceType(); |
| 1537 | $targetFolder = self::sanitizeFolder((string)($_POST['targetFolder'] ?? 'root')); |
| 1538 | $baseDir = self::stagingRoot($isLocal); |
| 1539 | if ($targetFolder !== '') { |
| 1540 | $baseDir = rtrim($baseDir, '/\\') . DIRECTORY_SEPARATOR |
| 1541 | . str_replace('/', DIRECTORY_SEPARATOR, $targetFolder) . DIRECTORY_SEPARATOR; |
| 1542 | } |
| 1543 | $tempDir = rtrim($baseDir, '/\\') . DIRECTORY_SEPARATOR . $tempFolderName; |
| 1544 | $hadDir = is_dir($tempDir); |
| 1545 | if ($hadDir) { |
| 1546 | if (!self::isPathWithinRoot($tempDir, $baseDir)) { |
| 1547 | return ['error' => 'Invalid temporary folder']; |
| 1548 | } |
| 1549 | self::rrmdir($tempDir); |
| 1550 | } |
| 1551 | if (is_dir($tempDir)) { |
| 1552 | return ['error' => 'Failed to remove temporary folder.']; |
| 1553 | } |
| 1554 | |
| 1555 | $hasRemaining = self::cleanupResumableTempDirs($targetFolder, $isLocal, false); |
| 1556 | if (!$hasRemaining) { |
| 1557 | $data = self::loadResumableIndex(); |
| 1558 | $folderKey = self::resumableFolderKey($targetFolder); |
| 1559 | if (isset($data['folders'][$folderKey])) { |
| 1560 | unset($data['folders'][$folderKey]); |
| 1561 | self::saveResumableIndex($data); |
| 1562 | } |
| 1563 | } |
| 1564 | |
| 1565 | return [ |
| 1566 | 'success' => true, |
| 1567 | 'message' => $hadDir ? 'Temporary folder removed.' : 'Temporary folder already removed.', |
| 1568 | ]; |
| 1569 | } |
| 1570 | |
| 1571 | /** |
| 1572 | * Force-clean any resumable_* temp folders for a target folder. |
no test coverage detected