diff options
author | Andreas Schneider <asn@samba.org> | 2010-04-14 15:15:32 +0200 |
---|---|---|
committer | Günther Deschner <gd@samba.org> | 2010-05-28 14:31:39 +0200 |
commit | 93ac516e15ab771b6ed4eeacc556a2ec916387bb (patch) | |
tree | a795aa18ad806ac26d79214551f2014d27ac5477 /source3 | |
parent | 87037006bd27601b620d0d31f72261ba968d9567 (diff) | |
download | samba-93ac516e15ab771b6ed4eeacc556a2ec916387bb.tar.gz |
s3-auth: Added a function to get the server_info from the system user.
Signed-off-by: Günther Deschner <gd@samba.org>
Diffstat (limited to 'source3')
-rw-r--r-- | source3/auth/auth_util.c | 39 | ||||
-rw-r--r-- | source3/include/proto.h | 3 | ||||
-rw-r--r-- | source3/smbd/server.c | 5 |
3 files changed, 47 insertions, 0 deletions
diff --git a/source3/auth/auth_util.c b/source3/auth/auth_util.c index 7869637bd1b..bccec8080b8 100644 --- a/source3/auth/auth_util.c +++ b/source3/auth/auth_util.c @@ -756,6 +756,27 @@ static NTSTATUS make_new_server_info_guest(struct auth_serversupplied_info **ser return NT_STATUS_OK; } +/*************************************************************************** + Make (and fill) a user_info struct for a system user login. + This *must* succeed for smbd to start. +***************************************************************************/ + +static NTSTATUS make_new_server_info_system(TALLOC_CTX *mem_ctx, + struct auth_serversupplied_info **server_info) +{ + struct passwd *pwd; + + pwd = getpwuid_alloc(mem_ctx, sec_initial_uid()); + if (pwd == NULL) { + return NT_STATUS_NO_MEMORY; + } + + return make_serverinfo_from_username(mem_ctx, + pwd->pw_name, + false, + server_info); +} + /**************************************************************************** Fake a auth_serversupplied_info just from a username ****************************************************************************/ @@ -888,6 +909,24 @@ NTSTATUS make_server_info_guest(TALLOC_CTX *mem_ctx, return (*server_info != NULL) ? NT_STATUS_OK : NT_STATUS_NO_MEMORY; } +static struct auth_serversupplied_info *system_info = NULL; + +bool init_system_info(void) +{ + if (system_info != NULL) + return True; + + return NT_STATUS_IS_OK(make_new_server_info_system(talloc_autofree_context(), &system_info)); +} + +NTSTATUS make_server_info_system(TALLOC_CTX *mem_ctx, + struct auth_serversupplied_info **server_info) +{ + if (system_info == NULL) return NT_STATUS_UNSUCCESSFUL; + *server_info = copy_serverinfo(mem_ctx, system_info); + return (*server_info != NULL) ? NT_STATUS_OK : NT_STATUS_NO_MEMORY; +} + bool copy_current_user(struct current_user *dst, struct current_user *src) { gid_t *groups; diff --git a/source3/include/proto.h b/source3/include/proto.h index cc14658a03d..f53c52c6635 100644 --- a/source3/include/proto.h +++ b/source3/include/proto.h @@ -133,10 +133,13 @@ NTSTATUS make_serverinfo_from_username(TALLOC_CTX *mem_ctx, struct auth_serversupplied_info *copy_serverinfo(TALLOC_CTX *mem_ctx, const struct auth_serversupplied_info *src); bool init_guest_info(void); +bool init_system_info(void); bool server_info_set_session_key(struct auth_serversupplied_info *info, DATA_BLOB session_key); NTSTATUS make_server_info_guest(TALLOC_CTX *mem_ctx, struct auth_serversupplied_info **server_info); +NTSTATUS make_server_info_system(TALLOC_CTX *mem_ctx, + struct auth_serversupplied_info **server_info); bool copy_current_user(struct current_user *dst, struct current_user *src); struct passwd *smb_getpwnam( TALLOC_CTX *mem_ctx, char *domuser, fstring save_username, bool create ); diff --git a/source3/smbd/server.c b/source3/smbd/server.c index fcfabcd06f0..7cd69467a8b 100644 --- a/source3/smbd/server.c +++ b/source3/smbd/server.c @@ -1318,6 +1318,11 @@ extern void build_options(bool screen); exit(1); #endif + if (!init_system_info()) { + DEBUG(0,("ERROR: failed to setup system user info.\n")); + return -1; + } + if (!print_backend_init(smbd_messaging_context())) exit(1); |