1
1
Этот коммит содержится в:
Aris Adamantiadis 2009-12-26 16:51:33 +01:00
родитель bfdc48e320
Коммит 6f3505bf6b
5 изменённых файлов: 89 добавлений и 49 удалений

Просмотреть файл

@ -123,6 +123,7 @@ int ssh_send_banner(ssh_session session, int is_server);
void ssh_connection_callback(ssh_session session); void ssh_connection_callback(ssh_session session);
SSH_PACKET_CALLBACK(ssh_packet_dh_reply); SSH_PACKET_CALLBACK(ssh_packet_dh_reply);
SSH_PACKET_CALLBACK(ssh_packet_newkeys); SSH_PACKET_CALLBACK(ssh_packet_newkeys);
SSH_PACKET_CALLBACK(ssh_packet_service_accept);
/* config.c */ /* config.c */
int ssh_config_parse_file(ssh_session session, const char *filename); int ssh_config_parse_file(ssh_session session, const char *filename);

Просмотреть файл

@ -41,6 +41,20 @@ enum ssh_session_state_e {
SSH_SESSION_STATE_ERROR 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 ssh_session_struct {
struct error_struct error; struct error_struct error;
struct ssh_socket_struct *socket; struct ssh_socket_struct *socket;
@ -60,7 +74,7 @@ struct ssh_session_struct {
/* !=0 when the user got a session handle */ /* !=0 when the user got a session handle */
int alive; int alive;
/* two previous are deprecated */ /* two previous are deprecated */
int auth_service_asked; // int auth_service_asked;
/* socket status */ /* socket status */
int blocking; // functions should block int blocking; // functions should block
@ -78,6 +92,7 @@ struct ssh_session_struct {
enum ssh_session_state_e session_state; enum ssh_session_state_e session_state;
int packet_state; int packet_state;
int dh_handshake_state; int dh_handshake_state;
enum ssh_auth_service_state_e auth_service_state;
ssh_string dh_server_signature; //information used by dh_handshake. ssh_string dh_server_signature; //information used by dh_handshake.
KEX server_kex; KEX server_kex;

Просмотреть файл

@ -45,19 +45,23 @@
/** \addtogroup ssh_auth /** \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) { static int ask_userauth(ssh_session session) {
int rc = 0; int rc = 0;
enter_function(); enter_function();
do {
if (session->auth_service_asked) { rc=ssh_service_request(session,"ssh-userauth");
rc = 0; if(rc==SSH_AGAIN)
} else if (ssh_service_request(session,"ssh-userauth")) { ssh_handle_packets(session);
rc = -1; } while(rc==SSH_AGAIN);
} else {
session->auth_service_asked++;
}
leave_function(); leave_function();
return rc; return rc;
} }

Просмотреть файл

@ -466,6 +466,23 @@ error:
return rc; 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 * @internal
* *
@ -476,52 +493,55 @@ error:
* @param session The session to use to ask for a service request. * @param session The session to use to ask for a service request.
* @param service The 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) { int ssh_service_request(ssh_session session, const char *service) {
ssh_string service_s = NULL; ssh_string service_s = NULL;
int rc=SSH_ERROR;
enter_function(); 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) { if (buffer_add_ssh_string(session->out_buffer,service_s) < 0) {
leave_function(); string_free(service_s);
return -1; 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(); leave_function();
return 0; return rc;
} }
/** \addtogroup ssh_session /** \addtogroup ssh_session

Просмотреть файл

@ -53,7 +53,7 @@ ssh_packet_callback default_packet_handlers[]= {
NULL, //#define SSH2_MSG_UNIMPLEMENTED 3 NULL, //#define SSH2_MSG_UNIMPLEMENTED 3
ssh_packet_ignore_callback, //#define SSH2_MSG_DEBUG 4 ssh_packet_ignore_callback, //#define SSH2_MSG_DEBUG 4
NULL, //#define SSH2_MSG_SERVICE_REQUEST 5 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, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
NULL, NULL, NULL, // 7-19 NULL, NULL, NULL, // 7-19
ssh_packet_kexinit, //#define SSH2_MSG_KEXINIT 20 ssh_packet_kexinit, //#define SSH2_MSG_KEXINIT 20