瀏覽代碼

Merge pull request #15946 from martink-p/bugxfix/9792/encrypted-external-webdav

Update Encryption.php
tags/v17.0.0beta1
Roeland Jago Douma 4 年之前
父節點
當前提交
d14aed1048
沒有連結到貢獻者的電子郵件帳戶。
共有 1 個檔案被更改,包括 27 行新增2 行删除
  1. 27
    2
      lib/private/Files/Stream/Encryption.php

+ 27
- 2
lib/private/Files/Stream/Encryption.php 查看文件

@@ -315,6 +315,31 @@ class Encryption extends Wrapper {
return $result;

}
/**
* stream_read_block
*
* This function is a wrapper for function stream_read.
* It calls stream read until the requested $blockSize was received or no remaining data is present.
* This is required as stream_read only returns smaller chunks of data when the stream fetches from a
* remote storage over the internet and it does not care about the given $blockSize.
*
* @param int $blockSize Length of requested data block in bytes
* @return string Data fetched from stream.
*/
private function stream_read_block(int $blockSize): string {
$remaining = $blockSize;
$data = '';

do {
$chunk = parent::stream_read($remaining);
$chunk_len = strlen($chunk);
$data .= $chunk;
$remaining -= $chunk_len;
} while (($remaining > 0) && ($chunk_len > 0));

return $data;
}

public function stream_write($data) {
$length = 0;
@@ -470,7 +495,7 @@ class Encryption extends Wrapper {
// don't try to fill the cache when trying to write at the end of the unencrypted file when it coincides with new block
if ($this->cache === '' && !($this->position === $this->unencryptedSize && ($this->position % $this->unencryptedBlockSize) === 0)) {
// Get the data from the file handle
$data = parent::stream_read($this->util->getBlockSize());
$data = $this->stream_read_block($this->util->getBlockSize());
$position = (int)floor($this->position/$this->unencryptedBlockSize);
$numberOfChunks = (int)($this->unencryptedSize / $this->unencryptedBlockSize);
if($numberOfChunks === $position) {
@@ -495,7 +520,7 @@ class Encryption extends Wrapper {
* read first block to skip the header
*/
protected function skipHeader() {
parent::stream_read($this->headerSize);
$this->stream_read_block($this->headerSize);
}

/**

Loading…
取消
儲存