diff options
Diffstat (limited to 'source3')
-rw-r--r-- | source3/auth/server_info.c | 135 | ||||
-rw-r--r-- | source3/include/proto.h | 2 |
2 files changed, 137 insertions, 0 deletions
diff --git a/source3/auth/server_info.c b/source3/auth/server_info.c index e9ccdb6700..d9b25bda68 100644 --- a/source3/auth/server_info.c +++ b/source3/auth/server_info.c @@ -441,3 +441,138 @@ struct netr_SamInfo3 *copy_netr_SamInfo3(TALLOC_CTX *mem_ctx, return info3; } + +static NTSTATUS wbcsids_to_samr_RidWithAttributeArray( + TALLOC_CTX *mem_ctx, + struct samr_RidWithAttributeArray *groups, + const struct dom_sid *domain_sid, + const struct wbcSidWithAttr *sids, + size_t num_sids) +{ + unsigned int i; + bool ok; + + groups->rids = talloc_array(mem_ctx, + struct samr_RidWithAttribute, num_sids); + if (!groups->rids) { + return NT_STATUS_NO_MEMORY; + } + + /* a wbcDomainSid is the same as a dom_sid */ + for (i = 0; i < num_sids; i++) { + ok = sid_peek_check_rid(domain_sid, + (const struct dom_sid *)&sids[i].sid, + &groups->rids[i].rid); + if (!ok) continue; + + groups->rids[i].attributes = SE_GROUP_MANDATORY | + SE_GROUP_ENABLED_BY_DEFAULT | + SE_GROUP_ENABLED; + groups->count++; + } + + return NT_STATUS_OK; +} + +struct netr_SamInfo3 *wbcAuthUserInfo_to_netr_SamInfo3(TALLOC_CTX *mem_ctx, + const struct wbcAuthUserInfo *info) +{ + struct netr_SamInfo3 *info3; + struct dom_sid user_sid; + struct dom_sid group_sid; + struct dom_sid domain_sid; + NTSTATUS status; + bool ok; + + memcpy(&user_sid, &info->sids[0].sid, sizeof(user_sid)); + memcpy(&group_sid, &info->sids[1].sid, sizeof(group_sid)); + + info3 = talloc_zero(mem_ctx, struct netr_SamInfo3); + if (!info3) return NULL; + + info3->base.last_logon = info->logon_time; + info3->base.last_logoff = info->logoff_time; + info3->base.acct_expiry = info->kickoff_time; + info3->base.last_password_change = info->pass_last_set_time; + info3->base.allow_password_change = info->pass_can_change_time; + info3->base.force_password_change = info->pass_must_change_time; + + if (info->account_name) { + info3->base.account_name.string = + talloc_strdup(info3, info->account_name); + RET_NOMEM(info3->base.account_name.string); + } + if (info->full_name) { + info3->base.full_name.string = + talloc_strdup(info3, info->full_name); + RET_NOMEM(info3->base.full_name.string); + } + if (info->logon_script) { + info3->base.logon_script.string = + talloc_strdup(info3, info->logon_script); + RET_NOMEM(info3->base.logon_script.string); + } + if (info->profile_path) { + info3->base.profile_path.string = + talloc_strdup(info3, info->profile_path); + RET_NOMEM(info3->base.profile_path.string); + } + if (info->home_directory) { + info3->base.home_directory.string = + talloc_strdup(info3, info->home_directory); + RET_NOMEM(info3->base.home_directory.string); + } + if (info->home_drive) { + info3->base.home_drive.string = + talloc_strdup(info3, info->home_drive); + RET_NOMEM(info3->base.home_drive.string); + } + + info3->base.logon_count = info->logon_count; + info3->base.bad_password_count = info->bad_password_count; + + sid_copy(&domain_sid, &user_sid); + sid_split_rid(&domain_sid, &info3->base.rid); + + ok = sid_peek_check_rid(&domain_sid, &group_sid, + &info3->base.primary_gid); + if (!ok) { + DEBUG(1, ("The primary group sid domain does not" + "match user sid domain for user: %s\n", + info->account_name)); + TALLOC_FREE(info3); + return NULL; + } + + status = wbcsids_to_samr_RidWithAttributeArray(info3, + &info3->base.groups, + &domain_sid, + &info->sids[1], + info->num_sids - 1); + if (!NT_STATUS_IS_OK(status)) { + TALLOC_FREE(info3); + return NULL; + } + + info3->base.user_flags = info->user_flags; + memcpy(info3->base.key.key, info->user_session_key, 16); + + if (info->logon_server) { + info3->base.logon_server.string = + talloc_strdup(info3, info->logon_server); + RET_NOMEM(info3->base.logon_server.string); + } + if (info->domain_name) { + info3->base.domain.string = + talloc_strdup(info3, info->domain_name); + RET_NOMEM(info3->base.domain.string); + } + + info3->base.domain_sid = sid_dup_talloc(info3, &domain_sid); + RET_NOMEM(info3->base.domain_sid); + + memcpy(info3->base.LMSessKey.key, info->lm_session_key, 8); + info3->base.acct_flags = info->acct_flags; + + return info3; +} diff --git a/source3/include/proto.h b/source3/include/proto.h index ff7eb9383e..8c3f05eade 100644 --- a/source3/include/proto.h +++ b/source3/include/proto.h @@ -184,6 +184,8 @@ NTSTATUS samu_to_SamInfo3(TALLOC_CTX *mem_ctx, struct netr_SamInfo3 **_info3); struct netr_SamInfo3 *copy_netr_SamInfo3(TALLOC_CTX *mem_ctx, struct netr_SamInfo3 *orig); +struct netr_SamInfo3 *wbcAuthUserInfo_to_netr_SamInfo3(TALLOC_CTX *mem_ctx, + const struct wbcAuthUserInfo *info); /* The following definitions come from auth/auth_wbc.c */ |