Passed
Branch master (30ffcd)
by Michael
06:06
created

FilesManagement::createFolder()   A

Complexity

Conditions 6
Paths 6

Size

Total Lines 12
Code Lines 7

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
cc 6
eloc 7
nc 6
nop 1
dl 0
loc 12
rs 9.2222
c 0
b 0
f 0
1
<?php namespace XoopsModules\Xdonations\Common;
2
3
/*
4
 You may not change or alter any portion of this comment or credits
5
 of supporting developers from this source code or any supporting source code
6
 which is considered copyrighted (c) material of the original comment or credit authors.
7
8
 This program is distributed in the hope that it will be useful,
9
 but WITHOUT ANY WARRANTY; without even the implied warranty of
10
 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
11
 */
12
13
/**
14
 * @copyright   XOOPS Project (https://xoops.org)
15
 * @license     http://www.fsf.org/copyleft/gpl.html GNU public license
16
 * @author      mamba <[email protected]>
17
 */
18
trait FilesManagement
19
{
20
    /**
21
     * Function responsible for checking if a directory exists, we can also write in and create an index.html file
22
     *
23
     * @param string $folder The full path of the directory to check
24
     *
25
     * @return void
26
     */
27
    public static function createFolder($folder)
28
    {
29
        try {
30
            if (!file_exists($folder)) {
31
                if (!is_dir($folder) && !mkdir($folder) && !is_dir($folder)) {
32
                    throw new \RuntimeException(sprintf('Unable to create the %s directory', $folder));
33
                }
34
35
                file_put_contents($folder . '/index.html', '<script>history.go(-1);</script>');
36
            }
37
        } catch (\Exception $e) {
38
            echo 'Caught exception: ', $e->getMessage(), "\n", '<br>';
39
        }
40
    }
41
42
    /**
43
     * @param $file
44
     * @param $folder
45
     * @return bool
46
     */
47
    public static function copyFile($file, $folder)
48
    {
49
        return copy($file, $folder);
50
    }
51
52
    /**
53
     * @param $src
54
     * @param $dst
55
     */
56
    public static function recurseCopy($src, $dst)
57
    {
58
        $dir = opendir($src);
59
        //        @mkdir($dst);
60
        if (!@mkdir($dst) && !is_dir($dst)) {
61
            throw new \RuntimeException('The directory ' . $dst . ' could not be created.');
62
        }
63
            while (false !== ($file = readdir($dir))) {
0 ignored issues
show
Bug introduced by
It seems like $dir can also be of type false; however, parameter $dir_handle of readdir() does only seem to accept resource, maybe add an additional type check? ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-type  annotation

63
            while (false !== ($file = readdir(/** @scrutinizer ignore-type */ $dir))) {
Loading history...
64
                if (('.' !== $file) && ('..' !== $file)) {
65
                    if (is_dir($src . '/' . $file)) {
66
                        self::recurseCopy($src . '/' . $file, $dst . '/' . $file);
67
                    } else {
68
                        copy($src . '/' . $file, $dst . '/' . $file);
69
                    }
70
                }
71
            }
72
        closedir($dir);
0 ignored issues
show
Bug introduced by
It seems like $dir can also be of type false; however, parameter $dir_handle of closedir() does only seem to accept resource, maybe add an additional type check? ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-type  annotation

72
        closedir(/** @scrutinizer ignore-type */ $dir);
Loading history...
73
    }
74
75
    /**
76
     *
77
     * Remove files and (sub)directories
78
     *
79
     * @param string $src source directory to delete
80
     *
81
     * @uses \Xmf\Module\Helper::getHelper()
82
     * @uses \Xmf\Module\Helper::isUserAdmin()
83
     *
84
     * @return bool true on success
85
     */
86
    public static function deleteDirectory($src)
87
    {
88
        // Only continue if user is a 'global' Admin
89
        if (!($GLOBALS['xoopsUser'] instanceof \XoopsUser) || !$GLOBALS['xoopsUser']->isAdmin()) {
0 ignored issues
show
Bug introduced by
The type XoopsUser was not found. Maybe you did not declare it correctly or list all dependencies?

The issue could also be caused by a filter entry in the build configuration. If the path has been excluded in your configuration, e.g. excluded_paths: ["lib/*"], you can move it to the dependency path list as follows:

filter:
    dependency_paths: ["lib/*"]

For further information see https://scrutinizer-ci.com/docs/tools/php/php-scrutinizer/#list-dependency-paths

Loading history...
90
            return false;
91
        }
92
93
        $success = true;
94
        // remove old files
95
        $dirInfo = new \SplFileInfo($src);
96
        // validate is a directory
97
        if ($dirInfo->isDir()) {
98
            $fileList = array_diff(scandir($src, SCANDIR_SORT_NONE), ['..', '.']);
99
            foreach ($fileList as $k => $v) {
100
                $fileInfo = new \SplFileInfo("{$src}/{$v}");
101
                if ($fileInfo->isDir()) {
102
                    // recursively handle subdirectories
103
                    if (!$success = self::deleteDirectory($fileInfo->getRealPath())) {
104
                        break;
105
                    }
106
                } else {
107
                    // delete the file
108
                    if (!($success = unlink($fileInfo->getRealPath()))) {
109
                        break;
110
                    }
111
                }
112
            }
113
            // now delete this (sub)directory if all the files are gone
114
            if ($success) {
115
                $success = rmdir($dirInfo->getRealPath());
116
            }
117
        } else {
118
            // input is not a valid directory
119
            $success = false;
120
        }
121
        return $success;
122
    }
123
124
    /**
125
     *
126
     * Recursively remove directory
127
     *
128
     * @todo currently won't remove directories with hidden files, should it?
129
     *
130
     * @param string $src directory to remove (delete)
131
     *
132
     * @return bool true on success
133
     */
134
    public static function rrmdir($src)
135
    {
136
        // Only continue if user is a 'global' Admin
137
        if (!($GLOBALS['xoopsUser'] instanceof \XoopsUser) || !$GLOBALS['xoopsUser']->isAdmin()) {
138
            return false;
139
        }
140
141
        // If source is not a directory stop processing
142
        if (!is_dir($src)) {
143
            return false;
144
        }
145
146
        $success = true;
0 ignored issues
show
Unused Code introduced by
The assignment to $success is dead and can be removed.
Loading history...
147
148
        // Open the source directory to read in files
149
        $iterator = new \DirectoryIterator($src);
150
        foreach ($iterator as $fObj) {
151
            if ($fObj->isFile()) {
152
                $filename = $fObj->getPathname();
153
                $fObj     = null; // clear this iterator object to close the file
0 ignored issues
show
Unused Code introduced by
The assignment to $fObj is dead and can be removed.
Loading history...
154
                if (!unlink($filename)) {
155
                    return false; // couldn't delete the file
156
                }
157
            } elseif (!$fObj->isDot() && $fObj->isDir()) {
158
                // Try recursively on directory
159
                self::rrmdir($fObj->getPathname());
160
            }
161
        }
162
        $iterator = null;   // clear iterator Obj to close file/directory
0 ignored issues
show
Unused Code introduced by
The assignment to $iterator is dead and can be removed.
Loading history...
163
        return rmdir($src); // remove the directory & return results
164
    }
165
166
    /**
167
     * Recursively move files from one directory to another
168
     *
169
     * @param string $src  - Source of files being moved
170
     * @param string $dest - Destination of files being moved
171
     *
172
     * @return bool true on success
173
     */
174
    public static function rmove($src, $dest)
175
    {
176
        // Only continue if user is a 'global' Admin
177
        if (!($GLOBALS['xoopsUser'] instanceof \XoopsUser) || !$GLOBALS['xoopsUser']->isAdmin()) {
178
            return false;
179
        }
180
181
        // If source is not a directory stop processing
182
        if (!is_dir($src)) {
183
            return false;
184
        }
185
186
        // If the destination directory does not exist and could not be created stop processing
187
        if (!is_dir($dest) && !mkdir($dest) && !is_dir($dest)) {
188
            return false;
189
        }
190
191
        // Open the source directory to read in files
192
        $iterator = new \DirectoryIterator($src);
193
        foreach ($iterator as $fObj) {
194
            if ($fObj->isFile()) {
195
                rename($fObj->getPathname(), "{$dest}/" . $fObj->getFilename());
196
            } elseif (!$fObj->isDot() && $fObj->isDir()) {
197
                // Try recursively on directory
198
                self::rmove($fObj->getPathname(), "{$dest}/" . $fObj->getFilename());
199
                //                rmdir($fObj->getPath()); // now delete the directory
200
            }
201
        }
202
        $iterator = null;   // clear iterator Obj to close file/directory
0 ignored issues
show
Unused Code introduced by
The assignment to $iterator is dead and can be removed.
Loading history...
203
        return rmdir($src); // remove the directory & return results
204
    }
205
206
    /**
207
     * Recursively copy directories and files from one directory to another
208
     *
209
     * @param string $src  - Source of files being moved
210
     * @param string $dest - Destination of files being moved
211
     *
212
     * @uses \Xmf\Module\Helper::getHelper()
213
     * @uses \Xmf\Module\Helper::isUserAdmin()
214
     *
215
     * @return bool true on success
216
     */
217
    public static function rcopy($src, $dest)
218
    {
219
        // Only continue if user is a 'global' Admin
220
        if (!($GLOBALS['xoopsUser'] instanceof \XoopsUser) || !$GLOBALS['xoopsUser']->isAdmin()) {
221
            return false;
222
        }
223
224
        // If source is not a directory stop processing
225
        if (!is_dir($src)) {
226
            return false;
227
        }
228
229
        // If the destination directory does not exist and could not be created stop processing
230
        if (!is_dir($dest) && !mkdir($dest) && !is_dir($dest)) {
231
            return false;
232
        }
233
234
        // Open the source directory to read in files
235
        $iterator = new \DirectoryIterator($src);
236
        foreach ($iterator as $fObj) {
237
            if ($fObj->isFile()) {
238
                copy($fObj->getPathname(), "{$dest}/" . $fObj->getFilename());
239
            } elseif (!$fObj->isDot() && $fObj->isDir()) {
240
                self::rcopy($fObj->getPathname(), "{$dest}/" . $fObj->getFilename());
241
            }
242
        }
243
        return true;
244
    }
245
}
246