diff --git a/lib/Alchemy/Phrasea/Core/Provider/FtpServiceProvider.php b/lib/Alchemy/Phrasea/Core/Provider/FtpServiceProvider.php index 42e9acf169..db6ad0470f 100644 --- a/lib/Alchemy/Phrasea/Core/Provider/FtpServiceProvider.php +++ b/lib/Alchemy/Phrasea/Core/Provider/FtpServiceProvider.php @@ -21,9 +21,11 @@ class FtpServiceProvider implements ServiceProviderInterface */ public function register(Application $app) { - $app['phraseanet.ftp.client'] = $app->protect(function ($host, $port = 21, $timeout = 90, $ssl = false, $proxy = false, $proxyport = false) { - return new \ftpclient($host, $port, $timeout, $ssl, $proxy, $proxyport); - }); + $app['phraseanet.ftp.client'] = $app->protect( + function ($host, $port = 21, $timeout = 90, $ssl = false, $proxy = false, $proxyport = false, $proxyuser = false, $proxypwd = false) { + return new \ftpclient($host, $port, $timeout, $ssl, $proxy, $proxyport, $proxyuser, $proxypwd); + } + ); } /** diff --git a/lib/Alchemy/Phrasea/TaskManager/Editor/FtpEditor.php b/lib/Alchemy/Phrasea/TaskManager/Editor/FtpEditor.php index fd1cf4c7af..f081103ba8 100644 --- a/lib/Alchemy/Phrasea/TaskManager/Editor/FtpEditor.php +++ b/lib/Alchemy/Phrasea/TaskManager/Editor/FtpEditor.php @@ -41,6 +41,8 @@ class FtpEditor extends AbstractEditor + + EOF; } @@ -53,6 +55,8 @@ EOF; return [ 'proxy' => static::FORM_TYPE_STRING, 'proxyport' => static::FORM_TYPE_STRING, + 'proxyuser' => static::FORM_TYPE_STRING, + 'proxypwd' => static::FORM_TYPE_STRING, ]; } } diff --git a/lib/Alchemy/Phrasea/TaskManager/Job/FtpJob.php b/lib/Alchemy/Phrasea/TaskManager/Job/FtpJob.php index 7bbf9f714b..52ec5fc75c 100644 --- a/lib/Alchemy/Phrasea/TaskManager/Job/FtpJob.php +++ b/lib/Alchemy/Phrasea/TaskManager/Job/FtpJob.php @@ -11,6 +11,7 @@ namespace Alchemy\Phrasea\TaskManager\Job; +use ftpclient; use Alchemy\Phrasea\Application; use Alchemy\Phrasea\Application\Helper\NotifierAware; use Alchemy\Phrasea\Model\Serializer\CaptionSerializer; @@ -95,6 +96,8 @@ class FtpJob extends AbstractJob $proxy = (string) $settings->proxy; $proxyport = (string) $settings->proxyport; + $proxyuser = (string) $settings->proxyuser; + $proxypwd = (string) $settings->proxypwd; $state = ""; $ftp_server = $export->getAddr(); @@ -122,7 +125,11 @@ class FtpJob extends AbstractJob try { $ssl = $export->isSsl(); - $ftp_client = $app['phraseanet.ftp.client']($ftp_server, 21, 300, $ssl, $proxy, $proxyport); + /** @var \ftpClient $ftp_client */ + $ftp_client = $app['phraseanet.ftp.client']( + $ftp_server, 21, 300, $ssl, $proxy, $proxyport, + $proxyuser, $proxypwd + ); $ftp_client->login($ftp_user_name, $ftp_user_pass); if ($export->isPassif()) { @@ -261,7 +268,7 @@ class FtpJob extends AbstractJob if ($export->isLogfile()) { $this->log('debug', "logfile "); - $date = new DateTime(); + $date = new \DateTime(); $buffer = '#transfert finished ' . $date->format(DATE_ATOM) . "\n\n"; foreach ($export->getElements() as $exportElement) { diff --git a/lib/classes/ftpclient.php b/lib/classes/ftpclient.php index ba4f5cba18..405ffc3309 100644 --- a/lib/classes/ftpclient.php +++ b/lib/classes/ftpclient.php @@ -12,36 +12,53 @@ class ftpclient { protected $connexion; - protected $proxy; protected $host; + protected $port; protected $cached_dirs = []; protected $debug = false; + private $proxyhost = false; + private $proxyport = false; + private $proxyuser = false; + private $proxypwd = false; - public function __construct($host, $port = 21, $timeout = 90, $ssl = false, $proxy = false, $proxyport = false) + private function cleanAddr($addr, &$usedSSL) { - $host = mb_substr($host, -1, 1) == '/' ? mb_substr($host, 0, (mb_strlen($host) - 1)) : $host; + $addr = trim($addr); + if(substr($addr, 0, 7) === "ftps://") { + $addr = substr($addr, 7); + $usedSSL = true; + } + elseif(substr($addr, 0, 6) === "ftp://") { + $addr = substr($addr, 6); + } + if(substr($addr, -1, 1) == '/') { + $addr = substr($addr, 0, (strlen($addr) - 1)); + } + return $addr; + } - if (mb_strpos($host, 'ftp://') !== false) - $host = mb_substr($host, 6); - - $host = $proxy ? $proxy : $host; - $port = $proxyport ? $proxyport : $port; - - if ($this->debug && $proxy) - echo "Utilisation du proxy $proxy\n
"; - - if ($this->debug && $proxyport) - echo "Utilisation du port proxy $proxyport\n
"; - - $this->proxy = $proxy; + public function __construct($host, $port = 21, $timeout = 90, $ssl = false, + $proxyhost = false, + $proxyport = false, + $proxyuser = false, + $proxypwd = false + ) + { $this->host = $host; + $this->port = $port; + $this->proxyhost = $proxyhost; + $this->proxyport = $proxyport; + $this->proxyuser = $proxyuser; + $this->proxypwd = $proxypwd; + + // if there is a proxy, connect to it, not on host/port provided + $host = $proxyhost ? $proxyhost : $host; + $port = $proxyport ? $proxyport : $port; + // clean the addr, force ssl if needed + $host = $this->cleanAddr($host, $ssl); if ($this->debug) - echo "Ouverture de connection vers $host:$port timeout $timeout et proxy $proxy:$proxyport\n
"; - - if (trim($host) == '') { - throw new Exception('Nom d\'hote incorrect ' . $host); - } + echo "Ouverture de connection vers $host:$port timeout $timeout\n
"; try { if ($ssl === true) { @@ -72,22 +89,29 @@ class ftpclient public function login($username, $password) { - $username = $this->proxy ? $username . "@" . $this->host : $username; + if($this->proxyhost) { + $username .= ("@" . $this->host); + if ($this->proxyuser) { + $username .= (' ' . $this->proxyuser); + } + } $retry = 3; $done = false; - if ($this->debug) - echo "tentative de login avec $username, $password\n
"; - - while ($retry > 0) { - if ((@ftp_login($this->connexion, $username, $password)) === false) { - $retry --; - } else { - $retry = 0; + while (!$done && $retry-- > 0) { + $ret = ftp_raw($this->connexion, "USER ".$username); + if(is_array($ret) && $password) { + $ret = ftp_raw($this->connexion, "PASS ".$password); + } + if(is_array($ret) && $this->proxypwd) { + $ret = ftp_raw($this->connexion, "ACCT ".$this->proxypwd); + } + if(is_array($ret)) { $done = true; } } + if (! $done) { throw new Exception('Impossible de s\'authentifier sur le serveur FTP'); } diff --git a/templates/web/admin/task-manager/task-editor/ftp.html.twig b/templates/web/admin/task-manager/task-editor/ftp.html.twig index 49f6920a1b..da5f5c757a 100644 --- a/templates/web/admin/task-manager/task-editor/ftp.html.twig +++ b/templates/web/admin/task-manager/task-editor/ftp.html.twig @@ -7,12 +7,26 @@ -
- -
- +
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ + + +
-
{% endblock %} @@ -27,6 +41,8 @@ var gform = document.forms['graphicForm']; gform.proxy.value = xml.find("proxy").text(); gform.proxyport.value = xml.find("proxyport").text(); + gform.proxyuser.value = xml.find("proxyuser").text(); + gform.proxypwd.value = xml.find("proxypwd").text(); } }