2012-08-23 17 views
5

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

cevap

3

Cevap. Bu sorunu psftp ile çözmelidir.

Neyse, etkin dosya ve dizin kulpları bir kaydını tutmak gerekir. Uzak taraf, etkin olmayan veya doğru türde olmayan bir tanıtıcı için bir işlem istediğinde, bir SSH_FX_FAILURE durum iletisiyle yanıt verin. Daha fazla bilgilendirici ve kullanıcı dostu bir hata eklemek için SSH_FXP_STATUS paketindeki error message paketini kullanın, çünkü yalnızca kod çok kullanışlı değildir.

+1

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