Cómo crear un cliente SFTP en Cordova Android

Cómo crear un cliente SFTP en Cordova Android

El protocolo de transferencia de archivos de SSH (SFTP), tambien conocido como protocolo de transferencia de archivos seguro, te permite la transferencia de archivo entre redes.

Puedes usar facilmente un cliente SFTP para android usando un plugin.

Requisitos

Para usar la característica de SFTP a tu aplicación de cordova en Android, deberás usar el plugin cordova-ourcodeworld-sftpplugin (creado por nosotros). Este plugin usa JSCh  JSCh (JSch - Java Secure Channel - JCraft) , librería que ofrece soporte para las funciones más basicas de un cliente SFTP:

  • Conexión segura.
  • Listar un directorio remoto.
  • Subir archivos.
  • Descargar archivos.
  • Eliminar un archivo remoto.
  • Usar una llave privada para autenticarse.
  • Indicador de progreso para subida y descarga de archivos.

Para instalar este plugin en tu proyecto ejecuta el siguiente comando:

cordova plugin add https://github.com/sdkcarlos/cordova-ourcodeworld-sftpplugin.git

Para más información acerca del plugin y su documentación visita esta página. Despues de la instalación, una variable global (despues del evento deviceready de cordova) estára disponible en la ventana llamada OurCodeWorldSFTP.

Recuerda que este plugin solo sirve para Android.

Implementando el cliente SFTP

Necesitarás seguir los siguientes pasos para usar el plugin correctamente:

  1. Crea un cliente SFTP.
  2. Usa el cliente creado para ejecutar todas las tareas que ofrece el plugin.

Para crear un client usa el método createSFTPClient:

/**
 * Un objeto de cliente para descargar/subir/borrar archivos via SFTP
 *
 * return {Object}
 */
var client = OurCodeWorldSFTP.createSFTPClient();

Ahora que tienes un cliente, debes proporcionar credenciales para poder usarlo.

Por ejemplo si usas una llave privada:

// Directorio remoto a listar
var pathToList = "/var/www/vhosts/myproject";
var myCredential = {
    //O usa la IP directamente
    //url: "127.0.0.1 etc..."
    url: "miservidor.algo.com",
    username : null,
    password : null,
    // El directorio local del archivo .pub en tu dispositivo
    privateKeyPath : "/storage/emulated/0/id_dsa.pub"
};

client.setCredentials(myCredential.url, myCredential.username, myCredential.password);
client.setPath(pathToList);
client.setIdentity(myCredential.privateKeyPath);

O si usas una clave y contraseña:

// Directorio remoto a listar
var pathToList = "/var/www/vhosts/myproject";
var myCredential = {
    // O usa la IP en su lugar
    //url: "127.0.0.1 etc..."
    url: "myserver.something.com",
    username : "root",
    password : "rootpassword",
};

client.setCredentials(myCredential.url, myCredential.username, myCredential.password);
client.setPath(pathToList);

Si quieres incrementar la seguridad de la conexión y prevenir ataques de MITM, agrega un archivo known_hosts al cliente usando el método setKnownHosts que recibe como primer argumento el directorio completo del archivo:

client.setKnownHosts("/storage/emulated/0/known_hosts");

Ahora que las credenciales son válidas, puedes usar cualquiera de los métodos que el cliente ofrece.

Listar un directorio remoto

Lista un directorio remoto usando el método list (cabe destacar que el directorio remoto ha sido declarado con el método setPath previamente, puedes cambiarlo dinamicamente usando el mismo):

/**
 * Recibe un array con objetos con todo la información relacionada con el contenido
 * de el directorio remoto
 */
var success = function(data) {
    console.info(data);
    /**
    Outputs : 
    [
        {
            name:"Folder/File name",
            filepath: "/var/www/vhosts/myproject/something.txt",
            isDir:false, // is Folder = true, is File = false
            isLink:false,
            size:"123", // bytes
            permissions: "????",
            permissions_string:"xxxxx",
        }
    ];
    */
}


var failure = function(e) {
    console.error(e);
}

client.list(success, failure);

Descargar un archivo y mostrar progreso

Para descargar un archivo, puedes usar el método downloadFile del cliente. Esta función espera como primer parametro la dirección del directorio remoto del archivo y como segundo parametro el directorio local (junto con el nombre) en el que debería ser guardado una vez se descargue. Finalmente como tercer argumento los callbacks dentro de un objeto.

Recuerda que el directorio del archivo local no puede contener el prefijo file://, usa el directorio relativo en su lugar, además el esquéma de FileURI no es soportado.

client.downloadFile("/var/www/vhosts/myproject/archivo.txt","/storage/emulated/0/archivo.txt",{
    success:function(download){
        // Ver información de objeto
        console.log(download);

        // Si la descarga del archivo ha finalizado
        if(download.finished == true){
            console.info("El archivo ha sido descargado satisfactoriamente");
        // De otra manera sigue descargandose
        }else{
            // Por lo tanto muestra el progreso
            console.log("Progreso descarga: "+download.progress+"%. "+ download.bytesprogress +" bytes descargados de " + download.filesizebytes + "total");
        }
    },
    error:function(er){
        console.error(er);
    }
});

Subir un archivo y mostrar progreso

Para subir un archivo a un servidor remoto, usa el método uploadFile del cliente. Esta función recibe como primer argumento el directorio local del archivo a subir y como segundo parametro el directorio remoto. Finalmente los callbacks en un objeto como tercer argumento.

client.uploadFile("/storage/emulated/0/file.txt","/var/www/vhosts/myproject/file.txt",{
    success:function(upload){
        // Ver información del objeto
        console.log(upload);

        // Si el archivo ha sido subido
        if(upload.finished == true){
            console.info("El archivo ha sido subido satisfactoriamente");
        }else{
            // Mostrar el progreso pues aun está siendo subido
            console.log("Progreso subida : "+upload.progress+"%. "+ upload.bytesprogress +" bytes subidos de " + upload.filesizebytes + "total");
        }
    },
    error:function(er){
        console.error(er);
    }
});

Borrar un archivo

Para borrar un archivo, usa el método removeFile del cliente. Esta función espera como primer argumento el directorio remoto del archivo para eliminar y como segundo parametro un objeto con los callbacks.

client.removeFile("/var/www/vhosts/myproject/file.txt",{
    success:function(removed){
        // see the object info
        console.log(removed);

        if(download.deleted == true){
            console.log("File removed from the server");
        }
    },
    error:function(er){
        // snap ! An error :( maybe doesnt exist?
        console.error(er);
    }
});

Que te diviertas !

Esto podría ser de tu interes

Conviertete en un programador más sociable