[SCM] Samba Shared Repository - branch master updated

Andrew Bartlett abartlet at samba.org
Wed Mar 22 19:37:01 UTC 2023


The branch, master has been updated
       via  7e3cbc2c641 s4:kdc: Fix typo
       via  9d59e42a2ba s4:kdc: Split samba_kdc_get_pac_blobs() into smaller functions
       via  c7b00ccc76f s4:kdc: Rename claims_blob to client_claims_blob
       via  fbed57b86bc s4:kdc: Fix leak
       via  9c4f7e4b339 s4:kdc: Don't modify cached user_info_dc SIDs
       via  c62937822d8 s4:kdc: Don't check PAC-OPTIONS claims-supported bit
       via  3e97ea3f35e s4:kdc: Have samba_kdc_update_pac() take device parameters
       via  a326aec4c04 s4:kdc: Don't pass a NULL pointer to krb5_pac_add_buffer()
       via  1a625702e81 libcli/security: Correctly handle ACL deletion
       via  545b40a70b0 s4/dsdb/repl_meta_data: Pass NULL into ldb_msg_add_empty
       via  211d19a04c3 ldb: Don't create error string if there is no error
      from  6241380bc52 samba-tool: rewrite dsacl.py to use the new sd_utils helpers

https://git.samba.org/?p=samba.git;a=shortlog;h=master


- Log -----------------------------------------------------------------
commit 7e3cbc2c6418a876ab4770f1fd5ff12e8c8dae9d
Author: Joseph Sutton <josephsutton at catalyst.net.nz>
Date:   Tue Mar 21 09:43:01 2023 +1300

    s4:kdc: Fix typo
    
    Signed-off-by: Joseph Sutton <josephsutton at catalyst.net.nz>
    Reviewed-by: Andrew Bartlett <abartlet at samba.org>
    
    Autobuild-User(master): Andrew Bartlett <abartlet at samba.org>
    Autobuild-Date(master): Wed Mar 22 19:36:28 UTC 2023 on atb-devel-224

commit 9d59e42a2bacf53eda99f0a3d96f9ce4088b1ddc
Author: Joseph Sutton <josephsutton at catalyst.net.nz>
Date:   Mon Mar 20 15:16:21 2023 +1300

    s4:kdc: Split samba_kdc_get_pac_blobs() into smaller functions
    
    Instead of having one large function that returns every PAC blob, we now
    have a more manageable assortment of smaller functions that each return
    one blob.
    
    That gives us more fine-grained handling of PAC blobs, with callers now
    able to procure only the specific blobs that they need.
    
    Signed-off-by: Joseph Sutton <josephsutton at catalyst.net.nz>
    Reviewed-by: Andrew Bartlett <abartlet at samba.org>

commit c7b00ccc76f4a055dd761c929c23b014b214c4f5
Author: Joseph Sutton <josephsutton at catalyst.net.nz>
Date:   Mon Mar 20 15:13:39 2023 +1300

    s4:kdc: Rename claims_blob to client_claims_blob
    
    This will not be the only claims blob. Later there will also be a
    device_claims_blob.
    
    Signed-off-by: Joseph Sutton <josephsutton at catalyst.net.nz>
    Reviewed-by: Andrew Bartlett <abartlet at samba.org>

commit fbed57b86bc5b358a7373c134ce26a012b4280ef
Author: Joseph Sutton <josephsutton at catalyst.net.nz>
Date:   Mon Mar 20 15:11:54 2023 +1300

    s4:kdc: Fix leak
    
    Signed-off-by: Joseph Sutton <josephsutton at catalyst.net.nz>
    Reviewed-by: Andrew Bartlett <abartlet at samba.org>

