2012-08-23 7 views
5

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

Odpowiedz

3

Odpowiedź na wniosek SSH_FXP_OPEN również z kodem SSH_FX_NO_SUCH_FILE stanu. To powinno rozwiązać problem z psftp.

W każdym razie, musisz prowadzić rejestr aktywnych plików i uchwytów katalogu. Gdy strona zdalna zażąda operacji dla uchwytu, który nie jest aktywny lub nie jest odpowiedniego typu, odpowiedz na komunikat o stanie: SSH_FX_FAILURE. Użyj gniazda error message w pakiecie SSH_FXP_STATUS, aby zawierał bardziej informacyjny i przyjazny dla użytkownika błąd, ponieważ sam kod nie jest zbyt użyteczny.

+1

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