Skip to content

Commit 6e821e2

Browse files
committed
This allows File Manager to Delete and rename directories. Viewing the contents of sub direcotries is not supported
Closes #1988 (or at least the parts aligned in the Developer meeting)
1 parent ead7df0 commit 6e821e2

File tree

4 files changed

+173
-131
lines changed

4 files changed

+173
-131
lines changed

www/api/controllers/files.php

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -729,6 +729,23 @@ function ZipDirectory($zip, $name, $directory)
729729
}
730730
}
731731

732+
function removeDir(string $dir): void
733+
{
734+
$it = new RecursiveDirectoryIterator($dir, RecursiveDirectoryIterator::SKIP_DOTS);
735+
$files = new RecursiveIteratorIterator(
736+
$it,
737+
RecursiveIteratorIterator::CHILD_FIRST
738+
);
739+
foreach ($files as $file) {
740+
if ($file->isDir()) {
741+
rmdir($file->getPathname());
742+
} else {
743+
unlink($file->getPathname());
744+
}
745+
}
746+
rmdir($dir);
747+
}
748+
732749
function DeleteFile()
733750
{
734751
$status = "File not found";
@@ -745,6 +762,9 @@ function DeleteFile()
745762
$status = "Invalid path: directory traversal detected or file outside allowed directory";
746763
} else if (!file_exists($fullPath)) {
747764
$status = "File Not Found";
765+
} else if (is_dir($fullPath)) {
766+
removeDir($fullPath);
767+
$status = "OK";
748768
} else {
749769
if (unlink($fullPath)) {
750770
$status = "OK";

www/filemanager.php

Lines changed: 56 additions & 45 deletions
Original file line numberDiff line numberDiff line change
@@ -232,22 +232,24 @@ class='badge text-bg-secondary'>0</span></div>
232232
value="Clear" />
233233
<?php if (isset($settings['fppMode']) && ($settings['fppMode'] == 'player')) { ?>
234234
<input onclick="ButtonHandler('Sequences', 'play');"
235-
class="disableButtons singleSequencesButton" type="button" value="Play" />
235+
class="disableButtons noDirButton singleSequencesButton" type="button"
236+
value="Play" />
236237
<input onclick="ButtonHandler('Sequences', 'playHere');"
237-
class="disableButtons singleSequencesButton" type="button"
238+
class="disableButtons noDirButton singleSequencesButton" type="button"
238239
value="Play Here" />
239240
<?php } ?>
240241
<input onclick="ButtonHandler('Sequences', 'sequenceInfo');"
241-
class="disableButtons singleSequencesButton" type="button"
242+
class="disableButtons noDirButton singleSequencesButton" type="button"
242243
value="Sequence Info" />
243244
<input onclick="ButtonHandler('Sequences', 'addToPlaylist');"
244-
class="disableButtons singleSequencesButton multiSequencesButton"
245+
class="disableButtons noDirButton singleSequencesButton multiSequencesButton"
245246
type="button" value="Add To Playlist" />
246247
<input onclick="ButtonHandler('Sequences', 'download');"
247-
class="disableButtons singleSequencesButton multiSequencesButton"
248+
class="disableButtons noDirButton singleSequencesButton multiSequencesButton"
248249
type="button" value="Download" />
249250
<input onclick="ButtonHandler('Sequences', 'rename');"
250-
class="disableButtons singleSequencesButton" type="button" value="Rename" />
251+
class="disableButtons noDirButton singleSequencesButton" type="button"
252+
value="Rename" />
251253
<input onclick="ButtonHandler('Sequences', 'delete');"
252254
class="disableButtons singleSequencesButton multiSequencesButton"
253255
type="button" value="Delete" />
@@ -294,20 +296,21 @@ class='badge text-bg-secondary'>0</span></div>
294296
<input onclick="ClearSelections('Music');" class="buttons" type="button"
295297
value="Clear" />
296298
<input onclick="ButtonHandler('Music', 'playInBrowser');"
297-
id="btnPlayMusicInBrowser" class="disableButtons singleMusicButton"
298-
type="button" value="Listen" />
299+
id="btnPlayMusicInBrowser"
300+
class="disableButtons noDirButton singleMusicButton" type="button"
301+
value="Listen" />
299302
<? if (file_exists("/bin/mp3gain") || file_exists("/usr/bin/mp3gain") || file_exists("/opt/homebrew/bin/mp3gain") || file_exists("/usr/local/bin/mp3gain")) { ?>
300303
<input onclick="ButtonHandler('Music', 'mp3gain');" id="btnPlayMusicInBrowser"
301-
class="disableButtons singleMusicButton multiMusicButton" type="button"
302-
value="MP3Gain" />
304+
class="disableButtons noDirButton singleMusicButton multiMusicButton"
305+
type="button" value="MP3Gain" />
303306
<? } ?>
304307

305308
<input onclick="ButtonHandler('Music', 'addToPlaylist');"
306-
class="disableButtons singleMusicButton multiMusicButton" type="button"
307-
value="Add To Playlist" />
309+
class="disableButtons noDirButton singleMusicButton multiMusicButton"
310+
type="button" value="Add To Playlist" />
308311
<input onclick="ButtonHandler('Music', 'download');" id="btnDownloadMusic"
309-
class="disableButtons singleMusicButton multiMusicButton" type="button"
310-
value="Download" />
312+
class="disableButtons noDirButton singleMusicButton multiMusicButton"
313+
type="button" value="Download" />
311314
<input onclick="ButtonHandler('Music', 'rename');" id="btnRenameMusic"
312315
class="disableButtons singleMusicButton" type="button" value="Rename" />
313316
<input onclick="ButtonHandler('Music', 'delete');" id="btnDeleteMusic"
@@ -356,16 +359,16 @@ class='badge text-bg-secondary'>0</span></div>
356359
<input onclick=" ClearSelections('Videos');" class="buttons" type="button"
357360
value="Clear" />
358361
<input onclick="ButtonHandler('Videos', 'playInBrowser');"
359-
class="disableButtons singleVideosButton" type="button"
360-
value="View" />
362+
class="disableButtons noDirButton singleVideosButton"
363+
type="button" value="View" />
361364
<input onclick="ButtonHandler('Videos', 'videoInfo');"
362-
class="disableButtons singleVideosButton" type="button"
363-
value="Video Info" />
365+
class="disableButtons noDirButton singleVideosButton"
366+
type="button" value="Video Info" />
364367
<input onclick="ButtonHandler('Videos', 'addToPlaylist');"
365-
class="disableButtons singleMusicButton multiMusicButton"
368+
class="disableButtons noDirButton singleMusicButton multiMusicButton"
366369
type="button" value="Add To Playlist" />
367370
<input onclick="ButtonHandler('Videos', 'download');"
368-
class="disableButtons singleVideosButton multiVideosButton"
371+
class="disableButtons noDirButton singleVideosButton multiVideosButton"
369372
type="button" value="Download" />
370373
<input onclick="ButtonHandler('Videos', 'rename');"
371374
class="disableButtons singleVideosButton" type="button"
@@ -419,10 +422,11 @@ class='badge text-bg-secondary'>0</span></div>
419422
<input onclick="ClearSelections('Images');" class="buttons" type="button"
420423
value="Clear" />
421424
<input onclick="ButtonHandler('Images', 'viewImage');"
422-
class="disableButtons singleImagesButton" type="button" value="View" />
425+
class="disableButtons noDirButton singleImagesButton" type="button"
426+
value="View" />
423427
<input onclick="ButtonHandler('Images', 'download');"
424-
class="disableButtons singleImagesButton multiImagesButton" type="button"
425-
value="Download" />
428+
class="disableButtons noDirButton singleImagesButton multiImagesButton"
429+
type="button" value="Download" />
426430
<input onclick="ButtonHandler('Images', 'rename');"
427431
class="disableButtons singleImagesButton" type="button" value="Rename" />
428432
<input onclick="ButtonHandler('Images', 'delete');"
@@ -472,11 +476,11 @@ class='badge text-bg-secondary'>0</span></div>
472476
<input onclick="ClearSelections('Effects');" class="buttons" type="button"
473477
value="Clear" />
474478
<input onclick="ButtonHandler('Effects', 'sequenceInfo');"
475-
class="disableButtons singleEffectsButton" type="button"
479+
class="disableButtons noDirButton singleEffectsButton" type="button"
476480
value="Sequence Info" />
477481
<input onclick="ButtonHandler('Effects', 'download');"
478-
class="disableButtons singleEffectsButton multiEffectsButton" type="button"
479-
value="Download" />
482+
class="disableButtons noDirButton singleEffectsButton multiEffectsButton"
483+
type="button" value="Download" />
480484
<input onclick="ButtonHandler('Effects', 'rename');"
481485
class="disableButtons singleEffectsButton" type="button" value="Rename" />
482486
<input onclick="ButtonHandler('Effects', 'delete');"
@@ -525,19 +529,23 @@ class='badge text-bg-secondary'>0</span></div>
525529
<input onclick="ClearSelections('Scripts');" class="buttons" type="button"
526530
value="Clear" />
527531
<input onclick="ButtonHandler('Scripts', 'viewFile');"
528-
class="disableButtons singleScriptsButton" type="button" value="View" />
532+
class="disableButtons noDirButton singleScriptsButton" type="button"
533+
value="View" />
529534
<input onclick="ButtonHandler('Scripts', 'runScript');"
530-
class="disableButtons singleScriptsButton" type="button" value="Run" />
535+
class="disableButtons noDirButton singleScriptsButton" type="button"
536+
value="Run" />
531537
<input onclick="ButtonHandler('Scripts', 'editScript');"
532-
class="disableButtons singleScriptsButton" type="button" value="Edit" />
538+
class="disableButtons noDirButton singleScriptsButton" type="button"
539+
value="Edit" />
533540
<input onclick="ButtonHandler('Scripts', 'addToPlaylist');"
534-
class="disableButtons singleScriptsButton multiScriptsButton" type="button"
535-
value="Add To Playlist" />
541+
class="disableButtons noDirButton singleScriptsButton multiScriptsButton"
542+
type="button" value="Add To Playlist" />
536543
<input onclick="ButtonHandler('Scripts', 'download');"
537-
class="disableButtons singleScriptsButton multiScriptsButton" type="button"
538-
value="Download" />
544+
class="disableButtons noDirButton singleScriptsButton multiScriptsButton"
545+
type="button" value="Download" />
539546
<input onclick="ButtonHandler('Scripts', 'copyFile');"
540-
class="disableButtons singleScriptsButton" type="button" value="Copy" />
547+
class="disableButtons noDirButton singleScriptsButton" type="button"
548+
value="Copy" />
541549
<input onclick="ButtonHandler('Scripts', 'rename');"
542550
class="disableButtons singleScriptsButton" type="button" value="Rename" />
543551
<input onclick="ButtonHandler('Scripts', 'delete');"
@@ -590,12 +598,14 @@ class='badge text-bg-secondary'>0</span></div>
590598
<input onclick="DownloadZip('Logs');" class="buttons" type="button"
591599
value="Zip" />
592600
<input onclick="ButtonHandler('Logs', 'viewFile');"
593-
class="disableButtons singleLogsButton" type="button" value="View" />
601+
class="disableButtons noDirButton singleLogsButton" type="button"
602+
value="View" />
594603
<input onclick="ButtonHandler('Logs', 'tailFile');"
595-
class="disableButtons singleLogsButton" type="button" value="Tail" />
604+
class="disableButtons noDirButton singleLogsButton" type="button"
605+
value="Tail" />
596606
<input onclick="ButtonHandler('Logs', 'download');"
597-
class="disableButtons singleLogsButton multiLogsButton" type="button"
598-
value="Download" />
607+
class="disableButtons noDirButton singleLogsButton multiLogsButton"
608+
type="button" value="Download" />
599609
<input onclick="ButtonHandler('Logs', 'delete');"
600610
class="disableButtons singleLogsButton multiLogsButton" type="button"
601611
value="Delete" />
@@ -640,10 +650,11 @@ class='badge text-bg-secondary'>0</span></div>
640650
<input onclick="ClearSelections('Uploads');" class="buttons" type="button"
641651
value="Clear" />
642652
<input onclick="ButtonHandler('Uploads', 'download');"
643-
class="disableButtons singleUploadsButton multiUploadsButton" type="button"
644-
value="Download" />
653+
class="disableButtons noDirButton singleUploadsButton multiUploadsButton"
654+
type="button" value="Download" />
645655
<input onclick="ButtonHandler('Uploads', 'copyFile');"
646-
class="disableButtons singleUploadsButton" type="button" value="Copy" />
656+
class="disableButtons noDirButton singleUploadsButton" type="button"
657+
value="Copy" />
647658
<input onclick="ButtonHandler('Uploads', 'rename');"
648659
class="disableButtons singleUploadsButton" type="button" value="Rename" />
649660
<input onclick="ButtonHandler('Uploads', 'delete');"
@@ -689,8 +700,8 @@ class='badge text-bg-secondary'>0</span></div>
689700
<input onclick="ClearSelections('Crashes');" class="buttons" type="button"
690701
value="Clear" />
691702
<input onclick="ButtonHandler('Crashes', 'download');"
692-
class="disableButtons singleCrashesButton multiCrashesButton" type="button"
693-
value="Download" />
703+
class="disableButtons noDirButton singleCrashesButton multiCrashesButton"
704+
type="button" value="Download" />
694705
<input onclick="ButtonHandler('Crashes', 'delete');"
695706
class="disableButtons singleCrashesButton multiCrashesButton" type="button"
696707
value="Delete" />
@@ -740,8 +751,8 @@ class='badge text-bg-secondary'>0</span></div>
740751
<input onclick="ClearSelections('Backups');" class="buttons" type="button"
741752
value="Clear" />
742753
<input onclick="ButtonHandler('Backups', 'download');"
743-
class="disableButtons singleBackupsButton multiBackupsButton" type="button"
744-
value="Download" />
754+
class="disableButtons noDirButton singleBackupsButton multiBackupsButton"
755+
type="button" value="Download" />
745756
<input onclick="ButtonHandler('Backups', 'delete');"
746757
class="disableButtons singleBackupsButton multiBackupsButton" type="button"
747758
value="Delete" />

0 commit comments

Comments
 (0)