]> source.dussan.org Git - nextcloud-server.git/commitdiff
fix checking quota in webdav, adding a sabredav plugin
authorscambra <sergio@entrecables.com>
Fri, 20 Apr 2012 09:39:30 +0000 (11:39 +0200)
committerscambra <sergio@entrecables.com>
Tue, 30 Oct 2012 09:32:30 +0000 (10:32 +0100)
apps/files/appinfo/remote.php
lib/connector/sabre/quotaplugin.php [new file with mode: 0644]

index 9c7b9ab6d5be9a3421a377c36fdb2e050df0631c..ecabe8621ddc2c974ea4c43658936464f803f808 100644 (file)
@@ -41,6 +41,7 @@ $server->setBaseUri($baseuri);
 $server->addPlugin(new Sabre_DAV_Auth_Plugin($authBackend, 'ownCloud'));
 $server->addPlugin(new Sabre_DAV_Locks_Plugin($lockBackend));
 $server->addPlugin(new Sabre_DAV_Browser_Plugin(false)); // Show something in the Browser, but no upload
+$server->addPlugin(new OC_Connector_Sabre_QuotaPlugin());
 
 // And off we go!
 $server->exec();
diff --git a/lib/connector/sabre/quotaplugin.php b/lib/connector/sabre/quotaplugin.php
new file mode 100644 (file)
index 0000000..67177c2
--- /dev/null
@@ -0,0 +1,57 @@
+<?php
+
+/**
+ * This plugin check user quota and deny creating files when they exceeds the quota.
+ * 
+ * @copyright Copyright (C) 2012 entreCables S.L. All rights reserved.
+ * @author Sergio Cambra
+ * @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;
+
+       /**
+               * 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;
+                       $this->server->subscribeEvent('beforeWriteContent',array($this,'checkQuota'),10);
+                       $this->server->subscribeEvent('beforeCreateFile',array($this,'checkQuota'),10);
+
+       }
+
+       /**
+               * This method is called before any HTTP method and forces users to be authenticated
+               * 
+               * @param string $method
+               * @throws Sabre_DAV_Exception
+               * @return bool 
+               */
+       public function checkQuota($uri, $data = null) {
+               $expected = $this->server->httpRequest->getHeader('X-Expected-Entity-Length');
+               $length = $expected ? $expected : $this->server->httpRequest->getHeader('Content-Length');
+               if ($length) {
+                       if(substr($uri,0,1)!=='/') $uri='/'.$uri;
+                       list($parentUri,$newName) = Sabre_DAV_URLUtil::splitPath($uri);
+                       if ($length > OC_Filesystem::free_space($parentUri)) {
+                               throw new Sabre_DAV_Exception('Quota exceeded. File is too big.');
+                       }
+               }
+               return true;
+       }
+}