static void session_init(struct vsf_session* p_sess) { /* Get the addresses of the control connection */ vsf_sysutil_getpeername(VSFTP_COMMAND_FD, &p_sess->p_remote_addr); vsf_sysutil_getsockname(VSFTP_COMMAND_FD, &p_sess->p_local_addr); /* If anonymous mode is active, fetch the uid of the anonymous user */ if (tunable_anonymous_enable) { const struct vsf_sysutil_user* p_user = vsf_sysutil_getpwnam(tunable_ftp_username); if (p_user == 0) { die("vsftpd: cannot locate user specified in 'ftp_username'"); } p_sess->anon_ftp_uid = vsf_sysutil_user_getuid(p_user); if (tunable_chown_uploads) { p_user = vsf_sysutil_getpwnam(tunable_chown_username); if (p_user == 0) { die("vsftpd: cannot locate user specified in 'chown_username'"); } p_sess->anon_upload_chown_uid = vsf_sysutil_user_getuid(p_user); } } }
struct vsf_sysutil_user* str_getpwnam(const struct mystr* p_user_str) { return vsf_sysutil_getpwnam(str_getbuf(p_user_str)); }
int vsf_sysdep_check_auth(struct mystr* p_user_str, const struct mystr* p_pass_str, const struct mystr* p_remote_host) { const char* p_crypted; const struct passwd* p_pwd = (struct passwd*) vsf_sysutil_getpwnam(str_getbuf(p_user_str)); (void) p_remote_host; if (p_pwd == NULL) { return 0; } #ifdef VSF_SYSDEP_HAVE_USERSHELL if (tunable_check_shell) { const char* p_shell; while ((p_shell = getusershell()) != NULL) { if (!vsf_sysutil_strcmp(p_shell, p_pwd->pw_shell)) { break; } } endusershell(); if (p_shell == NULL) { return 0; } } #endif #ifdef VSF_SYSDEP_HAVE_SHADOW { const struct spwd* p_spwd = getspnam(str_getbuf(p_user_str)); if (p_spwd != NULL) { long curr_time = vsf_sysutil_get_time_sec(); int days; days = curr_time / (60 * 60 * 24); if (p_spwd->sp_expire > 0 && p_spwd->sp_expire < days) { return 0; } if (p_spwd->sp_lstchg > 0 && p_spwd->sp_max > 0 && p_spwd->sp_lstchg + p_spwd->sp_max < days) { return 0; } p_crypted = crypt(str_getbuf(p_pass_str), p_spwd->sp_pwdp); if (!vsf_sysutil_strcmp(p_crypted, p_spwd->sp_pwdp)) { return 1; } } } #endif /* VSF_SYSDEP_HAVE_SHADOW */ p_crypted = crypt(str_getbuf(p_pass_str), p_pwd->pw_passwd); if (!vsf_sysutil_strcmp(p_crypted, p_pwd->pw_passwd)) { return 1; } return 0; }