X-Git-Url: http://git.samba.org/samba.git/?a=blobdiff_plain;f=source4%2Fdsdb%2Fschema%2Fschema.h;h=b1ae76882ab035733c62da1bae7b90ae31a9876a;hb=e7e9f1e2dd279beaaf9d94b39378d24548a531cd;hp=e8fefb5246b0b62b66b18c4b756ff75e631823af;hpb=203544e690ebd0b22ce9ea8388761ca3dc320673;p=samba.git diff --git a/source4/dsdb/schema/schema.h b/source4/dsdb/schema/schema.h index e8fefb5246b..b1ae76882ab 100644 --- a/source4/dsdb/schema/schema.h +++ b/source4/dsdb/schema/schema.h @@ -22,9 +22,32 @@ #ifndef _DSDB_SCHEMA_H #define _DSDB_SCHEMA_H +#include "prefixmap.h" + +enum dsdb_dn_format { + DSDB_NORMAL_DN, + DSDB_BINARY_DN, + DSDB_STRING_DN, + DSDB_INVALID_DN +}; + + struct dsdb_attribute; struct dsdb_class; struct dsdb_schema; +struct dsdb_dn; + +struct dsdb_syntax_ctx { + struct ldb_context *ldb; + const struct dsdb_schema *schema; + + /* set when converting objects under Schema NC */ + bool is_schema_nc; + + /* remote prefixMap to be used for drsuapi_to_ldb conversions */ + const struct dsdb_schema_prefixmap *pfm_remote; +}; + struct dsdb_syntax { const char *name; @@ -37,16 +60,20 @@ struct dsdb_syntax { const char *comment; const char *ldb_syntax; - WERROR (*drsuapi_to_ldb)(const struct dsdb_schema *schema, + WERROR (*drsuapi_to_ldb)(const struct dsdb_syntax_ctx *ctx, const struct dsdb_attribute *attr, const struct drsuapi_DsReplicaAttribute *in, TALLOC_CTX *mem_ctx, struct ldb_message_element *out); - WERROR (*ldb_to_drsuapi)(const struct dsdb_schema *schema, + WERROR (*ldb_to_drsuapi)(const struct dsdb_syntax_ctx *ctx, const struct dsdb_attribute *attr, const struct ldb_message_element *in, TALLOC_CTX *mem_ctx, struct drsuapi_DsReplicaAttribute *out); + WERROR (*validate_ldb)(const struct dsdb_syntax_ctx *ctx, + const struct dsdb_attribute *attr, + const struct ldb_message_element *in); + bool auto_normalise; }; struct dsdb_attribute { @@ -58,8 +85,10 @@ struct dsdb_attribute { uint32_t attributeID_id; struct GUID schemaIDGUID; uint32_t mAPIID; + uint32_t msDS_IntId; struct GUID attributeSecurityGUID; + struct GUID objectGUID; uint32_t searchFlags; uint32_t systemFlags; @@ -87,8 +116,12 @@ struct dsdb_attribute { bool isDefunct; bool systemOnly; + bool one_way_link; + enum dsdb_dn_format dn_format; + /* internal stuff */ const struct dsdb_syntax *syntax; + const struct ldb_schema_attribute *ldb_schema_attribute; }; struct dsdb_class { @@ -99,6 +132,7 @@ struct dsdb_class { const char *governsID_oid; uint32_t governsID_id; struct GUID schemaIDGUID; + struct GUID objectGUID; uint32_t objectClassCategory; const char *rDNAttID; @@ -116,10 +150,12 @@ struct dsdb_class { const char **mustContain; const char **mayContain; const char **possibleInferiors; + const char **systemPossibleInferiors; const char *defaultSecurityDescriptor; uint32_t schemaFlagsEx; + uint32_t systemFlags; struct ldb_val msDs_Schema_Extensions; bool showInAdvancedViewOnly; @@ -129,17 +165,42 @@ struct dsdb_class { bool defaultHidingValue; bool isDefunct; bool systemOnly; + + const char **supclasses; + const char **subclasses; + const char **subclasses_direct; + const char **posssuperiors; + uint32_t subClassOf_id; + uint32_t *systemAuxiliaryClass_ids; + uint32_t *auxiliaryClass_ids; + uint32_t *systemMayContain_ids; + uint32_t *systemMustContain_ids; + uint32_t *possSuperiors_ids; + uint32_t *mustContain_ids; + uint32_t *mayContain_ids; + uint32_t *systemPossSuperiors_ids; + + /* An ordered index showing how this subClass fits into the + * subClass tree. that is, an objectclass that is not + * subClassOf anything is 0 (just in case), and top is 1, and + * subClasses of top are 2, subclasses of those classes are + * 3 */ + uint32_t subClass_order; }; -struct dsdb_schema_oid_prefix { - uint32_t id; - const char *oid; - size_t oid_len; +/** + * data stored in schemaInfo attribute + */ +struct dsdb_schema_info { + uint32_t revision; + struct GUID invocation_id; }; + struct dsdb_schema { - uint32_t num_prefixes; - struct dsdb_schema_oid_prefix *prefixes; + struct ldb_dn *base_dn; + + struct dsdb_schema_prefixmap *prefixmap; /* * the last element of the prefix mapping table isn't a oid, @@ -151,15 +212,44 @@ struct dsdb_schema { */ const char *schema_info; + /* We can also tell the schema version from the USN on the partition */ + uint64_t loaded_usn; + struct dsdb_attribute *attributes; struct dsdb_class *classes; + /* lists of classes sorted by various attributes, for faster + access */ + uint32_t num_classes; + struct dsdb_class **classes_by_lDAPDisplayName; + struct dsdb_class **classes_by_governsID_id; + struct dsdb_class **classes_by_governsID_oid; + struct dsdb_class **classes_by_cn; + + /* lists of attributes sorted by various fields */ + uint32_t num_attributes; + struct dsdb_attribute **attributes_by_lDAPDisplayName; + struct dsdb_attribute **attributes_by_attributeID_id; + struct dsdb_attribute **attributes_by_attributeID_oid; + struct dsdb_attribute **attributes_by_linkID; + uint32_t num_int_id_attr; + struct dsdb_attribute **attributes_by_msDS_IntId; + struct { bool we_are_master; + bool update_allowed; struct ldb_dn *master_dn; } fsmo; - struct smb_iconv_convenience *iconv_convenience; + /* Was this schema loaded from ldb (if so, then we will reload it when we detect a change in ldb) */ + struct ldb_module *loaded_from_module; + struct dsdb_schema *(*refresh_fn)(struct ldb_module *module, struct dsdb_schema *schema, bool is_global_schema); + bool refresh_in_progress; + /* an 'opaque' sequence number that the reload function may also wish to use */ + uint64_t reload_seq_number; + + /* Should the syntax handlers in this case handle all incoming OIDs automatically, assigning them as an OID if no text name is known? */ + bool relax_OID_conversions; }; enum dsdb_attr_list_query {