Blame view

framework/core/TempPath.php 2.76 KB
0084d336   Administrator   Importers CRUD
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;
  }