summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAndreas Schneider <asn@samba.org>2010-04-14 15:15:32 +0200
committerGünther Deschner <gd@samba.org>2010-05-28 14:31:39 +0200
commit93ac516e15ab771b6ed4eeacc556a2ec916387bb (patch)
treea795aa18ad806ac26d79214551f2014d27ac5477
parent87037006bd27601b620d0d31f72261ba968d9567 (diff)
downloadsamba-93ac516e15ab771b6ed4eeacc556a2ec916387bb.tar.gz
samba-93ac516e15ab771b6ed4eeacc556a2ec916387bb.tar.bz2
samba-93ac516e15ab771b6ed4eeacc556a2ec916387bb.zip
s3-auth: Added a function to get the server_info from the system user.
Signed-off-by: Günther Deschner <gd@samba.org>
-rw-r--r--source3/auth/auth_util.c39
-rw-r--r--source3/include/proto.h3
-rw-r--r--source3/smbd/server.c5
3 files changed, 47 insertions, 0 deletions
diff --git a/source3/auth/auth_util.c b/source3/auth/auth_util.c
index 7869637bd1..bccec8080b 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 cc14658a03..f53c52c663 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 fcfabcd06f..7cd69467a8 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);