<?php
/* 
 * Classe SFTP permettant une connexion SSH2 FTP pour l'envoi des archives d'export.
 */

class SFTP {

    private $connexion;
    private $stream;
    private $client;
    private $host;
    private $port;
    private $login;
    private $password;
    private $dir;
    private $idClient;

    function  __construct($sIdClient) {
        //Instanciation du client pour le log
        $this->client = new client($sIdClient, 'SFTP');
        $this->host = $this->client->paramsSendExport['hostSFTP'];
        $this->port = $this->client->paramsSendExport['portSFTP'];
        $this->login = $this->client->paramsSendExport['userSFTP'];
        $this->password = $this->client->paramsSendExport['passSFTP'];
        $this->dir = $this->client->dirSendExport;
        $this->idClient = $sIdClient;
    }

    /*
     * Connexion au serveur FTP
     */
    public function connect() {
        $this->client->returnLog('Connexion SFTP...');
        try {
            if (!$this->connexion = @ssh2_connect($this->host, !empty($this->port) ? $this->port : 22)) throw new Exception('ssh2_connect('.$this->host.')');
            if (!@ssh2_auth_password($this->connexion, $this->login, $this->password)) throw new Exception('echec authentification SSH');
            if (!$this->stream = @ssh2_sftp($this->connexion)) throw new Exception('echec initialisation SFTP');
            $this->client->returnLog('Connexion SFTP ok');
        }
        catch (Exception $e) {
            $this->client->returnError('Erreur SFTP : '.$e->getMessage(), '500');
            return false;
        }
        return true;
    }

    /*
     * Envoi de tous les fichier d'un dossier
     */
    public function sendDir($sLocalDir, $sDefaultExtension = array()) {
        try {
            $handle = @opendir($sLocalDir);
            if (!$handle) throw new Exception('Impossible d\'ouvrir le dossier '.$sLocalDir);
            while ($file = @readdir($handle)) {
                if (!$file) throw new Exception('Impossible de lire le dossier '.$sLocalDir);
                if ($this->allowedFile($file, $sDefaultExtension)) {
                  $this->sendFile($file, $sLocalDir);
                }
            }
            closedir($handle);
            return true;
        }
        catch (Exception $e) {
            $this->client->returnError('Erreur SFTP : '.$e->getMessage(), '500');
            return false;
        }
    }

    /*
     * Envoi simple d'un fichier
     */
    public function sendFile($sFile, $sLocalDir) {
        $streamDir = $this->dir.$this->idClient.'/';
        $streamFile = $streamDir.$sFile.'_0';
        $localFile = $sLocalDir.'/'.$sFile;
        if (file_exists($localFile)) {
            try {
                $contents = @file_get_contents($localFile);
                if (!$contents) throw new Exception('Impossible de lire '.$localFile);
                $this->client->returnLog('Envoi du fichier '.$localFile);
                //Création du dossier client
                if (!file_exists('ssh2.sftp://'.$this->stream.substr($streamDir, 0, -1))) {
                    $mkdir = ssh2_sftp_mkdir($this->stream, substr($streamDir, 0, -1));
                    if (!$mkdir) throw new Exception('Impossible de créer le dossier '.substr($streamDir, 0, -1));
                }
                $return = file_put_contents('ssh2.sftp://'.$this->stream.$streamFile, $contents);
                if (!$return) throw new Exception('Impossible d\'écrire '.$this->stream.$streamFile);
                if (!ssh2_sftp_rename($this->stream, $this->dir.$this->idClient.'/'.$sFile.'_0', $this->dir.$this->idClient.'/'.$sFile)) throw new Exception('Impossible de renommer '.$streamFile); //Une fois bien envoyé, renomme en zip
                unlink($localFile);
                $this->client->returnLog('Fichier envoyé vers '.$streamFile);
                return true;
            }
            catch (Exception $e) {
                $this->client->returnError('Erreur SFTP : '.$e->getMessage(), '500');
                return false;
            }
        }
        else {
            $this->client->returnError('Erreur SFTP : fichier '.$localFile.' inexistant', '404');
            return false;
        }
    }

    /*
     * Ne conserve que les fichiers valides et non dossier
     */
    private function allowedFile($sFile, $sDefaultExtension) {
        if (is_dir($sFile) || substr($sFile, 0, 1) == "." ) {
            return false;
        }
        if (!empty($sDefaultExtension) && !in_array(substr(strrchr($sFile, "."), 1), $sDefaultExtension)) return false;
        return true;
    }

}

?>
