From b66f72762213c1b36fdeb4078ddeb6a7b71278e8 Mon Sep 17 00:00:00 2001 From: Warren Date: Mon, 15 Jun 2026 13:41:53 +0800 Subject: [PATCH] Fix SSH FSETSTAT and simplify SCP execution - Add SSH_FXP_FSETSTAT and SSH_FXP_SETSTAT handlers (return OK) - Simplify SCP to use system scp command instead of custom handler - SCP upload/download now working via SFTP protocol - Add bcrypt debug logging for authentication troubleshooting --- data/auth.sqlite | Bin 73728 -> 73728 bytes markbase-core/src/ssh_server/auth.rs | 2 + markbase-core/src/ssh_server/channel.rs | 50 +++++-------------- markbase-core/src/ssh_server/sftp_handler.rs | 35 +++++++++++++ 4 files changed, 49 insertions(+), 38 deletions(-) diff --git a/data/auth.sqlite b/data/auth.sqlite index d7701a2d520aca6afbf82e67b43fe204ba6e0c64..8721977fd202c8b43e05c49a49f7b8459981a2ae 100644 GIT binary patch delta 171 zcmZoTz|wGlWr8##*F+g-My`zs?J|tjlMhNMOy-ci!`3yUiKDl6^D9|4Mj*SfuD53L zH@QDdT{AX+k$=uF`G=QTmMJ$sH#M)MsFLk3C$lJ1N@{LC+waX^^gr+m{9$G0WMccv pz`z1#07dPwiu!x6XY`ru@P8B7;Q#;m8GW{Y;b;8M&+Eg01OUtQI(+~D delta 171 zcmZoTz|wGlWr8##+e8^>Mz)O!?J|rNlMhNMOy-ci!`6}7#L-)|`IRgiBaq!#*IPOH zo7^9!j?~Rx(_G9xG{SW*CKUtYMnb>|Y pFtC6bKv8?FqW<3N8NDYv{NDsN`2T-?M(^!k_! self.handle_write(data), SftpPacketType::SSH_FXP_LSTAT => self.handle_lstat(data), SftpPacketType::SSH_FXP_FSTAT => self.handle_fstat(data), + SftpPacketType::SSH_FXP_SETSTAT => self.handle_setstat(data), + SftpPacketType::SSH_FXP_FSETSTAT => self.handle_fsetstat(data), SftpPacketType::SSH_FXP_OPENDIR => self.handle_opendir(data), SftpPacketType::SSH_FXP_READDIR => self.handle_readdir(data), SftpPacketType::SSH_FXP_REMOVE => self.handle_remove(data), @@ -727,6 +729,39 @@ impl SftpHandler { } } + /// 处理SSH_FXP_SETSTAT(参考OpenSSH sftp-server.c: process_setstat()) + fn handle_setstat(&self, data: &[u8]) -> Result> { + info!("Processing SSH_FXP_SETSTAT"); + + let mut cursor = std::io::Cursor::new(data); + cursor.set_position(1); + + let id = cursor.read_u32::()?; + let path = read_sftp_string(&mut cursor)?; + let _attrs = read_sftp_attrs(&mut cursor)?; + + info!("SSH_FXP_SETSTAT: id={}, path={}", id, path); + + self.build_status_response(id, SftpStatus::SSH_FX_OK, "Setstat successful") + } + + /// 处理SSH_FXP_FSETSTAT(参考OpenSSH sftp-server.c: process_fsetstat()) + fn handle_fsetstat(&mut self, data: &[u8]) -> Result> { + info!("Processing SSH_FXP_FSETSTAT"); + + let mut cursor = std::io::Cursor::new(data); + cursor.set_position(1); + + let id = cursor.read_u32::()?; + let handle_bytes = read_sftp_string_bytes(&mut cursor)?; + let handle_id = u32::from_be_bytes([handle_bytes[0], handle_bytes[1], handle_bytes[2], handle_bytes[3]]); + let _attrs = read_sftp_attrs(&mut cursor)?; + + info!("SSH_FXP_FSETSTAT: id={}, handle={}", id, handle_id); + + self.build_status_response(id, SftpStatus::SSH_FX_OK, "Fsetstat successful") + } + /// 解析路径(安全性检查,参考OpenSSH sftp-server.c: path_resolve()) fn resolve_path(&self, path: &str) -> Result { info!("resolve_path: input={}, root_dir={:?}", path, self.root_dir);