2012-08-23 12 views
5

Estoy escribiendo clases de sistema de archivos personalizadas para Apache SSHd. He golpeado un problema cuando el cliente intenta get un archivo que no existe.Respuesta correcta a un SFTP "abierto" en un archivo no existente

Mi objeto devuelve doesExist() == false.

Esto hace que el servidor envíe un paquete SSH_FX_NO_SUCH_FILE en respuesta a un SSH_FXP_STAT.

Al usar un cliente OpenSSH, esto funciona bien: el cliente informa que "Archivo '/ foo' no encontrado".

Sin embargo, PSFTP (el cliente Putty SFTP) canaliza sus solicitudes, por lo que envía un paquete OPEN independientemente de la respuesta a STAT. A continuación, envía una LECTURA en el identificador de archivo resultante, que actualmente provoca una excepción en mi código, lo que da como resultado el final de la sesión completa.

¿Cuál debe ser la respuesta del servidor cuando hay un intento de leer un archivo que no existe?

Con disculpas por la verbosidad, aquí está el código de Apache en cuestión. Preferiría no modificarlo, mi clase es el "archivo" SshFile aquí. Pero si el código de Apache es definitivamente defectuoso, creo que tendré que darles un parche.

if (version <= 4) { 
     String path = buffer.getString(); 
     int pflags = buffer.getInt(); 
     // attrs 
     try { 
      SshFile file = resolveFile(path); 
      if (file.doesExist()) { 
       if (((pflags & SSH_FXF_CREAT) != 0) && ((pflags & SSH_FXF_EXCL) != 0)) { 
        sendStatus(id, SSH_FX_FILE_ALREADY_EXISTS, path); 
        return; 
       } 
      } else { 
       if (((pflags & SSH_FXF_CREAT) != 0)) { 
        if (!file.isWritable()) { 
         sendStatus(id, SSH_FX_FAILURE, "Can not create " + path); 
         return; 
        } 
        file.create(); 
       } 
      } 
      String acc = ((pflags & (SSH_FXF_READ | SSH_FXF_WRITE)) != 0 ? "r" : "") + 
        ((pflags & SSH_FXF_WRITE) != 0 ? "w" : ""); 
      if ((pflags & SSH_FXF_TRUNC) != 0) { 
       file.truncate(); 
      } 
      String handle = UUID.randomUUID().toString(); 
      handles.put(handle, new FileHandle(file, pflags)); // handle flags conversion 
      sendHandle(id, handle); 
     } catch (IOException e) { 
      sendStatus(id, SSH_FX_FAILURE, e.getMessage()); 
     } 

Respuesta

3

respuesta a la solicitud SSH_FXP_OPEN también con un código de estado SSH_FX_NO_SUCH_FILE. Eso debería resolver el problema con psftp.

De todos modos, debe mantener un registro del archivo activo y de los identificadores de directorio. Cuando el lado remoto solicita una operación para un identificador que no está activo o que no es del tipo correcto, responda con un mensaje de estado SSH_FX_FAILURE. Utilice la ranura error message en el paquete SSH_FXP_STATUS para incluir un error más informativo y fácil de usar ya que solo el código no es muy útil.

+1

Hmm, esperaba no tener que modificar el código Apache SSHD. Podría ser inevitable. Parece hacer lo correcto con los paquetes V4 FXP_OPEN (que tiene un indicador OPEN_EXISTING) pero no con V3 FXP_OPEN, que no lo hace. A propósito, PSFTP no parece transmitir los mensajes de error de los paquetes de respuesta a la interfaz de usuario :( – slim

Cuestiones relacionadas