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
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
|
<?php
namespace Drupal\Core\StreamWrapper;
/**
* Defines a read-only Drupal stream wrapper base class.
*
* This class provides a minimal-read only stream wrapper implementation.
* Specifically, it only implements the writing classes and read classes where
* we need to restrict 'write-capable' arguments.
*
* Drupal\Core\StreamWrapper\ReadOnlyStream implementations need to implement
* all the read-related classes.
*/
abstract class ReadOnlyStream implements StreamWrapperInterface {
/**
* Stream context resource.
*
* @var resource
*/
public $context;
/**
* A generic resource handle.
*
* @var resource
*/
public $handle = NULL;
/**
* Instance URI (stream).
*
* A stream is referenced as "scheme://target".
*
* @var string
*/
protected $uri;
/**
* {@inheritdoc}
*/
public function setUri($uri) {
$this->uri = $uri;
}
/**
* {@inheritdoc}
*/
public function getUri() {
return $this->uri;
}
/**
* Support for fopen(), file_get_contents(), etc.
*
* Any write modes will be rejected, as this is a read-only stream wrapper.
*
* @param string $uri
* A string containing the URI to the file to open.
* @param string $mode
* The file mode, only strict readonly modes are supported.
* @param int $options
* A bit mask of STREAM_USE_PATH and STREAM_REPORT_ERRORS.
* @param string $opened_path
* A string containing the path actually opened.
*
* @return bool
* TRUE if $mode denotes a readonly mode and the file was opened
* successfully, FALSE otherwise.
*
* @throws \BadMethodCallException
* When ::getLocalPath() is not implemented in the concrete driver class.
*
* @see http://php.net/manual/streamwrapper.stream-open.php
*/
public function stream_open($uri, $mode, $options, &$opened_path) {
if (!in_array($mode, ['r', 'rb', 'rt'])) {
if ($options & STREAM_REPORT_ERRORS) {
trigger_error('stream_open() write modes not supported for read-only stream wrappers', E_USER_WARNING);
}
return FALSE;
}
$this->uri = $uri;
$path = $this->getLocalPath();
$this->handle = ($options & STREAM_REPORT_ERRORS) ? fopen($path, $mode) : @fopen($path, $mode);
if ($this->handle !== FALSE && ($options & STREAM_USE_PATH)) {
$opened_path = $path;
}
return (bool) $this->handle;
}
/**
* Returns the canonical absolute path of the URI, if possible.
*
* @param string $uri
* (optional) The stream wrapper URI to be converted to a canonical
* absolute path. This may point to a directory or another type of file.
*
* phpcs:ignore Drupal.Commenting.FunctionComment.InvalidNoReturn
* @return string|bool
* If $uri is not set, returns the canonical absolute path of the URI
* previously set by the
* Drupal\Core\StreamWrapper\StreamWrapperInterface::setUri() function.
* If $uri is set and valid for this class, returns its canonical absolute
* path, as determined by the realpath() function. If $uri is set but not
* valid, returns FALSE.
*
* @throws \BadMethodCallException
* If the method is not implemented in the concrete driver class.
*
* @todo This method is called by ReadOnlyStream::stream_open on the abstract
* class, and therefore should be defined as well on the abstract class to
* prevent static analysis errors. In D11, consider changing it to an
* abstract method.
*/
protected function getLocalPath($uri = NULL) {
throw new \BadMethodCallException(get_class($this) . '::getLocalPath() not implemented.');
}
/**
* Support for flock().
*
* An exclusive lock attempt will be rejected, as this is a read-only stream
* wrapper.
*
* @param int $operation
* One of the following:
* - LOCK_SH to acquire a shared lock (reader).
* - LOCK_EX to acquire an exclusive lock (writer).
* - LOCK_UN to release a lock (shared or exclusive).
* - LOCK_NB if you don't want flock() to block while locking (not
* supported on Windows).
*
* @return bool
* Return FALSE for an exclusive lock (writer), as this is a read-only
* stream wrapper. Return the result of flock() for other valid operations.
* Defaults to TRUE if an invalid operation is passed.
*
* @see http://php.net/manual/streamwrapper.stream-lock.php
*/
public function stream_lock($operation) {
if (in_array($operation, [LOCK_EX, LOCK_EX | LOCK_NB])) {
trigger_error('stream_lock() exclusive lock operations not supported for read-only stream wrappers', E_USER_WARNING);
return FALSE;
}
if (in_array($operation, [LOCK_SH, LOCK_UN, LOCK_SH | LOCK_NB])) {
return flock($this->handle, $operation);
}
return TRUE;
}
/**
* Support for fwrite(), file_put_contents() etc.
*
* Data will not be written as this is a read-only stream wrapper.
*
* @param string $data
* The string to be written.
*
* @return bool
* FALSE as data will not be written.
*
* @see http://php.net/manual/streamwrapper.stream-write.php
*/
public function stream_write($data) {
trigger_error('stream_write() not supported for read-only stream wrappers', E_USER_WARNING);
return FALSE;
}
/**
* Support for fflush().
*
* Nothing will be output to the file, as this is a read-only stream wrapper.
* However as stream_flush is called during stream_close we should not trigger
* an error.
*
* @return bool
* FALSE, as no data will be stored.
*
* @see http://php.net/manual/streamwrapper.stream-flush.php
*/
public function stream_flush() {
return FALSE;
}
/**
* {@inheritdoc}
*
* Does not change meta data as this is a read-only stream wrapper.
*/
public function stream_metadata($uri, $option, $value) {
trigger_error('stream_metadata() not supported for read-only stream wrappers', E_USER_WARNING);
return FALSE;
}
/**
* {@inheritdoc}
*/
public function stream_truncate($new_size) {
trigger_error('stream_truncate() not supported for read-only stream wrappers', E_USER_WARNING);
return FALSE;
}
/**
* Support for unlink().
*
* The file will not be deleted from the stream as this is a read-only stream
* wrapper.
*
* @param string $uri
* A string containing the uri to the resource to delete.
*
* @return bool
* TRUE so that file_delete() will remove db reference to file. File is not
* actually deleted.
*
* @see http://php.net/manual/streamwrapper.unlink.php
*/
public function unlink($uri) {
trigger_error('unlink() not supported for read-only stream wrappers', E_USER_WARNING);
return TRUE;
}
/**
* Support for rename().
*
* This file will not be renamed as this is a read-only stream wrapper.
*
* @param string $from_uri
* The uri to the file to rename.
* @param string $to_uri
* The new uri for file.
*
* @return bool
* FALSE as file will never be renamed.
*
* @see http://php.net/manual/streamwrapper.rename.php
*/
public function rename($from_uri, $to_uri) {
trigger_error('rename() not supported for read-only stream wrappers', E_USER_WARNING);
return FALSE;
}
/**
* Support for mkdir().
*
* Directory will never be created as this is a read-only stream wrapper.
*
* @param string $uri
* A string containing the URI to the directory to create.
* @param int $mode
* Permission flags - see mkdir().
* @param int $options
* A bit mask of STREAM_REPORT_ERRORS and STREAM_MKDIR_RECURSIVE.
*
* @return bool
* FALSE as directory will never be created.
*
* @see http://php.net/manual/streamwrapper.mkdir.php
*/
public function mkdir($uri, $mode, $options) {
trigger_error('mkdir() not supported for read-only stream wrappers', E_USER_WARNING);
return FALSE;
}
/**
* Support for rmdir().
*
* Directory will never be deleted as this is a read-only stream wrapper.
*
* @param string $uri
* A string containing the URI to the directory to delete.
* @param int $options
* A bit mask of STREAM_REPORT_ERRORS.
*
* @return bool
* FALSE as directory will never be deleted.
*
* @see http://php.net/manual/streamwrapper.rmdir.php
*/
public function rmdir($uri, $options) {
trigger_error('rmdir() not supported for read-only stream wrappers', E_USER_WARNING);
return FALSE;
}
}
|