Asynchronous service request
Этот коммит содержится в:
родитель
bfdc48e320
Коммит
6f3505bf6b
@ -123,6 +123,7 @@ int ssh_send_banner(ssh_session session, int is_server);
|
||||
void ssh_connection_callback(ssh_session session);
|
||||
SSH_PACKET_CALLBACK(ssh_packet_dh_reply);
|
||||
SSH_PACKET_CALLBACK(ssh_packet_newkeys);
|
||||
SSH_PACKET_CALLBACK(ssh_packet_service_accept);
|
||||
|
||||
/* config.c */
|
||||
int ssh_config_parse_file(ssh_session session, const char *filename);
|
||||
|
@ -41,6 +41,20 @@ enum ssh_session_state_e {
|
||||
SSH_SESSION_STATE_ERROR
|
||||
};
|
||||
|
||||
/** @internal
|
||||
* @brief states of the authentication service request
|
||||
*/
|
||||
enum ssh_auth_service_state_e {
|
||||
/** initial state */
|
||||
SSH_AUTH_SERVICE_NONE=0,
|
||||
/** Authentication service request packet sent */
|
||||
SSH_AUTH_SERVICE_SENT,
|
||||
/** Service accepted */
|
||||
SSH_AUTH_SERVICE_ACCEPTED,
|
||||
/** Access to service denied (fatal) */
|
||||
SSH_AUTH_SERVICE_DENIED
|
||||
};
|
||||
|
||||
struct ssh_session_struct {
|
||||
struct error_struct error;
|
||||
struct ssh_socket_struct *socket;
|
||||
@ -60,7 +74,7 @@ struct ssh_session_struct {
|
||||
/* !=0 when the user got a session handle */
|
||||
int alive;
|
||||
/* two previous are deprecated */
|
||||
int auth_service_asked;
|
||||
// int auth_service_asked;
|
||||
|
||||
/* socket status */
|
||||
int blocking; // functions should block
|
||||
@ -78,6 +92,7 @@ struct ssh_session_struct {
|
||||
enum ssh_session_state_e session_state;
|
||||
int packet_state;
|
||||
int dh_handshake_state;
|
||||
enum ssh_auth_service_state_e auth_service_state;
|
||||
ssh_string dh_server_signature; //information used by dh_handshake.
|
||||
|
||||
KEX server_kex;
|
||||
|
@ -45,19 +45,23 @@
|
||||
/** \addtogroup ssh_auth
|
||||
* @{ */
|
||||
|
||||
/**
|
||||
* @internal
|
||||
* @brief ask access to the ssh-userauth service
|
||||
* @param session SSH session handle
|
||||
* @returns SSH_OK on success
|
||||
* @returns SSH_ERROR on error
|
||||
* @bug current implementation is blocking
|
||||
*/
|
||||
static int ask_userauth(ssh_session session) {
|
||||
int rc = 0;
|
||||
|
||||
enter_function();
|
||||
|
||||
if (session->auth_service_asked) {
|
||||
rc = 0;
|
||||
} else if (ssh_service_request(session,"ssh-userauth")) {
|
||||
rc = -1;
|
||||
} else {
|
||||
session->auth_service_asked++;
|
||||
}
|
||||
|
||||
do {
|
||||
rc=ssh_service_request(session,"ssh-userauth");
|
||||
if(rc==SSH_AGAIN)
|
||||
ssh_handle_packets(session);
|
||||
} while(rc==SSH_AGAIN);
|
||||
leave_function();
|
||||
return rc;
|
||||
}
|
||||
|
@ -466,6 +466,23 @@ error:
|
||||
return rc;
|
||||
}
|
||||
|
||||
/**
|
||||
* @internal
|
||||
* @brief handles a SSH_SERVICE_ACCEPT packet
|
||||
*
|
||||
*/
|
||||
SSH_PACKET_CALLBACK(ssh_packet_service_accept){
|
||||
(void)packet;
|
||||
(void)type;
|
||||
(void)user;
|
||||
enter_function();
|
||||
session->auth_service_state=SSH_AUTH_SERVICE_ACCEPTED;
|
||||
ssh_log(session, SSH_LOG_PACKET,
|
||||
"Received SSH_MSG_SERVICE_ACCEPT");
|
||||
leave_function();
|
||||
return SSH_PACKET_USED;
|
||||
}
|
||||
|
||||
/**
|
||||
* @internal
|
||||
*
|
||||
@ -476,52 +493,55 @@ error:
|
||||
* @param session The session to use to ask for a service request.
|
||||
* @param service The service request.
|
||||
*
|
||||
* @return 0 on success, < 0 on error.
|
||||
* @return SSH_OK on success
|
||||
* @return SSH_ERROR on error
|
||||
* @return SSH_AGAIN No response received yet
|
||||
* @bug actually only works with ssh-userauth
|
||||
*/
|
||||
int ssh_service_request(ssh_session session, const char *service) {
|
||||
ssh_string service_s = NULL;
|
||||
|
||||
int rc=SSH_ERROR;
|
||||
enter_function();
|
||||
switch(session->auth_service_state){
|
||||
case SSH_AUTH_SERVICE_NONE:
|
||||
if (buffer_add_u8(session->out_buffer, SSH2_MSG_SERVICE_REQUEST) < 0) {
|
||||
break;
|
||||
}
|
||||
service_s = string_from_char(service);
|
||||
if (service_s == NULL) {
|
||||
break;
|
||||
}
|
||||
|
||||
if (buffer_add_u8(session->out_buffer, SSH2_MSG_SERVICE_REQUEST) < 0) {
|
||||
leave_function();
|
||||
return -1;
|
||||
if (buffer_add_ssh_string(session->out_buffer,service_s) < 0) {
|
||||
string_free(service_s);
|
||||
break;
|
||||
}
|
||||
string_free(service_s);
|
||||
|
||||
if (packet_send(session) != SSH_OK) {
|
||||
ssh_set_error(session, SSH_FATAL,
|
||||
"Sending SSH2_MSG_SERVICE_REQUEST failed.");
|
||||
break;
|
||||
}
|
||||
|
||||
ssh_log(session, SSH_LOG_PACKET,
|
||||
"Sent SSH_MSG_SERVICE_REQUEST (service %s)", service);
|
||||
session->auth_service_state=SSH_AUTH_SERVICE_SENT;
|
||||
rc=SSH_AGAIN;
|
||||
break;
|
||||
case SSH_AUTH_SERVICE_DENIED:
|
||||
ssh_set_error(session,SSH_FATAL,"ssh_auth_service request denied");
|
||||
break;
|
||||
case SSH_AUTH_SERVICE_ACCEPTED:
|
||||
rc=SSH_OK;
|
||||
break;
|
||||
case SSH_AUTH_SERVICE_SENT:
|
||||
rc=SSH_AGAIN;
|
||||
break;
|
||||
}
|
||||
|
||||
service_s = string_from_char(service);
|
||||
if (service_s == NULL) {
|
||||
leave_function();
|
||||
return -1;
|
||||
}
|
||||
|
||||
if (buffer_add_ssh_string(session->out_buffer,service_s) < 0) {
|
||||
string_free(service_s);
|
||||
leave_function();
|
||||
return -1;
|
||||
}
|
||||
string_free(service_s);
|
||||
|
||||
if (packet_send(session) != SSH_OK) {
|
||||
ssh_set_error(session, SSH_FATAL,
|
||||
"Sending SSH2_MSG_SERVICE_REQUEST failed.");
|
||||
leave_function();
|
||||
return -1;
|
||||
}
|
||||
|
||||
ssh_log(session, SSH_LOG_PACKET,
|
||||
"Sent SSH_MSG_SERVICE_REQUEST (service %s)", service);
|
||||
|
||||
if (packet_wait(session,SSH2_MSG_SERVICE_ACCEPT,1) != SSH_OK) {
|
||||
ssh_set_error(session, SSH_FATAL, "Did not receive SERVICE_ACCEPT");
|
||||
leave_function();
|
||||
return -1;
|
||||
}
|
||||
|
||||
ssh_log(session, SSH_LOG_PACKET,
|
||||
"Received SSH_MSG_SERVICE_ACCEPT (service %s)", service);
|
||||
|
||||
leave_function();
|
||||
return 0;
|
||||
return rc;
|
||||
}
|
||||
|
||||
/** \addtogroup ssh_session
|
||||
|
@ -53,7 +53,7 @@ ssh_packet_callback default_packet_handlers[]= {
|
||||
NULL, //#define SSH2_MSG_UNIMPLEMENTED 3
|
||||
ssh_packet_ignore_callback, //#define SSH2_MSG_DEBUG 4
|
||||
NULL, //#define SSH2_MSG_SERVICE_REQUEST 5
|
||||
NULL, //#define SSH2_MSG_SERVICE_ACCEPT 6
|
||||
ssh_packet_service_accept, //#define SSH2_MSG_SERVICE_ACCEPT 6
|
||||
NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
|
||||
NULL, NULL, NULL, // 7-19
|
||||
ssh_packet_kexinit, //#define SSH2_MSG_KEXINIT 20
|
||||
|
Загрузка…
x
Ссылка в новой задаче
Block a user