s3-dssync-passdb: fill in passdb_process_objects
authorGünther Deschner <gd@samba.org>
Fri, 21 Nov 2008 23:35:20 +0000 (00:35 +0100)
committerStefan Metzmacher <metze@samba.org>
Wed, 2 Feb 2011 14:45:20 +0000 (15:45 +0100)
Guenther

Signed-off-by: Stefan Metzmacher <metze@samba.org>
source3/libnet/libnet_dssync_passdb.c

index a8e502a46c5a5c618abdb63c94b69b6805e7f70c..2388b1a67a1679f4913025249340712f43b3aa98 100644 (file)
@@ -19,6 +19,7 @@
 
 #include "includes.h"
 #include "libnet/libnet_dssync.h"
+#include "../libds/common/flags.h"
 
 /****************************************************************
 ****************************************************************/
@@ -61,12 +62,146 @@ static NTSTATUS passdb_finish(struct dssync_context *ctx, TALLOC_CTX *mem_ctx,
 /****************************************************************
 ****************************************************************/
 
+static NTSTATUS handle_account_object(TALLOC_CTX *mem_ctx,
+                                     struct pdb_methods *methods,
+                                     struct drsuapi_DsReplicaObjectListItemEx *cur)
+{
+       return NT_STATUS_OK;
+}
+
+/****************************************************************
+****************************************************************/
+
+static NTSTATUS handle_alias_object(TALLOC_CTX *mem_ctx,
+                                   struct pdb_methods *methods,
+                                   struct drsuapi_DsReplicaObjectListItemEx *cur)
+{
+       return NT_STATUS_OK;
+}
+
+/****************************************************************
+****************************************************************/
+
+static NTSTATUS handle_group_object(TALLOC_CTX *mem_ctx,
+                                   struct pdb_methods *methods,
+                                   struct drsuapi_DsReplicaObjectListItemEx *cur)
+{
+       return NT_STATUS_OK;
+}
+
+/****************************************************************
+****************************************************************/
+
+static NTSTATUS handle_interdomain_trust_object(TALLOC_CTX *mem_ctx,
+                                               struct pdb_methods *methods,
+                                               struct drsuapi_DsReplicaObjectListItemEx *cur)
+{
+       return NT_STATUS_OK;
+}
+
+/****************************************************************
+****************************************************************/
+
+struct dssync_object_table_t {
+       uint32_t type;
+       NTSTATUS (*fn) (TALLOC_CTX *mem_ctx,
+                       struct pdb_methods *methods,
+                       struct drsuapi_DsReplicaObjectListItemEx *cur);
+};
+
+static const struct dssync_object_table_t dssync_object_table[] = {
+       { ATYPE_NORMAL_ACCOUNT,         handle_account_object },
+       { ATYPE_WORKSTATION_TRUST,      handle_account_object },
+       { ATYPE_SECURITY_LOCAL_GROUP,   handle_alias_object },
+       { ATYPE_SECURITY_GLOBAL_GROUP,  handle_group_object },
+       { ATYPE_INTERDOMAIN_TRUST,      handle_interdomain_trust_object },
+};
+
+/****************************************************************
+****************************************************************/
+
+static NTSTATUS parse_object(TALLOC_CTX *mem_ctx,
+                            struct pdb_methods *methods,
+                            struct drsuapi_DsReplicaObjectListItemEx *cur)
+{
+       NTSTATUS status = NT_STATUS_OK;
+       DATA_BLOB *blob;
+       int i = 0;
+       int a = 0;
+       struct drsuapi_DsReplicaAttribute *attr;
+
+       char *name = NULL;
+       uint32_t uacc = 0;
+       uint32_t sam_type = 0;
+
+       DEBUG(3, ("parsing object '%s'\n", cur->object.identifier->dn));
+
+       for (i=0; i < cur->object.attribute_ctr.num_attributes; i++) {
+
+               attr = &cur->object.attribute_ctr.attributes[i];
+
+               if (attr->value_ctr.num_values != 1) {
+                       continue;
+               }
+
+               if (!attr->value_ctr.values[0].blob) {
+                       continue;
+               }
+
+               blob = attr->value_ctr.values[0].blob;
+
+               switch (attr->attid) {
+                       case DRSUAPI_ATTID_sAMAccountName:
+                               pull_string_talloc(mem_ctx, NULL, 0, &name,
+                                                  blob->data, blob->length,
+                                                  STR_UNICODE);
+                               break;
+                       case DRSUAPI_ATTID_sAMAccountType:
+                               sam_type = IVAL(blob->data, 0);
+                               break;
+                       case DRSUAPI_ATTID_userAccountControl:
+                               uacc = IVAL(blob->data, 0);
+                               break;
+                       default:
+                               break;
+               }
+       }
+
+       for (a=0; a < ARRAY_SIZE(dssync_object_table); a++) {
+               if (sam_type == dssync_object_table[a].type) {
+                       if (dssync_object_table[a].fn) {
+                               status = dssync_object_table[a].fn(mem_ctx,
+                                                                  methods,
+                                                                  cur);
+                               break;
+                       }
+               }
+       }
+
+       return status;
+}
+
+/****************************************************************
+****************************************************************/
+
 static NTSTATUS passdb_process_objects(struct dssync_context *ctx,
                                       TALLOC_CTX *mem_ctx,
                                       struct drsuapi_DsReplicaObjectListItemEx *cur,
                                       struct drsuapi_DsReplicaOIDMapping_Ctr *mapping_ctr)
 {
-       return NT_STATUS_NOT_SUPPORTED;
+       NTSTATUS status = NT_STATUS_OK;
+       struct pdb_methods *methods =
+               (struct pdb_methods *)ctx->private_data;
+
+       for (; cur; cur = cur->next_object) {
+               status = parse_object(mem_ctx, methods, cur);
+               if (!NT_STATUS_IS_OK(status)) {
+                       goto out;
+               }
+       }
+
+ out:
+       return status;
 }
 
 /****************************************************************