Wiki source for FilesActionSafeModeWorkaround


Show raw source

=====Files cannot be uploaded=====

===Symptoms===
The FilesAction complains about not being able to sucesfully move_uploaded_file() after an upload, even though the upload directory has been created and has correct permissions:
##**Warning:** move_uploaded_file() [function.move-uploaded-file]: SAFE MODE Restriction in effect. The script whose uid is 24822 is not allowed to access ""/uploads/SandBox"" owned by uid 99 in **/actions/files.php** on line **127**
**There was an error uploading your file.**##

===Cause===
[[http://www.php.net/features.safe-mode | PHP safe mode]] is activated, and the server and scripts run as different users.

===Applies to===

Version 1.1.6.0 (and very probably all earlier and future versions, since this is a "property" of the environment where the Wikka is run). This solution can only be applied when you have FTP acess to your website.

===Solution===

Instead of mkdir(), we have to create the directories using FTP. The following code was found in the [[http://www.php.net/manual/en/function.mkdir.php#53684 | comments to the mkdir()]] function on www.php.net.

Open the file **actions/files.php** and before the mkdir_r() function definition, add the following code:
%%(php)
// create directory through FTP connection
function FtpMkdir($path, $newDir) {

$server='ftp.server.com'; // ftp server
$connection = ftp_connect($server); // connection


// login to ftp server
$user = "me";
$pass = "pass";
$result = ftp_login($connection, $user, $pass);

// check if connection was made
if ((!$connection) || (!$result)) {
return false;
exit();
} else {
ftp_chdir($connection, $path); // go to destination dir
if(ftp_mkdir($connection, $newDir)) { // create directory
ftp_site($connection, "CHMOD 775 $newDir") or die("FTP SITE CMD failed.");
return $newDir;
} else {
return false;
}
ftp_close($connection); // close connection
}
}
%%
Change the login information accordingly.

Now, find the following code (still in **actions/files.php**)
%%(php)
if (! function_exists('mkdir_r')) {
function mkdir_r ($dir) {
if (strlen($dir) == 0) return 0;
if (is_dir($dir)) return 1;
elseif (dirname($dir) == $dir) return 1;
return (mkdir_r(dirname($dir)) and mkdir($dir));
}
}
%%

and change it to
%%(php)
if (! function_exists('mkdir_r')) {
function mkdir_r ($dir) {
if (strlen($dir) == 0) return 0;
if (is_dir($dir)) return 1;
elseif (dirname($dir) == $dir) return 1;
return (mkdir_r(dirname($dir)) and FtpMkdir('/PathToWikkaDirOnFTP',$dir));
}
}
%%
(**Note:** Don't forget to change the ""'/PathToWikkaDirOnFTP'"" according to your set-up. I believe that a simple '/' will probably sufficient in the majority of cases)
===Refinement===
This could be refined so that a new FTP connection isn't created for every directory we're creating recursively. Also, the parameters could probably be placed in **wikka.config.php** but since this is a very specific fix for a very specific situation, I don't think it's worth the effort. And lastly, the ""FtpMkdir()"" function could be placed in a conditional block to prevent it from being redeclared (but how real that possibility is, I don't know).
----
CategoryWorkaround
Valid XHTML :: Valid CSS: :: Powered by WikkaWiki