r9808: Improve code that selects what "passdb backend" to import from.
authorJelmer Vernooij <jelmer@samba.org>
Tue, 30 Aug 2005 17:23:07 +0000 (17:23 +0000)
committerGerald (Jerry) Carter <jerry@samba.org>
Wed, 10 Oct 2007 18:35:04 +0000 (13:35 -0500)
source/lib/samba3/PLAN
source/lib/samba3/samba3.c
source/lib/samba3/smbpasswd.c

index 67395ca84c3acbd0d1d8e08d6dea103d6b390ed6..f6cdf1cce40a049bf9bc86bd0a6625d876fc8f8a 100644 (file)
@@ -1,5 +1,3 @@
 TODO (SoC project):
- - move ini parsing stuff to seperate file param/ini.c
- - parse "passdb backend" setting and parse tdbsam/passdb based on it
  - test ldb_map backend (testsuite?)
  - testsuite for the static upgrade
index b919366ce3561af0774f651da01ae6e3252d4dbe..8d5ad7718586812bf97408c803ca3c63176c1fcf 100644 (file)
@@ -32,6 +32,55 @@ struct samba3_domainsecrets *samba3_find_domainsecrets(struct samba3 *db, const
        return NULL;
 }
 
+NTSTATUS samba3_read_passdb_backends(TALLOC_CTX *ctx, const char *libdir, struct samba3 *samba3)
+{
+       char *dbfile;
+       NTSTATUS status = NT_STATUS_OK;
+       int i;
+       const char **backends = param_get_string_list(samba3->configuration, NULL, "passdb backends", NULL);
+
+       /* Default to smbpasswd */
+       if (backends == NULL) 
+               backends = str_list_make(ctx, "smbpasswd", LIST_SEP);
+       else
+               backends = str_list_copy(ctx, backends);
+
+       for (i = 0; backends[i]; i++) {
+               if (!strncmp(backends[i], "tdbsam", strlen("tdbsam"))) {
+                       const char *p = strchr(backends[i], ':');
+                       if (p && p[1]) {
+                               dbfile = talloc_strdup(ctx, p+1);
+                       } else {
+                               dbfile = talloc_asprintf(ctx, "%s/passdb.tdb", libdir);
+                       }
+                       samba3_read_tdbsam(dbfile, ctx, &samba3->samaccounts, &samba3->samaccount_count);
+                       talloc_free(dbfile);
+               } else if (!strncmp(backends[i], "smbpasswd", strlen("smbpasswd"))) {
+                       const char *p = strchr(backends[i], ':');
+                       if (p && p[1]) {
+                               dbfile = talloc_strdup(ctx, p+1);
+                       } else if ((p = param_get_string(samba3->configuration, NULL, "smb passwd file"))) {
+                               dbfile = talloc_strdup(ctx, p);
+                       } else {
+                               dbfile = talloc_strdup(ctx, "/etc/samba/smbpasswd");
+                       }
+
+                       samba3_read_smbpasswd(dbfile, ctx, &samba3->samaccounts, &samba3->samaccount_count);
+                       talloc_free(dbfile);
+               } else if (!strncmp(backends[i], "ldapsam", strlen("ldapsam"))) {
+                       /* Will use samba3sam mapping module */                 
+               } else {
+                       DEBUG(0, ("Upgrade from %s database not supported", backends[i]));
+                       status = NT_STATUS_NOT_SUPPORTED;
+                       continue;
+               }
+       }
+
+       talloc_free(backends);
+
+       return status;
+}
+
 NTSTATUS samba3_read(const char *libdir, const char *smbconf, TALLOC_CTX *ctx, struct samba3 **samba3)
 {
        struct samba3 *ret;
@@ -68,9 +117,7 @@ NTSTATUS samba3_read(const char *libdir, const char *smbconf, TALLOC_CTX *ctx, s
        samba3_read_winsdb(dbfile, ret, &ret->winsdb_entries, &ret->winsdb_count);
        talloc_free(dbfile);
 
-       dbfile = talloc_asprintf(ctx, "%s/passdb.tdb", libdir);
-       samba3_read_tdbsam(dbfile, ctx, &ret->samaccounts, &ret->samaccount_count);
-       talloc_free(dbfile);
+       samba3_read_passdb_backends(ctx, libdir, ret);
 
        dbfile = talloc_asprintf(ctx, "%s/group_mapping.tdb", libdir);
        samba3_read_grouptdb(dbfile, ctx, &ret->group);
index 5976d2db572a8037d8fc54f3ab00367d6a39a63d..fe0780c8d31885e00cc7d6827d3c82f419a37237 100644 (file)
@@ -219,6 +219,11 @@ NTSTATUS samba3_read_smbpasswd(const char *filename, TALLOC_CTX *ctx, struct sam
 
        lines = file_lines_load(filename, &numlines, ctx);
 
+       if (lines == NULL) {
+               DEBUG(0, ("Unable to load lines from %s\n", filename));
+               return NT_STATUS_UNSUCCESSFUL;
+       }
+
        *accounts = talloc_array(ctx, struct samba3_samaccount, numlines);
 
        for (i = 0; i < numlines; i++) {