Blame view

sources/lib/private/connector/sabre/quotaplugin.php 2.68 KB
03e52840d   Kload   Init
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
  <?php
  
  /**
   * This plugin check user quota and deny creating files when they exceeds the quota.
   *
   * @author Sergio Cambra
   * @copyright Copyright (C) 2012 entreCables S.L. All rights reserved.
   * @license http://code.google.com/p/sabredav/wiki/License Modified BSD License
   */
  class OC_Connector_Sabre_QuotaPlugin extends Sabre_DAV_ServerPlugin {
  
  	/**
  	 * Reference to main server object
  	 *
  	 * @var Sabre_DAV_Server
  	 */
  	private $server;
  
  	/**
  	 * is kept public to allow overwrite for unit testing
  	 *
  	 * @var \OC\Files\View
  	 */
  	public $fileView;
  
  	/**
  	 * This initializes the plugin.
  	 *
  	 * This function is called by Sabre_DAV_Server, after
  	 * addPlugin is called.
  	 *
  	 * This method should set up the requires event subscriptions.
  	 *
  	 * @param Sabre_DAV_Server $server
  	 * @return void
  	 */
  	public function initialize(Sabre_DAV_Server $server) {
  
  		$this->server = $server;
  
  		$server->subscribeEvent('beforeWriteContent', array($this, 'checkQuota'), 10);
  		$server->subscribeEvent('beforeCreateFile', array($this, 'checkQuota'), 10);
  	}
  
  	/**
  	 * This method is called before any HTTP method and validates there is enough free space to store the file
  	 *
  	 * @param string $method
  	 * @throws Sabre_DAV_Exception
  	 * @return bool
  	 */
  	public function checkQuota($uri, $data = null) {
  		$length = $this->getLength();
  		if ($length) {
  			if (substr($uri, 0, 1)!=='/') {
  				$uri='/'.$uri;
  			}
  			list($parentUri, $newName) = Sabre_DAV_URLUtil::splitPath($uri);
837968727   Kload   [enh] Upgrade to ...
59
60
61
62
63
64
65
66
  			$req = $this->server->httpRequest;
  			if ($req->getHeader('OC-Chunked')) {
  				$info = OC_FileChunking::decodeName($newName);
  				$chunkHandler = new OC_FileChunking($info);
  				// substract the already uploaded size to see whether
  				// there is still enough space for the remaining chunks
  				$length -= $chunkHandler->getCurrentSize();
  			}
03e52840d   Kload   Init
67
  			$freeSpace = $this->getFreeSpace($parentUri);
31b7f2792   Kload   Upgrade to ownclo...
68
  			if ($freeSpace !== \OC\Files\SPACE_UNKNOWN && $length > $freeSpace) {
837968727   Kload   [enh] Upgrade to ...
69
70
71
  				if (isset($chunkHandler)) {
  					$chunkHandler->cleanup();
  				}
03e52840d   Kload   Init
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
  				throw new Sabre_DAV_Exception_InsufficientStorage();
  			}
  		}
  		return true;
  	}
  
  	public function getLength()
  	{
  		$req = $this->server->httpRequest;
  		$length = $req->getHeader('X-Expected-Entity-Length');
  		if (!$length) {
  			$length = $req->getHeader('Content-Length');
  		}
  
  		$ocLength = $req->getHeader('OC-Total-Length');
  		if ($length && $ocLength) {
  			return max($length, $ocLength);
  		}
  
  		return $length;
  	}
  
  	/**
  	 * @param $parentUri
  	 * @return mixed
  	 */
  	public function getFreeSpace($parentUri)
  	{
  		if (is_null($this->fileView)) {
  			// initialize fileView
  			$this->fileView = \OC\Files\Filesystem::getView();
  		}
  
  		$freeSpace = $this->fileView->free_space($parentUri);
  		return $freeSpace;
  	}
  }