PluginProbe ʕ •ᴥ•ʔ
Jetpack – WP Security, Backup, Speed, & Growth / 16.1-beta.3
Jetpack – WP Security, Backup, Speed, & Growth v16.1-beta.3
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-uploadedfilesystem.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-uploadedfilesystem.php
193 lines
1 <?php
2
3 namespace WordPress\Filesystem;
4
5 use WordPress\ByteStream\MemoryPipe;
6 use WordPress\ByteStream\ReadStream\ByteReadStream;
7 use WordPress\Filesystem\Layer\ChrootLayer;
8
9 /**
10 * A filesystem implementation that reads from an uploaded directory tree structure.
11 * This is useful for handling file uploads through the REST API where files are
12 * sent as part of a directory tree structure.
13 */
14 class UploadedFilesystem implements Filesystem {
15
16 use Mixin\ReadOnlyFilesystem;
17 use Mixin\GetContentsViaReadStream;
18
19 /**
20 * @var array The directory tree structure
21 */
22 private $tree;
23
24 /**
25 * @var REST_Request The request object containing uploaded files
26 */
27 private $request;
28
29 /**
30 * @var Filesystem The filesystem to read the uploaded files from.
31 */
32 private $uploads_fs;
33
34 /**
35 * Create a new UploadedFilesystem instance.
36 *
37 * @param REST_Request $request The request object containing uploaded files
38 * @param string $tree_parameter_name The name of the parameter containing the tree structure
39 * @param array $options The options array {
40 *
41 * @return UploadedFilesystem The new instance
42 * @var Filesystem $uploads_fs Optional. The filesystem to read the uploaded files from.
43 * }
44 */
45 public static function create( $request, $tree_parameter_name, $options = array() ) {
46 return new ChrootLayer(
47 new UploadedFilesystem( $request, $tree_parameter_name, $options ),
48 '/'
49 );
50 }
51
52 /**
53 * @param REST_Request $request The request object containing uploaded files
54 * @param string $tree_parameter_name The name of the parameter containing the tree structure
55 * @param array $options The options array
56 *
57 * @internal
58 * Use the static create() method instead.
59 */
60 private function __construct( $request, $tree_parameter_name, $options = array() ) {
61 $tree_json = $request->get_param( $tree_parameter_name );
62 if ( ! $tree_json ) {
63 throw new FilesystemException( 'Invalid file tree structure' );
64 }
65
66 $tree = json_decode( $tree_json, true );
67 if ( ! $tree ) {
68 throw new FilesystemException( 'Invalid JSON structure' );
69 }
70
71 if ( ! isset( $tree['type'] ) || 'directory' !== $tree['type'] || ! isset( $tree['name'] ) || '' !== $tree['name'] ) {
72 $tree = array(
73 'type' => 'directory',
74 'name' => '',
75 'children' => $tree,
76 );
77 }
78
79 $this->request = $request;
80 $this->tree = $tree;
81 $this->uploads_fs = $options['uploads_fs'] ?? LocalFilesystem::create( '/' );
82 }
83
84 public function ls( $parent_path = '/' ) {
85 $parent_path = '/' . ltrim( wp_unix_path_resolve_dots( $parent_path ), '/' );
86 $node = $this->find_node( $parent_path );
87 if ( ! $node || 'directory' !== $node['type'] ) {
88 return array();
89 }
90
91 return array_map(
92 function ( $child ) {
93 return $child['name'];
94 },
95 $node['children'] ?? array()
96 );
97 }
98
99 public function is_dir( $path ) {
100 $node = $this->find_node( $path );
101
102 return $node && 'directory' === $node['type'];
103 }
104
105 public function is_file( $path ) {
106 $node = $this->find_node( $path );
107
108 return $node && 'file' === $node['type'];
109 }
110
111 public function exists( $path ) {
112 return null !== $this->find_node( $path );
113 }
114
115 public function mkdir( $path, $options = array() ) {
116 throw new FilesystemException( 'Not implemented' );
117 }
118
119 public function rm( $path ) {
120 throw new FilesystemException( 'Not implemented' );
121 }
122
123 public function rmdir( $path, $options = array() ) {
124 throw new FilesystemException( 'Not implemented' );
125 }
126
127 public function open_read_stream( $path ): ByteReadStream {
128 $node = $this->find_node( $path );
129 if ( ! $node || 'file' !== $node['type'] ) {
130 throw new FilesystemException(
131 sprintf( 'File not found: %s', $path )
132 );
133 }
134
135 // Handle file content from request.
136 if ( ! isset( $node['content'] ) || ! is_string( $node['content'] ) ) {
137 $node['content'] = '';
138 }
139
140 if ( 0 === strpos( $node['content'], '@file:' ) ) {
141 $file_key = substr( $node['content'], 6 );
142 $uploaded_file = $this->request->get_file_params()[ $file_key ] ?? null;
143
144 if ( ! $uploaded_file || UPLOAD_ERR_OK !== $uploaded_file['error'] ) {
145 throw new FilesystemException(
146 sprintf( 'File upload error: %s', $uploaded_file['error'] )
147 );
148 }
149
150 return $this->uploads_fs->open_read_stream( $uploaded_file['tmp_name'] );
151 }
152
153 // Handle inline content.
154 return new MemoryPipe( $node['content'] );
155 }
156
157 /**
158 * Find a node in the tree by its path
159 *
160 * @param string $path The path to find
161 *
162 * @return array|null The node if found, null otherwise
163 */
164 private function find_node( $path ) {
165 $path = trim( $path, '/' );
166 if ( '' === $path ) {
167 return $this->tree;
168 }
169
170 $parts = explode( '/', $path );
171 $current = $this->tree;
172 foreach ( $parts as $part ) {
173 $found = false;
174 foreach ( $current['children'] as $node ) {
175 if ( $node['name'] === $part ) {
176 $found = true;
177 $current = $node;
178 break;
179 }
180 }
181 if ( ! $found ) {
182 return null;
183 }
184 }
185
186 return $current;
187 }
188
189 public function get_meta(): array {
190 return array();
191 }
192 }
193