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
+