add the code provided from an anonymous user for recursive copy and decompress functions in the browser. Will be audited and corrected to hook properly in the browser
See #1043.
This commit is contained in:
parent
44182f2f19
commit
593fdc17db
|
@ -413,6 +413,143 @@ class m_bro {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Extract an archive by using GNU and non-GNU tools
|
||||||
|
* @param string $file is the full or relative path to the archive
|
||||||
|
* @param string $dest is the path of the extract destination
|
||||||
|
* @return boolean != 0 on error
|
||||||
|
*/
|
||||||
|
function brouteur_extract($file, $dest="./")
|
||||||
|
{
|
||||||
|
static $i=0, $ret;
|
||||||
|
$file = addslashes($file);
|
||||||
|
$dest = addslashes($dest);
|
||||||
|
if ($i == 0) {
|
||||||
|
#TODO new version of tar supports `tar xf ...` so there is no
|
||||||
|
# need to specify the compression format
|
||||||
|
exec("tar -xzf '$file' -C '$dest'", $void, $ret);
|
||||||
|
} else if ($i == 1) {
|
||||||
|
exec("tar -xjf '$file' -C '$dest'", $void, $ret);
|
||||||
|
} else if ($i == 2) {
|
||||||
|
exec("unzip '$file' -d '$dest'", $void, $ret);
|
||||||
|
} else if ($i == 3) {
|
||||||
|
#FIXME I suck at extracting a rar archive to a specified directory
|
||||||
|
# but I think unrar just sucks <TM>
|
||||||
|
$rarfile = ereg_replace('[a-z0-9]+', '..', $dest)."/$file";
|
||||||
|
exec("mkdir -p '$dest'");
|
||||||
|
exec("cd '$dest' && unrar x -o+ '$rarfile'", $void, $ret);
|
||||||
|
} else {
|
||||||
|
return $ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($ret) {
|
||||||
|
$i++;
|
||||||
|
brouteur_extract($file, $dest);
|
||||||
|
}
|
||||||
|
return $ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Copy a source to a destination by either copying recursively a
|
||||||
|
* directory or by downloading a file with a URL (only http:// is
|
||||||
|
* supported)
|
||||||
|
* @param string $name is the application name
|
||||||
|
* @param string $src is the path or URL
|
||||||
|
* @param string $dest is the absolute path inside the users directory
|
||||||
|
* @return boolean false on error
|
||||||
|
*/
|
||||||
|
function brouteur_copy($name, $src, $dest)
|
||||||
|
{
|
||||||
|
global $error, $db;
|
||||||
|
|
||||||
|
$ok = false;
|
||||||
|
@mkdir($dest, 0777);
|
||||||
|
@chmod($dest, 0777);
|
||||||
|
$f = @fopen("$dest/test.php", 'w');
|
||||||
|
if ($f) {
|
||||||
|
@fputs($f, '<?php $ok = true; ?>');
|
||||||
|
@fclose($f);
|
||||||
|
@chmod("$dest/test.php", 0777);
|
||||||
|
include("$dest/test.php");
|
||||||
|
}
|
||||||
|
@unlink("$dest/test.php");
|
||||||
|
@rmdir("$dest");
|
||||||
|
if (!$ok) {
|
||||||
|
$error = _("No write permissions in the destination directory");
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (substr($src, 0, 7) == "http://") {
|
||||||
|
$filename = basename($src);
|
||||||
|
$extractdir = tempnam("/tmp", "brouteur");
|
||||||
|
unlink($extractdir);
|
||||||
|
mkdir($extractdir);
|
||||||
|
|
||||||
|
if (!$http = @fopen($src, "rb")) {
|
||||||
|
// Try to get a handle on $http with fsockopen instead
|
||||||
|
ereg('^http://([^/]+)(/.*)$', $src, $eregs);
|
||||||
|
$hostname = $eregs[1];
|
||||||
|
$path = $eregs[2];
|
||||||
|
$http = @fsockopen($hostname, 80);
|
||||||
|
@fputs($http, "GET $path HTTP/1.1\nHost: $hostname\n\n");
|
||||||
|
}
|
||||||
|
if ($http) {
|
||||||
|
// Save the bits
|
||||||
|
$f = fopen("$extractdir/$filename", "wb");
|
||||||
|
while (!feof($http)) {
|
||||||
|
$bin = fgets($http, 16384);
|
||||||
|
fwrite($f, $bin);
|
||||||
|
#FIXME if (!trim($bin)) break;
|
||||||
|
}
|
||||||
|
fclose($f);
|
||||||
|
fclose($http);
|
||||||
|
} else {
|
||||||
|
// Dammit, try with wget than
|
||||||
|
exec("wget -q '$src' -O '$extractdir/$filename'", $void, $ret);
|
||||||
|
if ($ret) {
|
||||||
|
$error = _("Unable to download the web application's package.");
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Now extract that package
|
||||||
|
if (!brouteur_extract("$extractdir/$filename", $extractdir)) {
|
||||||
|
$error = _("Unable to extract the files");
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
unlink("$extractdir/$filename");
|
||||||
|
|
||||||
|
// Corrupt $src since we want to copy $extractdir/packagename
|
||||||
|
$hd = opendir($extractdir);
|
||||||
|
while ($file = readdir($hd)) {
|
||||||
|
if ($file != "." && $file != "..") {
|
||||||
|
$src = "$extractdir/$file";
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Last step // Copy -R
|
||||||
|
$src = addslashes($src);
|
||||||
|
$dest = addslashes($dest);
|
||||||
|
$array = explode('/', $dest);
|
||||||
|
$dir = "";
|
||||||
|
foreach ($array as $v) {
|
||||||
|
$dir .= "$v/";
|
||||||
|
@mkdir($dest);
|
||||||
|
}
|
||||||
|
#TODO write a recursive copy function(?)
|
||||||
|
exec("cp -Rf '$src'/* '$dest'", $void, $ret);
|
||||||
|
if ($ret) {
|
||||||
|
$error = _("Errors happened while copying the source to destination.");
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
$error = _("The web application has been successfully installed.");
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
/* ----------------------------------------------------------------- */
|
/* ----------------------------------------------------------------- */
|
||||||
/** Affiche le chemin et les liens de la racine au dossier $path
|
/** Affiche le chemin et les liens de la racine au dossier $path
|
||||||
* Affiche autant de liens HTML (anchor) que le chemin $path contient de
|
* Affiche autant de liens HTML (anchor) que le chemin $path contient de
|
||||||
|
|
Loading…
Reference in New Issue