s4-dsdb: add auto-normalisation of attributes
[amitay/samba.git] / source4 / dsdb / schema / schema.h
index a4e455ae33f1118aaa4c58efd54aae10015ef160..58cf82b2973adb915467137af7eb85b52beb7ab7 100644 (file)
 #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;
@@ -32,17 +55,25 @@ struct dsdb_syntax {
        uint32_t oMSyntax;
        struct ldb_val oMObjectClass;
        const char *attributeSyntax_oid;
+       const char *equality;
+       const char *substring;
+       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 {
@@ -54,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;
@@ -68,8 +101,8 @@ struct dsdb_attribute {
        struct ldb_val oMObjectClass;
 
        bool isSingleValued;
-       uint32_t rangeLower;
-       uint32_t rangeUpper;
+       uint32_t *rangeLower;
+       uint32_t *rangeUpper;
        bool extendedCharsAllowed;
 
        uint32_t schemaFlagsEx;
@@ -83,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 {
@@ -95,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;
@@ -112,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;
@@ -125,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,
@@ -147,15 +212,43 @@ 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;
                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 {
@@ -168,6 +261,12 @@ enum dsdb_attr_list_query {
        DSDB_SCHEMA_ALL
 };
 
+enum dsdb_schema_convert_target {
+       TARGET_OPENLDAP,
+       TARGET_FEDORA_DS,
+       TARGET_AD_SCHEMA_SUBENTRY
+};
+
 #include "dsdb/schema/proto.h"
 
 #endif /* _DSDB_SCHEMA_H */