s4:dsdb Make the 'relative path' code in partitions handle tdb://
[ira/wip.git] / source4 / dsdb / samdb / samdb.c
index f75ea3c4f7c3a0f20f67548b5930e16e2cfb459a..6034c2565060c3bb539c8906501a6a275f25ac25 100644 (file)
@@ -36,7 +36,7 @@
 #include "ldb_wrap.h"
 #include "../lib/util/util_ldb.h"
 #include "dsdb/samdb/samdb.h"
-#include "dsdb/common/flags.h"
+#include "../libds/common/flags.h"
 #include "param/param.h"
 #include "lib/events/events.h"
 #include "auth/credentials/credentials.h"
@@ -55,6 +55,9 @@ char *samdb_relative_path(struct ldb_context *ldb,
        if (name[0] == 0 || name[0] == '/' || strstr(name, ":/")) {
                return talloc_strdup(mem_ctx, name);
        }
+       if (strncmp("tdb://", base_url, 6) == 0) {
+               base_url = base_url+6;
+       }
        path = talloc_strdup(mem_ctx, base_url);
        if (path == NULL) {
                return NULL;
@@ -70,7 +73,7 @@ char *samdb_relative_path(struct ldb_context *ldb,
 }
 
 struct cli_credentials *samdb_credentials(TALLOC_CTX *mem_ctx, 
-                                         struct event_context *event_ctx, 
+                                         struct tevent_context *event_ctx, 
                                          struct loadparm_context *lp_ctx) 
 {
        struct cli_credentials *cred = cli_credentials_init(mem_ctx);
@@ -97,7 +100,7 @@ struct cli_credentials *samdb_credentials(TALLOC_CTX *mem_ctx,
   return an opaque context pointer on success, or NULL on failure
  */
 struct ldb_context *samdb_connect(TALLOC_CTX *mem_ctx, 
-                                 struct event_context *ev_ctx,
+                                 struct tevent_context *ev_ctx,
                                  struct loadparm_context *lp_ctx,
                                  struct auth_session_info *session_info)
 {
@@ -113,117 +116,12 @@ struct ldb_context *samdb_connect(TALLOC_CTX *mem_ctx,
        return ldb;
 }
 
-/*
-  copy from a template record to a message
-*/
-int samdb_copy_template(struct ldb_context *ldb, 
-                       struct ldb_message *msg, const char *name,
-                       const char **errstring)
-{
-       struct ldb_result *res;
-       struct ldb_message *t;
-       int ret, i, j;
-       struct ldb_context *templates_ldb;
-       char *templates_ldb_path; 
-       struct ldb_dn *basedn;
-       struct event_context *event_ctx;
-       struct loadparm_context *lp_ctx;
-
-       templates_ldb = talloc_get_type(ldb_get_opaque(ldb, "templates_ldb"), struct ldb_context);
-
-       if (!templates_ldb) {
-               templates_ldb_path = samdb_relative_path(ldb, 
-                                                        msg, 
-                                                        "templates.ldb");
-               if (!templates_ldb_path) {
-                       *errstring = talloc_asprintf(msg, "samdb_copy_template: ERROR: Failed to contruct path for template db");
-                       return LDB_ERR_OPERATIONS_ERROR;
-               }
-               
-               event_ctx = ldb_get_event_context(ldb);
-               lp_ctx = (struct loadparm_context *)ldb_get_opaque(ldb, "loadparm");
-
-               /* FIXME: need to remove this wehn we finally pass the event
-                * context around in ldb */
-               if (event_ctx == NULL) {
-                       event_ctx = s4_event_context_init(templates_ldb);
-               }
-
-               templates_ldb = ldb_wrap_connect(ldb, event_ctx, lp_ctx, 
-                                               templates_ldb_path, NULL,
-                                               NULL, 0, NULL);
-               talloc_free(templates_ldb_path);
-               if (!templates_ldb) {
-                       *errstring = talloc_asprintf(msg, "samdb_copy_template: ERROR: Failed to connect to templates db at: %s",
-                                            templates_ldb_path);
-                       return LDB_ERR_OPERATIONS_ERROR;
-               }
-               
-               ret = ldb_set_opaque(ldb, "templates_ldb", templates_ldb);
-               if (ret != LDB_SUCCESS) {
-                       return ret;
-               }
-       }
-       *errstring = NULL;      
-
-       basedn = ldb_dn_new(templates_ldb, ldb, "cn=Templates");
-       if (!ldb_dn_add_child_fmt(basedn, "CN=Template%s", name)) {
-               talloc_free(basedn);
-               *errstring = talloc_asprintf(msg, "samdb_copy_template: ERROR: Failed to contruct DN for template '%s'", 
-                                            name);
-               return LDB_ERR_OPERATIONS_ERROR;
-       }
-       
-       /* pull the template record */
-       ret = ldb_search(templates_ldb, msg, &res, basedn, LDB_SCOPE_BASE, NULL, "distinguishedName=*");
-       talloc_free(basedn);
-       if (ret != LDB_SUCCESS) {
-               *errstring = talloc_steal(msg, ldb_errstring(templates_ldb));
-               return ret;
-       }
-       if (res->count != 1) {
-               *errstring = talloc_asprintf(msg, "samdb_copy_template: ERROR: template '%s' matched %d records, expected 1", 
-                                            name, 
-                                            res->count);
-               talloc_free(res);
-               return LDB_ERR_OPERATIONS_ERROR;
-       }
-       t = res->msgs[0];
-
-       for (i = 0; i < t->num_elements; i++) {
-               struct ldb_message_element *el = &t->elements[i];
-               /* some elements should not be copied from the template */
-               if (ldb_attr_cmp(el->name, "cn") == 0 ||
-                   ldb_attr_cmp(el->name, "name") == 0 ||
-                   ldb_attr_cmp(el->name, "objectClass") == 0 ||
-                   ldb_attr_cmp(el->name, "sAMAccountName") == 0 ||
-                   ldb_attr_cmp(el->name, "sAMAccountName") == 0 ||
-                   ldb_attr_cmp(el->name, "distinguishedName") == 0 ||
-                   ldb_attr_cmp(el->name, "objectGUID") == 0) {
-                       continue;
-               }
-               for (j = 0; j < el->num_values; j++) {
-                       ret = samdb_find_or_add_attribute(ldb, msg, el->name, 
-                                                         (char *)el->values[j].data);
-                       if (ret) {
-                               *errstring = talloc_asprintf(msg, "Adding attribute %s failed.", el->name);
-                               talloc_free(res);
-                               return ret;
-                       }
-               }
-       }
-
-       talloc_free(res);
-
-       return LDB_SUCCESS;
-}
-
 
 /****************************************************************************
  Create the SID list for this user.
 ****************************************************************************/
 NTSTATUS security_token_create(TALLOC_CTX *mem_ctx, 
-                              struct event_context *ev_ctx, 
+                              struct tevent_context *ev_ctx, 
                               struct loadparm_context *lp_ctx,
                               struct dom_sid *user_sid,
                               struct dom_sid *group_sid,