diff options
author | Damien Miller <djm@mindrot.org> | 2003-05-10 19:28:02 +1000 |
---|---|---|
committer | Damien Miller <djm@mindrot.org> | 2003-05-10 19:28:02 +1000 |
commit | 4f9f42a9bb6a6aa8f6100d873dc6344f2f9994de (patch) | |
tree | f81c39146e1cfabb4b198f57f60453b2dcaac299 /monitor_wrap.c | |
parent | c437cda328b4733b59a7ed028b72e6b7f58f86e6 (diff) |
- (djm) Merge FreeBSD PAM code: replaces PAM password auth kludge with
proper challenge-response module
Diffstat (limited to 'monitor_wrap.c')
-rw-r--r-- | monitor_wrap.c | 82 |
1 files changed, 82 insertions, 0 deletions
diff --git a/monitor_wrap.c b/monitor_wrap.c index 183ae8d0e..a83413a5f 100644 --- a/monitor_wrap.c +++ b/monitor_wrap.c | |||
@@ -677,6 +677,88 @@ mm_start_pam(char *user) | |||
677 | 677 | ||
678 | buffer_free(&m); | 678 | buffer_free(&m); |
679 | } | 679 | } |
680 | |||
681 | void * | ||
682 | mm_sshpam_init_ctx(Authctxt *authctxt) | ||
683 | { | ||
684 | Buffer m; | ||
685 | int success; | ||
686 | |||
687 | debug3("%s", __func__); | ||
688 | buffer_init(&m); | ||
689 | buffer_put_cstring(&m, authctxt->user); | ||
690 | mm_request_send(pmonitor->m_recvfd, MONITOR_REQ_PAM_INIT_CTX, &m); | ||
691 | debug3("%s: waiting for MONITOR_ANS_PAM_INIT_CTX", __func__); | ||
692 | mm_request_receive_expect(pmonitor->m_recvfd, MONITOR_ANS_PAM_INIT_CTX, &m); | ||
693 | success = buffer_get_int(&m); | ||
694 | if (success == 0) { | ||
695 | debug3("%s: pam_init_ctx failed", __func__); | ||
696 | buffer_free(&m); | ||
697 | return (NULL); | ||
698 | } | ||
699 | buffer_free(&m); | ||
700 | return (authctxt); | ||
701 | } | ||
702 | |||
703 | int | ||
704 | mm_sshpam_query(void *ctx, char **name, char **info, | ||
705 | u_int *num, char ***prompts, u_int **echo_on) | ||
706 | { | ||
707 | Buffer m; | ||
708 | int i, ret; | ||
709 | |||
710 | debug3("%s", __func__); | ||
711 | buffer_init(&m); | ||
712 | mm_request_send(pmonitor->m_recvfd, MONITOR_REQ_PAM_QUERY, &m); | ||
713 | debug3("%s: waiting for MONITOR_ANS_PAM_QUERY", __func__); | ||
714 | mm_request_receive_expect(pmonitor->m_recvfd, MONITOR_ANS_PAM_QUERY, &m); | ||
715 | ret = buffer_get_int(&m); | ||
716 | debug3("%s: pam_query returned %d", __func__, ret); | ||
717 | *name = buffer_get_string(&m, NULL); | ||
718 | *info = buffer_get_string(&m, NULL); | ||
719 | *num = buffer_get_int(&m); | ||
720 | *prompts = xmalloc((*num + 1) * sizeof(char *)); | ||
721 | *echo_on = xmalloc((*num + 1) * sizeof(u_int)); | ||
722 | for (i = 0; i < *num; ++i) { | ||
723 | (*prompts)[i] = buffer_get_string(&m, NULL); | ||
724 | (*echo_on)[i] = buffer_get_int(&m); | ||
725 | } | ||
726 | buffer_free(&m); | ||
727 | return (ret); | ||
728 | } | ||
729 | |||
730 | int | ||
731 | mm_sshpam_respond(void *ctx, u_int num, char **resp) | ||
732 | { | ||
733 | Buffer m; | ||
734 | int i, ret; | ||
735 | |||
736 | debug3("%s", __func__); | ||
737 | buffer_init(&m); | ||
738 | buffer_put_int(&m, num); | ||
739 | for (i = 0; i < num; ++i) | ||
740 | buffer_put_cstring(&m, resp[i]); | ||
741 | mm_request_send(pmonitor->m_recvfd, MONITOR_REQ_PAM_RESPOND, &m); | ||
742 | debug3("%s: waiting for MONITOR_ANS_PAM_RESPOND", __func__); | ||
743 | mm_request_receive_expect(pmonitor->m_recvfd, MONITOR_ANS_PAM_RESPOND, &m); | ||
744 | ret = buffer_get_int(&m); | ||
745 | debug3("%s: pam_respond returned %d", __func__, ret); | ||
746 | buffer_free(&m); | ||
747 | return (ret); | ||
748 | } | ||
749 | |||
750 | void | ||
751 | mm_sshpam_free_ctx(void *ctxtp) | ||
752 | { | ||
753 | Buffer m; | ||
754 | |||
755 | debug3("%s", __func__); | ||
756 | buffer_init(&m); | ||
757 | mm_request_send(pmonitor->m_recvfd, MONITOR_REQ_PAM_FREE_CTX, &m); | ||
758 | debug3("%s: waiting for MONITOR_ANS_PAM_FREE_CTX", __func__); | ||
759 | mm_request_receive_expect(pmonitor->m_recvfd, MONITOR_ANS_PAM_FREE_CTX, &m); | ||
760 | buffer_free(&m); | ||
761 | } | ||
680 | #endif /* USE_PAM */ | 762 | #endif /* USE_PAM */ |
681 | 763 | ||
682 | /* Request process termination */ | 764 | /* Request process termination */ |