PluginProbe ʕ •ᴥ•ʔ
Jetpack – WP Security, Backup, Speed, & Growth / 16.1-beta
Jetpack – WP Security, Backup, Speed, & Growth v16.1-beta
16.1-beta 16.1-beta.2 16.1-beta.3 16.1-a.5 16.1-a.3 16.0.1 16.1-a.1 16.0 16.0-beta 16.0-a.7 16.0-a.5 15.9.1 16.0-a.3 16.0-a.1 15.9 15.9-beta 15.9-a.7 15.9-a.5 15.9-a.3 15.9-a.1 15.8 15.8-beta 15.8-a.7 15.8-a.5 5.2.5 5.3.4 5.4.4 5.5.5 5.6.5 5.7.5 5.8.4 5.9.4 6.0.4 6.1 6.1.1 6.1.2 6.1.3 6.1.4 6.1.5 6.2 6.2.1 6.2.2 6.2.3 6.2.4 6.2.5 6.3 6.3.1 6.3.2 6.3.3 6.3.4 6.3.5 6.3.6 6.3.7 6.4 6.4.1 6.4.2 6.4.3 6.4.4 6.4.5 6.4.6 6.5 6.5.1 6.5.2 6.5.3 6.5.4 6.6 6.6.1 6.6.2 6.6.3 6.6.4 6.6.5 6.7 6.7.1 6.7.2 6.7.3 6.7.4 6.8 6.8.1 6.8.2 6.8.3 6.8.4 6.8.5 6.9 6.9.1 6.9.2 6.9.3 6.9.4 7.0 7.0.1 7.0.2 7.0.3 7.0.4 7.0.5 7.1 7.1.1 7.1.2 7.1.3 7.1.4 7.1.5 7.2 7.2.1 7.2.1.1 7.2.2 7.2.3 7.2.4 7.2.5 7.3 7.3.0.1 7.3.1 7.3.1.1 7.3.2 7.3.3 7.3.4 7.3.5 7.4 7.4.1 7.4.2 7.4.3 7.4.4 7.4.5 7.5 7.5.0.1 7.5.1 7.5.2 7.5.3 7.5.4 7.5.5 7.5.6 7.5.7 7.6 7.6.1 7.6.2 7.6.3 7.6.4 7.7 7.7.1 7.7.2 7.7.3 7.7.4 7.7.5 7.7.6 7.8 7.8.1 7.8.2 7.8.3 7.8.4 7.9 7.9.1 7.9.2 7.9.3 7.9.4 8.0 8.0.1 8.0.2 8.0.3 8.1 8.1.1 8.1.2 8.1.3 8.1.4 8.2 8.2.0.1 8.2.1 8.2.2 8.2.3 8.2.4 8.2.5 8.2.6 8.3 8.3.1 8.3.2 8.3.3 8.4 8.4.1 8.4.2 8.4.3 8.4.4 8.4.5 8.5 8.5.1 8.5.2 8.5.3 8.6 8.6.1 8.6.2 8.6.3 8.6.4 8.7 8.7.0.1 8.7.1 8.7.2 8.7.3 8.7.4 8.8 8.8.1 8.8.2 8.8.3 8.8.4 8.8.5 8.9 8.9.1 8.9.2 8.9.3 8.9.4 9.0 9.0.1 9.0.2 9.0.3 9.0.4 9.0.5 9.1 9.1.1 9.1.2 9.1.3 9.2 9.2.1 9.2.2 9.2.3 9.2.4 9.3 9.3.1 9.3.2 9.3.3 9.3.4 9.3.5 9.4 9.4.1 9.4.2 9.4.3 9.4.4 9.5 9.5.1 9.5.2 9.5.3 9.5.4 9.5.5 9.6 9.6.1 9.6.2 9.6.3 9.6.4 9.7 9.7.1 9.7.2 15.7-beta.2 9.7.3 15.7.1 9.8 15.8-a.1 9.8.1 15.8-a.3 9.8.2 2.0.9 9.8.3 2.1.7 9.9 2.2.10 9.9.1 2.3.10 9.9.2 2.4.7 9.9.3 2.5.5 2.6.6 2.7.5 2.8.5 2.9.6 3.0.6 3.1.5 3.2.5 3.3.6 3.4.6 3.5.6 3.6.4 3.7.5 3.8.5 3.9.10 4.0.7 4.1.4 4.2.5 4.3.5 4.4.5 4.5.3 4.6.3 4.7.4 4.8.5 4.9.3 5.0.3 5.1.4 trunk 10.0 10.0.1 10.0.2 10.1 10.1.1 10.1.2 10.2 10.2.1 10.2.2 10.2.3 10.3 10.3.1 10.3.2 10.4 10.4.1 10.4.2 10.5 10.5.1 10.5.2 10.5.3 10.6 10.6.1 10.6.2 10.7 10.7.1 10.7.2 10.8 10.8.1 10.8.2 10.9 10.9.1 10.9.2 10.9.3 11.0 11.0.1 11.0.2 11.1 11.1.1 11.1.2 11.1.3 11.1.4 11.2 11.2.1 11.2.2 11.3 11.3.1 11.3.2 11.3.3 11.3.4 11.4 11.4.1 11.4.2 11.5 11.5.1 11.5.2 11.5.3 11.6 11.6.1 11.6.2 11.7 11.7.1 11.7.2 11.7.3 11.8 11.8.3 11.8.4 11.8.5 11.8.6 11.9 11.9.1 11.9.2 11.9.3 12.0 12.0.1 12.0.2 12.1 12.1.1 12.1.2 12.2 12.2.1 12.2.2 12.3 12.3.1 12.4 12.4.1 12.5 12.5.1 12.6 12.6.1 12.6.2 12.6.3 12.7 12.7.1 12.7.2 12.8 12.8.1 12.8.2 12.9 12.9.1 12.9.2 12.9.3 12.9.4 13.0 13.0.1 13.1 13.1.1 13.1.2 13.1.3 13.1.4 13.2 13.2.1 13.2.2 13.2.3 13.3 13.3.1 13.3.2 13.4 13.4.1 13.4.2 13.4.3 13.4.4 13.5 13.5.1 13.6 13.6.1 13.7 13.7.1 13.8 13.8.1 13.8.2 13.9 13.9.1 14.0 14.1 14.2 14.2.1 14.3 14.4 14.4.1 14.5 14.6 14.7 14.8 14.9 14.9.1 15.0 15.0.1 15.0.2 15.1 15.1.1 15.2 15.3 15.3.1 15.4 15.5 15.6 15.7 15.7-a.1 15.7-a.3 15.7-a.5 15.7-a.7 15.7-beta
jetpack / vendor / wp-php-toolkit / filesystem / class-localfilesystem.php
jetpack / vendor / wp-php-toolkit / filesystem Last commit date
ByteStream 6 days ago Layer 6 days ago Mixin 6 days ago Path 6 days ago Visitor 6 days ago LICENSE.md 6 days ago README.md 6 days ago class-filesystemexception.php 6 days ago class-inmemoryfilesystem.php 6 days ago class-localfilesystem.php 6 days ago class-sqlitefilesystem.php 6 days ago class-uploadedfilesystem.php 6 days ago composer.json 6 days ago functions.php 6 days ago interface-filesystem.php 6 days ago
class-localfilesystem.php
198 lines
1 <?php
2
3 namespace WordPress\Filesystem;
4
5 use WordPress\ByteStream\ReadStream\ByteReadStream;
6 use WordPress\ByteStream\ReadStream\FileReadStream;
7 use WordPress\ByteStream\WriteStream\ByteWriteStream;
8 use WordPress\ByteStream\WriteStream\FileWriteStream;
9 use WordPress\Filesystem\Layer\ChrootLayer;
10
11 /**
12 * Represents the currently available filesystem.
13 */
14 class LocalFilesystem implements Filesystem {
15
16 use Mixin\PutContentsViaWriteStream;
17 use Mixin\GetContentsViaReadStream;
18 use Mixin\RmdirRecursive;
19 use Mixin\MkdirRecursive;
20 use Mixin\CopyDirectoryRecursive;
21
22 private $root;
23
24 public static function create( $root = null ) {
25 // Make sure the root path uses forward slashes on Windows.
26 // This allows us to use all wp_unix_* functions across the board.
27 if ( null === $root ) {
28 if ( 'WIN' === strtoupper( substr( PHP_OS, 0, 3 ) ) ) {
29 $system_drive = getenv( 'SystemDrive' );
30 $root = $system_drive ? $system_drive . '\\' : 'C:\\';
31 } else {
32 $root = '/';
33 }
34 } elseif ( 'WIN' === strtoupper( substr( PHP_OS, 0, 3 ) ) ) {
35 $root = self::normalize_path( $root );
36 }
37
38 if ( ! is_dir( $root ) ) {
39 if ( false === mkdir( $root, 0755, true ) ) {
40 throw new FilesystemException( sprintf( 'Root directory did not exist and could not be created: %s', var_export( $root, true ) ) );
41 }
42 }
43
44 return new ChrootLayer(
45 new LocalFilesystem( $root ),
46 $root
47 );
48 }
49
50 /**
51 * Use LocalFilesystem::create() to ensure the correct filesystem layers are applied.
52 */
53 private function __construct( $root ) {
54 $this->root = $root;
55 }
56
57 /**
58 * For mkdir_recursive().
59 */
60 public function get_root(): string {
61 return $this->root;
62 }
63
64 public function get_meta(): array {
65 return array(
66 'root' => $this->root,
67 );
68 }
69
70 public function ls( $path = '/' ) {
71 $dh = @opendir( $path );
72 if ( false === $dh ) {
73 throw new FilesystemException(
74 sprintf( 'Failed to open directory: %s', $path )
75 );
76 }
77
78 $children = array();
79 while ( true ) {
80 $filename = readdir( $dh );
81 if ( false === $filename ) {
82 break;
83 }
84 if ( '.' === $filename || '..' === $filename ) {
85 continue;
86 }
87 $children[] = $filename;
88 }
89 closedir( $dh );
90
91 return $children;
92 }
93
94 public function is_dir( $path ) {
95 return is_dir( $path );
96 }
97
98 public function is_file( $path ) {
99 return is_file( $path );
100 }
101
102 public function exists( $path ) {
103 return file_exists( $path );
104 }
105
106 public function rename( $old_path, $new_path, $options = array() ) {
107 if ( false === @rename( $old_path, $new_path ) ) {
108 throw new FilesystemException(
109 sprintf( 'Failed to rename: %s to %s', $old_path, $new_path )
110 );
111 }
112
113 return true;
114 }
115
116 public function copy_file( $from_path, $to_path, $options ) {
117 // phpcs:ignore WordPress.PHP.NoSilencedErrors.Discouraged
118 if ( false === @copy( $from_path, $to_path ) ) {
119 throw new FilesystemException(
120 sprintf( 'Failed to copy file: %s to %s', $from_path, $to_path )
121 );
122 }
123 }
124
125 protected function mkdir_single( $path, $options = array() ) {
126 $resolved_path = $this->normalize_path( $path );
127 if ( $this->exists( $path ) ) {
128 throw new FilesystemException(
129 sprintf( 'Path already exists: %s', $path )
130 );
131 }
132 if ( false === @mkdir( $resolved_path ) ) {
133 throw new FilesystemException(
134 sprintf( 'Failed to create directory: %s', $resolved_path )
135 );
136 }
137 if ( isset( $options['chmod'] ) ) {
138 // phpcs:ignore WordPress.PHP.NoSilencedErrors.Discouraged
139 if ( false === @chmod( $path, $options['chmod'] ) ) {
140 throw new FilesystemException(
141 sprintf( 'Failed to chmod directory: %s', $path )
142 );
143 }
144 }
145 }
146
147 public function rm( $path ) {
148 if ( false === @unlink( $path ) ) {
149 throw new FilesystemException(
150 sprintf( 'Failed to remove file: %s', $path )
151 );
152 }
153 }
154
155 protected function rmdir_single( $path, $options = array() ) {
156 if ( false === @rmdir( $path ) ) {
157 throw new FilesystemException(
158 sprintf( 'Failed to remove directory: %s', $path )
159 );
160 }
161 }
162
163 public function put_contents( $path, $data, $options = array() ) {
164 // phpcs:ignore WordPress.PHP.NoSilencedErrors.Discouraged
165 if ( false === @file_put_contents(
166 $path,
167 $data
168 ) ) {
169 throw new FilesystemException(
170 sprintf( 'Failed to write to file: %s', $path )
171 );
172 }
173 }
174
175 public function open_write_stream( $path ): ByteWriteStream {
176 return FileWriteStream::from_path( $path, 'truncate' );
177 }
178
179 public function open_read_stream( $path ): ByteReadStream {
180 return FileReadStream::from_path( $path );
181 }
182
183 /**
184 * Turns a linux path into an OS-specific path.
185 *
186 * This is necessary because Filesystem-related classes use
187 * forward slashes to separate paths. They must. LocalFilesystem
188 * is just one of the available Filesystem implementations.
189 *
190 * Therefore, the problem of converting forward slashes to
191 * OS-specific path separators is specific to the LocalFilesystem
192 * class
193 */
194 private static function normalize_path( $path ) {
195 return str_replace( DIRECTORY_SEPARATOR, '/', $path );
196 }
197 }
198