diff options
author | Andrew Bartlett <abartlet@samba.org> | 2012-02-03 18:19:36 +1100 |
---|---|---|
committer | Andrew Bartlett <abartlet@samba.org> | 2012-03-04 23:33:05 +0100 |
commit | 50de3cf9c0b95483263583d6f4762a77531a3004 (patch) | |
tree | cbbde8d33de1e99f05772cee79ea1de13cc9a175 /source3 | |
parent | d7bb961859a3501aec4d28842bfffb6190d19a73 (diff) | |
download | samba-50de3cf9c0b95483263583d6f4762a77531a3004.tar.gz samba-50de3cf9c0b95483263583d6f4762a77531a3004.tar.bz2 samba-50de3cf9c0b95483263583d6f4762a77531a3004.zip |
s3-auth Add make_session_info_from_pw to avoid multiple getpwnam() calls
Diffstat (limited to 'source3')
-rw-r--r-- | source3/auth/auth_util.c | 46 |
1 files changed, 34 insertions, 12 deletions
diff --git a/source3/auth/auth_util.c b/source3/auth/auth_util.c index e0665784f1..06aa9c5108 100644 --- a/source3/auth/auth_util.c +++ b/source3/auth/auth_util.c @@ -891,6 +891,35 @@ done: return status; } +/**************************************************************************** + Fake a auth_session_info just from a username (as a + session_info structure, with create_local_token() already called on + it. +****************************************************************************/ + +static NTSTATUS make_session_info_from_pw(TALLOC_CTX *mem_ctx, + struct passwd *pwd, + bool is_guest, + struct auth_session_info **session_info) +{ + struct auth_serversupplied_info *result; + NTSTATUS status; + + status = make_server_info_pw(&result, pwd->pw_name, pwd); + + if (!NT_STATUS_IS_OK(status)) { + return status; + } + + result->nss_token = true; + result->guest = is_guest; + + /* Now turn the server_info into a session_info with the full token etc */ + status = create_local_token(mem_ctx, result, NULL, pwd->pw_name, session_info); + talloc_free(result); + return status; +} + /*************************************************************************** Make (and fill) a auth_session_info struct for a system user login. This *must* succeed for smbd to start. @@ -907,10 +936,10 @@ static NTSTATUS make_new_session_info_system(TALLOC_CTX *mem_ctx, return NT_STATUS_NO_SUCH_USER; } - status = make_session_info_from_username(mem_ctx, - pwd->pw_name, - false, - session_info); + status = make_session_info_from_pw(mem_ctx, + pwd, + false, + session_info); TALLOC_FREE(pwd); if (!NT_STATUS_IS_OK(status)) { return status; @@ -941,7 +970,6 @@ NTSTATUS make_session_info_from_username(TALLOC_CTX *mem_ctx, bool is_guest, struct auth_session_info **session_info) { - struct auth_serversupplied_info *result; struct passwd *pwd; NTSTATUS status; @@ -950,20 +978,14 @@ NTSTATUS make_session_info_from_username(TALLOC_CTX *mem_ctx, return NT_STATUS_NO_SUCH_USER; } - status = make_server_info_pw(&result, pwd->pw_name, pwd); + status = make_session_info_from_pw(mem_ctx, pwd, is_guest, session_info); if (!NT_STATUS_IS_OK(status)) { TALLOC_FREE(pwd); return status; } - result->nss_token = true; - result->guest = is_guest; - - /* Now turn the server_info into a session_info with the full token etc */ - status = create_local_token(mem_ctx, result, NULL, pwd->pw_name, session_info); TALLOC_FREE(pwd); - talloc_free(result); return status; } |