TempPath.php
2.76 KB
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
59
60
61
62
63
64
65
66
67
68
69
70
71
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
<?php
/**
 * Returns the temporary folder path that silverstripe should use for its cache files.
 *
 * @package framework
 * @subpackage core
 *
 * @param $base The base path to use for determining the temporary path
 * @return string Path to temp
 */
function getTempFolder($base = null) {
	$parent = getTempParentFolder($base);
	
	// The actual temp folder is a subfolder of getTempParentFolder(), named by username
	$subfolder = $parent . DIRECTORY_SEPARATOR . getTempFolderUsername();
	if(!@file_exists($subfolder)) {	
		mkdir($subfolder);
	}
	return $subfolder;
}
/**
 * Returns as best a representation of the current username as we can glean.
 *
 * @package framework
 * @subpackage core
 */
function getTempFolderUsername() {
	$user = getenv('APACHE_RUN_USER');
	if(!$user) $user = getenv('USER');
	if(!$user) $user = getenv('USERNAME');
	if(!$user && function_exists('posix_getuid')) {
		$userDetails = posix_getpwuid(posix_getuid());
		$user = $userDetails['name'];
	}
	if(!$user) $user = 'unknown';
	$user = preg_replace('/[^A-Za-z0-9_\-]/', '', $user);
	return $user;
}
/**
 * Return the parent folder of the temp folder.
 * The temp folder will be a subfolder of this, named by username.
 * This structure prevents permission problems.
 *
 * @package framework
 * @subpackage core
 */
function getTempParentFolder($base = null) {
	if(!$base && defined('BASE_PATH')) $base = BASE_PATH;
	$tempPath = '';
	$worked = true;
	// first, try finding a silverstripe-cache dir built off the base path
	$tempPath = $base . DIRECTORY_SEPARATOR . 'silverstripe-cache';
	if(@file_exists($tempPath)) {
		if((fileperms($tempPath) & 0777) != 0777) {
			@chmod($tempPath, 0777);
		}
		return $tempPath;
	}
	// failing the above, try finding a namespaced silverstripe-cache dir in the system temp
	$tempPath = sys_get_temp_dir() . DIRECTORY_SEPARATOR . 
		'silverstripe-cache-php' . preg_replace('/[^\w-\.+]+/', '-', PHP_VERSION) . 
		str_replace(array(' ', '/', ':', '\\'), '-', $base);
	if(!@file_exists($tempPath)) {
		$oldUMask = umask(0);
		$worked = @mkdir($tempPath, 0777);
		umask($oldUMask);
	// if the folder already exists, correct perms
	} else {
		if((fileperms($tempPath) & 0777) != 0777) {
			@chmod($tempPath, 0777);
		}
	}
	// failing to use the system path, attempt to create a local silverstripe-cache dir
	if(!$worked) {
		$worked = true;
		$tempPath = $base . DIRECTORY_SEPARATOR . 'silverstripe-cache';
		if(!@file_exists($tempPath)) {
			$oldUMask = umask(0);
			$worked = @mkdir($tempPath, 0777);
			umask($oldUMask);
		}
	}
	if(!$worked) {
		throw new Exception(
			'Permission problem gaining access to a temp folder. ' .
			'Please create a folder named silverstripe-cache in the base folder ' .
			'of the installation and ensure it has the correct permissions'
		);
	}
	return $tempPath;
}