commit 9c4f7e4b339d6ed5ed1030f87c9a871b06987265
Author: Joseph Sutton <josephsutton at catalyst.net.nz>
Date:   Mon Mar 20 15:02:53 2023 +1300

    s4:kdc: Don't modify cached user_info_dc SIDs
    
    samba_kdc_get_pac_blobs() passes a pointer to a user_info_dc structure
    obtained from samba_kdc_get_user_info_from_db() into
    samba_add_asserted_identity(). The latter function modifies the SIDs of
    the user_info_dc structure in order to add the Asserted Identity SID,
    but samba_kdc_get_user_info_from_db() actually caches that structure
    internally, meaning that subsequent calls will return the modified
    structure.
    
    We should not modify cached SIDs, so have
    samba_kdc_get_user_info_from_db() return a pointer to constant data, and
    copy the returned array of SIDs before adding the Asserted Identity SID.
    
    Signed-off-by: Joseph Sutton <josephsutton at catalyst.net.nz>
    Reviewed-by: Andrew Bartlett <abartlet at samba.org>

commit c62937822d8d814a70d32efab93be721791c57f0
Author: Joseph Sutton <josephsutton at catalyst.net.nz>
Date:   Fri Mar 17 11:57:09 2023 +1300

    s4:kdc: Don't check PAC-OPTIONS claims-supported bit
    
    Windows only consults the PAC-OPTIONS claims bit to find out whether or
    not to add claims to the PAC if the ClaimsCompIdFASTSupport option is
    set to 1. If this option is set to 2 or 3, the bit is ignored and claims
    are always added.
    
    Signed-off-by: Joseph Sutton <josephsutton at catalyst.net.nz>
    Reviewed-by: Andrew Bartlett <abartlet at samba.org>

commit 3e97ea3f35e3d147b491bb2da959b0f8a6207835
Author: Joseph Sutton <josephsutton at catalyst.net.nz>
Date:   Fri Mar 17 11:14:15 2023 +1300

    s4:kdc: Have samba_kdc_update_pac() take device parameters
    
    These will be used later when we add support for compound
    authentication.
    
    Signed-off-by: Joseph Sutton <josephsutton at catalyst.net.nz>
    Reviewed-by: Andrew Bartlett <abartlet at samba.org>

commit a326aec4c0495200d05ab8b2310f23199058167a
Author: Joseph Sutton <josephsutton at catalyst.net.nz>
Date:   Fri Mar 17 11:07:11 2023 +1300

    s4:kdc: Don't pass a NULL pointer to krb5_pac_add_buffer()
    
    Heimdal contains an assertion that the data pointer is not NULL. We need
    to pass in a pointer to some dummy data instead.
    
    Signed-off-by: Joseph Sutton <josephsutton at catalyst.net.nz>
    Reviewed-by: Andrew Bartlett <abartlet at samba.org>

commit 1a625702e81ef2a6bd38c486e3056ce61da800e8
Author: Joseph Sutton <josephsutton at catalyst.net.nz>
Date:   Mon Mar 13 10:09:15 2023 +1300

    libcli/security: Correctly handle ACL deletion
    
    If there were two consecutive occurrences of an ACL to be deleted, we
    would miss the second one.
    
    Signed-off-by: Joseph Sutton <josephsutton at catalyst.net.nz>
    Reviewed-by: Andrew Bartlett <abartlet at samba.org>

commit 545b40a70b02141ed292ddd3ff63d1f62070bb85
Author: Joseph Sutton <josephsutton at catalyst.net.nz>
Date:   Wed Mar 8 09:24:49 2023 +1300

    s4/dsdb/repl_meta_data: Pass NULL into ldb_msg_add_empty
    
    We weren't doing anything with the passed-in 'el' afterwards, so this
    was just confusing.
    
    Signed-off-by: Joseph Sutton <josephsutton at catalyst.net.nz>
    Reviewed-by: Andrew Bartlett <abartlet at samba.org>

commit 211d19a04c303ad264e3d155ce9bee242789cf62
Author: Joseph Sutton <josephsutton at catalyst.net.nz>
Date:   Wed Mar 8 09:23:00 2023 +1300

    ldb: Don't create error string if there is no error
    
    We should only do this in the LDB_ERR_NO_SUCH_ATTRIBUTE case.
    
    Signed-off-by: Joseph Sutton <josephsutton at catalyst.net.nz>
    Reviewed-by: Andrew Bartlett <abartlet at samba.org>

