s4-dsdb_syntax: Add remote prefixMap member for dsdb_syntax conversions
[samba.git] / source4 / dsdb / schema / schema.h
index a605e2f707fe21fbbc58af6df8335540d1668ad3..5ba2254a50b6d1513dedbc3acd50243639b14cea 100644 (file)
 #ifndef _DSDB_SCHEMA_H
 #define _DSDB_SCHEMA_H
 
+#include "prefixmap.h"
+
 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,18 +52,19 @@ struct dsdb_syntax {
        const char *comment;
        const char *ldb_syntax;
 
-       WERROR (*drsuapi_to_ldb)(struct ldb_context *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)(struct ldb_context *ldb, 
-                                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);
 };
 
 struct dsdb_attribute {
@@ -60,8 +76,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;
@@ -102,6 +120,7 @@ struct dsdb_class {
        const char *governsID_oid;
        uint32_t governsID_id;
        struct GUID schemaIDGUID;
+       struct GUID objectGUID;
 
        uint32_t objectClassCategory;
        const char *rDNAttID;
@@ -119,6 +138,7 @@ struct dsdb_class {
        const char **mustContain;
        const char **mayContain;
        const char **possibleInferiors;
+       const char **systemPossibleInferiors;
 
        const char *defaultSecurityDescriptor;
 
@@ -133,10 +153,10 @@ struct dsdb_class {
        bool isDefunct;
        bool systemOnly;
 
-       char **supclasses;
-       char **subclasses;
-       char **subclasses_direct;
-       char **posssuperiors;
+       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;
@@ -146,17 +166,28 @@ struct dsdb_class {
        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,
@@ -168,6 +199,9 @@ 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;
 
@@ -185,13 +219,23 @@ struct dsdb_schema {
        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;
                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 {