/
FilterImportedResources.php
93 lines (85 loc) · 3.54 KB
/
FilterImportedResources.php
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
<?php
namespace LimeSurvey\Models\Services;
class FilterImportedResources
{
//todo: make a good service class ... (constructor, dependency injection etc.)
/**
* @param string $extractdir
* @param string $destdir
* @return array
*/
public function filterImportedResources($extractdir, $destdir)
{
$aErrorFilesInfo = [];
$aImportedFilesInfo = [];
if (!is_dir($extractdir)) {
return [[], []];
}
$directory = opendir($extractdir);
if (!$directory) {
$aErrorFilesInfo[] = [
"filename" => '',
"status" => gT("Extracted files not found - maybe a permission problem?")
];
return [$aImportedFilesInfo, $aErrorFilesInfo];
}
return $this->copyDirectory($directory, $extractdir, $destdir);
}
/**
* Copy $directory to $destdir and return [$aImportedFilesInfo, $aErrorFilesInfo]
* @param resource $directory
* @param string $extractdir
* @param string $destdir
*
* @return array An array of failed and imported files/directories
*/
private function copyDirectory($directory, $extractdir, $destdir): array
{
$aImportedFilesInfo = [];
$aErrorFilesInfo = [];
if (!is_dir($destdir) && !mkdir($destdir) && !is_dir($destdir)) {
$aErrorFilesInfo[] = [
"filename" => $destdir,
"status" => gT("Could not create directory")
];
}
while ($direntry = readdir($directory)) {
if ($direntry !== "." && $direntry !== "..") {
if (is_file($extractdir . "/" . $direntry)) {
// is a file
$extfile = (string)substr(strrchr($direntry, '.'), 1);
if (!(stripos(',' . \Yii::app()->getConfig('allowedresourcesuploads') . ',', ',' . $extfile . ',') === false)) {
// Extension allowed
if (!copy($extractdir . "/" . $direntry, $destdir . "/" . $direntry)) {
$aErrorFilesInfo[] = [
"filename" => $direntry,
"status" => gT("Copy failed")
];
} else {
$aImportedFilesInfo[] = [
"filename" => $direntry,
"status" => gT("OK")
];
}
} else {
// Extension forbidden
$aErrorFilesInfo[] = [
"filename" => $direntry,
"status" => gT("Forbidden Extension")
];
}
unlink($extractdir . "/" . $direntry);
}
if (is_dir($extractdir . "/" . $direntry)) {
$subDirectory = opendir($extractdir . "/" . $direntry);
$subExtractdir = $extractdir . "/" . $direntry;
$subDestdir = $destdir . "/" . $direntry;
list($aSubImportedFilesInfo, $aSubErrorFilesInfo) = $this->copyDirectory($subDirectory, $subExtractdir, $subDestdir);
$aImportedFilesInfo = array_merge($aImportedFilesInfo, $aSubImportedFilesInfo);
$aErrorFilesInfo = array_merge($aErrorFilesInfo, $aSubErrorFilesInfo);
}
}
}
return [$aImportedFilesInfo, $aErrorFilesInfo];
}
}