-----------------------------------------------------------------------

Summary of changes:
 lib/ldb/ldb_key_value/ldb_kv.c                  |  15 +-
 libcli/security/security_descriptor.c           |   1 +
 source4/auth/session.c                          |   2 +-
 source4/auth/session.h                          |   2 +-
 source4/dsdb/samdb/ldb_modules/repl_meta_data.c |   2 +-
 source4/kdc/db-glue.c                           |   4 +-
 source4/kdc/mit_samba.c                         |  70 +++-
 source4/kdc/pac-glue.c                          | 440 ++++++++++++++++--------
 source4/kdc/pac-glue.h                          |  45 ++-
 source4/kdc/wdc-samba4.c                        | 133 ++++---
 10 files changed, 457 insertions(+), 257 deletions(-)


Changeset truncated at 500 lines:

diff --git a/lib/ldb/ldb_key_value/ldb_kv.c b/lib/ldb/ldb_key_value/ldb_kv.c
index aea6f0c1be0..4c153b21c31 100644
--- a/lib/ldb/ldb_key_value/ldb_kv.c
+++ b/lib/ldb/ldb_key_value/ldb_kv.c
@@ -1289,13 +1289,14 @@ int ldb_kv_modify_internal(struct ldb_module *module,
 				    ldb_kv,
 				    msg2,
 				    msg->elements[i].name);
-				if (ret == LDB_ERR_NO_SUCH_ATTRIBUTE &&
-				    control_permissive) {
-					ret = LDB_SUCCESS;
-				} else {
-					ldb_asprintf_errstring(ldb,
-							       "attribute '%s': no such attribute for delete on '%s'",
-							       msg->elements[i].name, dn);
+				if (ret == LDB_ERR_NO_SUCH_ATTRIBUTE) {
+					if (control_permissive) {
+						ret = LDB_SUCCESS;
+					} else {
+						ldb_asprintf_errstring(ldb,
+								       "attribute '%s': no such attribute for delete on '%s'",
+								       msg->elements[i].name, dn);
+					}
 				}
 				if (ret != LDB_SUCCESS) {
 					goto done;
diff --git a/libcli/security/security_descriptor.c b/libcli/security/security_descriptor.c
index d6a7eda611b..ebc5c8f1f45 100644
--- a/libcli/security/security_descriptor.c
+++ b/libcli/security/security_descriptor.c
@@ -414,6 +414,7 @@ static NTSTATUS security_descriptor_acl_del(struct security_descriptor *sd,
 				acl->aces = NULL;
 			}
 			found = true;
+			--i;
 		}
 	}
 
