Apache SSHd için özel dosya sistemi sınıfları yazıyorum. İstemci get
olmayan bir dosyaya çalıştığında bir sorunla karşılaştım.Mevcut olmayan bir dosyada bir SFTP "açık" doğru yanıtı
Benim nesne doesExist() == false
döndürür.
Bu SSH_FXP_STAT cevaben bir SSH_FX_NO_SUCH_FILE paket göndermek sunucu neden olur. Bir OpenSSH kullanarak
, bu iyi çalışır: istemci raporları "Dosya bulunamadı '/ foo'".Ancak PSFtp (Macun SFTP istemcisi) boru hatlarını, istek, bu bağımsız olarak STAT yanıt bir AÇIK paketi gönderir, böylece. Daha sonra, kodun tamamında bir istisna oluşturmaya neden olan sonuç dosyası üzerinde bir READ gönderir ve bu da tüm oturumun sonlandırılmasına neden olur. varolmayan bir dosyayı okumak için bir girişim olduğunda
sunucu yanıtı ne olmalıdır?
Ayrıntılardan dolayı özür dileriz, işte söz konusu Apache kodu. Bunu değiştirmemeyi tercih ederim - sınıfım SshFile "dosyası". Ama Apache kodu kesinlikle buggy ise, sanırım onlara bir yama vermek zorunda kalacağım. Bir SSH_FX_NO_SUCH_FILE
durum koduyla da SSH_FXP_OPEN
isteğine
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, Apache SSHD kodunu değiştirmemeyi umuyordum. Bu kaçınılmaz olabilir. V4 FXP_OPEN paketleriyle (OPEN_EXISTING bayrağı olan) değil, V3 FXP_OPEN ile doğru olanı yapıyor gibi görünüyor. Bu arada, PSFTP yanıt paketlerinden kullanıcı arabirimine hata iletileri iletmiyor gibi görünüyor :( – slim