PITS /
00621: Safe_mode prevents sub-directories creation
Summary: Safe_mode prevents sub-directories creation
Created: 2005-12-15 13:44
Status: Open
Category: Feature
From: JFH
Assigned:
Priority: 33
Version: 2.0.12
OS: Linux/Apache/PHP 4.x
Description: When PHP safe_mode is enabled, everything works fine, except sub-directories creation.
I use per-group subdirectories and my webhost has enabled safe_mode, so creating a new group doesn't work (I get 'PmWiki needs to have a writable ...').
I found the following solution, for function mkdirp($dir):
function mkdirp($dir) { global $ScriptUrl, $FtpServer, $FtpLogin, $FtpPassword; if (file_exists($dir)) return; if (!file_exists(dirname($dir))) mkdirp(dirname($dir)); /*BEGIN CUSTOM CODE*/ $safemode = ini_get('safe_mode'); if($safemode) { $conn_id = ftp_connect($FtpServer); $login_result = ftp_login($conn_id, $FtpLogin, $FtpPassword); if(ftp_mkdir($conn_id, $dir)) { ftp_close($conn_id); fixperms($dir); if (@touch("$dir/xxx")) { unlink("$dir/xxx"); return; } rmdir($dir); } else ftp_close($conn_id); } else { if (mkdir($dir, 0777)) { fixperms($dir); if (@touch("$dir/xxx")) { unlink("$dir/xxx"); return; } rmdir($dir); } } /*END CUSTOM CODE*/ $parent = realpath(dirname($dir)); $perms = decoct(fileperms($parent) & 03777); $msg = "PmWiki needs to have a writable <tt>$dir/</tt> directory before it can continue. You can create the directory manually by executing the following commands on your server: <pre> mkdir $parent/$dir\n chmod 777 $parent/$dir</pre> Then, <a href='$ScriptUrl'>reload this page</a>."; $safemode = ini_get('safe_mode'); if (!$safemode) $msg .= "<br /><br />Or, for a slightly more secure installation, try executing <pre> chmod 2777 $parent</pre> on your server and following <a target='_blank' href='$ScriptUrl'> this link</a>. Afterwards you can restore the permissions to their current setting by executing <pre> chmod $perms $parent</pre>."; Abort($msg); }
You'll have to define $FtpServer, $FtpLogin, $FtpPassword in local/config.php. Now, sub-directories creation works fine. --JFH