Skip to content
GitLab
Menu
Projects
Groups
Snippets
/
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
Menu
Open sidebar
die_coolen_jungs
our_own_cloud_project
Commits
7562e495
Commit
7562e495
authored
Sep 12, 2015
by
Frank Karlitschek
Browse files
Merge pull request #18658 from owncloud/configurable-temp
Configurable temporary directory
parents
9860a794
c3a327dc
Changes
6
Hide whitespace changes
Inline
Side-by-side
config/config.sample.php
View file @
7562e495
...
...
@@ -79,6 +79,16 @@ $CONFIG = array(
*/
'datadirectory'
=>
'/var/www/owncloud/data'
,
/**
* Override where ownCloud stores temporary files. Useful in situations where
* the system temporary directory is on a limited space ramdisk or is otherwise
* restricted, or if external storages which do not support streaming are in
* use.
*
* The web server user must have write access to this directory.
*/
'tempdirectory'
=>
'/tmp/owncloudtemp'
,
/**
* The current version number of your ownCloud installation. This is set up
* during installation and update, so you shouldn't need to change it.
...
...
lib/base.php
View file @
7562e495
...
...
@@ -1115,27 +1115,16 @@ class OC {
}
return
true
;
}
}
if
(
!
function_exists
(
'get_temp_dir'
))
{
/**
* Get the temporary dir to store uploaded data
* @return null|string Path to the temporary directory or null
*/
function
get_temp_dir
()
{
if
(
$temp
=
ini_get
(
'upload_tmp_dir'
))
return
$temp
;
if
(
$temp
=
getenv
(
'TMP'
))
return
$temp
;
if
(
$temp
=
getenv
(
'TEMP'
))
return
$temp
;
if
(
$temp
=
getenv
(
'TMPDIR'
))
return
$temp
;
$temp
=
tempnam
(
__FILE__
,
''
);
if
(
file_exists
(
$temp
))
{
unlink
(
$temp
);
return
dirname
(
$temp
);
}
if
(
$temp
=
sys_get_temp_dir
())
return
$temp
;
return
null
;
return
\
OC
::
$server
->
getTempManager
()
->
t_get_temp_dir
();
}
}
OC
::
init
();
lib/private/server.php
View file @
7562e495
...
...
@@ -356,7 +356,10 @@ class Server extends SimpleContainer implements IServerContainer {
}
});
$this
->
registerService
(
'TempManager'
,
function
(
Server
$c
)
{
return
new
TempManager
(
get_temp_dir
(),
$c
->
getLogger
());
return
new
TempManager
(
$c
->
getLogger
(),
$c
->
getConfig
()
);
});
$this
->
registerService
(
'AppManager'
,
function
(
Server
$c
)
{
return
new
\
OC\App\AppManager
(
...
...
lib/private/tempmanager.php
View file @
7562e495
...
...
@@ -25,6 +25,7 @@
namespace
OC
;
use
OCP\ILogger
;
use
OCP\IConfig
;
use
OCP\ITempManager
;
class
TempManager
implements
ITempManager
{
...
...
@@ -34,16 +35,20 @@ class TempManager implements ITempManager {
protected
$tmpBaseDir
;
/** @var ILogger */
protected
$log
;
/** @var IConfig */
protected
$config
;
/** Prefix */
const
TMP_PREFIX
=
'oc_tmp_'
;
/**
* @param string $baseDir
* @param \OCP\ILogger $logger
* @param \OCP\IConfig $config
*/
public
function
__construct
(
$baseDir
,
ILogger
$logger
)
{
$this
->
tmpBaseDir
=
$baseDir
;
public
function
__construct
(
ILogger
$logger
,
IConfig
$config
)
{
$this
->
log
=
$logger
;
$this
->
config
=
$config
;
$this
->
tmpBaseDir
=
$this
->
getTempBaseDir
();
}
/**
...
...
@@ -190,4 +195,79 @@ class TempManager implements ITempManager {
}
return
$files
;
}
/**
* Get the temporary base directory configured on the server
*
* @return string Path to the temporary directory or null
* @throws \UnexpectedValueException
*/
public
function
getTempBaseDir
()
{
if
(
$this
->
tmpBaseDir
)
{
return
$this
->
tmpBaseDir
;
}
$directories
=
[];
if
(
$temp
=
$this
->
config
->
getSystemValue
(
'tempdirectory'
,
null
))
{
$directories
[]
=
$temp
;
}
if
(
$temp
=
ini_get
(
'upload_tmp_dir'
))
{
$directories
[]
=
$temp
;
}
if
(
$temp
=
getenv
(
'TMP'
))
{
$directories
[]
=
$temp
;
}
if
(
$temp
=
getenv
(
'TEMP'
))
{
$directories
[]
=
$temp
;
}
if
(
$temp
=
getenv
(
'TMPDIR'
))
{
$directories
[]
=
$temp
;
}
$temp
=
tempnam
(
__FILE__
,
''
);
if
(
file_exists
(
$temp
))
{
unlink
(
$temp
);
$directories
[]
=
dirname
(
$temp
);
}
if
(
$temp
=
sys_get_temp_dir
())
{
$directories
[]
=
$temp
;
}
foreach
(
$directories
as
$dir
)
{
if
(
$this
->
checkTemporaryDirectory
(
$dir
))
{
return
$dir
;
}
}
throw
new
\
UnexpectedValueException
(
'Unable to detect system temporary directory'
);
}
/**
* Check if a temporary directory is ready for use
*
* @param mixed $directory
* @return bool
*/
private
function
checkTemporaryDirectory
(
$directory
)
{
// surpress any possible errors caused by is_writable
// checks missing or invalid path or characters, wrong permissions ect
try
{
if
(
is_writeable
(
$directory
))
{
return
true
;
}
}
catch
(
Exception
$e
)
{
}
$this
->
log
->
warning
(
'Temporary directory {dir} is not present or writable'
,
[
'dir'
=>
$directory
]
);
return
false
;
}
/**
* Override the temporary base directory
*
* @param string $directory
*/
public
function
overrideTempBaseDir
(
$directory
)
{
$this
->
tmpBaseDir
=
$directory
;
}
}
lib/public/itempmanager.php
View file @
7562e495
...
...
@@ -58,4 +58,12 @@ interface ITempManager {
* @since 8.0.0
*/
public
function
cleanOld
();
/**
* Get the temporary base directory
*
* @return string
* @since 8.2.0
*/
public
function
getTempBaseDir
();
}
tests/lib/tempmanager.php
View file @
7562e495
...
...
@@ -22,12 +22,13 @@ class NullLogger extends Log {
}
class
TempManager
extends
\
Test\TestCase
{
protected
$baseDir
;
protected
$baseDir
=
null
;
protected
function
setUp
()
{
parent
::
setUp
();
$this
->
baseDir
=
get_temp_d
ir
()
.
$this
->
getUniqueID
(
'/oc_tmp_test'
);
$this
->
baseDir
=
$this
->
getManager
()
->
getTempBaseD
ir
()
.
$this
->
getUniqueID
(
'/oc_tmp_test'
);
if
(
!
is_dir
(
$this
->
baseDir
))
{
mkdir
(
$this
->
baseDir
);
}
...
...
@@ -35,18 +36,30 @@ class TempManager extends \Test\TestCase {
protected
function
tearDown
()
{
\
OC_Helper
::
rmdirr
(
$this
->
baseDir
);
$this
->
baseDir
=
null
;
parent
::
tearDown
();
}
/**
* @param \OCP\ILogger $logger
* @param \OCP\IConfig $config
* @return \OC\TempManager
*/
protected
function
getManager
(
$logger
=
null
)
{
protected
function
getManager
(
$logger
=
null
,
$config
=
null
)
{
if
(
!
$logger
)
{
$logger
=
new
NullLogger
();
}
return
new
\
OC\TempManager
(
$this
->
baseDir
,
$logger
);
if
(
!
$config
)
{
$config
=
$this
->
getMock
(
'\OCP\IConfig'
);
$config
->
method
(
'getSystemValue'
)
->
with
(
'tempdirectory'
,
null
)
->
willReturn
(
'/tmp'
);
}
$manager
=
new
\
OC\TempManager
(
$logger
,
$config
);
if
(
$this
->
baseDir
)
{
$manager
->
overrideTempBaseDir
(
$this
->
baseDir
);
}
return
$manager
;
}
public
function
testGetFile
()
{
...
...
@@ -185,4 +198,19 @@ class TempManager extends \Test\TestCase {
$this
->
assertStringEndsNotWith
(
'./Traversal\\../FileName'
,
$tmpManager
);
$this
->
assertStringEndsWith
(
'.Traversal..FileName'
,
$tmpManager
);
}
public
function
testGetTempBaseDirFromConfig
()
{
$dir
=
$this
->
getManager
()
->
getTemporaryFolder
();
$config
=
$this
->
getMock
(
'\OCP\IConfig'
);
$config
->
expects
(
$this
->
once
())
->
method
(
'getSystemValue'
)
->
with
(
'tempdirectory'
,
null
)
->
willReturn
(
$dir
);
$this
->
baseDir
=
null
;
// prevent override
$tmpManager
=
$this
->
getManager
(
null
,
$config
);
$this
->
assertEquals
(
$dir
,
$tmpManager
->
getTempBaseDir
());
}
}
Write
Preview
Supports
Markdown
0%
Try again
or
attach a new file
.
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment