View source
<?php
class hackedProjectWebFilesDownloader extends hackedProjectWebDownloader {
function download_link() {
if (!empty($this->project->project_info['releases'][$this->project->existing_version])) {
$this_release = $this->project->project_info['releases'][$this->project->existing_version];
return $this_release['download_link'];
}
}
function download() {
$dir = $this
->get_destination();
if (!($release_url = $this
->download_link())) {
return FALSE;
}
if (file_exists($dir) && count(hacked_file_scan_directory($dir, '/.*/', array(
'.',
'..',
'CVS',
'.svn',
'.git',
)))) {
return $dir;
}
if (!file_prepare_directory($dir, FILE_CREATE_DIRECTORY) && !mkdir($dir, 0775, TRUE)) {
watchdog('hacked', 'Failed to create temp directory: %dir', array(
'%dir' => $dir,
), WATCHDOG_ERROR);
return FALSE;
}
if (!($local_file = $this
->file_get($release_url))) {
watchdog('hacked', 'Could not download the project: @name from URL: @url', array(
'@name' => $this->project
->title(),
'@url' => $release_url,
), WATCHDOG_ERROR);
return FALSE;
}
try {
$this
->archive_extract($local_file, $dir);
} catch (Exception $e) {
watchdog('hacked', 'Could not extract the project: @name. Error was: !error', array(
'@name' => $this->project
->title(),
'!error' => $e
->getMessage(),
), WATCHDOG_ERROR);
return FALSE;
}
return TRUE;
}
function file_get($url) {
$parsed_url = parse_url($url);
$remote_schemes = array(
'http',
'https',
'ftp',
'ftps',
'smb',
'nfs',
);
if (!in_array($parsed_url['scheme'], $remote_schemes)) {
return drupal_realpath($url);
}
$cache_directory = 'temporary://hacked-cache';
$local = $cache_directory . '/' . basename($parsed_url['path']);
if (!file_exists($cache_directory)) {
mkdir($cache_directory);
}
return system_retrieve_file($url, $local, FALSE, FILE_EXISTS_REPLACE);
}
function archive_extract($file, $directory) {
$archiver = archiver_get_archiver($file);
if (!$archiver) {
throw new Exception(t('Cannot extract %file, not a valid archive.', array(
'%file' => $file,
)));
}
$files = $archiver
->listContents();
$project = drupal_substr($files[0], 0, -1);
$extract_location = $directory . '/' . $project;
if (file_exists($extract_location)) {
file_unmanaged_delete_recursive($extract_location);
}
$archiver
->extract($directory);
return $archiver;
}
}