Changeset View
Changeset View
Standalone View
Standalone View
crypto/openssh/monitor.c
Context not available. | |||||
int mm_answer_moduli(int, Buffer *); | int mm_answer_moduli(int, Buffer *); | ||||
int mm_answer_sign(int, Buffer *); | int mm_answer_sign(int, Buffer *); | ||||
int mm_answer_login_getpwclass(int, Buffer *); | |||||
int mm_answer_pwnamallow(int, Buffer *); | int mm_answer_pwnamallow(int, Buffer *); | ||||
int mm_answer_auth2_read_banner(int, Buffer *); | int mm_answer_auth2_read_banner(int, Buffer *); | ||||
int mm_answer_authserv(int, Buffer *); | int mm_answer_authserv(int, Buffer *); | ||||
Context not available. | |||||
#endif | #endif | ||||
{MONITOR_REQ_SIGN, MON_ONCE, mm_answer_sign}, | {MONITOR_REQ_SIGN, MON_ONCE, mm_answer_sign}, | ||||
{MONITOR_REQ_PWNAM, MON_ONCE, mm_answer_pwnamallow}, | {MONITOR_REQ_PWNAM, MON_ONCE, mm_answer_pwnamallow}, | ||||
{MONITOR_REQ_GETPWCLASS, MON_AUTH, mm_answer_login_getpwclass}, | |||||
{MONITOR_REQ_AUTHSERV, MON_ONCE, mm_answer_authserv}, | {MONITOR_REQ_AUTHSERV, MON_ONCE, mm_answer_authserv}, | ||||
{MONITOR_REQ_AUTH2_READ_BANNER, MON_ONCE, mm_answer_auth2_read_banner}, | {MONITOR_REQ_AUTH2_READ_BANNER, MON_ONCE, mm_answer_auth2_read_banner}, | ||||
{MONITOR_REQ_AUTHPASSWORD, MON_AUTH, mm_answer_authpassword}, | {MONITOR_REQ_AUTHPASSWORD, MON_AUTH, mm_answer_authpassword}, | ||||
Context not available. | |||||
return (0); | return (0); | ||||
} | } | ||||
int | |||||
mm_answer_login_getpwclass(int sock, Buffer *m) | |||||
{ | |||||
login_cap_t *lc; | |||||
struct passwd *pw; | |||||
u_int len; | |||||
debug3("%s", __func__); | |||||
pw = buffer_get_string(m, &len); | |||||
if (len != sizeof(struct passwd)) | |||||
fatal("%s: struct passwd size mismatch", __func__); | |||||
pw->pw_name = buffer_get_string(m, NULL); | |||||
pw->pw_passwd = buffer_get_string(m, NULL); | |||||
#ifdef HAVE_STRUCT_PASSWD_PW_GECOS | |||||
pw->pw_gecos = buffer_get_string(m, NULL); | |||||
#endif | |||||
#ifdef HAVE_STRUCT_PASSWD_PW_CLASS | |||||
pw->pw_class = buffer_get_string(m, NULL); | |||||
#endif | |||||
pw->pw_dir = buffer_get_string(m, NULL); | |||||
pw->pw_shell = buffer_get_string(m, NULL); | |||||
lc = login_getpwclass(pw); | |||||
if (lc == NULL) { | |||||
buffer_put_char(m, 0); | |||||
goto out; | |||||
} | |||||
buffer_put_char(m, 1); | |||||
buffer_put_string(m, lc, sizeof(login_cap_t)); | |||||
buffer_put_cstring(m, lc->lc_class); | |||||
buffer_put_cstring(m, lc->lc_cap); | |||||
buffer_put_cstring(m, lc->lc_style); | |||||
debug3("%s: sending MONITOR_ANS_GETPWCLASS: %s", __func__, lc->lc_class); | |||||
login_close(lc); | |||||
out: | |||||
mm_request_send(sock, MONITOR_ANS_GETPWCLASS, m); | |||||
free(pw->pw_shell); | |||||
free(pw->pw_dir); | |||||
#ifdef HAVE_STRUCT_PASSWD_PW_CLASS | |||||
free(pw->pw_class); | |||||
#endif | |||||
#ifdef HAVE_STRUCT_PASSWD_PW_GECOS | |||||
free(pw->pw_gecos); | |||||
#endif | |||||
free(pw->pw_passwd); | |||||
free(pw->pw_name); | |||||
free(pw); | |||||
return (0); | |||||
} | |||||
/* Retrieves the password entry and also checks if the user is permitted */ | /* Retrieves the password entry and also checks if the user is permitted */ | ||||
int | int | ||||
Context not available. |