[SCM] Samba Shared Repository - branch master updated - tevent-0-9-8-129-g3adbbae

Andrew Tridgell tridge at samba.org
Wed Sep 9 20:13:47 MDT 2009


The branch, master has been updated
       via  3adbbaee3b613725516a8855d8cd460db56ecf1a (commit)
       via  0807251154344f93f5aaf6838f62945056b24693 (commit)
       via  3671c9e99179b22b42acb61bfa751ab93714fdd2 (commit)
       via  7c5ce719ebb5b0247e479b3293acb4c56402fa57 (commit)
      from  b1dabb11333a715b0e23e91eecaf29933ea383a7 (commit)

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


- Log -----------------------------------------------------------------
commit 3adbbaee3b613725516a8855d8cd460db56ecf1a
Author: Andrew Tridgell <tridge at samba.org>
Date:   Thu Sep 10 12:09:01 2009 +1000

    s4: regenerate drsuapi IDL

commit 0807251154344f93f5aaf6838f62945056b24693
Author: Andrew Tridgell <tridge at samba.org>
Date:   Thu Sep 10 12:08:15 2009 +1000

    s4/schema: teach the schema_syntax code how to encode/decode more attributes
    
    We were trying to encode strings like 'top' as integers, without first
    looking them up in our schema. We need special handling for all the
    attributes that contain attributeID_id or governsID_id fields that
    should be translated first before encoding.

commit 3671c9e99179b22b42acb61bfa751ab93714fdd2
Author: Andrew Tridgell <tridge at samba.org>
Date:   Thu Sep 10 12:06:20 2009 +1000

    s4/schema: don't crash if we don't have subClassOf

commit 7c5ce719ebb5b0247e479b3293acb4c56402fa57
Author: Andrew Tridgell <tridge at samba.org>
Date:   Thu Sep 10 12:05:50 2009 +1000

    s4/drsuapi: tech the IDL about some more key attribute names

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

Summary of changes:
 librpc/gen_ndr/drsuapi.h               |   16 +++++
 librpc/gen_ndr/ndr_drsuapi.c           |    8 +++
 librpc/idl/drsuapi.idl                 |    8 +++
 source4/dsdb/schema/schema_inferiors.c |    9 ++-
 source4/dsdb/schema/schema_syntax.c    |  104 ++++++++++++++++++++++++++++++++
 5 files changed, 143 insertions(+), 2 deletions(-)


Changeset truncated at 500 lines:

diff --git a/librpc/gen_ndr/drsuapi.h b/librpc/gen_ndr/drsuapi.h
index fc1da82..b4888a0 100644
--- a/librpc/gen_ndr/drsuapi.h
+++ b/librpc/gen_ndr/drsuapi.h
@@ -294,8 +294,12 @@ enum drsuapi_DsAttributeId
 	DRSUAPI_ATTRIBUTE_member=0x0000001f,
 	DRSUAPI_ATTRIBUTE_instanceType=0x00020001,
 	DRSUAPI_ATTRIBUTE_whenCreated=0x00020002,
+	DRSUAPI_ATTRIBUTE_possSuperiors=0x00020008,
 	DRSUAPI_ATTRIBUTE_hasMasterNCs=0x0002000e,
+	DRSUAPI_ATTRIBUTE_subClassOf=0x00020015,
 	DRSUAPI_ATTRIBUTE_governsID=0x00020016,
+	DRSUAPI_ATTRIBUTE_mustContain=0x00020018,
+	DRSUAPI_ATTRIBUTE_mayContain=0x00020019,
 	DRSUAPI_ATTRIBUTE_attributeID=0x0002001e,
 	DRSUAPI_ATTRIBUTE_attributeSyntax=0x00020020,
 	DRSUAPI_ATTRIBUTE_isSingleValued=0x00020021,
@@ -310,6 +314,7 @@ enum drsuapi_DsAttributeId
 	DRSUAPI_ATTRIBUTE_oMSyntax=0x000200e7,
 	DRSUAPI_ATTRIBUTE_ntSecurityDescriptor=0x00020119,
 	DRSUAPI_ATTRIBUTE_searchFlags=0x0002014e,
