Completed
Pull Request — master (#226)
by Victor
09:27 queued 07:39
created

RequestHelper::setSizeForPath()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 3
Code Lines 2

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 3
CRAP Score 1

Importance

Changes 0
Metric Value
c 0
b 0
f 0
dl 0
loc 3
ccs 3
cts 3
cp 1
rs 10
cc 1
eloc 2
nc 1
nop 2
crap 1
1
<?php
2
/**
3
 * ownCloud - files_antivirus
4
 *
5
 * This file is licensed under the Affero General Public License version 3 or
6
 * later. See the COPYING file.
7
 *
8
 * @author Viktar Dubiniuk <[email protected]>
9
 *
10
 * @copyright Viktar Dubiniuk 2017-2018
11
 * @license AGPL-3.0
12
 */
13
14
namespace OCA\Files_Antivirus;
15
16
use OC\Cache\CappedMemoryCache;
17
use OC\Files\Storage\Storage;
18
use \OCP\IRequest;
19
20
/**
21
 * Used to detect the size of the uploaded file
22
 *
23
 * @package OCA\Files_Antivirus
24
 */
25
class RequestHelper {
26
	/**
27
	 * @var  IRequest
28
	 */
29
	private $request;
30
31
	/**
32
	 * @var CappedMemoryCache
33
	 */
34
	private static $fileSizeCache;
35
36
	/**
37
	 * RequestHelper constructor.
38
	 *
39
	 * @param IRequest $request
40
	 */
41 5
	public function __construct(IRequest $request) {
42 5
		$this->request = $request;
43 5
	}
44
45
	/**
46
	 * @return CappedMemoryCache
47
	 */
48 4
	public function getCache() {
49 4
		if (self::$fileSizeCache === null) {
50 1
			self::$fileSizeCache = new CappedMemoryCache();
51
		}
52 4
		return self::$fileSizeCache;
53
	}
54
55
	/**
56
	 * @param string $path
57
	 * @param string $size
58
	 *
59
	 * @return void
60
	 */
61 1
	public function setSizeForPath($path, $size) {
62 1
		$this->getCache()->set($path, $size);
63 1
	}
64
65
	/**
66
	 * Get current upload size
67
	 * returns null for chunks and when there is no upload
68
	 *
69
	 * @param Storage $storage
70
	 * @param string $path
71
	 *
72
	 * @return int|null
73
	 */
74 4
	public function getUploadSize(Storage $storage, $path) {
75
		// remove .ocTransferId444531916.part from part files
76 4
		$cleanedPath = preg_replace(
77 4
			'|\.ocTransferId\d+\.part$|',
78 4
			'',
79 4
			$path
80
		);
81
		// cache uses dav path in /files/$user/path format
82 4
		$translatedPath = preg_replace(
83 4
			'|^files/|',
84 4
			'files/' . $storage->getOwner('/') . '/',
85 4
			$cleanedPath
86
		);
87 4
		$cachedSize = $this->getCache()->get($translatedPath);
88 4
		if ($cachedSize > 0) {
89 1
			return $cachedSize;
90
		}
91
92 3
		$requestMethod = $this->request->getMethod();
93
		// Are we uploading anything?
94 3
		if ($requestMethod !== 'PUT') {
95 1
			return null;
96
		}
97 2
		$isRemoteScript = $this->isScriptName('remote.php');
98 2
		$isPublicScript = $this->isScriptName('public.php');
99 2
		if (!$isRemoteScript && !$isPublicScript) {
100
			return null;
101
		}
102
103 2
		if ($isRemoteScript) {
104
			// v1 && v2 Chunks are not scanned
105 1
			if (\strpos($path, 'uploads/') === 0) {
106 1
				return null;
107
			}
108
109
			if (\OC_FileChunking::isWebdavChunk()
110
				&& \strpos($path, 'cache/') === 0
111
			) {
112
				return null;
113
			}
114
		}
115 1
		$uploadSize = (int)$this->request->getHeader('CONTENT_LENGTH');
116
117 1
		return $uploadSize;
118
	}
119
120
	/**
121
	 *
122
	 * @param string $string
123
	 *
124
	 * @return bool
125
	 */
126 2
	public function isScriptName($string) {
127 2
		$pattern = \sprintf('|/%s|', \preg_quote($string));
128 2
		return \preg_match($pattern, $this->request->getScriptName()) === 1;
129
	}
130
}
131