diff --git a/htdocs/ftp/index.php b/htdocs/ftp/index.php index 4da37cde779aade99f95d039c2580cd9a9009631..19c4b50dc7db7ad6a51b03e923cb0de4828a6524 100644 --- a/htdocs/ftp/index.php +++ b/htdocs/ftp/index.php @@ -38,12 +38,13 @@ if ($user->societe_id) $socid=$user->societe_id; $result = restrictedArea($user, 'ftp',''); // Get parameters -$action = isset($_GET["action"])?$_GET["action"]:$_POST['action']; -$section=isset($_GET["section"])?$_GET["section"]:$_POST['section']; +$action=GETPOST('action'); +$section=GETPOST('section'); if (! $section) $section='/'; $numero_ftp = GETPOST("numero_ftp"); -if (! $numero_ftp) $numero_ftp=1; -$file=isset($_GET["file"])?$_GET["file"]:$_POST['file']; +/* if (! $numero_ftp) $numero_ftp=1; */ +$file=GETPOST("file"); +$confirm=GETPOST('confirm'); $upload_dir = $conf->ftp->dir_temp; $download_dir = $conf->ftp->dir_temp; @@ -71,18 +72,19 @@ $ftp_user=$conf->global->$s_ftp_user; $ftp_password=$conf->global->$s_ftp_password; $ftp_passive=$conf->global->$s_ftp_passive; +// For result on connection +$ok=0; $conn_id=null; // FTP connection ID +$mesg=''; -/******************************************************************* +/* * ACTIONS - * - * Put here all code to do according to value of "action" parameter - ********************************************************************/ + */ -// Envoie fichier -if ( $_POST["sendit"] && ! empty($conf->global->MAIN_UPLOAD_DOC)) +// Submit file +if (GETPOST("sendit") && ! empty($conf->global->MAIN_UPLOAD_DOC)) { require_once DOL_DOCUMENT_ROOT.'/core/lib/files.lib.php'; @@ -127,7 +129,7 @@ if ( $_POST["sendit"] && ! empty($conf->global->MAIN_UPLOAD_DOC)) } // Action ajout d'un rep -if ($_POST["action"] == 'add' && $user->rights->ftp->setup) +if ($action == 'add' && $user->rights->ftp->setup) { $ecmdir->ref = $_POST["ref"]; $ecmdir->label = $_POST["label"]; @@ -148,7 +150,7 @@ if ($_POST["action"] == 'add' && $user->rights->ftp->setup) } // Remove file -if ($_REQUEST['action'] == 'confirm_deletefile' && $_REQUEST['confirm'] == 'yes') +if ($action == 'confirm_deletefile' && $_REQUEST['confirm'] == 'yes') { // set up a connection or die if (! $conn_id) @@ -246,7 +248,7 @@ if ($_POST["const"] && $_POST["delete"] && $_POST["delete"] == $langs->trans("De } // Remove directory -if ($_REQUEST['action'] == 'confirm_deletesection' && $_REQUEST['confirm'] == 'yes') +if ($action == 'confirm_deletesection' && $confirm == 'yes') { // set up a connection or die if (! $conn_id) @@ -286,7 +288,7 @@ if ($_REQUEST['action'] == 'confirm_deletesection' && $_REQUEST['confirm'] == 'y } // Download directory -if ($_REQUEST['action'] == 'download') +if ($action == 'download') { // set up a connection or die if (! $conn_id) @@ -339,8 +341,7 @@ if ($_REQUEST['action'] == 'download') } else { - //TODO: Translate - setEventMessage('Failed to get file '.$remotefile, 'errors'); + setEventMessages($langs->trans('FailedToGetFile',$remotefile), null, 'errors'); } } @@ -355,11 +356,9 @@ if ($_REQUEST['action'] == 'download') -/******************************************************************* - * PAGE - * - * Put here all code to do according to value of "action" parameter - ********************************************************************/ +/* + * View + */ llxHeader(); @@ -383,10 +382,7 @@ $formfile=new FormFile($db); $userstatic = new User($db); - -//*********************** // List -//*********************** print_fiche_titre($langs->trans("FTPArea")); print $langs->trans("FTPAreaDesc")."<br>"; @@ -397,18 +393,17 @@ if (! function_exists('ftp_connect')) } else { - if (! empty($ftp_server)) + if (! empty($ftp_server)) { - // Confirm remove file - if ($_GET['action'] == 'delete') + if ($action == 'delete') { print $form->formconfirm($_SERVER["PHP_SELF"].'?numero_ftp='.$numero_ftp.'§ion='.urlencode($_REQUEST["section"]).'&file='.urlencode($_GET["file"]), $langs->trans('DeleteFile'), $langs->trans('ConfirmDeleteFile'), 'confirm_deletefile','','',1); } // Confirmation de la suppression d'une ligne categorie - if ($_GET['action'] == 'delete_section') + if ($action == 'delete_section') { print $form->formconfirm($_SERVER["PHP_SELF"].'?numero_ftp='.$numero_ftp.'§ion='.urlencode($_REQUEST["section"]).'&file='.urlencode($_GET["file"]), $langs->trans('DeleteSection'), $langs->trans('ConfirmDeleteSection',$ecmdir->label), 'confirm_deletesection','','',1); @@ -417,8 +412,9 @@ else print $langs->trans("Server").': <b>'.$ftp_server.'</b><br>'; print $langs->trans("Port").': <b>'.$ftp_port.'</b> '.($ftp_passive?"(Passive)":"(Active)").'<br>'; print $langs->trans("User").': <b>'.$ftp_user.'</b><br>'; - - print $langs->trans("Directory").': '; + print $langs->trans("FTPs (FTP over SSH)").': <b>'.yn($conf->global->FTP_CONNECT_WITH_SSL).'</b><br>'; + print $langs->trans("SFTP (FTP as a subsytem of SSH)").': <b>'.yn($conf->global->FTP_CONNECT_WITH_SFTP).'</b><br>'; + print $langs->trans("Directory").': '; $sectionarray=preg_split('|[\/]|',$section); // For / $newsection='/'; @@ -465,24 +461,43 @@ else print '</tr>'."\n"; // set up a connection or die - if (! $conn_id) + if (empty($conn_id)) { $resultarray=dol_ftp_connect($ftp_server, $ftp_port, $ftp_user, $ftp_password, $section, $ftp_passive); + $conn_id=$resultarray['conn_id']; $ok=$resultarray['ok']; $mesg=$resultarray['mesg']; - } if ($ok) { //$type = ftp_systype($conn_id); - $newsectioniso=utf8_decode($section); - $buff = ftp_rawlist($conn_id, $newsectioniso); - $contents = ftp_nlist($conn_id, $newsectioniso); // Sometimes rawlist fails but never nlist - //var_dump($contents); - //var_dump($buff); + $newsection=$section; + $newsectioniso=utf8_decode($section); + //$newsection='/home'; + + // List content of directory ($newsection = '/', '/home', ...) + if (! empty($conf->global->FTP_CONNECT_WITH_SFTP)) + { + if ($newsection == '/') $newsection='/./'; # workaround for bug https://bugs.php.net/bug.php?id=64169 + //$dirHandle = opendir("ssh2.sftp://$conn_id".$newsection); + //var_dump($dirHandle); + $contents = scandir('ssh2.sftp://' . $conn_id . $newsection); + $buff=array(); + foreach($contents as $i => $key) + { + $buff[$i]="---------- - root root 1234 Aug 01 2000 ".$key; + } + } + else + { + $buff = ftp_rawlist($conn_id, $newsectioniso); + $contents = ftp_nlist($conn_id, $newsectioniso); // Sometimes rawlist fails but never nlist + //var_dump($contents); + //var_dump($buff); + } $nboflines=count($contents); $var=true; @@ -590,9 +605,16 @@ else } - print "</table>"; + + if (! $ok) + { + print $mesg.'<br>'."\n"; + setEventMessages($mesg, null, 'errors'); + } + + // Actions /* if ($user->rights->ftp->write && ! empty($section)) @@ -611,19 +633,42 @@ else } else { - print $langs->trans("SetupOfFTPClientModuleNotComplete"); + $s_ftp_server='FTP_SERVER_1'; + if (empty($s_ftp_server)) + { + print $langs->trans("SetupOfFTPClientModuleNotComplete"); + } + else + { + print $langs->trans("ChooseAFTPEntryIntoMenu"); + } } } print '<br>'; // Close FTP connection -if ($conn_id) ftp_close($conn_id); +if ($conn_id) +{ + if (! empty($conf->global->FTP_CONNECT_WITH_SFTP)) + { + + } + else if (! empty($conf->global->FTP_CONNECT_WITH_SSL)) + { + ftp_close($conn_id); + } + else + { + ftp_close($conn_id); + } +} + + +llxFooter(); -// End of page $db->close(); -llxFooter(); /** @@ -642,46 +687,90 @@ function dol_ftp_connect($ftp_server, $ftp_port, $ftp_user, $ftp_password, $sect global $langs, $conf; $ok=1; - + $conn_id=null; + if (! is_numeric($ftp_port)) { - $mesg=$langs->trans("FailedToConnectToFTPServer",$ftp_server,$ftp_port); + $mesg=$langs->transnoentitiesnoconv("FailedToConnectToFTPServer",$ftp_server,$ftp_port); $ok=0; } if ($ok) { $connecttimeout=(empty($conf->global->FTP_CONNECT_TIMEOUT)?40:$conf->global->FTP_CONNECT_TIMEOUT); - if (! empty($conf->global->FTP_CONNECT_WITH_SSL)) $conn_id = ftp_ssl_connect($ftp_server, $ftp_port, $connecttimeout); - else $conn_id = ftp_connect($ftp_server, $ftp_port, $connecttimeout); - if ($conn_id) + if (! empty($conf->global->FTP_CONNECT_WITH_SFTP)) + { + dol_syslog('Try to connect with ssh2_ftp'); + $tmp_conn_id = ssh2_connect($ftp_server, $ftp_port); + } + else if (! empty($conf->global->FTP_CONNECT_WITH_SSL)) + { + dol_syslog('Try to connect with ftp_ssl_connect'); + $conn_id = ftp_ssl_connect($ftp_server, $ftp_port, $connecttimeout); + } + else + { + dol_syslog('Try to connect with ftp_connect'); + $conn_id = ftp_connect($ftp_server, $ftp_port, $connecttimeout); + } + if ($conn_id || $tmp_conn_id) { if ($ftp_user) { - if (ftp_login($conn_id, $ftp_user, $ftp_password)) + if (! empty($conf->global->FTP_CONNECT_WITH_SFTP)) { - // Turn on passive mode transfers (must be after a successful login - if ($ftp_passive) ftp_pasv($conn_id, true); - - // Change the dir - $newsectioniso=utf8_decode($section); - ftp_chdir($conn_id, $newsectioniso); - } + if (ssh2_auth_password($tmp_conn_id, $ftp_user, $ftp_password)) + { + // Turn on passive mode transfers (must be after a successful login + //if ($ftp_passive) ftp_pasv($conn_id, true); + + // Change the dir + $newsectioniso=utf8_decode($section); + //ftp_chdir($conn_id, $newsectioniso); + $conn_id = ssh2_sftp($tmp_conn_id); + if (! $conn_id) + { + $mesg=$langs->transnoentitiesnoconv("FailedToConnectToSFTPAfterSSHAuthentication"); + $ok=0; + $error++; + } + } + else + { + $mesg=$langs->transnoentitiesnoconv("FailedToConnectToFTPServerWithCredentials"); + $ok=0; + $error++; + } + } else { - $mesg=$langs->trans("FailedToConnectToFTPServerWithCredentials"); - $ok=0; + if (ftp_login($conn_id, $ftp_user, $ftp_password)) + { + // Turn on passive mode transfers (must be after a successful login + if ($ftp_passive) ftp_pasv($conn_id, true); + + // Change the dir + $newsectioniso=utf8_decode($section); + ftp_chdir($conn_id, $newsectioniso); + } + else + { + $mesg=$langs->transnoentitiesnoconv("FailedToConnectToFTPServerWithCredentials"); + $ok=0; + $error++; + } } } } else { - $mesg=$langs->trans("FailedToConnectToFTPServer",$ftp_server,$ftp_port); + dol_syslog('FailedToConnectToFTPServer '.$ftp_server.' '.$ftp_port, LOG_ERR); + $mesg=$langs->transnoentitiesnoconv("FailedToConnectToFTPServer",$ftp_server,$ftp_port); $ok=0; } } - $arrayresult=array('conn_id'=>$conn_id, 'ok'=>$ok, 'mesg'=>$mesg); + $arrayresult=array('conn_id'=>$conn_id, 'ok'=>$ok, 'mesg'=>$mesg, 'curdir'=>$section, 'curdiriso'=>$newsectioniso); return $arrayresult; } diff --git a/htdocs/langs/en_US/ftp.lang b/htdocs/langs/en_US/ftp.lang index 9984ce689eeafee5bd163f7160909f8a123e3b35..d6b9d2ca07072ebb15a208c14cfc33be4bf027de 100644 --- a/htdocs/langs/en_US/ftp.lang +++ b/htdocs/langs/en_US/ftp.lang @@ -10,3 +10,5 @@ FailedToConnectToFTPServerWithCredentials=Failed to login to FTP server with def FTPFailedToRemoveFile=Failed to remove file <b>%s</b>. FTPFailedToRemoveDir=Failed to remove directory <b>%s</b> (Check permissions and that directory is empty). FTPPassiveMode=Passive mode +ChooseAFTPEntryIntoMenu=Choose a FTP entry into menu... +FailedToGetFile=Failed to get files %s \ No newline at end of file