+	DRSUAPI_ATTRIBUTE_auxiliaryClass=0x0002015f,
 	DRSUAPI_ATTRIBUTE_lDAPDisplayName=0x000201cc,
 	DRSUAPI_ATTRIBUTE_name=0x00090001,
 	DRSUAPI_ATTRIBUTE_userAccountControl=0x00090008,
@@ -330,6 +335,9 @@ enum drsuapi_DsAttributeId
 	DRSUAPI_ATTRIBUTE_trustAuthIncoming=0x00090081,
 	DRSUAPI_ATTRIBUTE_trustAuthOutgoing=0x00090087,
 	DRSUAPI_ATTRIBUTE_lmPwdHistory=0x000900a0,
+	DRSUAPI_ATTRIBUTE_systemPossSuperiors=0x000900c3,
+	DRSUAPI_ATTRIBUTE_systemMayContain=0x000900c4,
+	DRSUAPI_ATTRIBUTE_systemMustContain=0x000900c5,
 	DRSUAPI_ATTRIBUTE_sAMAccountName=0x000900dd,
 	DRSUAPI_ATTRIBUTE_sAMAccountType=0x0009012e,
 	DRSUAPI_ATTRIBUTE_fSMORoleOwner=0x00090171,
@@ -358,8 +366,12 @@ enum drsuapi_DsAttributeId
 #define DRSUAPI_ATTRIBUTE_member ( 0x0000001f )
 #define DRSUAPI_ATTRIBUTE_instanceType ( 0x00020001 )
 #define DRSUAPI_ATTRIBUTE_whenCreated ( 0x00020002 )
+#define DRSUAPI_ATTRIBUTE_possSuperiors ( 0x00020008 )
 #define DRSUAPI_ATTRIBUTE_hasMasterNCs ( 0x0002000e )
+#define DRSUAPI_ATTRIBUTE_subClassOf ( 0x00020015 )
 #define DRSUAPI_ATTRIBUTE_governsID ( 0x00020016 )
+#define DRSUAPI_ATTRIBUTE_mustContain ( 0x00020018 )
+#define DRSUAPI_ATTRIBUTE_mayContain ( 0x00020019 )
 #define DRSUAPI_ATTRIBUTE_attributeID ( 0x0002001e )
 #define DRSUAPI_ATTRIBUTE_attributeSyntax ( 0x00020020 )
 #define DRSUAPI_ATTRIBUTE_isSingleValued ( 0x00020021 )
@@ -374,6 +386,7 @@ enum drsuapi_DsAttributeId
 #define DRSUAPI_ATTRIBUTE_oMSyntax ( 0x000200e7 )
 #define DRSUAPI_ATTRIBUTE_ntSecurityDescriptor ( 0x00020119 )
 #define DRSUAPI_ATTRIBUTE_searchFlags ( 0x0002014e )
+#define DRSUAPI_ATTRIBUTE_auxiliaryClass ( 0x0002015f )
 #define DRSUAPI_ATTRIBUTE_lDAPDisplayName ( 0x000201cc )
 #define DRSUAPI_ATTRIBUTE_name ( 0x00090001 )
 #define DRSUAPI_ATTRIBUTE_userAccountControl ( 0x00090008 )
@@ -394,6 +407,9 @@ enum drsuapi_DsAttributeId
 #define DRSUAPI_ATTRIBUTE_trustAuthIncoming ( 0x00090081 )
 #define DRSUAPI_ATTRIBUTE_trustAuthOutgoing ( 0x00090087 )
 #define DRSUAPI_ATTRIBUTE_lmPwdHistory ( 0x000900a0 )
+#define DRSUAPI_ATTRIBUTE_systemPossSuperiors ( 0x000900c3 )
+#define DRSUAPI_ATTRIBUTE_systemMayContain ( 0x000900c4 )
+#define DRSUAPI_ATTRIBUTE_systemMustContain ( 0x000900c5 )
 #define DRSUAPI_ATTRIBUTE_sAMAccountName ( 0x000900dd )
 #define DRSUAPI_ATTRIBUTE_sAMAccountType ( 0x0009012e )
 #define DRSUAPI_ATTRIBUTE_fSMORoleOwner ( 0x00090171 )
