/** * set the maximum upload size limit for apache hosts using .htaccess * * @param int $size file size in bytes * @return bool false on failure, size on success */ static function setUploadLimit($size) { //don't allow user to break his config -- upper boundary if ($size > PHP_INT_MAX) { //max size is always 1 byte lower than computerFileSize returns if ($size > PHP_INT_MAX + 1) { return false; } $size -= 1; } else { $size = OC_Helper::phpFileSize($size); } //don't allow user to break his config -- broken or malicious size input if (intval($size) === 0) { return false; } //suppress errors in case we don't have permissions for $htaccess = @file_get_contents(OC::$SERVERROOT . '/.htaccess'); if (!$htaccess) { return false; } $phpValueKeys = array('upload_max_filesize', 'post_max_size'); foreach ($phpValueKeys as $key) { $pattern = '/php_value ' . $key . ' (\\S)*/'; $setting = 'php_value ' . $key . ' ' . $size; $hasReplaced = 0; $content = preg_replace($pattern, $setting, $htaccess, 1, $hasReplaced); if ($content !== null) { $htaccess = $content; } if ($hasReplaced === 0) { $htaccess .= "\n" . $setting; } } //check for write permissions if (is_writable(OC::$SERVERROOT . '/.htaccess')) { file_put_contents(OC::$SERVERROOT . '/.htaccess', $htaccess); return OC_Helper::computerFileSize($size); } else { OC_Log::write('files', 'Can\'t write upload limit to ' . OC::$SERVERROOT . '/.htaccess. Please check the file permissions', OC_Log::WARN); } return false; }
/** * set the maximum upload size limit for apache hosts using .htaccess * * @param int $size file size in bytes * @param array $files override '.htaccess' and '.user.ini' locations * @return bool false on failure, size on success */ public static function setUploadLimit($size, $files = []) { //don't allow user to break his config $size = intval($size); if ($size < self::UPLOAD_MIN_LIMIT_BYTES) { return false; } $size = OC_Helper::phpFileSize($size); $phpValueKeys = array('upload_max_filesize', 'post_max_size'); // default locations if not overridden by $files $files = array_merge(['.htaccess' => OC::$SERVERROOT . '/.htaccess', '.user.ini' => OC::$SERVERROOT . '/.user.ini'], $files); $updateFiles = [$files['.htaccess'] => ['pattern' => '/php_value %1$s (\\S)*/', 'setting' => 'php_value %1$s %2$s'], $files['.user.ini'] => ['pattern' => '/%1$s=(\\S)*/', 'setting' => '%1$s=%2$s']]; $success = true; foreach ($updateFiles as $filename => $patternMap) { // suppress warnings from fopen() $handle = @fopen($filename, 'r+'); if (!$handle) { \OCP\Util::writeLog('files', 'Can\'t write upload limit to ' . $filename . '. Please check the file permissions', \OCP\Util::WARN); $success = false; continue; // try to update as many files as possible } $content = ''; while (!feof($handle)) { $content .= fread($handle, 1000); } foreach ($phpValueKeys as $key) { $pattern = vsprintf($patternMap['pattern'], [$key]); $setting = vsprintf($patternMap['setting'], [$key, $size]); $hasReplaced = 0; $newContent = preg_replace($pattern, $setting, $content, 1, $hasReplaced); if ($newContent !== null) { $content = $newContent; } if ($hasReplaced === 0) { $content .= "\n" . $setting; } } // write file back ftruncate($handle, 0); rewind($handle); fwrite($handle, $content); fclose($handle); } if ($success) { return OC_Helper::computerFileSize($size); } return false; }
/** * @dataProvider phpFileSizeProvider */ public function testPhpFileSize($expected, $input) { $result = OC_Helper::phpFileSize($input); $this->assertEquals($expected, $result); }