⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 schema_init.c

📁 samba最新软件
💻 C
📖 第 1 页 / 共 3 页
字号:
		attr->attributeID_id = 0xFFFFFFFF;	} else {		status = dsdb_map_oid2int(schema, attr->attributeID_oid, &attr->attributeID_id);		if (!W_ERROR_IS_OK(status)) {			DEBUG(0,("%s: '%s': unable to map attributeID %s: %s\n",				__location__, attr->lDAPDisplayName, attr->attributeID_oid,				win_errstr(status)));			return status;		}	}	GET_GUID_LDB(msg, "schemaIDGUID", attr, schemaIDGUID);	GET_UINT32_LDB(msg, "mAPIID", attr, mAPIID);	GET_GUID_LDB(msg, "attributeSecurityGUID", attr, attributeSecurityGUID);	GET_UINT32_LDB(msg, "searchFlags", attr, searchFlags);	GET_UINT32_LDB(msg, "systemFlags", attr, systemFlags);	GET_BOOL_LDB(msg, "isMemberOfPartialAttributeSet", attr, isMemberOfPartialAttributeSet, false);	GET_UINT32_LDB(msg, "linkID", attr, linkID);	GET_STRING_LDB(msg, "attributeSyntax", mem_ctx, attr, attributeSyntax_oid, true);	if (schema->num_prefixes == 0) {		/* set an invalid value */		attr->attributeSyntax_id = 0xFFFFFFFF;	} else {		status = dsdb_map_oid2int(schema, attr->attributeSyntax_oid, &attr->attributeSyntax_id);		if (!W_ERROR_IS_OK(status)) {			DEBUG(0,("%s: '%s': unable to map attributeSyntax_ %s: %s\n",				__location__, attr->lDAPDisplayName, attr->attributeSyntax_oid,				win_errstr(status)));			return status;		}	}	GET_UINT32_LDB(msg, "oMSyntax", attr, oMSyntax);	GET_BLOB_LDB(msg, "oMObjectClass", mem_ctx, attr, oMObjectClass);	GET_BOOL_LDB(msg, "isSingleValued", attr, isSingleValued, true);	GET_UINT32_LDB(msg, "rangeLower", attr, rangeLower);	GET_UINT32_LDB(msg, "rangeUpper", attr, rangeUpper);	GET_BOOL_LDB(msg, "extendedCharsAllowed", attr, extendedCharsAllowed, false);	GET_UINT32_LDB(msg, "schemaFlagsEx", attr, schemaFlagsEx);	GET_BLOB_LDB(msg, "msDs-Schema-Extensions", mem_ctx, attr, msDs_Schema_Extensions);	GET_BOOL_LDB(msg, "showInAdvancedViewOnly", attr, showInAdvancedViewOnly, false);	GET_STRING_LDB(msg, "adminDisplayName", mem_ctx, attr, adminDisplayName, false);	GET_STRING_LDB(msg, "adminDescription", mem_ctx, attr, adminDescription, false);	GET_STRING_LDB(msg, "classDisplayName", mem_ctx, attr, classDisplayName, false);	GET_BOOL_LDB(msg, "isEphemeral", attr, isEphemeral, false);	GET_BOOL_LDB(msg, "isDefunct", attr, isDefunct, false);	GET_BOOL_LDB(msg, "systemOnly", attr, systemOnly, false);	attr->syntax = dsdb_syntax_for_attribute(attr);	if (!attr->syntax) {		return WERR_DS_ATT_SCHEMA_REQ_SYNTAX;	}	return WERR_OK;}WERROR dsdb_class_from_ldb(const struct dsdb_schema *schema,			   struct ldb_message *msg,			   TALLOC_CTX *mem_ctx,			   struct dsdb_class *obj){	WERROR status;	GET_STRING_LDB(msg, "cn", mem_ctx, obj, cn, false);	GET_STRING_LDB(msg, "lDAPDisplayName", mem_ctx, obj, lDAPDisplayName, true);	GET_STRING_LDB(msg, "governsID", mem_ctx, obj, governsID_oid, true);	if (schema->num_prefixes == 0) {		/* set an invalid value */		obj->governsID_id = 0xFFFFFFFF;	} else {		status = dsdb_map_oid2int(schema, obj->governsID_oid, &obj->governsID_id);		if (!W_ERROR_IS_OK(status)) {			DEBUG(0,("%s: '%s': unable to map governsID %s: %s\n",				__location__, obj->lDAPDisplayName, obj->governsID_oid,				win_errstr(status)));			return status;		}	}	GET_GUID_LDB(msg, "schemaIDGUID", obj, schemaIDGUID);	GET_UINT32_LDB(msg, "objectClassCategory", obj, objectClassCategory);	GET_STRING_LDB(msg, "rDNAttID", mem_ctx, obj, rDNAttID, false);	GET_STRING_LDB(msg, "defaultObjectCategory", mem_ctx, obj, defaultObjectCategory, true); 	GET_STRING_LDB(msg, "subClassOf", mem_ctx, obj, subClassOf, true);	obj->systemAuxiliaryClass	= NULL;	obj->auxiliaryClass		= NULL;	GET_STRING_LIST_LDB(msg, "systemMustContain", mem_ctx, obj, systemMustContain, false);	GET_STRING_LIST_LDB(msg, "systemMayContain", mem_ctx, obj, systemMayContain, false);	GET_STRING_LIST_LDB(msg, "mustContain", mem_ctx, obj, mustContain, false);	GET_STRING_LIST_LDB(msg, "mayContain", mem_ctx, obj, mayContain, false);	GET_STRING_LIST_LDB(msg, "systemPossSuperiors", mem_ctx, obj, systemPossSuperiors, false);	GET_STRING_LIST_LDB(msg, "possSuperiors", mem_ctx, obj, possSuperiors, false);	GET_STRING_LIST_LDB(msg, "possibleInferiors", mem_ctx, obj, possibleInferiors, false);	GET_STRING_LDB(msg, "defaultSecurityDescriptor", mem_ctx, obj, defaultSecurityDescriptor, false);	GET_UINT32_LDB(msg, "schemaFlagsEx", obj, schemaFlagsEx);	GET_BLOB_LDB(msg, "msDs-Schema-Extensions", mem_ctx, obj, msDs_Schema_Extensions);	GET_BOOL_LDB(msg, "showInAdvancedViewOnly", obj, showInAdvancedViewOnly, false);	GET_STRING_LDB(msg, "adminDisplayName", mem_ctx, obj, adminDisplayName, false);	GET_STRING_LDB(msg, "adminDescription", mem_ctx, obj, adminDescription, false);	GET_STRING_LDB(msg, "classDisplayName", mem_ctx, obj, classDisplayName, false);	GET_BOOL_LDB(msg, "defaultHidingValue", obj, defaultHidingValue, false);	GET_BOOL_LDB(msg, "isDefunct", obj, isDefunct, false);	GET_BOOL_LDB(msg, "systemOnly", obj, systemOnly, false);	return WERR_OK;}static const struct {	const char *name;	const char *oid;} name_mappings[] = {	{ "cn",					"2.5.4.3" },	{ "name",				"1.2.840.113556.1.4.1" },	{ "lDAPDisplayName",			"1.2.840.113556.1.2.460" },	{ "attributeID", 			"1.2.840.113556.1.2.30" },	{ "schemaIDGUID", 			"1.2.840.113556.1.4.148" },	{ "mAPIID", 				"1.2.840.113556.1.2.49" },	{ "attributeSecurityGUID", 		"1.2.840.113556.1.4.149" },	{ "searchFlags", 			"1.2.840.113556.1.2.334" },	{ "systemFlags", 			"1.2.840.113556.1.4.375" },	{ "isMemberOfPartialAttributeSet", 	"1.2.840.113556.1.4.639" },	{ "linkID", 				"1.2.840.113556.1.2.50" },	{ "attributeSyntax", 			"1.2.840.113556.1.2.32" },	{ "oMSyntax", 				"1.2.840.113556.1.2.231" },	{ "oMObjectClass", 			"1.2.840.113556.1.2.218" },	{ "isSingleValued",			"1.2.840.113556.1.2.33" },	{ "rangeLower", 			"1.2.840.113556.1.2.34" },	{ "rangeUpper", 			"1.2.840.113556.1.2.35" },	{ "extendedCharsAllowed", 		"1.2.840.113556.1.2.380" },	{ "schemaFlagsEx", 			"1.2.840.113556.1.4.120" },	{ "msDs-Schema-Extensions", 		"1.2.840.113556.1.4.1440" },	{ "showInAdvancedViewOnly", 		"1.2.840.113556.1.2.169" },	{ "adminDisplayName", 			"1.2.840.113556.1.2.194" },	{ "adminDescription", 			"1.2.840.113556.1.2.226" },	{ "classDisplayName", 			"1.2.840.113556.1.4.610" },	{ "isEphemeral", 			"1.2.840.113556.1.4.1212" },	{ "isDefunct", 				"1.2.840.113556.1.4.661" },	{ "systemOnly", 			"1.2.840.113556.1.4.170" },	{ "governsID",				"1.2.840.113556.1.2.22" },	{ "objectClassCategory",		"1.2.840.113556.1.2.370" },	{ "rDNAttID",				"1.2.840.113556.1.2.26" },	{ "defaultObjectCategory",		"1.2.840.113556.1.4.783" },	{ "subClassOf",				"1.2.840.113556.1.2.21" },	{ "systemAuxiliaryClass",		"1.2.840.113556.1.4.198" },	{ "systemPossSuperiors",		"1.2.840.113556.1.4.195" },	{ "systemMustContain",			"1.2.840.113556.1.4.197" },	{ "systemMayContain",			"1.2.840.113556.1.4.196" },	{ "auxiliaryClass",			"1.2.840.113556.1.2.351" },	{ "possSuperiors",			"1.2.840.113556.1.2.8" },	{ "mustContain",			"1.2.840.113556.1.2.24" },	{ "mayContain",				"1.2.840.113556.1.2.25" },	{ "defaultSecurityDescriptor",		"1.2.840.113556.1.4.224" },	{ "defaultHidingValue",			"1.2.840.113556.1.4.518" },};static struct drsuapi_DsReplicaAttribute *dsdb_find_object_attr_name(struct dsdb_schema *schema,								     struct drsuapi_DsReplicaObject *obj,								     const char *name,								     uint32_t *idx){	WERROR status;	uint32_t i, id;	const char *oid = NULL;	for(i=0; i < ARRAY_SIZE(name_mappings); i++) {		if (strcmp(name_mappings[i].name, name) != 0) continue;		oid = name_mappings[i].oid;		break;	}	if (!oid) {		return NULL;	}	status = dsdb_map_oid2int(schema, oid, &id);	if (!W_ERROR_IS_OK(status)) {		return NULL;	}	for (i=0; i < obj->attribute_ctr.num_attributes; i++) {		if (obj->attribute_ctr.attributes[i].attid != id) continue;		if (idx) *idx = i;		return &obj->attribute_ctr.attributes[i];	}	return NULL;}#define GET_STRING_DS(s, r, attr, mem_ctx, p, elem, strict) do { \	struct drsuapi_DsReplicaAttribute *_a; \	_a = dsdb_find_object_attr_name(s, r, attr, NULL); \	if (strict && !_a) { \		d_printf("%s: %s == NULL\n", __location__, attr); \		return WERR_INVALID_PARAM; \	} \	if (strict && _a->value_ctr.num_values != 1) { \		d_printf("%s: %s num_values == %u\n", __location__, attr, \			_a->value_ctr.num_values); \		return WERR_INVALID_PARAM; \	} \	if (_a && _a->value_ctr.num_values >= 1) { \		ssize_t _ret; \		_ret = convert_string_talloc(mem_ctx, s->iconv_convenience, CH_UTF16, CH_UNIX, \					     _a->value_ctr.values[0].blob->data, \					     _a->value_ctr.values[0].blob->length, \					     (void **)discard_const(&(p)->elem)); \		if (_ret == -1) { \			DEBUG(0,("%s: invalid data!\n", attr)); \			dump_data(0, \				     _a->value_ctr.values[0].blob->data, \				     _a->value_ctr.values[0].blob->length); \			return WERR_FOOBAR; \		} \	} else { \		(p)->elem = NULL; \	} \} while (0)#define GET_DN_DS(s, r, attr, mem_ctx, p, elem, strict) do { \	struct drsuapi_DsReplicaAttribute *_a; \	_a = dsdb_find_object_attr_name(s, r, attr, NULL); \	if (strict && !_a) { \		d_printf("%s: %s == NULL\n", __location__, attr); \		return WERR_INVALID_PARAM; \	} \	if (strict && _a->value_ctr.num_values != 1) { \		d_printf("%s: %s num_values == %u\n", __location__, attr, \			_a->value_ctr.num_values); \		return WERR_INVALID_PARAM; \	} \	if (strict && !_a->value_ctr.values[0].blob) { \		d_printf("%s: %s data == NULL\n", __location__, attr); \		return WERR_INVALID_PARAM; \	} \	if (_a && _a->value_ctr.num_values >= 1 \	    && _a->value_ctr.values[0].blob) { \		struct drsuapi_DsReplicaObjectIdentifier3 _id3; \		enum ndr_err_code _ndr_err; \		_ndr_err = ndr_pull_struct_blob_all(_a->value_ctr.values[0].blob, \						      mem_ctx, s->iconv_convenience, &_id3,\						      (ndr_pull_flags_fn_t)ndr_pull_drsuapi_DsReplicaObjectIdentifier3);\		if (!NDR_ERR_CODE_IS_SUCCESS(_ndr_err)) { \			NTSTATUS _nt_status = ndr_map_error2ntstatus(_ndr_err); \			return ntstatus_to_werror(_nt_status); \		} \		(p)->elem = _id3.dn; \	} else { \		(p)->elem = NULL; \	} \} while (0)#define GET_BOOL_DS(s, r, attr, p, elem, strict) do { \	struct drsuapi_DsReplicaAttribute *_a; \	_a = dsdb_find_object_attr_name(s, r, attr, NULL); \	if (strict && !_a) { \		d_printf("%s: %s == NULL\n", __location__, attr); \		return WERR_INVALID_PARAM; \	} \	if (strict && _a->value_ctr.num_values != 1) { \		d_printf("%s: %s num_values == %u\n", __location__, attr, \			 (unsigned int)_a->value_ctr.num_values);	\		return WERR_INVALID_PARAM; \	} \	if (strict && !_a->value_ctr.values[0].blob) { \		d_printf("%s: %s data == NULL\n", __location__, attr); \		return WERR_INVALID_PARAM; \	} \	if (strict && _a->value_ctr.values[0].blob->length != 4) { \		d_printf("%s: %s length == %u\n", __location__, attr, \			 (unsigned int)_a->value_ctr.values[0].blob->length); \		return WERR_INVALID_PARAM; \	} \	if (_a && _a->value_ctr.num_values >= 1 \	    && _a->value_ctr.values[0].blob \	    && _a->value_ctr.values[0].blob->length == 4) { \		(p)->elem = (IVAL(_a->value_ctr.values[0].blob->data,0)?true:false);\	} else { \		(p)->elem = false; \	} \} while (0)#define GET_UINT32_DS(s, r, attr, p, elem) do { \	struct drsuapi_DsReplicaAttribute *_a; \	_a = dsdb_find_object_attr_name(s, r, attr, NULL); \	if (_a && _a->value_ctr.num_values >= 1 \	    && _a->value_ctr.values[0].blob \	    && _a->value_ctr.values[0].blob->length == 4) { \		(p)->elem = IVAL(_a->value_ctr.values[0].blob->data,0);\	} else { \		(p)->elem = 0; \	} \} while (0)#define GET_GUID_DS(s, r, attr, mem_ctx, p, elem) do { \	struct drsuapi_DsReplicaAttribute *_a; \	_a = dsdb_find_object_attr_name(s, r, attr, NULL); \	if (_a && _a->value_ctr.num_values >= 1 \	    && _a->value_ctr.values[0].blob \	    && _a->value_ctr.values[0].blob->length == 16) { \		enum ndr_err_code _ndr_err; \		_ndr_err = ndr_pull_struct_blob_all(_a->value_ctr.values[0].blob, \						      mem_ctx, s->iconv_convenience, &(p)->elem, \						      (ndr_pull_flags_fn_t)ndr_pull_GUID); \		if (!NDR_ERR_CODE_IS_SUCCESS(_ndr_err)) { \			NTSTATUS _nt_status = ndr_map_error2ntstatus(_ndr_err); \			return ntstatus_to_werror(_nt_status); \		} \	} else { \		ZERO_STRUCT((p)->elem);\	} \} while (0)#define GET_BLOB_DS(s, r, attr, mem_ctx, p, elem) do { \	struct drsuapi_DsReplicaAttribute *_a; \	_a = dsdb_find_object_attr_name(s, r, attr, NULL); \	if (_a && _a->value_ctr.num_values >= 1 \	    && _a->value_ctr.values[0].blob) { \		(p)->elem = *_a->value_ctr.values[0].blob;\		talloc_steal(mem_ctx, (p)->elem.data); \	} else { \		ZERO_STRUCT((p)->elem);\	}\} while (0)WERROR dsdb_attribute_from_drsuapi(struct dsdb_schema *schema,				   struct drsuapi_DsReplicaObject *r,				   TALLOC_CTX *mem_ctx,				   struct dsdb_attribute *attr){	WERROR status;	GET_STRING_DS(schema, r, "name", mem_ctx, attr, cn, true);	GET_STRING_DS(schema, r, "lDAPDisplayName", mem_ctx, attr, lDAPDisplayName, true);	GET_UINT32_DS(schema, r, "attributeID", attr, attributeID_id);	status = dsdb_map_int2oid(schema, attr->attributeID_id, mem_ctx, &attr->attributeID_oid);	if (!W_ERROR_IS_OK(status)) {		DEBUG(0,("%s: '%s': unable to map attributeID 0x%08X: %s\n",			__location__, attr->lDAPDisplayName, attr->attributeID_id,			win_errstr(status)));		return status;	}	GET_GUID_DS(schema, r, "schemaIDGUID", mem_ctx, attr, schemaIDGUID);	GET_UINT32_DS(schema, r, "mAPIID", attr, mAPIID);	GET_GUID_DS(schema, r, "attributeSecurityGUID", mem_ctx, attr, attributeSecurityGUID);	GET_UINT32_DS(schema, r, "searchFlags", attr, searchFlags);	GET_UINT32_DS(schema, r, "systemFlags", attr, systemFlags);	GET_BOOL_DS(schema, r, "isMemberOfPartialAttributeSet", attr, isMemberOfPartialAttributeSet, false);	GET_UINT32_DS(schema, r, "linkID", attr, linkID);	GET_UINT32_DS(schema, r, "attributeSyntax", attr, attributeSyntax_id);	status = dsdb_map_int2oid(schema, attr->attributeSyntax_id, mem_ctx, &attr->attributeSyntax_oid);	if (!W_ERROR_IS_OK(status)) {		DEBUG(0,("%s: '%s': unable to map attributeSyntax 0x%08X: %s\n",			__location__, attr->lDAPDisplayName, attr->attributeSyntax_id,			win_errstr(status)));		return status;	}	GET_UINT32_DS(schema, r, "oMSyntax", attr, oMSyntax);	GET_BLOB_DS(schema, r, "oMObjectClass", mem_ctx, attr, oMObjectClass);	GET_BOOL_DS(schema, r, "isSingleValued", attr, isSingleValued, true);	GET_UINT32_DS(schema, r, "rangeLower", attr, rangeLower);	GET_UINT32_DS(schema, r, "rangeUpper", attr, rangeUpper);	GET_BOOL_DS(schema, r, "extendedCharsAllowed", attr, extendedCharsAllowed, false);	GET_UINT32_DS(schema, r, "schemaFlagsEx", attr, schemaFlagsEx);	GET_BLOB_DS(schema, r, "msDs-Schema-Extensions", mem_ctx, attr, msDs_Schema_Extensions);	GET_BOOL_DS(schema, r, "showInAdvancedViewOnly", attr, showInAdvancedViewOnly, false);	GET_STRING_DS(schema, r, "adminDisplayName", mem_ctx, attr, adminDisplayName, false);	GET_STRING_DS(schema, r, "adminDescription", mem_ctx, attr, adminDescription, false);	GET_STRING_DS(schema, r, "classDisplayName", mem_ctx, attr, classDisplayName, false);	GET_BOOL_DS(schema, r, "isEphemeral", attr, isEphemeral, false);	GET_BOOL_DS(schema, r, "isDefunct", attr, isDefunct, false);	GET_BOOL_DS(schema, r, "systemOnly", attr, systemOnly, false);	attr->syntax = dsdb_syntax_for_attribute(attr);	if (!attr->syntax) {		return WERR_DS_ATT_SCHEMA_REQ_SYNTAX;	}	return WERR_OK;}WERROR dsdb_class_from_drsuapi(struct dsdb_schema *schema,			       struct drsuapi_DsReplicaObject *r,			       TALLOC_CTX *mem_ctx,			       struct dsdb_class *obj){	WERROR status;	GET_STRING_DS(schema, r, "name", mem_ctx, obj, cn, true);	GET_STRING_DS(schema, r, "lDAPDisplayName", mem_ctx, obj, lDAPDisplayName, true);	GET_UINT32_DS(schema, r, "governsID", obj, governsID_id);	status = dsdb_map_int2oid(schema, obj->governsID_id, mem_ctx, &obj->governsID_oid);	if (!W_ERROR_IS_OK(status)) {		DEBUG(0,("%s: '%s': unable to map governsID 0x%08X: %s\n",			__location__, obj->lDAPDisplayName, obj->governsID_id,			win_errstr(status)));		return status;	}	GET_GUID_DS(schema, r, "schemaIDGUID", mem_ctx, obj, schemaIDGUID);	GET_UINT32_DS(schema, r, "objectClassCategory", obj, objectClassCategory);	GET_STRING_DS(schema, r, "rDNAttID", mem_ctx, obj, rDNAttID, false);	GET_DN_DS(schema, r, "defaultObjectCategory", mem_ctx, obj, defaultObjectCategory, true);	GET_STRING_DS(schema, r, "subClassOf", mem_ctx, obj, subClassOf, true);

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -