Merge pull request #80 from glyptodon/sftp-errors
GUAC-1323: Send proper Guacamole protocol status codes for SFTP errors.
This commit is contained in:
commit
5cbd9d2262
@ -34,6 +34,78 @@
|
|||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Translates the last error message received by the SFTP layer of an SSH
|
||||||
|
* session into a Guacamole protocol status code.
|
||||||
|
*
|
||||||
|
* @param filesystem
|
||||||
|
* The Guacamole protocol object defining the filesystem associated with
|
||||||
|
* the SFTP and SSH sessions.
|
||||||
|
*
|
||||||
|
* @return
|
||||||
|
* The Guacamole protocol status code corresponding to the last reported
|
||||||
|
* error of the SFTP layer, if nay, or GUAC_PROTOCOL_STATUS_SUCCESS if no
|
||||||
|
* error has occurred.
|
||||||
|
*/
|
||||||
|
static guac_protocol_status guac_sftp_get_status(guac_object* filesystem) {
|
||||||
|
|
||||||
|
guac_common_ssh_sftp_data* sftp_data =
|
||||||
|
(guac_common_ssh_sftp_data*) filesystem->data;
|
||||||
|
|
||||||
|
/* Get libssh2 objects */
|
||||||
|
LIBSSH2_SFTP* sftp = sftp_data->sftp_session;
|
||||||
|
LIBSSH2_SESSION* session = sftp_data->ssh_session->session;
|
||||||
|
|
||||||
|
/* Return success code if no error occurred */
|
||||||
|
if (libssh2_session_last_errno(session) != LIBSSH2_ERROR_SFTP_PROTOCOL)
|
||||||
|
return GUAC_PROTOCOL_STATUS_SUCCESS;
|
||||||
|
|
||||||
|
/* Translate SFTP error codes defined by
|
||||||
|
* https://tools.ietf.org/html/draft-ietf-secsh-filexfer-02 (the most
|
||||||
|
* commonly-implemented standard) */
|
||||||
|
switch (libssh2_sftp_last_error(sftp)) {
|
||||||
|
|
||||||
|
/* SSH_FX_OK (not an error) */
|
||||||
|
case 0:
|
||||||
|
return GUAC_PROTOCOL_STATUS_SUCCESS;
|
||||||
|
|
||||||
|
/* SSH_FX_EOF (technically not an error) */
|
||||||
|
case 1:
|
||||||
|
return GUAC_PROTOCOL_STATUS_SUCCESS;
|
||||||
|
|
||||||
|
/* SSH_FX_NO_SUCH_FILE */
|
||||||
|
case 2:
|
||||||
|
return GUAC_PROTOCOL_STATUS_RESOURCE_NOT_FOUND;
|
||||||
|
|
||||||
|
/* SSH_FX_PERMISSION_DENIED */
|
||||||
|
case 3:
|
||||||
|
return GUAC_PROTOCOL_STATUS_CLIENT_FORBIDDEN;
|
||||||
|
|
||||||
|
/* SSH_FX_FAILURE */
|
||||||
|
case 4:
|
||||||
|
return GUAC_PROTOCOL_STATUS_UPSTREAM_ERROR;
|
||||||
|
|
||||||
|
/* SSH_FX_BAD_MESSAGE */
|
||||||
|
case 5:
|
||||||
|
return GUAC_PROTOCOL_STATUS_SERVER_ERROR;
|
||||||
|
|
||||||
|
/* SSH_FX_NO_CONNECTION / SSH_FX_CONNECTION_LOST */
|
||||||
|
case 6:
|
||||||
|
case 7:
|
||||||
|
return GUAC_PROTOCOL_STATUS_UPSTREAM_TIMEOUT;
|
||||||
|
|
||||||
|
/* SSH_FX_OP_UNSUPPORTED */
|
||||||
|
case 8:
|
||||||
|
return GUAC_PROTOCOL_STATUS_UNSUPPORTED;
|
||||||
|
|
||||||
|
/* Return generic error if cause unknown */
|
||||||
|
default:
|
||||||
|
return GUAC_PROTOCOL_STATUS_UPSTREAM_ERROR;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Concatenates the given filename with the given path, separating the two
|
* Concatenates the given filename with the given path, separating the two
|
||||||
* with a single forward slash. The full result must be no more than
|
* with a single forward slash. The full result must be no more than
|
||||||
@ -249,7 +321,7 @@ int guac_common_ssh_sftp_handle_file_stream(guac_object* filesystem,
|
|||||||
guac_client_log(client, GUAC_LOG_INFO,
|
guac_client_log(client, GUAC_LOG_INFO,
|
||||||
"Unable to open file \"%s\"", fullpath);
|
"Unable to open file \"%s\"", fullpath);
|
||||||
guac_protocol_send_ack(client->socket, stream, "SFTP: Open failed",
|
guac_protocol_send_ack(client->socket, stream, "SFTP: Open failed",
|
||||||
GUAC_PROTOCOL_STATUS_RESOURCE_NOT_FOUND);
|
guac_sftp_get_status(filesystem));
|
||||||
guac_socket_flush(client->socket);
|
guac_socket_flush(client->socket);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -642,7 +714,7 @@ static int guac_common_ssh_sftp_put_handler(guac_client* client,
|
|||||||
guac_client_log(client, GUAC_LOG_INFO,
|
guac_client_log(client, GUAC_LOG_INFO,
|
||||||
"Unable to open file \"%s\"", name);
|
"Unable to open file \"%s\"", name);
|
||||||
guac_protocol_send_ack(client->socket, stream, "SFTP: Open failed",
|
guac_protocol_send_ack(client->socket, stream, "SFTP: Open failed",
|
||||||
GUAC_PROTOCOL_STATUS_RESOURCE_NOT_FOUND);
|
guac_sftp_get_status(object));
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Set handlers for file stream */
|
/* Set handlers for file stream */
|
||||||
|
Loading…
Reference in New Issue
Block a user