Lines 125-130
Link Here
|
125 |
|
125 |
|
126 |
int mm_answer_moduli(int, Buffer *); |
126 |
int mm_answer_moduli(int, Buffer *); |
127 |
int mm_answer_sign(int, Buffer *); |
127 |
int mm_answer_sign(int, Buffer *); |
|
|
128 |
int mm_answer_login_getpwclass(int, Buffer *); |
128 |
int mm_answer_pwnamallow(int, Buffer *); |
129 |
int mm_answer_pwnamallow(int, Buffer *); |
129 |
int mm_answer_auth2_read_banner(int, Buffer *); |
130 |
int mm_answer_auth2_read_banner(int, Buffer *); |
130 |
int mm_answer_authserv(int, Buffer *); |
131 |
int mm_answer_authserv(int, Buffer *); |
Lines 203-208
Link Here
|
203 |
#endif |
204 |
#endif |
204 |
{MONITOR_REQ_SIGN, MON_ONCE, mm_answer_sign}, |
205 |
{MONITOR_REQ_SIGN, MON_ONCE, mm_answer_sign}, |
205 |
{MONITOR_REQ_PWNAM, MON_ONCE, mm_answer_pwnamallow}, |
206 |
{MONITOR_REQ_PWNAM, MON_ONCE, mm_answer_pwnamallow}, |
|
|
207 |
{MONITOR_REQ_GETPWCLASS, MON_AUTH, mm_answer_login_getpwclass}, |
206 |
{MONITOR_REQ_AUTHSERV, MON_ONCE, mm_answer_authserv}, |
208 |
{MONITOR_REQ_AUTHSERV, MON_ONCE, mm_answer_authserv}, |
207 |
{MONITOR_REQ_AUTH2_READ_BANNER, MON_ONCE, mm_answer_auth2_read_banner}, |
209 |
{MONITOR_REQ_AUTH2_READ_BANNER, MON_ONCE, mm_answer_auth2_read_banner}, |
208 |
{MONITOR_REQ_AUTHPASSWORD, MON_AUTH, mm_answer_authpassword}, |
210 |
{MONITOR_REQ_AUTHPASSWORD, MON_AUTH, mm_answer_authpassword}, |
Lines 707-712
Link Here
|
707 |
return (0); |
709 |
return (0); |
708 |
} |
710 |
} |
709 |
|
711 |
|
|
|
712 |
int |
713 |
mm_answer_login_getpwclass(int sock, Buffer *m) |
714 |
{ |
715 |
login_cap_t *lc; |
716 |
struct passwd *pw; |
717 |
u_int len; |
718 |
|
719 |
debug3("%s", __func__); |
720 |
|
721 |
pw = buffer_get_string(m, &len); |
722 |
if (len != sizeof(struct passwd)) |
723 |
fatal("%s: struct passwd size mismatch", __func__); |
724 |
pw->pw_name = buffer_get_string(m, NULL); |
725 |
pw->pw_passwd = buffer_get_string(m, NULL); |
726 |
#ifdef HAVE_STRUCT_PASSWD_PW_GECOS |
727 |
pw->pw_gecos = buffer_get_string(m, NULL); |
728 |
#endif |
729 |
#ifdef HAVE_STRUCT_PASSWD_PW_CLASS |
730 |
pw->pw_class = buffer_get_string(m, NULL); |
731 |
#endif |
732 |
pw->pw_dir = buffer_get_string(m, NULL); |
733 |
pw->pw_shell = buffer_get_string(m, NULL); |
734 |
|
735 |
lc = login_getpwclass(pw); |
736 |
if (lc == NULL) { |
737 |
buffer_put_char(m, 0); |
738 |
goto out; |
739 |
} |
740 |
|
741 |
buffer_put_char(m, 1); |
742 |
buffer_put_string(m, lc, sizeof(login_cap_t)); |
743 |
buffer_put_cstring(m, lc->lc_class); |
744 |
buffer_put_cstring(m, lc->lc_cap); |
745 |
buffer_put_cstring(m, lc->lc_style); |
746 |
|
747 |
debug3("%s: sending MONITOR_ANS_GETPWCLASS: %s", __func__, lc->lc_class); |
748 |
login_close(lc); |
749 |
out: |
750 |
mm_request_send(sock, MONITOR_ANS_GETPWCLASS, m); |
751 |
|
752 |
free(pw->pw_shell); |
753 |
free(pw->pw_dir); |
754 |
#ifdef HAVE_STRUCT_PASSWD_PW_CLASS |
755 |
free(pw->pw_class); |
756 |
#endif |
757 |
#ifdef HAVE_STRUCT_PASSWD_PW_GECOS |
758 |
free(pw->pw_gecos); |
759 |
#endif |
760 |
free(pw->pw_passwd); |
761 |
free(pw->pw_name); |
762 |
free(pw); |
763 |
|
764 |
return (0); |
765 |
} |
766 |
|
710 |
/* Retrieves the password entry and also checks if the user is permitted */ |
767 |
/* Retrieves the password entry and also checks if the user is permitted */ |
711 |
|
768 |
|
712 |
int |
769 |
int |