Completed
Pull Request — master (#226)
by Victor
12:39 queued 06:40
created

RequestHelper::getCache()   A

Complexity

Conditions 2
Paths 2

Size

Total Lines 6
Code Lines 4

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 4
CRAP Score 2

Importance

Changes 0
Metric Value
c 0
b 0
f 0
dl 0
loc 6
ccs 4
cts 4
cp 1
rs 9.4285
cc 2
eloc 4
nc 2
nop 0
crap 2
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 4
	public function __construct(IRequest $request) {
42 4
		$this->request = $request;
43 4
	}
44
45
	/**
46
	 * @return CappedMemoryCache
47
	 */
48 3
	public function getCache() {
49 3
		if (self::$fileSizeCache === null) {
50 1
			self::$fileSizeCache = new CappedMemoryCache();
51
		}
52 3
		return self::$fileSizeCache;
53
	}
54
55
	/**
56
	 * @param string $path
57
	 * @param string $size
58
	 *
59
	 * @return void
60
	 */
61
	public function setSizeForPath($path, $size) {
62
		$this->getCache()->set($path, $size);
63
	}
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 3
	public function getUploadSize(Storage $storage, $path) {
75
		// remove .ocTransferId444531916.part from part files
76 3
		$cleanedPath = preg_replace(
77 3
			'|\.ocTransferId\d+\.part$|',
78 3
			'',
79 3
			$path
80
		);
81
		// cache uses dav path in /files/$user/path format
82 3
		$translatedPath = preg_replace(
83 3
			'|^files/|',
84 3
			'files/' . $storage->getOwner('/') . '/',
85 3
			$cleanedPath
86
		);
87 3
		$cachedSize = $this->getCache()->get($translatedPath);
88 3
		if ($cachedSize > 0) {
89
			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