diff --git a/source4/auth/session.c b/source4/auth/session.c
index 4b9a0058dd5..2e28bc15c6d 100644
--- a/source4/auth/session.c
+++ b/source4/auth/session.c
@@ -52,7 +52,7 @@ _PUBLIC_ struct auth_session_info *anonymous_session(TALLOC_CTX *mem_ctx,
 _PUBLIC_ NTSTATUS auth_generate_session_info(TALLOC_CTX *mem_ctx,
 					     struct loadparm_context *lp_ctx, /* Optional, if you don't want privilages */
 					     struct ldb_context *sam_ctx, /* Optional, if you don't want local groups */
-					     struct auth_user_info_dc *user_info_dc,
+					     const struct auth_user_info_dc *user_info_dc,
 					     uint32_t session_info_flags,
 					     struct auth_session_info **_session_info)
 {
diff --git a/source4/auth/session.h b/source4/auth/session.h
index 97a8aba0f14..2d42396a556 100644
--- a/source4/auth/session.h
+++ b/source4/auth/session.h
@@ -39,7 +39,7 @@ NTSTATUS auth_anonymous_user_info_dc(TALLOC_CTX *mem_ctx,
 NTSTATUS auth_generate_session_info(TALLOC_CTX *mem_ctx,
 				    struct loadparm_context *lp_ctx, /* Optional, if you don't want privilages */
 				    struct ldb_context *sam_ctx, /* Optional, if you don't want local groups */
-				    struct auth_user_info_dc *interim_info,
+				    const struct auth_user_info_dc *interim_info,
 				    uint32_t session_info_flags,
 				    struct auth_session_info **session_info);
 NTSTATUS auth_anonymous_session_info(TALLOC_CTX *parent_ctx, 
diff --git a/source4/dsdb/samdb/ldb_modules/repl_meta_data.c b/source4/dsdb/samdb/ldb_modules/repl_meta_data.c
index 175a02d3ba7..cb32d190dce 100644
--- a/source4/dsdb/samdb/ldb_modules/repl_meta_data.c
+++ b/source4/dsdb/samdb/ldb_modules/repl_meta_data.c
@@ -4712,7 +4712,7 @@ static int replmd_delete_internals(struct ldb_module *module, struct ldb_request
 				 */
 				dsdb_flags |= DSDB_REPLMD_VANISH_LINKS;
 			}
-			ret = ldb_msg_add_empty(msg, el->name, LDB_FLAG_MOD_DELETE, &el);
+			ret = ldb_msg_add_empty(msg, el->name, LDB_FLAG_MOD_DELETE, NULL);
 			if (ret != LDB_SUCCESS) {
 				talloc_free(tmp_ctx);
 				ldb_module_oom(module);
diff --git a/source4/kdc/db-glue.c b/source4/kdc/db-glue.c
index 7a048a6a418..55286f04c85 100644
--- a/source4/kdc/db-glue.c
+++ b/source4/kdc/db-glue.c
@@ -1394,7 +1394,7 @@ static krb5_error_code samba_kdc_message2entry(krb5_context context,
 
 	if (ent_type == SAMBA_KDC_ENT_TYPE_CLIENT && (flags & SDB_F_FOR_AS_REQ)) {
 		int result;
-		struct auth_user_info_dc *user_info_dc = NULL;
+		const struct auth_user_info_dc *user_info_dc = NULL;
 		/*
 		 * These protections only apply to clients, so servers in the
 		 * Protected Users group may still have service tickets to them
@@ -1407,7 +1407,7 @@ static krb5_error_code samba_kdc_message2entry(krb5_context context,
 		 * and computers should never be members of Protected Users, or
 		 * they may fail to authenticate.
 		 */
-		status = samba_kdc_get_user_info_from_db(p, msg, &user_info_dc);
+		status = samba_kdc_get_user_info_from_db(mem_ctx, p, msg, &user_info_dc);
 		if (!NT_STATUS_IS_OK(status)) {
 			ret = EINVAL;
 			goto out;
diff --git a/source4/kdc/mit_samba.c b/source4/kdc/mit_samba.c
index c3c07926cca..48e4b74efaf 100644
--- a/source4/kdc/mit_samba.c
+++ b/source4/kdc/mit_samba.c
@@ -464,6 +464,7 @@ int mit_samba_get_pac(struct mit_samba_context *smb_ctx,
 		      krb5_pac *pac)
 {
 	TALLOC_CTX *tmp_ctx;
+	struct auth_user_info_dc user_info_dc = {};
 	DATA_BLOB *logon_info_blob = NULL;
 	DATA_BLOB *upn_dns_info_blob = NULL;
 	DATA_BLOB *cred_ndr = NULL;
@@ -511,17 +512,10 @@ int mit_samba_get_pac(struct mit_samba_context *smb_ctx,
 		cred_ndr_ptr = &cred_ndr;
 	}
 
-	nt_status = samba_kdc_get_pac_blobs(tmp_ctx,
-					    skdc_entry,
-					    asserted_identity,
-					    group_inclusion,
-					    &logon_info_blob,
-					    cred_ndr_ptr,
-					    &upn_dns_info_blob,
-					    is_krbtgt ? &pac_attrs_blob : NULL,
-					    PAC_ATTRIBUTE_FLAG_PAC_WAS_GIVEN_IMPLICITLY,
-					    is_krbtgt ? &requester_sid_blob : NULL,
-					    NULL);
+	nt_status = samba_kdc_get_user_info_dc(tmp_ctx,
+					       skdc_entry,
+					       asserted_identity,
+					       &user_info_dc);
 	if (!NT_STATUS_IS_OK(nt_status)) {
 		talloc_free(tmp_ctx);
 		if (NT_STATUS_EQUAL(nt_status,
@@ -531,6 +525,51 @@ int mit_samba_get_pac(struct mit_samba_context *smb_ctx,
 		return EINVAL;
 	}
 
+	nt_status = samba_kdc_get_logon_info_blob(tmp_ctx,
+						  &user_info_dc,
+						  group_inclusion,
+						  &logon_info_blob);
+	if (!NT_STATUS_IS_OK(nt_status)) {
+		talloc_free(tmp_ctx);
+		return EINVAL;
+	}
+
+	if (cred_ndr_ptr != NULL) {
+		nt_status = samba_kdc_get_cred_ndr_blob(tmp_ctx,
+							skdc_entry,
+							cred_ndr_ptr);
+		if (!NT_STATUS_IS_OK(nt_status)) {
+			talloc_free(tmp_ctx);
+			return EINVAL;
+		}
+	}
+
+	nt_status = samba_kdc_get_upn_info_blob(tmp_ctx,
+						&user_info_dc,
+						&upn_dns_info_blob);
+	if (!NT_STATUS_IS_OK(nt_status)) {
+		talloc_free(tmp_ctx);
+		return EINVAL;
+	}
+
+	if (is_krbtgt) {
+		nt_status = samba_kdc_get_pac_attrs_blob(tmp_ctx,
+							 PAC_ATTRIBUTE_FLAG_PAC_WAS_GIVEN_IMPLICITLY,
+							 &pac_attrs_blob);
+		if (!NT_STATUS_IS_OK(nt_status)) {
+			talloc_free(tmp_ctx);
+			return EINVAL;
+		}
+
+		nt_status = samba_kdc_get_requester_sid_blob(tmp_ctx,
+							     &user_info_dc,
+							     &requester_sid_blob);
+		if (!NT_STATUS_IS_OK(nt_status)) {
+			talloc_free(tmp_ctx);
+			return EINVAL;
+		}
+	}
+
 	if (replaced_reply_key != NULL && cred_ndr != NULL) {
 		code = samba_kdc_encrypt_pac_credentials(context,
 							 replaced_reply_key,
@@ -651,6 +690,8 @@ krb5_error_code mit_samba_reget_pac(struct mit_samba_context *ctx,
 				    server_skdc_entry,
 				    krbtgt_skdc_entry,
 				    delegated_proxy_principal,
+				    NULL, /* device */
+				    NULL, /* device_pac */
 				    *pac,
 				    new_pac);
 	if (code != 0) {
@@ -752,6 +793,8 @@ krb5_error_code mit_samba_update_pac(struct mit_samba_context *ctx,
 				    server_skdc_entry,
 				    krbtgt_skdc_entry,
 				    NULL, /* delegated_proxy_principal */
+				    NULL, /* device */
+				    NULL, /* device_pac */
 				    old_pac,
 				    new_pac);
 	if (code != 0) {
@@ -970,7 +1013,7 @@ int mit_samba_kpasswd_change_password(struct mit_samba_context *ctx,
 	enum samPwdChangeReason reject_reason;
 	struct samr_DomInfo1 *dominfo;
 	const char *error_string = NULL;
-	struct auth_user_info_dc *user_info_dc;
+	const struct auth_user_info_dc *user_info_dc = NULL;
 	struct samba_kdc_entry *p =
 		talloc_get_type_abort(db_entry->e_data, struct samba_kdc_entry);
 	krb5_error_code code = 0;
@@ -984,7 +1027,8 @@ int mit_samba_kpasswd_change_password(struct mit_samba_context *ctx,
 		return ENOMEM;
 	}
 
-	status = samba_kdc_get_user_info_from_db(p,
+	status = samba_kdc_get_user_info_from_db(tmp_ctx,
+						 p,
 						 p->msg,
 						 &user_info_dc);
 	if (!NT_STATUS_IS_OK(status)) {
diff --git a/source4/kdc/pac-glue.c b/source4/kdc/pac-glue.c
index 97dac1bc79e..1fcc79a2e62 100644
--- a/source4/kdc/pac-glue.c
+++ b/source4/kdc/pac-glue.c
@@ -299,8 +299,7 @@ NTSTATUS samba_get_logon_info_pac_blob(TALLOC_CTX *mem_ctx,
 				       const struct auth_user_info_dc *info,
 				       const struct PAC_DOMAIN_GROUP_MEMBERSHIP *override_resource_groups,
 				       const enum auth_group_inclusion group_inclusion,
-				       DATA_BLOB *pac_data,
-				       DATA_BLOB *requester_sid_blob)
+				       DATA_BLOB *pac_data)
 {
 	struct netr_SamInfo3 *info3 = NULL;
 	struct PAC_DOMAIN_GROUP_MEMBERSHIP *_resource_groups = NULL;
@@ -312,9 +311,6 @@ NTSTATUS samba_get_logon_info_pac_blob(TALLOC_CTX *mem_ctx,
 	ZERO_STRUCT(pac_info);
 
 	*pac_data = data_blob_null;
-	if (requester_sid_blob != NULL) {
-		*requester_sid_blob = data_blob_null;
-	}
 
 	if (override_resource_groups == NULL) {
 		resource_groups = &_resource_groups;
@@ -375,6 +371,21 @@ NTSTATUS samba_get_logon_info_pac_blob(TALLOC_CTX *mem_ctx,
 		return nt_status;
 	}
 
+	return NT_STATUS_OK;
+}
+
+static
+NTSTATUS samba_get_requester_sid_pac_blob(TALLOC_CTX *mem_ctx,
+					  const struct auth_user_info_dc *info,
+					  DATA_BLOB *requester_sid_blob)
+{
+	enum ndr_err_code ndr_err;
+	NTSTATUS nt_status;
+
+	if (requester_sid_blob != NULL) {
+		*requester_sid_blob = data_blob_null;
+	}
+
 	if (requester_sid_blob != NULL && info->num_sids > 0) {
 		union PAC_INFO pac_requester_sid;
 
@@ -819,10 +830,8 @@ krb5_error_code samba_make_krb5_pac(krb5_context context,
 {
 	krb5_data logon_data;
 	krb5_error_code ret;
-#ifdef SAMBA4_USES_HEIMDAL
 	char null_byte = '\0';
 	krb5_data null_data = smb_krb5_make_data(&null_byte, 0);
-#endif
 
 	/* The user account may be set not to want the PAC */
 	if (logon_blob == NULL) {
@@ -846,10 +855,19 @@ krb5_error_code samba_make_krb5_pac(krb5_context context,
 	}
 
 	if (client_claims_blob != NULL) {
-		krb5_data client_claims_data = smb_krb5_data_from_blob(*client_claims_blob);
+		krb5_data client_claims_data;
+		krb5_data *data = NULL;
+
+		if (client_claims_blob->length != 0) {
+			client_claims_data = smb_krb5_data_from_blob(*client_claims_blob);
+			data = &client_claims_data;
+		} else {
+			data = &null_data;
+		}
+
 		ret = krb5_pac_add_buffer(context, pac,
 					  PAC_TYPE_CLIENT_CLAIMS_INFO,
-					  &client_claims_data);
+					  data);
 		if (ret != 0) {
 			return ret;
 		}
@@ -1071,7 +1089,8 @@ int samba_krbtgt_is_in_db(struct samba_kdc_entry *p,
  */
 static NTSTATUS samba_add_asserted_identity(TALLOC_CTX *mem_ctx,
 					    enum samba_asserted_identity ai,
-					    struct auth_user_info_dc *user_info_dc)
+					    struct auth_SidAttr **sids,
+					    uint32_t *num_sids)
 {
 	struct dom_sid ai_sid;
 	const char *sid_str = NULL;
@@ -1090,11 +1109,11 @@ static NTSTATUS samba_add_asserted_identity(TALLOC_CTX *mem_ctx,
 	dom_sid_parse(sid_str, &ai_sid);
 
 	return add_sid_to_array_attrs_unique(
-		user_info_dc,
+		mem_ctx,
 		&ai_sid,
 		SE_GROUP_DEFAULT_FLAGS,
-		&user_info_dc->sids,
-		&user_info_dc->num_sids);
+		sids,
+		num_sids);
 }
 
 /*
@@ -1102,9 +1121,10 @@ static NTSTATUS samba_add_asserted_identity(TALLOC_CTX *mem_ctx,
  * structure. If the resulting structure is not talloc_free()d, it will be
  * reused on future calls to this function.
  */
-NTSTATUS samba_kdc_get_user_info_from_db(struct samba_kdc_entry *skdc_entry,
+NTSTATUS samba_kdc_get_user_info_from_db(TALLOC_CTX *mem_ctx,
+                                         struct samba_kdc_entry *skdc_entry,
                                          const struct ldb_message *msg,
-                                         struct auth_user_info_dc **user_info_dc)
+                                         const struct auth_user_info_dc **user_info_dc)
 {
 	if (skdc_entry->user_info_dc == NULL) {
 		NTSTATUS nt_status;
@@ -1129,161 +1149,227 @@ NTSTATUS samba_kdc_get_user_info_from_db(struct samba_kdc_entry *skdc_entry,
 	return NT_STATUS_OK;
 }
 
-NTSTATUS samba_kdc_get_pac_blobs(TALLOC_CTX *mem_ctx,
-				 struct samba_kdc_entry *p,
-				 enum samba_asserted_identity asserted_identity,
-				 const enum auth_group_inclusion group_inclusion,
-				 DATA_BLOB **_logon_info_blob,
-				 DATA_BLOB **_cred_ndr_blob,
-				 DATA_BLOB **_upn_info_blob,
-				 DATA_BLOB **_pac_attrs_blob,
-				 uint64_t pac_attributes,
-				 DATA_BLOB **_requester_sid_blob,
-				 DATA_BLOB **_client_claims_blob)
+NTSTATUS samba_kdc_get_logon_info_blob(TALLOC_CTX *mem_ctx,
+				       const struct auth_user_info_dc *user_info_dc,
+				       const enum auth_group_inclusion group_inclusion,
+				       DATA_BLOB **_logon_info_blob)
 {
-	struct auth_user_info_dc *user_info_dc = NULL;
 	DATA_BLOB *logon_blob = NULL;
-	DATA_BLOB *cred_blob = NULL;
-	DATA_BLOB *upn_blob = NULL;
-	DATA_BLOB *pac_attrs_blob = NULL;
-	DATA_BLOB *requester_sid_blob = NULL;
-	DATA_BLOB *client_claims_blob = NULL;
 	NTSTATUS nt_status;
 
 	*_logon_info_blob = NULL;
-	if (_cred_ndr_blob != NULL) {
-		*_cred_ndr_blob = NULL;
-	}
-	*_upn_info_blob = NULL;
-	if (_pac_attrs_blob != NULL) {
-		*_pac_attrs_blob = NULL;
-	}
-	if (_requester_sid_blob != NULL) {
-		*_requester_sid_blob = NULL;
-	}
-	if (_client_claims_blob != NULL) {
-		*_client_claims_blob = NULL;
-	}
 
 	logon_blob = talloc_zero(mem_ctx, DATA_BLOB);
 	if (logon_blob == NULL) {
 		return NT_STATUS_NO_MEMORY;
 	}
 
-	if (_cred_ndr_blob != NULL) {
-		cred_blob = talloc_zero(mem_ctx, DATA_BLOB);
-		if (cred_blob == NULL) {
-			return NT_STATUS_NO_MEMORY;
-		}
+	nt_status = samba_get_logon_info_pac_blob(logon_blob,
+						  user_info_dc,
+						  NULL,
+						  group_inclusion,
+						  logon_blob);
+	if (!NT_STATUS_IS_OK(nt_status)) {
+		DBG_ERR("Building PAC LOGON INFO failed: %s\n",
+			nt_errstr(nt_status));
+		return nt_status;
 	}
 
-	upn_blob = talloc_zero(mem_ctx, DATA_BLOB);
-	if (upn_blob == NULL) {
+	*_logon_info_blob = logon_blob;
+
+	return NT_STATUS_OK;
+}
+
+NTSTATUS samba_kdc_get_cred_ndr_blob(TALLOC_CTX *mem_ctx,
+				     const struct samba_kdc_entry *p,
+				     DATA_BLOB **_cred_ndr_blob)
+{
+	DATA_BLOB *cred_blob = NULL;
+	NTSTATUS nt_status;
+
+	SMB_ASSERT(_cred_ndr_blob != NULL);
+
+	*_cred_ndr_blob = NULL;
+
+	cred_blob = talloc_zero(mem_ctx, DATA_BLOB);
+	if (cred_blob == NULL) {
 		return NT_STATUS_NO_MEMORY;
 	}
 
-	if (_pac_attrs_blob != NULL) {
-		pac_attrs_blob = talloc_zero(mem_ctx, DATA_BLOB);
-		if (pac_attrs_blob == NULL) {
-			return NT_STATUS_NO_MEMORY;
-		}
+	nt_status = samba_get_cred_info_ndr_blob(cred_blob,
+						 p->msg,
+						 cred_blob);
+	if (!NT_STATUS_IS_OK(nt_status)) {
+		DBG_ERR("Building PAC CRED INFO failed: %s\n",
+			nt_errstr(nt_status));
+		return nt_status;
 	}
 
-	if (_requester_sid_blob != NULL) {
-		requester_sid_blob = talloc_zero(mem_ctx, DATA_BLOB);
-		if (requester_sid_blob == NULL) {
-			return NT_STATUS_NO_MEMORY;
-		}
-	}
+	*_cred_ndr_blob = cred_blob;
 
-	if (_client_claims_blob != NULL) {
-		/*
-		 * Until we support claims we just
-		 * return an empty blob,
-		 * that matches what Windows is doing
-		 * without defined claims
-		 */
-		client_claims_blob = talloc_zero(mem_ctx, DATA_BLOB);
-		if (client_claims_blob == NULL) {
-			return NT_STATUS_NO_MEMORY;
-		}
+	return NT_STATUS_OK;
+}
+
+NTSTATUS samba_kdc_get_upn_info_blob(TALLOC_CTX *mem_ctx,
+				     const struct auth_user_info_dc *user_info_dc,
+				     DATA_BLOB **_upn_info_blob)
+{
+	DATA_BLOB *upn_blob = NULL;
+	NTSTATUS nt_status;
+
+	*_upn_info_blob = NULL;
+
+	upn_blob = talloc_zero(mem_ctx, DATA_BLOB);
+	if (upn_blob == NULL) {
+		return NT_STATUS_NO_MEMORY;
 	}
 
-	nt_status = samba_kdc_get_user_info_from_db(p,
-						    p->msg,
-						    &user_info_dc);
+	nt_status = samba_get_upn_info_pac_blob(upn_blob,
+						user_info_dc,
+						upn_blob);
 	if (!NT_STATUS_IS_OK(nt_status)) {
-		DEBUG(0, ("Getting user info for PAC failed: %s\n",
+		DEBUG(0, ("Building PAC UPN INFO failed: %s\n",
 			  nt_errstr(nt_status)));
 		return nt_status;
 	}
 
-	nt_status = samba_add_asserted_identity(mem_ctx,
-						asserted_identity,
-						user_info_dc);
+	*_upn_info_blob = upn_blob;
+
+	return NT_STATUS_OK;
+}
+
+NTSTATUS samba_kdc_get_pac_attrs_blob(TALLOC_CTX *mem_ctx,
+				      uint64_t pac_attributes,


-- 
Samba Shared Repository



More information about the samba-cvs mailing list