function _backup_migrate_destination_file_check_web_dir in Backup and Migrate 5.2
Check that a web accessible directory has been properly secured, othewise attempt to secure it.
1 call to _backup_migrate_destination_file_check_web_dir()
- _backup_migrate_destination_file_check_dir in includes/
destinations.file.inc - Prepare the destination directory for the backups.
File
- includes/
destinations.file.inc, line 105 - Functions to handle the local server directory backup destinations.
Code
function _backup_migrate_destination_file_check_web_dir($directory) {
// Check for a htaccess file which adequately protects the backup files.
$htaccess_lines = "order allow,deny\ndeny from all\n";
if (!is_file($directory . '/.htaccess') || strpos(file_get_contents($directory . '/.htaccess'), $htaccess_lines) === FALSE) {
// Attempt to protect the backup files from public access using htaccess.
if (($fp = @fopen($directory . '/.htaccess', 'w')) && @fputs($fp, $htaccess_lines)) {
fclose($fp);
chmod($directory . '/.htaccess', 0664);
}
else {
$message = "Security warning: Couldn't modify .htaccess file. Please create a .htaccess file in your %directory directory which contains the following lines: <code>!htaccess</code> or add them to the existing .htaccess file";
$replace = array(
'%directory' => $directory,
'!htaccess' => '<br />' . nl2br(check_plain($htaccess_lines)),
);
drupal_set_message(t($message, $replace), "error");
watchdog('security', t($message, $replace), WATCHDOG_ERROR);
return FALSE;
}
}
// Check the user agent to make sure we're not responding to a request from drupal itself.
// That should prevent infinite loops which could be caused by poormanscron in some circumstances.
if (strpos($_SERVER['HTTP_USER_AGENT'], 'Drupal') !== FALSE) {
return FALSE;
}
// Check to see if the destination is publicly accessible
$test_contents = "this file should not be publicly accesible";
// Create the the text.txt file if it's not already there.
if (!is_file($directory . '/test.txt') || file_get_contents($directory . '/test.txt') != $test_contents) {
if ($fp = fopen($directory . '/test.txt', 'w')) {
@fputs($fp, $test_contents);
fclose($fp);
}
else {
$message = t("Security notice: Backup and Migrate was unable to write a test text file to the destination directory %directory, and is therefore unable to check the security of the backup destination. Backups to the server will be disabled until the destination becomes writable and secure.", array(
'%directory' => $directory,
));
drupal_set_message($message, "error");
return FALSE;
}
}
// Attempt to read the test file via http. This may fail for other reasons,
// so it's not a bullet-proof check.
$path = trim(drupal_substr($directory . '/test.txt', drupal_strlen(file_directory_path())), '\\/');
if (_backup_migrate_test_file_readable_remotely($filename, $contents)) {
$message = t("Security notice: Backup and Migrate will not save backup files to the server because the destination directory is publicly accessible. If you want to save files to the server, please secure the '%directory' directory", array(
'%directory' => $directory,
));
drupal_set_message($message, "error");
return FALSE;
}
return $directory;
}