Automattic / Automattic/VIP-Coding-Standards

Improve file operations checks to allow for use of stream wrappers

Offen
#431 0 Kommentare 0 Reaktionen 0 zugewiesene Personen Auf GitHub ansehen
Standard: VIP-Go Status: Needs investigation Type: Enhancement
Vorherrschende Sprache
PHP
Sterne
261
Forks
44
Ø Merge
19 Min.
Gemergte PRs (30 T.)
1

Beschreibung

## What problem would the enhancement address for VIP?

#415 dropped the file operations down from Errors to Warnings, but this is not the full picture.

Here's a rundown of how file operations / stream wrappers will work on VIP:

- If a PHP file operation is done with a normal file path, it won't work, unless writing to the `temp` directory.
- If a PHP file operation is done where the file has been opened with the `vip://` protocol, then it will to use stream wrappers and will work.
- If WP_Filesystem is used for file operations, it should switch to use the right protocol, based on whether they are in the `uploads` or `temp` directory, or if the path uses `wp_upload_dir()` or `wp_get_upload_dir()`, should work.
- If the path is outside of uploads and temp directories, then file writing can not work.

Aside: Noting here that just because you can, doesn't mean you should. File operations are done over HTTP API, so as an example, writing a log file to the `uploads` directory and writing to it several times during one request would be a bad idea, to the performance of file IO over HTTP.

## Describe the solution you'd like

Needs to be fleshed out, but instead of just checking for discrete file ops calls, we need to look at how the file was opened for reading or writing, and the arguments of that (for instance) `fopen()` call, to determine if the file operation behaviour is likely to succeed.

This will be made trickier by having to look for `fopen()` or other calls happening before the file operation function call (which may be in another file), or the _arg_ for that `fopen()` being a variable that may be defined elsewhere (different function, different file, etc.). In these cases, the best we can do is to give a Warning.

If we _can_ determine with confidence how the file was opened (including matching file handles), we can then run through the conditions above to determine if we can throw an Error.

This will need a new sniff.

## What code should be reported as a violation?

{To be completed with more examples}

```php
// Correctly opening file
$basedir = wp_upload_dir()[ 'basedir' ]; // this will return the proper vip protocol stream
$file = fopen( $basedir . '/test.txt', '+r' );
```

```php
// Simplified example of how to upload a file using PHP functions
$csv_content = '1,hello,admin';

$upload_dir = wp_get_upload_dir()['basedir'];

$file_path = $upload_dir . '/csv/updated.csv';

file_put_contents( $file_path, $csv_content );

// The file will now be accessible at https://example-com.go-vip.net/wp-content/uploads/csv/updated.csv
```

```php
// Example that parses an uploaded CSV and stores the contents in a variable
$csv_attachment = get_attached_file( 1234 );

$csv_file = file( $csv_attachment );

$csv_content = array_map( 'str_getcsv', $csv_file );
```

## What code should *not* be reported as a violation?

{To be completed with more examples}

```php
// Incorrectly opening file
$file = fopen( './test.txt', '+r' );

// Thus the following functions would work or not depending on the how it's opened above
fread( $file, 1024 );
fwrite( $file, 'new string' );
fclose( $file );
```

## Additional context

- #415 has a bit more discussion.
- Link to Lobby post
- [VIP documentation](https://wpvip.com/documentation/vip-go/writing-files-on-vip-go/#programmatic-access-to-media-uploads)

Beitragsleitfaden

Beitragsleitfaden öffnen

Rechercherichtung

Beginne mit dem Lesen von Issue #415 und der verlinkten VIP-Dokumentation, um die bestehenden Prüfungen für Dateioperationen und die Einschränkungen von Stream-Wrappern zu verstehen. Lege anhand der bereitgestellten Beispiele die unterstützten Fälle des neuen Sniffs fest, einschließlich der Frage, wann eine zuverlässige Handle- und Pfadanalyse einen Error melden kann und wann sie stattdessen eine Warning ausgeben muss, und vervollständige die fehlenden Beispiele für Verstöße und Nichtverstöße.

Vom Indexierungsmodell aus dem Issue-Text verfasst.

Bewertung

Tech-Stack
php
Bereich
tooling
Issue-Typ
Feature
Schwierigkeit
5/5
Geschätzter Aufwand
Über eine Woche
Aktivitätsstatus
Veraltet
Klarheit
Muss geklärt werden
Anfängerfreundlichkeit
25/100

Neue Issues direkt in Ihr Postfach

Eine kurze Übersicht über anfängerfreundliche GitHub-Issues.