Piszę niestandardowe klasy systemów plików dla Apache SSHd. Wystąpił problem, gdy klient próbuje pliku, który nie istnieje.Prawidłowa odpowiedź na SFTP "otwarty" w nieistniejącym pliku
Mój obiekt zwraca doesExist() == false
.
To powoduje, że serwer wysyła pakiet SSH_FX_NO_SUCH_FILE w odpowiedzi na SSH_FXP_STAT.
Korzystanie z klienta OpenSSH działa dobrze: klient zgłasza "File"/foo "not found".
Jednak PSFTP (klient Putty SFTP) potokuje swoje żądania, więc wysyła pakiet OPEN niezależnie od odpowiedzi na STAT. Następnie wysyła READ na wynikowym uchwycie pliku, który obecnie powoduje wyjątek w moim kodzie, co powoduje zakończenie całej sesji.
Jak powinna wyglądać odpowiedź serwera podczas próby odczytania pliku, który nie istnieje?
Z przeprosinami za gadatliwość, oto kod Apache, o którym mowa. Wolałbym go nie modyfikować - moja klasa to "plik" SshFile. Ale jeśli kod Apache jest zdecydowanie błędny, to chyba będę musiał dać im łatkę.
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, miałem nadzieję, że nie będę musiał modyfikować kodu Apache SSHD. To może być nieuniknione. Wydaje się, że robi to dobrze z pakietami V4 FXP_OPEN (który ma flagę OPEN_EXISTING), ale nie z V3 FXP_OPEN, co nie działa. Nawiasem mówiąc, PSFTP nie przekazuje komunikatów o błędach z pakietów odpowiedzi do interfejsu użytkownika :( – slim