#include "../librpc/gen_ndr/ndr_auth.h"
#include "../auth/auth_sam_reply.h"
#include "../librpc/gen_ndr/idmap.h"
+#include "lib/param/loadparm.h"
#undef DBGC_CLASS
#define DBGC_CLASS DBGC_AUTH
char *add_script;
int ret;
- add_script = talloc_strdup(ctx, lp_adduser_script());
+ add_script = lp_adduser_script(ctx);
if (!add_script || !*add_script) {
return -1;
}
char *group_sidstr;
size_t i;
- if ((lp_log_nt_token_command() == NULL) ||
- (strlen(lp_log_nt_token_command()) == 0)) {
+ if ((lp_log_nt_token_command(frame) == NULL) ||
+ (strlen(lp_log_nt_token_command(frame)) == 0)) {
TALLOC_FREE(frame);
return NT_STATUS_OK;
}
}
command = talloc_string_sub(
- frame, lp_log_nt_token_command(),
+ frame, lp_log_nt_token_command(frame),
"%s", sid_string_talloc(frame, &token->sids[0]));
command = talloc_string_sub(frame, command, "%t", group_sidstr);
session_info->unix_info->sanitized_username =
talloc_strdup(session_info->unix_info, tmp);
- session_info->unix_info->system = server_info->system;
-
if (session_key) {
data_blob_free(&session_info->session_key);
session_info->session_key = data_blob_talloc(session_info,
if (server_info->security_token) {
/* Just copy the token, it has already been finalised
- * (nasty hack to support a cached guest session_info,
- * and a possible strategy for auth_samba4 to pass in
- * a finalised session) */
+ * (nasty hack to support a cached guest/system session_info
+ */
session_info->security_token = dup_nt_token(session_info, server_info->security_token);
if (!session_info->security_token) {
}
static NTSTATUS get_system_info3(TALLOC_CTX *mem_ctx,
- struct passwd *pwd,
struct netr_SamInfo3 *info3)
{
NTSTATUS status;
struct dom_sid *system_sid;
- const char *tmp;
/* Set account name */
- tmp = talloc_strdup(mem_ctx, pwd->pw_name);
- if (tmp == NULL) {
- return NT_STATUS_NO_MEMORY;
- }
- init_lsa_String(&info3->base.account_name, tmp);
+ init_lsa_String(&info3->base.account_name, "SYSTEM");
/* Set domain name */
- tmp = talloc_strdup(mem_ctx, get_global_sam_name());
- if (tmp == NULL) {
- return NT_STATUS_NO_MEMORY;
- }
- init_lsa_StringLarge(&info3->base.logon_domain, tmp);
+ init_lsa_StringLarge(&info3->base.logon_domain, "NT AUTHORITY");
/* The SID set here will be overwirtten anyway, but try and make it SID_NT_SYSTEM anyway */
info3->base.rid = DOMAIN_RID_GUEST;
/* Primary gid */
- info3->base.primary_gid = BUILTIN_RID_GUESTS;
+ info3->base.primary_gid = DOMAIN_RID_GUESTS;
/* Set as guest */
info3->base.user_flags = NETLOGON_GUEST;
return status;
}
-/****************************************************************************
- Fake a auth_session_info just from a username (as a
- session_info structure, with create_local_token() already called on
- it.
-****************************************************************************/
+/***************************************************************************
+ Make (and fill) a auth_session_info struct for a system user login.
+ This *must* succeed for smbd to start.
+***************************************************************************/
-static NTSTATUS make_system_session_info_from_pw(TALLOC_CTX *mem_ctx,
- struct passwd *pwd,
- struct auth_session_info **session_info)
+static NTSTATUS make_new_session_info_system(TALLOC_CTX *mem_ctx,
+ struct auth_session_info **session_info)
{
+ NTSTATUS status;
struct auth_serversupplied_info *server_info;
- const char *domain = lp_netbios_name();
- struct netr_SamInfo3 info3;
TALLOC_CTX *tmp_ctx;
- NTSTATUS status;
tmp_ctx = talloc_stackframe();
if (tmp_ctx == NULL) {
return NT_STATUS_NO_MEMORY;
}
- ZERO_STRUCT(info3);
-
- status = get_system_info3(tmp_ctx, pwd, &info3);
- if (!NT_STATUS_IS_OK(status)) {
- DEBUG(0, ("Failed creating system info3 with %s\n",
- nt_errstr(status)));
+ server_info = make_server_info(tmp_ctx);
+ if (!server_info) {
+ status = NT_STATUS_NO_MEMORY;
+ DEBUG(0, ("failed making server_info\n"));
goto done;
}
- status = make_server_info_info3(tmp_ctx,
- pwd->pw_name,
- domain,
- &server_info,
- &info3);
- if (!NT_STATUS_IS_OK(status)) {
- DEBUG(0, ("make_server_info_info3 failed with %s\n",
- nt_errstr(status)));
+ server_info->info3 = talloc_zero(server_info, struct netr_SamInfo3);
+ if (!server_info->info3) {
+ status = NT_STATUS_NO_MEMORY;
+ DEBUG(0, ("talloc failed setting info3\n"));
goto done;
}
- server_info->nss_token = true;
-
- /* Now turn the server_info into a session_info with the full token etc */
- status = create_local_token(mem_ctx, server_info, NULL, pwd->pw_name, session_info);
+ status = get_system_info3(server_info, server_info->info3);
if (!NT_STATUS_IS_OK(status)) {
- DEBUG(0, ("create_local_token failed: %s\n",
+ DEBUG(0, ("Failed creating system info3 with %s\n",
nt_errstr(status)));
goto done;
}
- talloc_free(server_info);
-
- /* SYSTEM has all privilages */
- (*session_info)->security_token->privilege_mask = ~0;
-
- talloc_steal(mem_ctx, *session_info);
-
- status = NT_STATUS_OK;
-done:
- TALLOC_FREE(tmp_ctx);
- return status;
-}
+ server_info->utok.uid = sec_initial_uid();
+ server_info->utok.gid = sec_initial_gid();
+ server_info->unix_name = talloc_asprintf(server_info,
+ "NT AUTHORITY%cSYSTEM",
+ *lp_winbind_separator());
-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;
+ if (!server_info->unix_name) {
+ status = NT_STATUS_NO_MEMORY;
+ DEBUG(0, ("talloc_asprintf failed setting unix_name\n"));
+ goto done;
+ }
- status = make_server_info_pw(&result, pwd->pw_name, pwd);
+ server_info->security_token = talloc_zero(server_info, struct security_token);
+ if (!server_info->security_token) {
+ status = NT_STATUS_NO_MEMORY;
+ DEBUG(0, ("talloc failed setting security token\n"));
+ goto done;
+ }
+ status = add_sid_to_array_unique(server_info->security_token->sids,
+ &global_sid_System,
+ &server_info->security_token->sids,
+ &server_info->security_token->num_sids);
if (!NT_STATUS_IS_OK(status)) {
- return status;
+ goto done;
}
- result->nss_token = true;
- result->guest = is_guest;
+ /* SYSTEM has all privilages */
+ server_info->security_token->privilege_mask = ~0;
/* 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.
-***************************************************************************/
-
-static NTSTATUS make_new_session_info_system(TALLOC_CTX *mem_ctx,
- struct auth_session_info **session_info)
-{
- struct passwd *pwd;
- NTSTATUS status;
-
- pwd = getpwuid_alloc(mem_ctx, sec_initial_uid());
- if (pwd == NULL) {
- return NT_STATUS_NO_SUCH_USER;
- }
+ status = create_local_token(mem_ctx, server_info, NULL, "SYSTEM", session_info);
+ talloc_free(server_info);
- status = make_system_session_info_from_pw(mem_ctx,
- pwd,
- session_info);
- TALLOC_FREE(pwd);
if (!NT_STATUS_IS_OK(status)) {
- return status;
+ DEBUG(0, ("create_local_token failed: %s\n",
+ nt_errstr(status)));
+ goto done;
}
- (*session_info)->unix_info->system = true;
-
- status = add_sid_to_array_unique((*session_info)->security_token->sids,
- &global_sid_System,
- &(*session_info)->security_token->sids,
- &(*session_info)->security_token->num_sids);
- if (!NT_STATUS_IS_OK(status)) {
- TALLOC_FREE((*session_info));
- return status;
- }
+ talloc_steal(mem_ctx, *session_info);
- return NT_STATUS_OK;
+done:
+ TALLOC_FREE(tmp_ctx);
+ return status;
}
/****************************************************************************
{
struct passwd *pwd;
NTSTATUS status;
+ struct auth_serversupplied_info *result;
pwd = Get_Pwnam_alloc(talloc_tos(), username);
if (pwd == NULL) {
return NT_STATUS_NO_SUCH_USER;
}
- status = make_session_info_from_pw(mem_ctx, pwd, is_guest, session_info);
+ status = make_server_info_pw(&result, pwd->pw_name, pwd);
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(result);
TALLOC_FREE(pwd);
+
return status;
}
if (!lower_username) {
return NT_STATUS_NO_MEMORY;
}
- strlower_m( lower_username );
+ if (!strlower_m( lower_username )) {
+ return NT_STATUS_INVALID_PARAMETER;
+ }
orig_dom_user = talloc_asprintf(mem_ctx,
"%s%c%s",
/* make sure we get the case of the username correct */
/* work around 'winbind use default domain = yes' */
- if ( !strchr_m( pw->pw_name, *lp_winbind_separator() ) ) {
+ if ( lp_winbind_use_default_domain() &&
+ !strchr_m( pw->pw_name, *lp_winbind_separator() ) ) {
char *domain;
/* split the domain and username into 2 strings */
char *found_username = NULL;
const char *nt_domain;
const char *nt_username;
+ struct dom_sid user_sid;
+ struct dom_sid group_sid;
bool username_was_mapped;
struct passwd *pwd;
struct auth_serversupplied_info *result;
- struct dom_sid *group_sid;
- struct netr_SamInfo3 *i3;
/*
Here is where we should check the list of
matches.
*/
+ if (!sid_compose(&user_sid, info3->base.domain_sid, info3->base.rid)) {
+ return NT_STATUS_INVALID_PARAMETER;
+ }
+
+ if (!sid_compose(&group_sid, info3->base.domain_sid,
+ info3->base.primary_gid)) {
+ return NT_STATUS_INVALID_PARAMETER;
+ }
+
nt_username = talloc_strdup(mem_ctx, info3->base.account_name.string);
if (!nt_username) {
/* If the server didn't give us one, just use the one we sent
result->unix_name = talloc_strdup(result, found_username);
/* copy in the info3 */
- result->info3 = i3 = copy_netr_SamInfo3(result, info3);
+ result->info3 = copy_netr_SamInfo3(result, info3);
if (result->info3 == NULL) {
TALLOC_FREE(result);
return NT_STATUS_NO_MEMORY;
}
/* Fill in the unix info we found on the way */
+
result->utok.uid = pwd->pw_uid;
result->utok.gid = pwd->pw_gid;
- /* We can't just trust that the primary group sid sent us is something
- * we can really use. Obtain the usable sid, and store the original
- * one as an additional group if it had to be replaced */
- nt_status = get_primary_group_sid(mem_ctx, found_username,
- &pwd, &group_sid);
- if (!NT_STATUS_IS_OK(nt_status)) {
- TALLOC_FREE(result);
- return nt_status;
- }
-
- /* store and check if it is the same we got originally */
- sid_peek_rid(group_sid, &i3->base.primary_gid);
- if (i3->base.primary_gid != info3->base.primary_gid) {
- uint32_t n = i3->base.groups.count;
- /* not the same, store the original as an additional group */
- i3->base.groups.rids =
- talloc_realloc(i3, i3->base.groups.rids,
- struct samr_RidWithAttribute, n + 1);
- if (i3->base.groups.rids == NULL) {
- TALLOC_FREE(result);
- return NT_STATUS_NO_MEMORY;
- }
- i3->base.groups.rids[n].rid = info3->base.primary_gid;
- i3->base.groups.rids[n].attributes = SE_GROUP_ENABLED;
- i3->base.groups.count = n + 1;
- }
-
/* ensure we are never given NULL session keys */
if (memcmp(info3->base.key.key, zeros, sizeof(zeros)) == 0) {