[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[PATCH] sftpserver: Support some openssh extensions
[Thread Prev] | [Thread Next]
- Subject: [PATCH] sftpserver: Support some openssh extensions
- From: Chris Townsend <Christopher.Townsend@xxxxxxxxxxxxx>
- Reply-to: libssh@xxxxxxxxxx
- Date: Tue, 28 Aug 2018 08:03:33 -0400
- To: Jakub Jelen <jjelen@xxxxxxxxxx>, libssh@xxxxxxxxxx
- Cc: Alberto Aguirre <albaguirre@xxxxxxxxx>
Hi Jakub,
This only allows the libssh sftp server to receive the extended messages
from a client. The libssh sftp server does not implement any of the
actual command handling on a host and is left up to the developer using
the API on how to do that.
Regards,
Chris
On 08/28/2018 03:56 AM, Jakub Jelen wrote:
> Does this actually implement the the extensions or just sends and
> receives the extended messages?
>
> I don't know a lot about SFTP, but there is nothing referencing the
> rename nor to hardlink in the attached patch.
>
> Jakub
>
>
> On Mon, 2018-08-27 at 10:45 -0500, Alberto Aguirre wrote:
>> From: Chris Townsend <christopher.townsend@xxxxxxxxxxxxx>
>>
>> Add support for "hardlink@xxxxxxxxxxx" and
>> "posix-rename@xxxxxxxxxxx" extensions.
>>
>> Signed-off-by: Alberto Aguirre <albaguirre@xxxxxxxxx>
>> ---
>> include/libssh/sftp.h | 3 +++
>> src/sftp.c | 7 ++++++-
>> src/sftpserver.c | 28 ++++++++++++++++++++++++++++
>> 3 files changed, 37 insertions(+), 1 deletion(-)
>>
>> diff --git a/include/libssh/sftp.h b/include/libssh/sftp.h
>> index b07f269f..aac7af2b 100644
>> --- a/include/libssh/sftp.h
>> +++ b/include/libssh/sftp.h
>> @@ -123,6 +123,7 @@ struct sftp_client_message_struct {
>> sftp_session sftp;
>> uint8_t type;
>> uint32_t id;
>> + char *submessage; /* for extended messages */
>> char *filename; /* can be "path" */
>> uint32_t flags;
>> sftp_attributes attr;
>> @@ -862,6 +863,7 @@ 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 const 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 const char
>> *sftp_client_message_get_submessage(sftp_client_message msg);
>> LIBSSH_API int sftp_send_client_message(sftp_session sftp,
>> sftp_client_message msg);
>> LIBSSH_API int sftp_reply_name(sftp_client_message msg, const char
>> *name,
>> sftp_attributes attr);
>> @@ -1011,6 +1013,7 @@ LIBSSH_API void sftp_handle_remove(sftp_session
>> sftp, void *handle);
>> #define SFTP_RENAME SSH_FXP_RENAME
>> #define SFTP_READLINK SSH_FXP_READLINK
>> #define SFTP_SYMLINK SSH_FXP_SYMLINK
>> +#define SFTP_EXTENDED SSH_FXP_EXTENDED
>>
>> /* openssh flags */
>> #define SSH_FXE_STATVFS_ST_RDONLY 0x1 /* read-only */
>> diff --git a/src/sftp.c b/src/sftp.c
>> index 87b6ff94..82b71578 100644
>> --- a/src/sftp.c
>> +++ b/src/sftp.c
>> @@ -219,7 +219,12 @@ int sftp_server_init(sftp_session sftp){
>> return -1;
>> }
>>
>> - if (ssh_buffer_add_u32(reply, ntohl(LIBSFTP_VERSION)) < 0) {
>> + if (ssh_buffer_pack(reply, "dssss",
>> + ntohl(LIBSFTP_VERSION),
>> + "posix-rename@xxxxxxxxxxx",
>> + "1",
>> + "hardlink@xxxxxxxxxxx",
>> + "1") < 0) {
>> ssh_set_error_oom(session);
>> ssh_buffer_free(reply);
>> return -1;
>> diff --git a/src/sftpserver.c b/src/sftpserver.c
>> index 68fdb3d2..3cb30090 100644
>> --- a/src/sftpserver.c
>> +++ b/src/sftpserver.c
>> @@ -202,6 +202,29 @@ sftp_client_message
>> sftp_get_client_message(sftp_session sftp) {
>> return NULL;
>> }
>> break;
>> + case SSH_FXP_EXTENDED:
>> + rc = ssh_buffer_unpack(payload,
>> + "s",
>> + &msg->submessage);
>> + if (rc != SSH_OK) {
>> + ssh_set_error_oom(session);
>> + sftp_client_message_free(msg);
>> + return NULL;
>> + }
>> +
>> + if (strcmp(msg->submessage, "hardlink@xxxxxxxxxxx") == 0 ||
>> + strcmp(msg->submessage, "posix-rename@xxxxxxxxxxx") == 0)
>> {
>> + rc = ssh_buffer_unpack(payload,
>> + "sS",
>> + &msg->filename,
>> + &msg->data);
>> + if (rc != SSH_OK) {
>> + ssh_set_error_oom(session);
>> + sftp_client_message_free(msg);
>> + return NULL;
>> + }
>> + }
>> + break;
>> default:
>> ssh_set_error(sftp->session, SSH_FATAL,
>> "Received unhandled sftp message %d", msg-
>>> type);
>> @@ -242,12 +265,17 @@ uint32_t
>> sftp_client_message_get_flags(sftp_client_message msg){
>> return msg->flags;
>> }
>>
>> +const char *sftp_client_message_get_submessage(sftp_client_message
>> msg){
>> + return msg->submessage;
>> +}
>> +
>> void sftp_client_message_free(sftp_client_message msg) {
>> if (msg == NULL) {
>> return;
>> }
>>
>> SAFE_FREE(msg->filename);
>> + SAFE_FREE(msg->submessage);
>> ssh_string_free(msg->data);
>> ssh_string_free(msg->handle);
>> sftp_attributes_free(msg->attr);
| Re: [PATCH] sftpserver: Support some openssh extensions | Jakub Jelen <jjelen@xxxxxxxxxx> |
| [PATCH] sftpserver: Support some openssh extensions | Alberto Aguirre <albaguirre@xxxxxxxxx> |
| Re: [PATCH] sftpserver: Support some openssh extensions | Jakub Jelen <jjelen@xxxxxxxxxx> |