From 214874972167669b96a861a3fdb3f1132c4879bf Mon Sep 17 00:00:00 2001 From: Jean-Yves Gaulier Date: Wed, 7 Oct 2015 15:51:49 +0200 Subject: [PATCH] #PHRAS-750 #time 3h add proxy user/pwd to ftpclient object add proxy user/pwd to ftp task interface --- .../Core/Provider/FtpServiceProvider.php | 8 +- lib/classes/ftpclient.php | 81 ++++++++++++------- lib/classes/task/period/ftp.php | 24 +++++- 3 files changed, 80 insertions(+), 33 deletions(-) diff --git a/lib/Alchemy/Phrasea/Core/Provider/FtpServiceProvider.php b/lib/Alchemy/Phrasea/Core/Provider/FtpServiceProvider.php index 42e9acf169..f809c06b87 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, $proxyhost=false, $proxyport=false, $proxyuser=false, $proxypwd=false) { + return new \ftpclient($host, $port, $timeout, $ssl, $proxyhost, $proxyport, $proxyuser, $proxypwd); + } + ); } /** diff --git a/lib/classes/ftpclient.php b/lib/classes/ftpclient.php index cabc395f08..2a8a1e99ac 100644 --- a/lib/classes/ftpclient.php +++ b/lib/classes/ftpclient.php @@ -3,36 +3,54 @@ class ftpclient { protected $connexion; - protected $proxy; protected $host; + protected $port; protected $cached_dirs = array(); 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 (($p = mb_strpos($host, 'ftp://')) !== false) - $host = mb_substr($host, 6); + 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; - $host = $proxy ? $proxy : $host; + // if there is a proxy, connect to it, not on host/port provided + $host = $proxyhost ? $proxyhost : $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; - $this->host = $host; + // 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 connexion vers $host:$port timeout $timeout\n
"; try { if ($ssl === true) { @@ -63,22 +81,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/lib/classes/task/period/ftp.php b/lib/classes/task/period/ftp.php index 0af6ce2eaf..2c167a8204 100644 --- a/lib/classes/task/period/ftp.php +++ b/lib/classes/task/period/ftp.php @@ -46,13 +46,13 @@ class task_period_ftp extends task_appboxAbstract { $request = http_request::getInstance(); - $parm2 = $request->get_parms('proxy', 'proxyport', 'period', 'syslog'); + $parm2 = $request->get_parms('proxy', 'proxyport', 'proxyuser', 'proxypwd', 'period', 'syslog'); $dom = new DOMDocument(); $dom->preserveWhiteSpace = false; $dom->formatOutput = true; if ((@$dom->loadXML($oldxml)) != FALSE) { $xmlchanged = false; - foreach (array('str:proxy', 'str:proxyport', 'str:period', 'pop:syslog') as $pname) { + foreach (array('str:proxy', 'str:proxyport', 'str:proxyuser', 'str:proxypwd', 'str:period', 'pop:syslog') as $pname) { $ptype = substr($pname, 0, 3); $pname = substr($pname, 4); $pvalue = $parm2[$pname]; @@ -101,6 +101,8 @@ class task_period_ftp extends task_appboxAbstract { proxy.value = xml.find("proxy").text(); proxyport.value = xml.find("proxyport").text(); + proxyuser.value = xml.find("proxyuser").text(); + proxypwd.value = xml.find("proxypwd").text(); period.value = xml.find("period").text(); } } @@ -154,6 +156,18 @@ class task_period_ftp extends task_appboxAbstract +
+ +
+ +
+
+
+ +
+ +
+
@@ -177,6 +191,8 @@ class task_period_ftp extends task_appboxAbstract , 'active' , 'proxy' , 'proxyport' + , 'proxyuser' + , 'proxypwd' , 'period' , 'debug' ); @@ -189,6 +205,8 @@ class task_period_ftp extends task_appboxAbstract foreach (array( 'proxy' , 'proxyport' + , 'proxyuser' + , 'proxypwd' , 'period' ) as $f) { if ($parm[$f] !== NULL) { @@ -718,6 +736,8 @@ class task_period_ftp extends task_appboxAbstract + + %s ", min(max($period, self::MINPERIOD), self::MAXPERIOD));