@@ -461,13 +461,15 @@ nc_sshcb_auth_password(struct nc_session *session, struct nc_auth_client *auth_c
461461 return auth_ret ;
462462}
463463
464- /* get answers to kbdint prompts on the given libssh session and return the number of them, -1 on timeout/dc */
465- static int
466- nc_server_ssh_kbdint_get_nanswers (struct nc_session * session , ssh_session libssh_session , uint16_t auth_timeout )
464+ API int
465+ nc_server_ssh_kbdint_get_nanswers (const struct nc_session * session , ssh_session libssh_session )
467466{
468467 int ret = 0 ;
469468 struct timespec ts_timeout = {0 };
470469 ssh_message reply = NULL ;
470+ uint16_t auth_timeout = * ((uint16_t * )session -> data );
471+
472+ NC_CHECK_ARG_RET (NULL , session , libssh_session , -1 );
471473
472474 if (auth_timeout ) {
473475 nc_timeouttime_get (& ts_timeout , auth_timeout * 1000 );
@@ -523,10 +525,8 @@ nc_pam_conv_clb(int n_messages, const struct pam_message **msg, struct pam_respo
523525 ssh_message reply = NULL ;
524526 struct nc_pam_thread_arg * clb_data = appdata_ptr ;
525527 ssh_session libssh_session ;
526- uint16_t auth_timeout ;
527528
528529 libssh_session = clb_data -> session -> ti .libssh .session ;
529- auth_timeout = clb_data -> auth_timeout ;
530530
531531 /* PAM_MAX_NUM_MSG == 32 by default */
532532 if ((n_messages <= 0 ) || (n_messages >= PAM_MAX_NUM_MSG )) {
@@ -598,7 +598,7 @@ nc_pam_conv_clb(int n_messages, const struct pam_message **msg, struct pam_respo
598598 goto cleanup ;
599599 }
600600
601- n_answers = nc_server_ssh_kbdint_get_nanswers (clb_data -> session , libssh_session , auth_timeout );
601+ n_answers = nc_server_ssh_kbdint_get_nanswers (clb_data -> session , libssh_session );
602602 if (n_answers < 0 ) {
603603 /* timeout or dc */
604604 r = PAM_CONV_ERR ;
@@ -642,7 +642,7 @@ nc_pam_conv_clb(int n_messages, const struct pam_message **msg, struct pam_respo
642642 * @return PAM error otherwise.
643643 */
644644static int
645- nc_pam_auth (struct nc_session * session , struct nc_auth_client * client , uint16_t auth_timeout , ssh_message ssh_msg )
645+ nc_pam_auth (struct nc_session * session , struct nc_auth_client * client , ssh_message ssh_msg )
646646{
647647 pam_handle_t * pam_h = NULL ;
648648 int ret ;
@@ -652,7 +652,6 @@ nc_pam_auth(struct nc_session *session, struct nc_auth_client *client, uint16_t
652652 /* structure holding callback's data */
653653 clb_data .msg = ssh_msg ;
654654 clb_data .session = session ;
655- clb_data .auth_timeout = auth_timeout ;
656655
657656 /* PAM conversation structure holding the callback and it's data */
658657 conv .conv = nc_pam_conv_clb ;
@@ -835,13 +834,12 @@ nc_server_ssh_get_pwd_hash(const char *username)
835834 *
836835 * @param[in] session Session to authenticate on.
837836 * @param[in] client Client to authenticate.
838- * @param[in] auth_timeout Authentication timeout.
839837 * @param[in] msg SSH message that originally requested kbdint authentication.
840838 *
841839 * @return 0 on success, non-zero otherwise.
842840 */
843841static int
844- nc_server_ssh_system_auth (struct nc_session * session , struct nc_auth_client * client , uint16_t auth_timeout , ssh_message msg )
842+ nc_server_ssh_system_auth (struct nc_session * session , struct nc_auth_client * client , ssh_message msg )
845843{
846844 int ret = 0 , n_answers ;
847845 const char * name = "Keyboard-Interactive Authentication" ;
@@ -868,7 +866,7 @@ nc_server_ssh_system_auth(struct nc_session *session, struct nc_auth_client *cli
868866 }
869867
870868 /* get the reply */
871- n_answers = nc_server_ssh_kbdint_get_nanswers (session , session -> ti .libssh .session , auth_timeout );
869+ n_answers = nc_server_ssh_kbdint_get_nanswers (session , session -> ti .libssh .session );
872870 if (n_answers < 0 ) {
873871 /* timeout or dc */
874872 ret = 1 ;
@@ -895,7 +893,7 @@ nc_server_ssh_system_auth(struct nc_session *session, struct nc_auth_client *cli
895893#endif
896894
897895static int
898- nc_sshcb_auth_kbdint (struct nc_session * session , struct nc_auth_client * client , uint16_t auth_timeout , ssh_message msg )
896+ nc_sshcb_auth_kbdint (struct nc_session * session , struct nc_auth_client * client , ssh_message msg )
899897{
900898 int auth_ret = 1 ;
901899
@@ -904,16 +902,15 @@ nc_sshcb_auth_kbdint(struct nc_session *session, struct nc_auth_client *client,
904902 } else {
905903#ifdef HAVE_LIBPAM
906904 /* authenticate using PAM */
907- if (!nc_pam_auth (session , client , auth_timeout , msg )) {
905+ if (!nc_pam_auth (session , client , msg )) {
908906 auth_ret = 0 ;
909907 }
910908#elif defined (HAVE_SHADOW )
911909 /* authenticate using locally configured users */
912- if (!nc_server_ssh_system_auth (session , client , auth_timeout , msg )) {
910+ if (!nc_server_ssh_system_auth (session , client , msg )) {
913911 auth_ret = 0 ;
914912 }
915913#else
916- (void ) auth_timeout ;
917914 ERR (NULL , "Keyboard-interactive method not supported." );
918915#endif
919916 }
@@ -1506,7 +1503,7 @@ nc_session_ssh_msg(struct nc_session *session, struct nc_server_ssh_opts *opts,
15061503 } else if (subtype == SSH_AUTH_METHOD_PUBLICKEY ) {
15071504 ret = nc_sshcb_auth_pubkey (session , auth_client , msg );
15081505 } else if (subtype == SSH_AUTH_METHOD_INTERACTIVE ) {
1509- ret = nc_sshcb_auth_kbdint (session , auth_client , opts -> auth_timeout , msg );
1506+ ret = nc_sshcb_auth_kbdint (session , auth_client , msg );
15101507 }
15111508
15121509 if (!ret ) {
@@ -1780,8 +1777,11 @@ nc_accept_ssh_session(struct nc_session *session, struct nc_server_ssh_opts *opt
17801777 goto cleanup ;
17811778 }
17821779
1783- /* authenticate */
1784- if ((rc = nc_accept_ssh_session_auth (session , opts )) != 1 ) {
1780+ /* authenticate, store auth_timeout in session so we can retrieve it in kb interactive API */
1781+ session -> data = & opts -> auth_timeout ;
1782+ rc = nc_accept_ssh_session_auth (session , opts );
1783+ session -> data = NULL ;
1784+ if (rc != 1 ) {
17851785 goto cleanup ;
17861786 }
17871787
0 commit comments