View source
<?php
define('BACKUP_MIGRATE_FILENAME_MAXLENGTH', 255);
function backup_migrate_temp_files_add($filepath = NULL) {
static $files = array();
if (!$filepath) {
return $files;
}
else {
$files[] = $filepath;
}
}
function _backup_migrate_temp_files_delete() {
foreach (backup_migrate_temp_files_add() as $file) {
$file = drupal_realpath($file);
if (file_exists($file) && is_writable($file)) {
unlink($file);
}
}
$dir = file_stream_wrapper_get_instance_by_scheme('temporary')
->getDirectoryPath();
$expire = time() - variable_get('backup_migrate_cleanup_time', 21600);
if (file_exists($dir) && is_dir($dir) && is_readable($dir) && ($handle = opendir($dir))) {
while (FALSE !== ($file = @readdir($handle))) {
if (strpos($file, 'backup_migrate_') === 0 && is_writable("{$dir}/{$file}") && @filectime("{$dir}/{$file}") < $expire) {
unlink("{$dir}/{$file}");
}
}
closedir($handle);
}
}
function _backup_migrate_filetypes() {
backup_migrate_include('filters');
$out = backup_migrate_filters_file_types();
foreach ($out as $key => $info) {
$out[$key]['id'] = empty($info['id']) ? $key : $info['id'];
}
return $out;
}
function _backup_migrate_filename_append_prepare($filename, $append_str) {
$max_name_len = BACKUP_MIGRATE_FILENAME_MAXLENGTH - drupal_strlen($append_str);
if (drupal_strlen($filename) > $max_name_len) {
$filename = drupal_substr($filename, 0, $max_name_len);
}
return $filename;
}
function _backup_migrate_construct_filename($filename, $timestamp = '') {
$token = \Drupal::token();
$filename = $token
->replace($filename);
$filename = preg_replace("/[^a-zA-Z0-9\\.\\-_]/", "", $filename);
$filename = _backup_migrate_filename_append_prepare($filename, $timestamp);
$filename .= '-' . $timestamp;
$filename = trim($filename, '-');
if (drupal_strlen($filename) == 0) {
$filename = 'untitled';
}
return $filename;
}
function _backup_migrate_default_filename() {
return '[site:name]';
}
function _backup_migrate_file_dispose_buffer($buffer) {
return "";
}
class backup_file {
var $file_info = array();
var $type = array();
var $ext = array();
var $path = "";
var $name = "";
var $handle = NULL;
function backup_file($params = array()) {
if (isset($params['filepath']) && file_exists($params['filepath'])) {
$this
->set_filepath($params['filepath']);
}
else {
$this
->set_file_info($params);
$this
->temporary_file();
}
}
function file_id() {
return isset($this->file_info['file_id']) ? $this->file_info['file_id'] : $this
->filename();
}
function filepath() {
return drupal_realpath($this->path);
}
function filename($name = NULL) {
if ($name) {
$this->name = $name;
}
return $this->name . '.' . $this
->extension();
}
function set_filepath($path) {
$this->path = $path;
$params = array(
'filename' => basename($path),
);
if (file_exists($path)) {
$params['filesize'] = filesize($path);
$params['filetime'] = filectime($path);
}
$this
->set_file_info($params);
}
function info($key = NULL) {
if ($key) {
return @$this->file_info[$key];
}
return $this->file_info;
}
function extension() {
return implode(".", $this->ext);
}
function type() {
return $this->type;
}
function mimetype() {
return @$this->type['filemime'] ? $this->type['filemime'] : 'application/octet-stream';
}
function type_id() {
return @$this->type['id'];
}
function can_backup() {
return @$this->type['backup'];
}
function can_restore() {
return @$this->type['restore'];
}
function is_recognized_type() {
return @$this->type['restore'] || @$this->type['backup'];
}
function open($write = FALSE, $binary = FALSE) {
if (!$this->handle) {
$path = $this
->filepath();
if ($write && (file_exists($path) && !is_writable($path) || !is_writable(dirname($path)))) {
_backup_migrate_message('The file %path cannot be written to.', array(
'%path' => $path,
), 'error');
return FALSE;
}
if (!$write && !is_readable($path)) {
_backup_migrate_message('The file %path cannot be read.', array(
'%path' => $path,
), 'error');
return FALSE;
}
$mode = ($write ? "w" : "r") . ($binary ? "b" : "");
$this->handle = fopen($path, $mode);
return $this->handle;
}
return NULL;
}
function close() {
fclose($this->handle);
$this->handle = NULL;
}
function write($data) {
if (!$this->handle) {
$this->handle = $this
->open(TRUE);
}
if ($this->handle) {
fwrite($this->handle, $data);
}
}
function read($size = NULL) {
if (!$this->handle) {
$this->handle = $this
->open();
}
if ($this->handle && !feof($this->handle)) {
return $size ? fread($this->handle, $size) : fgets($this->handle);
}
return NULL;
}
function put_contents($data) {
file_put_contents($this
->filepath(), $data);
}
function get_contents() {
return file_get_contents($this
->filepath());
}
function transfer() {
$headers = array(
array(
'key' => 'Content-Type',
'value' => $this
->mimetype(),
),
array(
'key' => 'Content-Disposition',
'value' => 'attachment; filename="' . $this
->filename() . '"',
),
);
if ($size = $this
->info('filesize')) {
$headers[] = array(
'key' => 'Content-Length',
'value' => $size,
);
}
@ob_end_clean();
if ($this
->open(FALSE, TRUE)) {
foreach ($headers as $header) {
$header['value'] = preg_replace('/\\r?\\n(?!\\t| )/', '', $header['value']);
$response = new \Symfony\Component\HttpFoundation\Response();
$response->headers
->set($header['key'], $header['value']);
$response
->send();
}
while ($data = $this
->read(1024)) {
print $data;
}
$this
->close();
$GLOBALS['devel_shutdown'] = FALSE;
}
else {
drupal_not_found();
}
ob_start('_backup_migrate_file_dispose_buffer');
backup_migrate_cleanup();
Drupal::moduleHandler()
->invokeAll('exit');
exit;
}
function push_type($extension) {
$types = _backup_migrate_filetypes();
if ($type = @$types[$extension]) {
$this
->push_filetype($type);
}
$out = $this
->filepath();
$this
->temporary_file();
return $out;
}
function pop_type() {
$out = new backup_file(array(
'filepath' => $this
->filepath(),
));
$this
->pop_filetype();
$this
->temporary_file();
return $out;
}
function set_filetype($type) {
$this->type = $type;
$this->ext = array(
$type['extension'],
);
}
function push_filetype($type) {
$this->ext[] = $type['extension'];
$this->type = $type;
}
function pop_filetype() {
array_pop($this->ext);
$this
->detect_filetype_from_extension();
}
function set_file_info($file_info) {
$this->file_info = $file_info;
$this->ext = explode('.', @$this->file_info['filename']);
foreach ($this->ext as $key => $val) {
$this->ext[$key] = trim($val, '_');
}
$this
->filename(array_shift($this->ext));
$this
->detect_filetype_from_extension();
}
function detect_filetype_from_extension() {
$ext = end($this->ext);
$this->type = array();
$types = _backup_migrate_filetypes();
foreach ($types as $key => $type) {
if (trim($ext, "_0123456789") === $type['extension']) {
$this->type = $type;
$this->type['id'] = $key;
}
}
}
function temporary_file() {
$file = drupal_tempnam('temporary://', 'backup_migrate_');
backup_migrate_temp_files_add($file);
if ($this
->extension()) {
$file .= '.' . $this
->extension();
backup_migrate_temp_files_add($file);
}
$this->path = $file;
}
}