X-Git-Url: http://git.samba.org/samba.git/?p=jra%2Fsamba%2F.git;a=blobdiff_plain;f=source4%2Fscripting%2Flibjs%2Fprovision.js;h=51e2785762bd79a29c2beba5b478f08066f80a05;hp=80362ce7f2d83cb1d0f62bce27cac80ffd7b4195;hb=8f8c56bfbcbfe8f80afb09eb1d481a108b252bee;hpb=8b70764038cd08020ab1c22b7f54cbec10acc6a0 diff --git a/source4/scripting/libjs/provision.js b/source4/scripting/libjs/provision.js index 80362ce7f2d..51e2785762b 100644 --- a/source4/scripting/libjs/provision.js +++ b/source4/scripting/libjs/provision.js @@ -1,7 +1,7 @@ /* backend code for provisioning a Samba4 server Copyright Andrew Tridgell 2005 - Released under the GNU GPL v2 or later + Released under the GNU GPL version 3 or later */ sys = sys_init(); @@ -23,7 +23,7 @@ function install_ok(session_info, credentials) return false; } var res = ldb.search("(cn=Administrator)"); - if (res.length != 1) { + if (res.error != 0 || res.msgs.length != 1) { return false; } return true; @@ -57,7 +57,7 @@ objectClass: top objectClass: foreignSecurityPrincipal description: %s ", - sid, subobj.BASEDN, desc); + sid, subobj.DOMAINDN, desc); /* deliberately ignore errors from this, as the records may already exist */ ldb.add(add); @@ -71,8 +71,8 @@ function setup_name_mapping(info, ldb, sid, unixname) { var attrs = new Array("dn"); var res = ldb.search(sprintf("objectSid=%s", sid), - info.subobj.BASEDN, ldb.SCOPE_SUBTREE, attrs); - if (res.length != 1) { + info.subobj.DOMAINDN, ldb.SCOPE_SUBTREE, attrs); + if (res.error != 0 || res.msgs.length != 1) { info.message("Failed to find record for objectSid %s\n", sid); return false; } @@ -82,9 +82,9 @@ changetype: modify replace: unixName unixName: %s ", - res[0].dn, unixname); + res.msgs[0].dn, unixname); var ok = ldb.modify(mod); - if (!ok) { + if (ok.error != 0) { info.message("name mapping for %s failed - %s\n", sid, ldb.errstring()); return false; @@ -140,9 +140,9 @@ function hostname() /* the ldb is in bad shape, possibly due to being built from an incompatible previous version of the code, so delete it completely */ -function ldb_delete(ldb) +function ldb_delete(info, ldb) { - println("Deleting " + ldb.filename); + info.message("Deleting " + ldb.filename + "\n"); var lp = loadparm_init(); sys.unlink(sprintf("%s/%s", lp.get("private dir"), ldb.filename)); ldb.transaction_cancel(); @@ -155,14 +155,14 @@ function ldb_delete(ldb) /* erase an ldb, removing all records */ -function ldb_erase(ldb) +function ldb_erase(info, ldb) { var res; /* delete the specials */ ldb.del("@INDEXLIST"); ldb.del("@ATTRIBUTES"); - ldb.del("@SUBCLASSES"); + ldb.del("@OPTIONS"); ldb.del("@MODULES"); ldb.del("@PARTITION"); ldb.del("@KLUDGEACL"); @@ -170,22 +170,22 @@ function ldb_erase(ldb) /* and the rest */ attrs = new Array("dn"); var basedn = ""; - var res = ldb.search("(&(|(objectclass=*)(dn=*))(!(dn=@BASEINFO)))", basedn, ldb.SCOPE_SUBTREE, attrs); + var res = ldb.search("(&(|(objectclass=*)(distinguishedName=*))(!(distinguishedName=@BASEINFO)))", basedn, ldb.SCOPE_SUBTREE, attrs); var i; - if (typeof(res) == "undefined") { - ldb_delete(ldb); + if (res.error != 0) { + ldb_delete(info, ldb); return; } - for (i=0;i cn=rootdse + // - objectclass must be before password_hash, because password_hash checks + // that the objectclass is of type person (filled in by the objectclass + // module when expanding the objectclass list) + // - partition must be last + // - each partition has its own module list then + var modules_list = new Array("rootdse", + "paged_results", + "ranged_results", + "anr", + "server_sort", + "extended_dn", + "asq", + "samldb", + "rdn_name", + "objectclass", + "kludge_acl", + "operational"); + var tdb_modules_list = new Array("subtree_rename", + "subtree_delete", + "linked_attributes"); + var modules_list2 = new Array("show_deleted", + "partition"); + subobj.MODULES_LIST = join(",", modules_list); + subobj.TDB_MODULES_LIST = "," + join(",", tdb_modules_list); + subobj.MODULES_LIST2 = join(",", modules_list2); + subobj.DOMAINDN_LDB = "users.ldb"; + subobj.CONFIGDN_LDB = "configuration.ldb"; + subobj.SCHEMADN_LDB = "schema.ldb"; + subobj.DOMAINDN_MOD = "pdc_fsmo,password_hash,instancetype"; + subobj.CONFIGDN_MOD = "naming_fsmo,instancetype"; + subobj.SCHEMADN_MOD = "schema_fsmo,instancetype"; + + subobj.ACI = "# no aci for local ldb"; + return subobj; } @@ -714,11 +1055,12 @@ function searchone(ldb, basedn, expression, attribute) { var attrs = new Array(attribute); res = ldb.search(expression, basedn, ldb.SCOPE_SUBTREE, attrs); - if (res.length != 1 || - res[0][attribute] == undefined) { + if (res.error != 0 || + res.msgs.length != 1 || + res.msgs[0][attribute] == undefined) { return undefined; } - return res[0][attribute]; + return res.msgs[0][attribute]; } /* @@ -728,8 +1070,9 @@ function enable_account(ldb, user_dn) { var attrs = new Array("userAccountControl"); var res = ldb.search(NULL, user_dn, ldb.SCOPE_ONELEVEL, attrs); - assert(res.length == 1); - var userAccountControl = res[0].userAccountControl; + assert(res.error == 0); + assert(res.msgs.length == 1); + var userAccountControl = res.msgs[0].userAccountControl; userAccountControl = userAccountControl - 2; /* remove disabled bit */ var mod = sprintf(" dn: %s @@ -739,7 +1082,7 @@ userAccountControl: %u ", user_dn, userAccountControl); var ok = ldb.modify(mod); - return ok; + return (ok.error == 0); } @@ -764,8 +1107,9 @@ function newuser(username, unixname, password, message, session_info, credential /* find the DNs for the domain and the domain users group */ var attrs = new Array("defaultNamingContext"); res = ldb.search("defaultNamingContext=*", "", ldb.SCOPE_BASE, attrs); - assert(res.length == 1 && res[0].defaultNamingContext != undefined); - var domain_dn = res[0].defaultNamingContext; + assert(res.error == 0); + assert(res.msgs.length == 1 && res.msgs[0].defaultNamingContext != undefined); + var domain_dn = res.msgs[0].defaultNamingContext; assert(domain_dn != undefined); var dom_users = searchone(ldb, domain_dn, "name=Domain Users", "dn"); assert(dom_users != undefined); @@ -780,12 +1124,11 @@ function newuser(username, unixname, password, message, session_info, credential var ldif = sprintf(" dn: %s sAMAccountName: %s -memberOf: %s unixName: %s sambaPassword: %s objectClass: user ", - user_dn, username, dom_users, + user_dn, username, unixname, password); /* add the user to the users group as well @@ -795,7 +1138,7 @@ dn: %s changetype: modify add: member member: %s -", +", dom_users, user_dn); @@ -804,15 +1147,15 @@ member: %s */ message("Adding user %s\n", user_dn); ok = ldb.add(ldif); - if (ok != true) { - message("Failed to add %s - %s\n", user_dn, ldb.errstring()); + if (ok.error != 0) { + message("Failed to add %s - %s\n", user_dn, ok.errstr); return false; } message("Modifying group %s\n", dom_users); ok = ldb.modify(modgroup); - if (ok != true) { - message("Failed to modify %s - %s\n", dom_users, ldb.errstring()); + if (ok.error != 0) { + message("Failed to modify %s - %s\n", dom_users, ok.errstr); return false; } @@ -831,7 +1174,7 @@ member: %s // crh has a paragraph on this in his book (1.4.1.1) function valid_netbios_name(name) { - if (strlen(name) > 13) return false; + if (strlen(name) > 15) return false; return true; } @@ -850,15 +1193,21 @@ function provision_validate(subobj, message) } - if (strupper(lp.get("workgroup")) != strupper(subobj.DOMAIN)) { + if (strupper(lp.get("workgroup")) != strupper(subobj.DOMAIN_CONF)) { message("workgroup '%s' in smb.conf must match chosen domain '%s'\n", - lp.get("workgroup"), subobj.DOMAIN); + lp.get("workgroup"), subobj.DOMAIN_CONF); return false; } - if (strupper(lp.get("realm")) != strupper(subobj.REALM)) { + if (strupper(lp.get("realm")) != strupper(subobj.REALM_CONF)) { message("realm '%s' in smb.conf must match chosen realm '%s'\n", - lp.get("realm"), subobj.REALM); + lp.get("realm"), subobj.REALM_CONF); + return false; + } + + if (strlower(lp.get("server role")) != strlower(subobj.SERVERROLE)) { + message("server role '%s' in smb.conf must match chosen role '%s'\n", + lp.get("server role"), subobj.SERVERROLE); return false; }