From 7e7910a1ca35c069864bafc200d7ba593a73a1f2 Mon Sep 17 00:00:00 2001 From: Aris Adamantiadis Date: Thu, 30 May 2013 10:38:47 +0200 Subject: [PATCH] sftp: added useful server APIs Reviewed-by: Andreas Schneider --- include/libssh/sftp.h | 11 +++++++++-- src/sftpserver.c | 33 ++++++++++++++++++++++++++++++++- 2 files changed, 41 insertions(+), 3 deletions(-) diff --git a/include/libssh/sftp.h b/include/libssh/sftp.h index 462e04c5..5a21a959 100644 --- a/include/libssh/sftp.h +++ b/include/libssh/sftp.h @@ -132,6 +132,7 @@ struct sftp_client_message_struct { int attr_num; ssh_buffer attrbuf; /* used by sftp_reply_attrs */ ssh_string data; /* can be newpath of rename() */ + ssh_buffer complete_message; /* complete message in case of retransmission*/ }; struct sftp_request_queue_struct { @@ -824,8 +825,14 @@ int buffer_add_attributes(ssh_buffer buffer, sftp_attributes attr); sftp_attributes sftp_parse_attr(sftp_session session, ssh_buffer buf,int expectname); /* sftpserver.c */ -sftp_client_message sftp_get_client_message(sftp_session sftp); -void sftp_client_message_free(sftp_client_message msg); +LIBSSH_API sftp_client_message sftp_get_client_message(sftp_session sftp); +LIBSSH_API void sftp_client_message_free(sftp_client_message msg); +LIBSSH_API uint8_t sftp_client_message_get_type(sftp_client_message msg); +LIBSSH_API const char *sftp_client_message_get_filename(sftp_client_message msg); +LIBSSH_API void sftp_client_message_set_filename(sftp_client_message msg, const char *newname); +LIBSSH_API char *sftp_client_message_get_data(sftp_client_message msg); +LIBSSH_API uint32_t sftp_client_message_get_flags(sftp_client_message msg); +LIBSSH_API int sftp_send_client_message(sftp_session sftp, sftp_client_message msg); int sftp_reply_name(sftp_client_message msg, const char *name, sftp_attributes attr); int sftp_reply_handle(sftp_client_message msg, ssh_string handle); diff --git a/src/sftpserver.c b/src/sftpserver.c index 3ae93a99..431d1d82 100644 --- a/src/sftpserver.c +++ b/src/sftpserver.c @@ -62,6 +62,10 @@ sftp_client_message sftp_get_client_message(sftp_session sftp) { msg->type = packet->type; msg->sftp = sftp; + /* take a copy of the whole packet */ + msg->complete_message = ssh_buffer_new(); + buffer_add_data(msg->complete_message, buffer_get_rest(payload), buffer_get_rest_len(payload)); + buffer_get_u32(payload, &msg->id); switch(msg->type) { @@ -241,6 +245,33 @@ sftp_client_message sftp_get_client_message(sftp_session sftp) { return msg; } +/* Send an sftp client message. Can be used in cas of proxying */ +int sftp_send_client_message(sftp_session sftp, sftp_client_message msg){ + return sftp_packet_write(sftp, msg->type, msg->complete_message); +} + +uint8_t sftp_client_message_get_type(sftp_client_message msg){ + return msg->type; +} + +const char *sftp_client_message_get_filename(sftp_client_message msg){ + return msg->filename; +} + +void sftp_client_message_set_filename(sftp_client_message msg, const char *newname){ + free(msg->filename); + msg->filename = strdup(newname); +} + +char *sftp_client_message_get_data(sftp_client_message msg){ + char *str = ssh_string_to_char(msg->data); + return str; +} + +uint32_t sftp_client_message_get_flags(sftp_client_message msg){ + return msg->flags; +} + void sftp_client_message_free(sftp_client_message msg) { if (msg == NULL) { return; @@ -250,7 +281,7 @@ void sftp_client_message_free(sftp_client_message msg) { ssh_string_free(msg->data); ssh_string_free(msg->handle); sftp_attributes_free(msg->attr); - + ssh_buffer_free(msg->complete_message); ZERO_STRUCTP(msg); SAFE_FREE(msg); }