2012-08-23 57 views
5

Apache SSHd用のカスタムファイルシステムクラスを作成しています。クライアントが存在しないファイルgetに接続しようとすると、問題が発生しました。存在しないファイルのSFTP "open"に対する正しい応答

私のオブジェクトはdoesExist() == falseを返します。

これにより、サーバーはSSH_FXP_STATに対する応答としてSSH_FX_NO_SUCH_FILEパケットを送信します。

OpenSSHクライアントを使用すると、これは正常に動作します。クライアントは「ファイル '/ foo'が見つかりません」と報告します。

しかし、PSFTP(パテSFTPクライアント)は要求をパイプライン処理するため、STATへの応答に関係なくOPENパケットを送信します。次に、結果のファイルハンドルに対してREADを送ります。これは現在、コード内で例外を引き起こし、セッション全体が終了します。

存在しないファイルを読み取ろうとすると、サーバーの応答はどうなるべきですか?

冗長にお詫び申し上げますが、ここには問題のApacheコードがあります。私はそれを変更したくない - 私のクラスはSshFile "ファイル"です。しかし、Apacheコードが間違いなくバグがあれば、私はそれらにパッチを付ける必要があります。 SSH_FX_NO_SUCH_FILEステータスコードでもSSH_FXP_OPEN要求に

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

答えて

3

返信。それはpsftpの問題を解決するはずです。

とにかく、アクティブファイルとディレクトリハンドルの登録を保持する必要があります。リモート側がアクティブでないハンドルまたは適切なタイプでないハンドルの操作を要求すると、SSH_FX_FAILUREステータスメッセージで応答します。 SSH_FXP_STATUSパケットのerror messageスロットを使用すると、コードがあまり役に立ちませんので、より有益で使いやすいエラーを含めることができます。

+1

ええと、私はApache SSHDコードを変更しないことを望んでいました。やむを得ないかもしれない。 V4 FXP_OPENパケット(OPEN_EXISTINGフラグを持っています)では正しく動作していますが、V3 FXP_OPENではそうではありません。ちなみに、PSFTPは、UIへの応答パケットからのエラーメッセージを渡すようには見えません。 – slim

関連する問題