s3:pdb_tdb: store the next rid counter in passdb.tdb instead of winbind_idmap.tdb
authorStefan Metzmacher <metze@samba.org>
Mon, 15 Dec 2008 18:28:27 +0000 (19:28 +0100)
committerKarolin Seeger <kseeger@samba.org>
Fri, 2 Jan 2009 11:44:27 +0000 (12:44 +0100)
This upgrades the TDBSAM_VERSION to 4 and SAMU_BUFFER_V4.

metze
(cherry picked from commit 7516ba860c160e8b971b6f5bc1036370169e6e8a)
(cherry picked from commit adc22887e50b6bb48f7235361460f61999965f84)

source/passdb/pdb_tdb.c

index bda44a44e0bbce0d973254cd4368ae68527f8858..eab91100fdd08ee67878f31f6ab104d8253e0b6e 100644 (file)
@@ -37,13 +37,14 @@ static int tdbsam_debug_level = DBGC_ALL;
 
 #endif
 
-#define TDBSAM_VERSION 3       /* Most recent TDBSAM version */
+#define TDBSAM_VERSION 4       /* Most recent TDBSAM version */
 #define TDBSAM_VERSION_STRING  "INFO/version"
 #define PASSDB_FILE_NAME       "passdb.tdb"
 #define USERPREFIX             "USER_"
 #define USERPREFIX_LEN         5
 #define RIDPREFIX              "RID_"
 #define PRIVPREFIX             "PRIV_"
+#define NEXT_RID_STRING                "NEXT_RID"
 
 /* GLOBAL TDB SAM CONTEXT */
 
@@ -101,6 +102,10 @@ static int tdbsam_convert_one(struct db_record *rec, void *priv)
                ret = init_samu_from_buffer(user, SAMU_BUFFER_V3,
                                            (uint8 *)rec->value.dptr,
                                            rec->value.dsize);
+       case 4:
+               ret = init_samu_from_buffer(user, SAMU_BUFFER_V4,
+                                           (uint8 *)rec->value.dptr,
+                                           rec->value.dsize);
                break;
        default:
                /* unknown tdbsam version */
@@ -136,6 +141,37 @@ static int tdbsam_convert_one(struct db_record *rec, void *priv)
        return 0;
 }
 
+static bool tdbsam_upgrade_next_rid(struct db_context *db)
+{
+       TDB_CONTEXT *tdb;
+       uint32 rid;
+       bool ok = false;
+
+       ok = dbwrap_fetch_uint32(db, NEXT_RID_STRING, &rid);
+       if (ok) {
+               return true;
+       }
+
+       tdb = tdb_open_log(state_path("winbindd_idmap.tdb"), 0,
+                          TDB_DEFAULT, O_RDONLY, 0644);
+
+       if (tdb) {
+               ok = tdb_fetch_uint32(tdb, "RID_COUNTER", &rid);
+               if (!ok) {
+                       rid = BASE_RID;
+               }
+               tdb_close(tdb);
+       } else {
+               rid = BASE_RID;
+       }
+
+       if (dbwrap_store_uint32(db, NEXT_RID_STRING, rid) != 0) {
+               return false;
+       }
+
+       return true;
+}
+
 static bool tdbsam_convert(struct db_context *db, int32 from)
 {
        struct tdbsam_convert_state state;
@@ -149,6 +185,11 @@ static bool tdbsam_convert(struct db_context *db, int32 from)
                return false;
        }
 
+       if (!tdbsam_upgrade_next_rid(db)) {
+               DEBUG(0, ("tdbsam_upgrade_next_rid failed\n"));
+               goto cancel;
+       }
+
        ret = db->traverse(db, tdbsam_convert_one, &state);
        if (ret < 0) {
                DEBUG(0, ("traverse failed\n"));
@@ -730,90 +771,21 @@ static bool tdbsam_rid_algorithm(struct pdb_methods *methods)
        return False;
 }
 
-/*
- * Historically, winbind was responsible for allocating RIDs, so the next RID
- * value was stored in winbindd_idmap.tdb. It has been moved to passdb now,
- * but for compatibility reasons we still keep the the next RID counter in
- * winbindd_idmap.tdb.
- */
-
-/*****************************************************************************
- Initialise idmap database. For now (Dec 2005) this is a copy of the code in
- sam/idmap_tdb.c. Maybe at a later stage we can remove that capability from
- winbind completely and store the RID counter in passdb.tdb.
-
- Dont' fully initialize with the HWM values, if it's new, we're only
- interested in the RID counter.
-*****************************************************************************/
-
-static bool init_idmap_tdb(TDB_CONTEXT *tdb)
-{
-       int32 version;
-
-       if (tdb_lock_bystring(tdb, "IDMAP_VERSION") != 0) {
-               DEBUG(0, ("Could not lock IDMAP_VERSION\n"));
-               return False;
-       }
-
-       version = tdb_fetch_int32(tdb, "IDMAP_VERSION");
-
-       if (version == -1) {
-               /* No key found, must be a new db */
-               if (tdb_store_int32(tdb, "IDMAP_VERSION",
-                                   IDMAP_VERSION) != 0) {
-                       DEBUG(0, ("Could not store IDMAP_VERSION\n"));
-                       tdb_unlock_bystring(tdb, "IDMAP_VERSION");
-                       return False;
-               }
-               version = IDMAP_VERSION;
-       }
-
-       if (version != IDMAP_VERSION) {
-               DEBUG(0, ("Expected IDMAP_VERSION=%d, found %d. Please "
-                         "start winbind once\n", IDMAP_VERSION, version));
-               tdb_unlock_bystring(tdb, "IDMAP_VERSION");
-               return False;
-       }
-
-       tdb_unlock_bystring(tdb, "IDMAP_VERSION");
-       return True;
-}
-
 static bool tdbsam_new_rid(struct pdb_methods *methods, uint32 *prid)
 {
-       TDB_CONTEXT *tdb;
        uint32 rid;
-       bool ret = False;
-
-       tdb = tdb_open_log(state_path("winbindd_idmap.tdb"), 0,
-                          TDB_DEFAULT, O_RDWR | O_CREAT, 0644);
-
-       if (tdb == NULL) {
-               DEBUG(1, ("Could not open idmap: %s\n", strerror(errno)));
-               goto done;
-       }
-
-       if (!init_idmap_tdb(tdb)) {
-               DEBUG(1, ("Could not init idmap\n"));
-               goto done;
-       }
 
        rid = BASE_RID;         /* Default if not set */
 
-       if (!tdb_change_uint32_atomic(tdb, "RID_COUNTER", &rid, 1)) {
-               DEBUG(3, ("tdbsam_new_rid: Failed to increase RID_COUNTER\n"));
-               goto done;
+       if (dbwrap_change_uint32_atomic(db_sam, NEXT_RID_STRING, &rid, 1) != 0) {
+               DEBUG(3, ("tdbsam_new_rid: Failed to increase %s\n",
+                       NEXT_RID_STRING));
+               return false;
        }
 
        *prid = rid;
-       ret = True;
 
- done:
-       if ((tdb != NULL) && (tdb_close(tdb) != 0)) {
-               smb_panic("tdb_close(idmap_tdb) failed");
-       }
-
-       return ret;
+       return true;
 }
 
 struct tdbsam_search_state {