From: Stefan Metzmacher Date: Thu, 7 Jan 2016 14:15:14 +0000 (+0100) Subject: auth/auth_sam_reply: add auth_convert_user_info_dc_saminfo6() and implement level... X-Git-Tag: tdb-1.3.10~587 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=aee33fc38ab496af621df770c91b5d05e17ff617;p=thirdparty%2Fsamba.git auth/auth_sam_reply: add auth_convert_user_info_dc_saminfo6() and implement level 3 as wrapper Signed-off-by: Stefan Metzmacher Reviewed-by: Andrew Bartlett --- diff --git a/auth/auth_sam_reply.c b/auth/auth_sam_reply.c index 0e2c008984f..5602daf62de 100644 --- a/auth/auth_sam_reply.c +++ b/auth/auth_sam_reply.c @@ -130,32 +130,33 @@ NTSTATUS auth_convert_user_info_dc_sambaseinfo(TALLOC_CTX *mem_ctx, return NT_STATUS_OK; } -/* Note that the validity of the _sam3 structure is only as long as +/* Note that the validity of the _sam6 structure is only as long as * the user_info_dc it was generated from */ -NTSTATUS auth_convert_user_info_dc_saminfo3(TALLOC_CTX *mem_ctx, - const struct auth_user_info_dc *user_info_dc, - struct netr_SamInfo3 **_sam3) +NTSTATUS auth_convert_user_info_dc_saminfo6(TALLOC_CTX *mem_ctx, + const struct auth_user_info_dc *user_info_dc, + struct netr_SamInfo6 **_sam6) { - struct netr_SamBaseInfo *sam; - struct netr_SamInfo3 *sam3 = talloc_zero(mem_ctx, struct netr_SamInfo3); NTSTATUS status; + struct netr_SamBaseInfo *sam = NULL; + struct netr_SamInfo6 *sam6 = NULL; size_t i; - NT_STATUS_HAVE_NO_MEMORY(sam3); - status = auth_convert_user_info_dc_sambaseinfo(sam3, user_info_dc, &sam); + sam6 = talloc_zero(mem_ctx, struct netr_SamInfo6); + if (sam6 == NULL) { + return NT_STATUS_NO_MEMORY; + } + + status = auth_convert_user_info_dc_sambaseinfo(sam6, user_info_dc, &sam); if (!NT_STATUS_IS_OK(status)) { - talloc_free(sam3); + TALLOC_FREE(sam6); return status; } - sam3->base = *sam; - sam3->sidcount = 0; - sam3->sids = NULL; - + sam6->base = *sam; - sam3->sids = talloc_array(sam, struct netr_SidAttr, + sam6->sids = talloc_array(sam6, struct netr_SidAttr, user_info_dc->num_sids); - if (sam3->sids == NULL) { - TALLOC_FREE(sam3); + if (sam6->sids == NULL) { + TALLOC_FREE(sam6); return NT_STATUS_NO_MEMORY; } @@ -164,22 +165,68 @@ NTSTATUS auth_convert_user_info_dc_saminfo3(TALLOC_CTX *mem_ctx, if (dom_sid_in_domain(sam->domain_sid, &user_info_dc->sids[i])) { continue; } - sam3->sids[sam3->sidcount].sid = dom_sid_dup(sam3->sids, &user_info_dc->sids[i]); - if (sam3->sids[sam3->sidcount].sid == NULL) { - TALLOC_FREE(sam3); + sam6->sids[sam6->sidcount].sid = dom_sid_dup(sam6->sids, &user_info_dc->sids[i]); + if (sam6->sids[sam6->sidcount].sid == NULL) { + TALLOC_FREE(sam6); return NT_STATUS_NO_MEMORY; } - sam3->sids[sam3->sidcount].attributes = + sam6->sids[sam6->sidcount].attributes = SE_GROUP_MANDATORY | SE_GROUP_ENABLED_BY_DEFAULT | SE_GROUP_ENABLED; - sam3->sidcount += 1; + sam6->sidcount += 1; } - if (sam3->sidcount) { - sam3->base.user_flags |= NETLOGON_EXTRA_SIDS; + if (sam6->sidcount) { + sam6->base.user_flags |= NETLOGON_EXTRA_SIDS; } else { - sam3->sids = NULL; + sam6->sids = NULL; } - *_sam3 = sam3; + if (user_info_dc->info->dns_domain_name != NULL) { + sam6->dns_domainname.string = talloc_strdup(sam6, + user_info_dc->info->dns_domain_name); + if (sam6->dns_domainname.string == NULL) { + TALLOC_FREE(sam6); + return NT_STATUS_NO_MEMORY; + } + } + + if (user_info_dc->info->user_principal_name != NULL) { + sam6->principal_name.string = talloc_strdup(sam6, + user_info_dc->info->user_principal_name); + if (sam6->principal_name.string == NULL) { + TALLOC_FREE(sam6); + return NT_STATUS_NO_MEMORY; + } + } + + *_sam6 = sam6; + return NT_STATUS_OK; +} + +/* Note that the validity of the _sam3 structure is only as long as + * the user_info_dc it was generated from */ +NTSTATUS auth_convert_user_info_dc_saminfo3(TALLOC_CTX *mem_ctx, + const struct auth_user_info_dc *user_info_dc, + struct netr_SamInfo3 **_sam3) +{ + NTSTATUS status; + struct netr_SamInfo6 *sam6 = NULL; + struct netr_SamInfo3 *sam3 = NULL; + + sam3 = talloc_zero(mem_ctx, struct netr_SamInfo3); + if (sam3 == NULL) { + return NT_STATUS_NO_MEMORY; + } + + status = auth_convert_user_info_dc_saminfo6(sam3, user_info_dc, &sam6); + if (!NT_STATUS_IS_OK(status)) { + TALLOC_FREE(sam3); + return status; + } + sam3->base = sam6->base; + sam3->sidcount = sam6->sidcount; + sam3->sids = sam6->sids; + + *_sam3 = sam3; return NT_STATUS_OK; } diff --git a/auth/auth_sam_reply.h b/auth/auth_sam_reply.h index d9573242129..c163bcaa288 100644 --- a/auth/auth_sam_reply.h +++ b/auth/auth_sam_reply.h @@ -41,6 +41,9 @@ NTSTATUS make_user_info_SamBaseInfo(TALLOC_CTX *mem_ctx, NTSTATUS auth_convert_user_info_dc_sambaseinfo(TALLOC_CTX *mem_ctx, const struct auth_user_info_dc *user_info_dc, struct netr_SamBaseInfo **_sam); +NTSTATUS auth_convert_user_info_dc_saminfo6(TALLOC_CTX *mem_ctx, + const struct auth_user_info_dc *user_info_dc, + struct netr_SamInfo6 **_sam6); NTSTATUS auth_convert_user_info_dc_saminfo3(TALLOC_CTX *mem_ctx, const struct auth_user_info_dc *user_info_dc, struct netr_SamInfo3 **_sam3);