From 6b34ba8a8ef94c36c73dc68eb6cfe9b12335f7a4 Mon Sep 17 00:00:00 2001
From: Robin Appelman <icewind1991@gmail.com>
Date: Sun, 29 May 2011 17:43:13 +0200
Subject: [PATCH] Make max upload filesize configurable for apache hosts

---
 files/admin.php           | 11 +++++++++++
 files/settings.php        |  2 +-
 files/templates/admin.php |  6 +++++-
 lib/files.php             | 18 ++++++++++++++++++
 lib/setup.php             |  5 ++++-
 5 files changed, 39 insertions(+), 3 deletions(-)

diff --git a/files/admin.php b/files/admin.php
index 0333e2c6cb..59b822468e 100644
--- a/files/admin.php
+++ b/files/admin.php
@@ -26,15 +26,26 @@
 require_once('../lib/base.php');
 require( 'template.php' );
 
+
 // Check if we are a user
 if( !OC_USER::isLoggedIn() || !OC_GROUP::inGroup( $_SESSION['user_id'], 'admin' )){
 	header( "Location: ".OC_HELPER::linkTo( "index.php" ));
 	exit();
 }
 
+$htaccessWorking=(getenv('htaccessWorking')=='true');
+if(isset($_POST['maxUploadSize'])){
+	$maxUploadFilesize=$_POST['maxUploadSize'];
+	OC_FILES::setUploadLimit(OC_HELPER::computerFileSize($maxUploadFilesize));
+}else{
+	$maxUploadFilesize = ini_get('upload_max_filesize').'B';
+}
+
 OC_APP::setActiveNavigationEntry( "files_administration" );
 // return template
 $tmpl = new OC_TEMPLATE( "files", "admin", "admin" );
+$tmpl->assign( 'htaccessWorking', $htaccessWorking );
+$tmpl->assign( 'uploadMaxFilesize', $maxUploadFilesize);
 $tmpl->printPage();
 
 ?>
diff --git a/files/settings.php b/files/settings.php
index 6d237ed615..23aed4d1b8 100644
--- a/files/settings.php
+++ b/files/settings.php
@@ -57,7 +57,7 @@ foreach( explode( "/", $dir ) as $i ){
 
 // return template
 $tmpl = new OC_TEMPLATE( "files", "index", "user" );
-$tmpl->assign( "files", $files );
+$tmpl->assign( 'files', $files );
 $tmpl->assign( "breadcrumb", $breadcrumb );
 $tmpl->printPage();
 
diff --git a/files/templates/admin.php b/files/templates/admin.php
index 65a540ac91..f768931eb2 100644
--- a/files/templates/admin.php
+++ b/files/templates/admin.php
@@ -1,4 +1,7 @@
-<form>
+<form action='#' method='post'>
+	<?php if($_['htaccessWorking']):?>
+		Maximum upload size <input name='maxUploadSize' value='<?php echo $_['uploadMaxFilesize'] ?>'/><br/>
+	<?php endif;?>
 	<input type="checkbox" /> Allow public folders<br>
 
 	(if public is enabled)<br>
@@ -9,4 +12,5 @@
 
 	<input type="checkbox" /> Allow downloading shared files<br>
 	<input type="checkbox" /> Allow uploading in shared directory<br>
+	<input type='submit' value='Save'/>
 </form>
diff --git a/lib/files.php b/lib/files.php
index 2a56c5b4b3..9e66f9dab8 100644
--- a/lib/files.php
+++ b/lib/files.php
@@ -291,6 +291,24 @@ class OC_FILES {
 			return false;
 		}
 	}
+	
+	/**
+	 * set the maximum upload size limit for apache hosts using .htaccess
+	 * @param int size filesisze in bytes
+	 */
+	static function setUploadLimit($size){
+		global $SERVERROOT;
+		global $WEBROOT;
+		$size=OC_HELPER::humanFileSize($size);
+		echo $size;
+		$size=substr($size,0,-1);//strip the B
+		$size=str_replace(' ','',$size); //remove the space between the size and the postfix
+		$content = "ErrorDocument 404 /$WEBROOT/templates/404.php\n";//custom 404 error page
+		$content.= "php_value upload_max_filesize $size\n";//upload limit
+		$content.= "php_value post_max_size $size\n";
+		$content.= "SetEnv htaccessWorking true\n";
+		@file_put_contents($SERVERROOT.'/.htaccess', $content); //supress errors in case we don't have permissions for it
+	}
 }
 
 function zipAddDir($dir,$zip,$internalDir=''){
diff --git a/lib/setup.php b/lib/setup.php
index fa0b8f8590..72507f221b 100644
--- a/lib/setup.php
+++ b/lib/setup.php
@@ -167,7 +167,10 @@ class OC_SETUP {
 	private static function createHtaccess() {
 		global $SERVERROOT;
 		global $WEBROOT;
-		$content = "ErrorDocument 404 /$WEBROOT/templates/404.php\n";
+		$content = "ErrorDocument 404 /$WEBROOT/templates/404.php\n";//custom 404 error page
+		$content.= "php_value upload_max_filesize 20M\n";//upload limit
+		$content.= "php_value post_max_size 20M\n";
+		$content.= "SetEnv htaccessWorking true\n";
 		@file_put_contents($SERVERROOT.'/.htaccess', $content); //supress errors in case we don't have permissions for it
 
 		$content = "deny from all";
-- 
GitLab