<?php
/***************************************************************************************

~> FTP CONECTOR v1.0

Autor: Anderson Dad�rio
Licen�a: GPL
E-mail: andersonmvd@hotmail.com

~ Depend�ncias:

- Criar um arquivo no mesmo diret�rio deste arquivo com o nome: "info.ftp.class.php"
- Criar um diret�rio no mesmo diret�rio deste arquivo com o nome: "temp"
- D� permiss�o geral ai nos arquivos e no diret�rio "temp"

*****************************************************************************************/


session_start();
set_time_limit(0);

require "info.ftp.class.php"; // Arquivo com as configura��es da classe ftp

if($_SERVER['QUERY_STRING'] == 'destruir'){ session_destroy();header("Location: ".$_SERVER['PHP_SELF'].""); }


class ftp
{

private $host, $port, $timeout, $user, $pass;
var $socket, $info, $dir, $nCampos, $nTamanho;


function __construct($host, $port=21, $timeout=90, $user, $pass, $seguro)
{
if(empty($host)){ $host = base64_decode($conf_host); }
if(empty($port)){ $port = base64_decode($conf_port); }
if(empty($timeout)){ $timeout = base64_decode($conf_timeout); }
if(empty($user)){ $user = base64_decode($conf_user); }
if(empty($pass)){ $pass = base64_decode($conf_pass); }
if(empty($seguro)){ $seguro = base64_decode($conf_seguro); }

$this->host = $host;
$this->port = $port;
$this->timeout = $timeout;
$this->user = $user;
$this->pass = $pass;
$this->info = "info.ftp.class.php";       // Arquivo no qual estar�o salvas as informa��es da conex�o
$this->dir = "temp";                      // Diret�rio respons�vel por armazenar os arquivos baixados por FTP
$this->nCampos = 5;                       // Quantidade de campos para enviar arquivos
$this->nTamanho = 100;                    // Tamanho em MB de cada arquivo que pode ser enviado por upload

if(@!$this->Con())
{
exit("<center><font face=verdana size=2>Houveram problemas durante a tentativa de conex�o<br><br><a href='?destruir'>Conectar-se novamente</a></font></center>");
}

if(!isset($_GET['caminho']))
{
$this->Salvar();
exit("<script language='JavaScript'>location='?caminho=\.'</script>");
}
else{ 

if(isset($_GET['dwn']) && !empty($_GET['dwn'])){ $this->Download($_GET['dwn']); }
elseif(isset($_GET['pasta']) && !empty($_GET['pasta'])){ $this->NovoDir($_GET['pasta']); }
elseif(isset($_GET['cmd']) && !empty($_GET['cmd'])){ $this->Comando($_GET['cmd']); }
elseif(isset($_GET['enviar']) && !empty($_GET['enviar'])){ $this->UploadForm();exit; }
$this->chDir($_GET['caminho']);

}
}

function __destruct()
{
$this->Des();
# shell_exec("del ".$this->dir."/*.*");
# unlink($this->info);
}

// ================ Conex�o
public function Con()
{
if($this->seguro == true){ $this->socket = ftp_ssl_connect($this->host,$this->port,$this->timeout); }
else{ $this->socket = ftp_connect($this->host,$this->port,$this->timeout); }

if($this->Aut()){ return TRUE; }
else{ return FALSE; }


}
// ================ Autentica��o
public function Aut()
{
if(ftp_login($this->socket, $this->user, $this->pass)){ return TRUE; }
else{ return FALSE; }
}
// ================ Desconcetar
public function Des()
{
if(!empty($this->$socket)){ ftp_close($socket); }
else { return FALSE; }
# unlink($this->file);
}
// ================ Aloca��o
private function Aloc($bytes)
{
if (ftp_alloc($this->con(), filesize($bytes), $retorno))
{ return $retorno; }
else{ return FALSE; }
}
// ================ Upload
public function Upload($nome, $file)
{
// if(!$this->Aloc(filesize($file))){ return FALSE; }

if(empty($nome) || empty($file)){ return FALSE; }

if(ftp_put($this->socket, $nome, $file, FTP_ASCII)){ fclose($fp);return TRUE; }
elseif(ftp_put($this->socket, $nome, $file, FTP_BINARY)){ fclose($fp);return TRUE; }
else{ fclose($fp);return FALSE; }
}
// ================ Upload Form
public function UploadForm()
{

echo "<head><title>Enviar arquivos para: ".$_GET['caminho']."</title></head>
<form name='upload' action='?caminho=".$_GET['caminho']."' method='post' enctype='multipart/form-data' onsubmit=\"document.upload.u.value='Aguarde ...';document.upload.u.disabled=true\"><center><p><input type='file' name='arquivo[]' style='color:green; background:white;border: 1px solid darkgray'>";

for($i=0;$i < $this->nCampos; $i++)
{
echo"<br />  <input type='file' name='arquivo[]' style='color:green; background:white;border: 1px solid darkgray' />\n";
}

echo"<br /><input type='submit' name='u' value='Enviar Tudo' style='color:black;background:white;border: 1px solid darkgray;'></p></center></form><br>
<center><a href='?caminho=".$_GET['caminho']."'><font face=verdana size=2 color=red>Retornar</font></a></center>";



}
// ================ Listar
public function Listar()
{
$var=ftp_nlist($this->socket,$this->Atual()); // var_dump($var) || print_r($var)
$pastas = array();
$arquivos = array();
foreach($var as $chave => $valor)
{
if($this->Tamanho($valor) < 0) { array_unshift($pastas,$valor); }
else{ array_unshift($arquivos,$valor); }
}

# Visualiza��o ~~ Come�a

echo "<title>FTP CONECTOR v1.0 - Voc� est� em: ".$this->Atual()."</title>";

echo "<font face=verdana size=2>Diret�rios:<br><br>";
foreach($pastas as $nome){ echo "<a href=\"?caminho=$nome\">$nome</a><br>"; }
echo "</font><br><br>";

echo "<font face=verdana size=2>Arquivos:<br><br>";
foreach($arquivos as $nome){ echo "<a href=\"?caminho=".$_GET['caminho']."&dwn=$nome\">$nome</a><br>"; }
echo "</font>";

# Visualiza��o ~~ Termina

echo "<br><br><center><a href='?destruir'><font face=verdana size=2 color=red>Disconnect</font></a> || <a href=\"?caminho=".$_GET['caminho']."&enviar=true\"><font face=verdana size=2 color=red>Put Files</font></a></center>";

}
// ================ Download
public function Download($arq_servidor)
{
$errey = explode("/",$arq_servidor);
$errey = array_reverse($errey);
$concat = "".$this->dir."/".$errey[0]."";

if($var = ftp_get($this->socket, $concat, $arq_servidor, FTP_BINARY)){
$tamanho = filesize($concat);

header("Content-Type: application/save"); 
header("Content-Length: $tamanho");
header("Content-Disposition: attachment; filename=$errey[0]"); 
header("Content-Transfer-Encoding: binary"); 
$fp = fopen($concat, "r");fpassthru($fp);fclose($fp);return TRUE; }
else{ return FALSE; }

}
// ================ Dir Atual
public function Atual()
{
return "".ftp_pwd($this->socket)."";
}
// ================ File Size
public function Tamanho($arquivo)
{
if(empty($arquivo)){ return FALSE; }
else{ return ftp_size($this->socket,$arquivo); }
}
// ================ Cria dir
public function NovoDir($dir)
{
if(empty($dir)){ return FALSE; }
else{ return (ftp_mkdir($this->socket,$dir)) ? TRUE : FALSE; }
}
// ================ Op��es
public function Info()
{
$inf = array();
$inf[0] = ftp_systype($this->socket);
$inf[1] = ftp_get_option($this->socket);
return $inf;
}
// ================ Comando
public function Comando($cmd)
{
if(ftp_site($this->socket,$cmd)){ return TRUE; }
else{ return FALSE; }
}
// ================ CD ..
public function DirUp()
{
return ftp_cdup($this->socket);
}
// ================ mudar CD..
public function chDir($dir)
{
if(ftp_chDir($this->socket,$dir)){ return TRUE; }
else{ return FALSE; }
}
// ================ CHMOD
public function chmod($chmod,$oque)
{
if(ftp_chmod($this->socket, $chmod, $oque) !== false){ return TRUE; }
else{ return FALSE; }
}
// ================ Salvando
public function Salvar()
{
$fp = fopen($this->info,"w");
fputs($fp,"<?php
\$conf_host = \"".base64_encode($this->host)."\";
\$conf_port = \"".base64_encode($this->port)."\";
\$conf_timeout = \"".base64_encode($this->timeout)."\";
\$conf_user = \"".base64_encode($this->user)."\";
\$conf_pass = \"".base64_encode($this->pass)."\";
\$conf_seguro = \"".base64_encode($this->seguro)."\";
?>");
fclose($fp);
}

} // fim da classe





# Usando: new ftp( [STR] $host, [INT] $porta, [INT] $timeout, [STR] $usuario, [STR] $senha, [BOOL] $conexao_ssl)

if(getenv('REQUEST_METHOD') == "POST")
{
if(isset($_POST['logar']))
{
$host = $_POST['host'];
$port = $_POST['port'];
$timeout = $_POST['timeout'];
$user = $_POST['user'];
$pass = $_POST['pass'];
$seguro = $_POST['seguro'];
$form = true;
session_register('host');
session_register('port');
session_register('timeout');
session_register('user');
session_register('pass');
session_register('seguro');
session_register('form');
}
else
{
$classe = new ftp($_SESSION['host'],$_SESSION['port'],$_SESSION['timeout'],$_SESSION['user'],$_SESSION['pass'],$_SESSION['seguro']);
for($i=0;$i<count($_FILES[arquivo][name]);$i++){
      $type=$_FILES[arquivo][type][$i];

$name=$_FILES[arquivo][name][$i];
$name=explode('/',$name);
$name=join('',$name);
$name=str_replace("\'","",$name);
$name=str_replace("'","",$name);

      $temp_name=$_FILES[arquivo][tmp_name][$i];
      $file_erros=$_FILES[arquivo][error][$i];
	  $tamanho=$_FILES[arquivo][size][$i];


// if (is_file($_FILES[arquivo][$i])) {
if(!empty($name)){

                if($tamanho > $classe->nTamanho*1024*1024){ echo "O arquivo $name � maior do que o limite definido.";exit; }
                elseif($file_erros==1 || $file_erros==2) { echo "O arquivo $name � maior do que o limite definido.";exit; }
                elseif($file_erros==3) { echo "O arquivo $name est� corrompido.";exit;  }
                elseif($file_erros==4) { echo "N�o foi feito a transfer�ncia do arquivo: $name";exit;  }
                elseif(!$file_erros){

move_uploaded_file($temp_name, "".$classe->dir."/" . $name) or die("Erro ao mover arquivo");
if(@!$classe->Upload($name,"".$classe->dir."/" . $name))
{
exit("<center><font face=verdana size=2>Houveram erros ao tentar enviar o arquivo para o servidor<br><br><a href='javascript:history.back()'>Tentar novamente</a></font></center>"); 
} // fim do if
} // fim do elseif

          }// fim do if
}// fim do for
echo "<center><font face=verdana size=2 color=green>Arquivos enviados com sucesso!<br><br></font></center>";

	} // fim do else

} // fim do post


if($_SESSION['form'] == true){
$ftp = new ftp($_SESSION['host'],$_SESSION['port'],$_SESSION['timeout'],$_SESSION['user'],$_SESSION['pass'],$_SESSION['seguro']);
$ftp->Listar(); }
else{
echo"
<center>
<title>FTP CONECTOR v1.0 - Feito por Anderson Dad�rio</title>
<font face='Arial Black' size='3'>FTP CONECTOR v1.0</font><br><br>
<form action='ftp.class.php' method=post>
<input type=hidden name=logar value=true>
<table border=0 width='50%' cellspace='0'>
<tr><td width='25%' align='center'><font face=verdana size=2>Host:</font></td><td align=center><input type=text name=host style='width: 175px;'></td></tr>
<tr><td width='25%' align='center'><font face=verdana size=2>Porta:</font></td><td align=center><input type=text name=port value=21 style='width: 175px;'></td></tr>
<tr><td width='25%' align='center'><font face=verdana size=2>Timeout:</font></td><td align=center><input type=text name=timeout value=90 style='width: 175px;'></td></tr>
<tr><td width='25%' align='center'><font face=verdana size=2>Usuario:</font></td><td align=center><input type=text name=user style='width: 175px;'></td></tr>
<tr><td width='25%' align='center'><font face=verdana size=2>Senha:</font></td><td align=center><input type=password name=pass style='width: 175px;'></td></tr>
<tr><td width='25%' align='center'><font face=verdana size=2>Seguro:</font></td><td align=center><select name=seguro style='width: 175px;'><option value=true>TRUE</option><option value=false>FALSE</option></select></td></tr>
</table><br>
<input type=submit value=Entrar style='background: white;color: black;width: 150px;'>
</form><br>
<font face='verdana' size='2'>Feito por <a href='mailto:andersonmvd@hotmail.com'>Anderson Dad�rio</a></font>";
}
?>