Join GitHub today
GitHub is home to over 28 million developers working together to host and review code, manage projects, and build software together.Sign up
Server computes checksum on read/write file operations #26655
Old ticket: #11811
We already have a column "oc_filecache.checksums" in the database.
@guruz I'm starting to have the feeling that maybe we shouldn't compute the checksum in the AssemblyStream but instead implement a
The advantage of the stream wrapper is that it will cover most code paths, including chunking ng assembly and also download.
This was referenced
Nov 18, 2016
referenced this issue
Nov 23, 2016
changed the title from
Server computes checksum on upload/download
Server computes checksum on read/write file operations
Jan 26, 2017
Posting what I said in the chat:
Basically the goal is to try and always have a checksum value available in the matching oc_filecache column.
@IljaN you might need to use a similar approach to encryption with a storage wrapper + stream wrapper:
@IljaN start debugging encryption here: https://github.com/owncloud/core/blob/master/lib/private/Encryption/Manager.php#L256, then dig into the storage wrapper and see what it does on fopen. Basically a storage wrapper intercepts any FS calls and does things, so it has all regular storage methods. Since a storage wrapper intercepts FS calls, it's likely the best place to add something that needs to act on fopen/file_put_contents.
The encryption storage wrapper sets up a stream wrapper (PHP stream wrapper) on fopen. the stream wrapper encrypts In the case of checksum, the stream wrapper would only compute the checksum and store it in oc_filecache in stream_close or so
For checksum verification, I think this should happen later. First let the stream wrapper compute the checksum of whatever has been read or written, and add code that runs later (need to find a good place) and compares that checksum with the expected one from the header
Let's focus on the computing part first.
This is basically the task item "compute and store checksum in database when using fopen in write mode".
it should actually be possible to copy-paste the encryption storage + stream wrapper code and adjust accordingly
encryption also writes some data (unencrypted size) to the filecache. so for checksum replace that code to write the checksum instead
so not that much new stuff to invent :-)
Sorry to jump in to hijack @PVince81 's way of thoughts.
I just wanted to re-state that maybe a stream filter would be interesting/easier to do? I'm not a PHP guy and I didn't try it, but it felt better to me than the wrapping orgy we have ;-)
Maybe it doesn't make sense what I write.