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());
}
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