diff --git a/librpc/gen_ndr/ndr_drsuapi.c b/librpc/gen_ndr/ndr_drsuapi.c
index 02de014..32bc879 100644
--- a/librpc/gen_ndr/ndr_drsuapi.c
+++ b/librpc/gen_ndr/ndr_drsuapi.c
@@ -1261,8 +1261,12 @@ _PUBLIC_ void ndr_print_drsuapi_DsAttributeId(struct ndr_print *ndr, const char
 			case DRSUAPI_ATTRIBUTE_member: val = "DRSUAPI_ATTRIBUTE_member"; break;
 			case DRSUAPI_ATTRIBUTE_instanceType: val = "DRSUAPI_ATTRIBUTE_instanceType"; break;
 			case DRSUAPI_ATTRIBUTE_whenCreated: val = "DRSUAPI_ATTRIBUTE_whenCreated"; break;
+			case DRSUAPI_ATTRIBUTE_possSuperiors: val = "DRSUAPI_ATTRIBUTE_possSuperiors"; break;
 			case DRSUAPI_ATTRIBUTE_hasMasterNCs: val = "DRSUAPI_ATTRIBUTE_hasMasterNCs"; break;
+			case DRSUAPI_ATTRIBUTE_subClassOf: val = "DRSUAPI_ATTRIBUTE_subClassOf"; break;
 			case DRSUAPI_ATTRIBUTE_governsID: val = "DRSUAPI_ATTRIBUTE_governsID"; break;
+			case DRSUAPI_ATTRIBUTE_mustContain: val = "DRSUAPI_ATTRIBUTE_mustContain"; break;
+			case DRSUAPI_ATTRIBUTE_mayContain: val = "DRSUAPI_ATTRIBUTE_mayContain"; break;
 			case DRSUAPI_ATTRIBUTE_attributeID: val = "DRSUAPI_ATTRIBUTE_attributeID"; break;
 			case DRSUAPI_ATTRIBUTE_attributeSyntax: val = "DRSUAPI_ATTRIBUTE_attributeSyntax"; break;
 			case DRSUAPI_ATTRIBUTE_isSingleValued: val = "DRSUAPI_ATTRIBUTE_isSingleValued"; break;
@@ -1277,6 +1281,7 @@ _PUBLIC_ void ndr_print_drsuapi_DsAttributeId(struct ndr_print *ndr, const char
 			case DRSUAPI_ATTRIBUTE_oMSyntax: val = "DRSUAPI_ATTRIBUTE_oMSyntax"; break;
 			case DRSUAPI_ATTRIBUTE_ntSecurityDescriptor: val = "DRSUAPI_ATTRIBUTE_ntSecurityDescriptor"; break;
 			case DRSUAPI_ATTRIBUTE_searchFlags: val = "DRSUAPI_ATTRIBUTE_searchFlags"; break;
+			case DRSUAPI_ATTRIBUTE_auxiliaryClass: val = "DRSUAPI_ATTRIBUTE_auxiliaryClass"; break;
 			case DRSUAPI_ATTRIBUTE_lDAPDisplayName: val = "DRSUAPI_ATTRIBUTE_lDAPDisplayName"; break;
 			case DRSUAPI_ATTRIBUTE_name: val = "DRSUAPI_ATTRIBUTE_name"; break;
 			case DRSUAPI_ATTRIBUTE_userAccountControl: val = "DRSUAPI_ATTRIBUTE_userAccountControl"; break;
@@ -1297,6 +1302,9 @@ _PUBLIC_ void ndr_print_drsuapi_DsAttributeId(struct ndr_print *ndr, const char
 			case DRSUAPI_ATTRIBUTE_trustAuthIncoming: val = "DRSUAPI_ATTRIBUTE_trustAuthIncoming"; break;
 			case DRSUAPI_ATTRIBUTE_trustAuthOutgoing: val = "DRSUAPI_ATTRIBUTE_trustAuthOutgoing"; break;
 			case DRSUAPI_ATTRIBUTE_lmPwdHistory: val = "DRSUAPI_ATTRIBUTE_lmPwdHistory"; break;
+			case DRSUAPI_ATTRIBUTE_systemPossSuperiors: val = "DRSUAPI_ATTRIBUTE_systemPossSuperiors"; break;
+			case DRSUAPI_ATTRIBUTE_systemMayContain: val = "DRSUAPI_ATTRIBUTE_systemMayContain"; break;
+			case DRSUAPI_ATTRIBUTE_systemMustContain: val = "DRSUAPI_ATTRIBUTE_systemMustContain"; break;
 			case DRSUAPI_ATTRIBUTE_sAMAccountName: val = "DRSUAPI_ATTRIBUTE_sAMAccountName"; break;
 			case DRSUAPI_ATTRIBUTE_sAMAccountType: val = "DRSUAPI_ATTRIBUTE_sAMAccountType"; break;
 			case DRSUAPI_ATTRIBUTE_fSMORoleOwner: val = "DRSUAPI_ATTRIBUTE_fSMORoleOwner"; break;
diff --git a/librpc/idl/drsuapi.idl b/librpc/idl/drsuapi.idl
index 037d2a9..e5d2536 100644
--- a/librpc/idl/drsuapi.idl
+++ b/librpc/idl/drsuapi.idl
@@ -401,8 +401,12 @@ interface drsuapi
 		DRSUAPI_ATTRIBUTE_member			= 0x0000001f,
 		DRSUAPI_ATTRIBUTE_instanceType			= 0x00020001,
 		DRSUAPI_ATTRIBUTE_whenCreated			= 0x00020002,
+		DRSUAPI_ATTRIBUTE_possSuperiors			= 0x00020008,
 		DRSUAPI_ATTRIBUTE_hasMasterNCs			= 0x0002000e,
+		DRSUAPI_ATTRIBUTE_subClassOf			= 0x00020015,
 		DRSUAPI_ATTRIBUTE_governsID			= 0x00020016,
+		DRSUAPI_ATTRIBUTE_mustContain			= 0x00020018,
+		DRSUAPI_ATTRIBUTE_mayContain			= 0x00020019,
 		DRSUAPI_ATTRIBUTE_attributeID			= 0x0002001e,
 		DRSUAPI_ATTRIBUTE_attributeSyntax		= 0x00020020,
 		DRSUAPI_ATTRIBUTE_isSingleValued		= 0x00020021,
@@ -417,6 +421,7 @@ interface drsuapi
 		DRSUAPI_ATTRIBUTE_oMSyntax			= 0x000200e7,
 		DRSUAPI_ATTRIBUTE_ntSecurityDescriptor		= 0x00020119,
 		DRSUAPI_ATTRIBUTE_searchFlags			= 0x0002014e,
+		DRSUAPI_ATTRIBUTE_auxiliaryClass		= 0x0002015f,
 		DRSUAPI_ATTRIBUTE_lDAPDisplayName		= 0x000201cc,
 		DRSUAPI_ATTRIBUTE_name				= 0x00090001,
 		DRSUAPI_ATTRIBUTE_userAccountControl		= 0x00090008,
@@ -437,6 +442,9 @@ interface drsuapi
 		DRSUAPI_ATTRIBUTE_trustAuthIncoming		= 0x00090081,
 		DRSUAPI_ATTRIBUTE_trustAuthOutgoing		= 0x00090087,
 		DRSUAPI_ATTRIBUTE_lmPwdHistory			= 0x000900a0,
+		DRSUAPI_ATTRIBUTE_systemPossSuperiors		= 0x000900c3,
+		DRSUAPI_ATTRIBUTE_systemMayContain		= 0x000900c4,
+		DRSUAPI_ATTRIBUTE_systemMustContain		= 0x000900c5,
 		DRSUAPI_ATTRIBUTE_sAMAccountName		= 0x000900dd,
 		DRSUAPI_ATTRIBUTE_sAMAccountType		= 0x0009012e,
 		DRSUAPI_ATTRIBUTE_fSMORoleOwner			= 0x00090171,
diff --git a/source4/dsdb/schema/schema_inferiors.c b/source4/dsdb/schema/schema_inferiors.c
index 63ddb4a..b0ecc08 100644
--- a/source4/dsdb/schema/schema_inferiors.c
+++ b/source4/dsdb/schema/schema_inferiors.c
@@ -49,7 +49,8 @@ static char **schema_supclasses(struct dsdb_schema *schema, struct dsdb_class *s
 	}
 
 	/* Cope with 'top SUP top', ie top is subClassOf top */ 
-	if (strcmp(schema_class->lDAPDisplayName, schema_class->subClassOf) == 0) {
+	if (schema_class->subClassOf &&
+	    strcmp(schema_class->lDAPDisplayName, schema_class->subClassOf) == 0) {
 		schema_class->supclasses = list;
 		return list;
 	}
@@ -132,7 +133,11 @@ static void schema_create_subclasses(struct dsdb_schema *schema)
 
 	for (schema_class=schema->classes; schema_class; schema_class=schema_class->next) {
 		struct dsdb_class *schema_class2 = dsdb_class_by_lDAPDisplayName(schema, schema_class->subClassOf);
-		if (schema_class != schema_class2) {
+		if (schema_class2 == NULL) {
+			DEBUG(0,("ERROR: no subClassOf for '%s'\n", schema_class->lDAPDisplayName));
+			continue;
+		}
+		if (schema_class2 && schema_class != schema_class2) {
 			if (schema_class2->subclasses_direct == NULL) {
 				schema_class2->subclasses_direct = str_list_make_empty(schema_class2);
 			}
diff --git a/source4/dsdb/schema/schema_syntax.c b/source4/dsdb/schema/schema_syntax.c
index 0977ee1..d5f7e6b 100644
--- a/source4/dsdb/schema/schema_syntax.c
+++ b/source4/dsdb/schema/schema_syntax.c
@@ -619,6 +619,53 @@ static WERROR _dsdb_syntax_OID_obj_drsuapi_to_ldb(struct ldb_context *ldb,
 	return WERR_OK;
 }
 
+static WERROR _dsdb_syntax_OID_attr_drsuapi_to_ldb(struct ldb_context *ldb, 
+						   const struct dsdb_schema *schema,
+						   const struct dsdb_attribute *attr,
+						   const struct drsuapi_DsReplicaAttribute *in,
+						   TALLOC_CTX *mem_ctx,
+						   struct ldb_message_element *out)
+{
+	uint32_t i;
+
+	out->flags	= 0;
+	out->name	= talloc_strdup(mem_ctx, attr->lDAPDisplayName);
+	W_ERROR_HAVE_NO_MEMORY(out->name);
+
+	out->num_values	= in->value_ctr.num_values;
+	out->values	= talloc_array(mem_ctx, struct ldb_val, out->num_values);
+	W_ERROR_HAVE_NO_MEMORY(out->values);
+
+	for (i=0; i < out->num_values; i++) {
+		uint32_t v;
+		const struct dsdb_attribute *a;
+		const char *str;
+
+		if (in->value_ctr.values[i].blob == NULL) {
+			return WERR_FOOBAR;
+		}
+
+		if (in->value_ctr.values[i].blob->length != 4) {
+			return WERR_FOOBAR;
+		}
+
+		v = IVAL(in->value_ctr.values[i].blob->data, 0);
+
+		a = dsdb_attribute_by_attributeID_id(schema, v);
+		if (!a) {
+			return WERR_FOOBAR;
+		}
+
+		str = talloc_strdup(out->values, a->lDAPDisplayName);
+		W_ERROR_HAVE_NO_MEMORY(str);
+
+		/* the values need to be reversed */
+		out->values[out->num_values - (i + 1)] = data_blob_string_const(str);
+	}
+
+	return WERR_OK;
+}
+
 static WERROR _dsdb_syntax_OID_oid_drsuapi_to_ldb(struct ldb_context *ldb, 
 						  const struct dsdb_schema *schema,
 						  const struct dsdb_attribute *attr,
@@ -699,6 +746,45 @@ static WERROR _dsdb_syntax_OID_obj_ldb_to_drsuapi(struct ldb_context *ldb,
         return WERR_OK;
 }
 
+static WERROR _dsdb_syntax_OID_attr_ldb_to_drsuapi(struct ldb_context *ldb,
+						   const struct dsdb_schema *schema,
+						   const struct dsdb_attribute *attr,
+						   const struct ldb_message_element *in,
+						   TALLOC_CTX *mem_ctx,
+						   struct drsuapi_DsReplicaAttribute *out)
+{
+        uint32_t i;
+        DATA_BLOB *blobs;
+
+        out->attid= attr->attributeID_id;
+        out->value_ctr.num_values= in->num_values;
+        out->value_ctr.values= talloc_array(mem_ctx,
+                                            struct drsuapi_DsAttributeValue,
+                                            in->num_values);
+        W_ERROR_HAVE_NO_MEMORY(out->value_ctr.values);
+
+        blobs = talloc_array(mem_ctx, DATA_BLOB, in->num_values);
+        W_ERROR_HAVE_NO_MEMORY(blobs);
+
+        for (i=0; i < in->num_values; i++) {
+		const struct dsdb_attribute *obj_attr;
+
+		out->value_ctr.values[i].blob= &blobs[i];
+
+		blobs[i] = data_blob_talloc(blobs, NULL, 4);
+		W_ERROR_HAVE_NO_MEMORY(blobs[i].data);
+
+		obj_attr = dsdb_attribute_by_lDAPDisplayName(schema, (const char *)in->values[i].data);
+		if (!obj_attr) {
+			return WERR_FOOBAR;
+		}
+		SIVAL(blobs[i].data, 0, obj_attr->attributeID_id);
+        }
+
+
+        return WERR_OK;
+}
+
 static WERROR _dsdb_syntax_OID_oid_ldb_to_drsuapi(struct ldb_context *ldb,
 						  const struct dsdb_schema *schema,
 						  const struct dsdb_attribute *attr,
@@ -750,7 +836,16 @@ static WERROR dsdb_syntax_OID_drsuapi_to_ldb(struct ldb_context *ldb,
 
 	switch (attr->attributeID_id) {
 	case DRSUAPI_ATTRIBUTE_objectClass:
+	case DRSUAPI_ATTRIBUTE_subClassOf:
+	case DRSUAPI_ATTRIBUTE_auxiliaryClass:
+	case DRSUAPI_ATTRIBUTE_systemPossSuperiors:
+	case DRSUAPI_ATTRIBUTE_possSuperiors:
 		return _dsdb_syntax_OID_obj_drsuapi_to_ldb(ldb, schema, attr, in, mem_ctx, out);
+	case DRSUAPI_ATTRIBUTE_systemMustContain:
+	case DRSUAPI_ATTRIBUTE_systemMayContain:	
+	case DRSUAPI_ATTRIBUTE_mustContain:
+	case DRSUAPI_ATTRIBUTE_mayContain:
+		return _dsdb_syntax_OID_attr_drsuapi_to_ldb(ldb, schema, attr, in, mem_ctx, out);
 	case DRSUAPI_ATTRIBUTE_governsID:
 	case DRSUAPI_ATTRIBUTE_attributeID:
 	case DRSUAPI_ATTRIBUTE_attributeSyntax:
@@ -810,7 +905,16 @@ static WERROR dsdb_syntax_OID_ldb_to_drsuapi(struct ldb_context *ldb,
 
 	switch (attr->attributeID_id) {
 	case DRSUAPI_ATTRIBUTE_objectClass:
+	case DRSUAPI_ATTRIBUTE_subClassOf:
+	case DRSUAPI_ATTRIBUTE_auxiliaryClass:
+	case DRSUAPI_ATTRIBUTE_systemPossSuperiors:
+	case DRSUAPI_ATTRIBUTE_possSuperiors:
 		return _dsdb_syntax_OID_obj_ldb_to_drsuapi(ldb, schema, attr, in, mem_ctx, out);
+	case DRSUAPI_ATTRIBUTE_systemMustContain:
+	case DRSUAPI_ATTRIBUTE_systemMayContain:	
+	case DRSUAPI_ATTRIBUTE_mustContain:
+	case DRSUAPI_ATTRIBUTE_mayContain:
+		return _dsdb_syntax_OID_attr_ldb_to_drsuapi(ldb, schema, attr, in, mem_ctx, out);
 	case DRSUAPI_ATTRIBUTE_governsID:
 	case DRSUAPI_ATTRIBUTE_attributeID:
 	case DRSUAPI_ATTRIBUTE_attributeSyntax:


-- 
Samba Shared Repository


More information about the samba-cvs mailing list