function upgrade_registry(regdb,prefix)
{
+ assert(regdb != undefined);
var prefix_up = strupper(prefix);
-
- var ldif = "";
+ var ldif = new Array();
for (var i in regdb.keys) {
var rk = regdb.keys[i];
+ var pts = split("/", rk.name);
+
/* Only handle selected hive */
- if (strncmp(prefix_up, rk.name, strlen(prefix_up)) != 0) {
+ if (strupper(pts[0]) != prefix_up) {
continue;
}
var pts = split("/", rk.name);
/* Convert key name to dn */
- ldif = ldif + sprintf("
+ ldif[rk.name] = sprintf("
dn: %s
name: %s
for (var j in rk.values) {
var rv = rk.values[j];
- ldif = ldif + sprintf("
+ ldif[rk.name + " (" + rv.name + ")"] = sprintf("
dn: %s,value=%s
value: %s
type: %d
{
var ldif = sprintf("
dn: %s
+changetype: modify
+replace: minPwdLength
minPwdLength: %d
pwdHistoryLength: %d
minPwdAge: %d
function upgrade_sam_account(acc,domaindn)
{
+ var ldb = ldb_init();
var ldif = sprintf(
"dn: cn=%s,%s
objectClass: top
samba3PassCanChangeTime: %d
samba3PassMustChangeTime: %d
samba3Rid: %d
+ntPwdHash:: %s
+lmPwdHash:: %s
-", acc.fullname, domaindn, sam.logon_time, acc.logoff_time, acc.username, acc.nt_username,
+", acc.fullname, domaindn, acc.logon_time, acc.logoff_time, acc.username, acc.nt_username,
acc.fullname, acc.acct_desc, acc.group_rid, acc.bad_password_count, acc.logon_count,
acc.domain, acc.dir_drive, acc.munged_dial, acc.homedir, acc.logon_script,
acc.profile_path, acc.workstations, acc.kickoff_time, acc.bad_password_time,
-acc.pass_last_set_time, acc.pass_can_change_time, acc.pass_must_change_time, acc.user_rid);
-
- /* FIXME: Passwords */
+acc.pass_last_set_time, acc.pass_can_change_time, acc.pass_must_change_time, acc.user_rid,
+ ldb.encode(acc.lm_pw), ldb.encode(acc.nt_pw));
return ldif;
}
cn: %s
objectSid: %s
unixName: FIXME
-samba3SidNameUse: %d", grp.nt_name, domaindn,
+samba3SidNameUse: %d
+", grp.nt_name, domaindn,
grp.comment, grp.nt_name, grp.sid, grp.sid_name_use);
return ldif;
name: %s
objectClass: wins
nbFlags: %x
-expires: %s", e.type, e.name, e.name, e.type, e.nb_flags, sys.ldap_time(e.ttl));
+expires: %s
+", e.type, e.name, e.name, e.type, e.nb_flags, sys.ldaptime(e.ttl));
for (var i in e.ips) {
ldif = ldif + sprintf("address: %s\n", e.ips[i]);
var lp = loadparm_init();
var rdn_list;
- var domainname = samba3.get_param("global", "workgroup");
+ var domainname = samba3.configuration.get("workgroup");
+
+ if (domainname == undefined) {
+ domainname = samba3.secrets.domains[0].name;
+ println("No domain specified in smb.conf file, assuming '" + domainname + "'");
+ }
+
var domsec = samba3.find_domainsecrets(domainname);
var hostsec = samba3.find_domainsecrets(hostname());
- var realm = samba3.get_param("global", "realm");
+ var realm = samba3.configuration.get("realm");
+
+ if (realm == undefined) {
+ realm = domainname;
+ println("No realm specified in smb.conf file, assuming '" + realm + "'");
+ }
random_init(local);
subobj.REALM = realm;
assert(subobj.HOSTNAME);
subobj.HOSTIP = hostip();
- subobj.DOMAINGUID = domsec.guid;
- subobj.DOMAINSID = domsec.sid;
- subobj.HOSTGUID = hostsec.guid;
+ if (domsec != undefined) {
+ subobj.DOMAINGUID = domsec.guid;
+ subobj.DOMAINSID = domsec.sid;
+ } else {
+ println("Can't find domain secrets for '" + domainname + "'; using random SID and GUID");
+ subobj.DOMAINGUID = randguid();
+ subobj.DOMAINSID = randsid();
+ }
+
+ if (hostsec) {
+ subobj.HOSTGUID = hostsec.guid;
+ } else {
+ subobj.HOSTGUID = randguid();
+ }
subobj.INVOCATIONID = randguid();
subobj.KRBTGTPASS = randpass(12);
subobj.MACHINEPASS = randpass(12);
subobj.LDAPTIME = ldaptime;
subobj.DATESTRING = datestring;
subobj.USN = nextusn;
- subobj.ROOT = findnss(nss.getpwnam, split(samba3.get_param("global", "admin users")));
+ subobj.ROOT = findnss(nss.getpwnam, "root");
subobj.NOBODY = findnss(nss.getpwnam, "nobody");
subobj.NOGROUP = findnss(nss.getgrnam, "nogroup", "nobody");
subobj.WHEEL = findnss(nss.getgrnam, "wheel", "root");
subobj.DNSDOMAIN);
subobj.BASEDN = "DC=" + join(",DC=", split(".", subobj.REALM));
rdn_list = split(".", subobj.REALM);
- subobj.RDN_DC = rdn_list[0];
return subobj;
}
"obey pam restrictions",
"password server",
"smb passwd file",
- "sam database",
- "spoolss database",
- "wins database",
"private dir",
"passwd chat",
"password level",
"debuglevel",
"log file",
"smb ports",
- "nbt port",
- "dgram port",
- "cldap port",
- "krb5 port",
- "web port",
- "tls enabled",
- "tls keyfile",
- "tls certfile",
- "tls cafile",
- "tls crlfile",
- "swat directory",
"large readwrite",
"max protocol",
"min protocol",
"use spnego",
"server signing",
"client signing",
- "rpc big endian",
"max connections",
"paranoid server security",
"socket options",
"strict sync",
- "case insensitive filesystem",
"max print jobs",
"printable",
"print ok",
"lock dir",
"lock directory",
"pid directory",
- "js include",
- "setup directory",
"socket address",
- "-valid",
"copy",
"include",
"available",
{
//FIXME
}
+
+function save_smbconf(path,smbconf)
+{
+ var data = "
+# Generated by upgrade.js";
+
+ for (var i in smbconf.shares) {
+ var s = smbconf.shares[i];
+ data = data + "\n[" + s.name + "]\n";
+ for (var j in s.parameters) {
+ var p = s.parameters[j];
+ data = data + "\t" + p.name + " = " + p + "\n";
+ }
+ }
+
+ sys.file_save(path,data);
+}
+
+function upgrade(subobj, samba3, message)
+{
+ var ret = 0;
+ var samdb = ldb_init();
+ var ok = samdb.connect("sam.ldb");
+ assert(ok);
+
+ message("Importing account policies\n");
+ var ldif = upgrade_sam_policy(samba3,subobj.BASEDN);
+ ok = samdb.modify(ldif);
+ assert(ok);
+
+ var ldapurl = undefined;
+
+ // FIXME: figure out ldapurl
+
+ // Enable samba3sam module if original passdb backend was ldap
+ if (ldapurl != undefined) {
+ var ldif = sprintf("
+dn: @MAP=samba3sam
+@MAP_URL: %s", ldapurl);
+ samdb.add(ldif);
+
+ samdb.modify("dn: @MODULES
+@LIST: samldb,timestamps,objectguid,rdn_name");
+ }
+
+ message("Importing users\n");
+ for (var i in samba3.samaccounts) {
+ message("... " + samba3.samaccounts[i].username);
+ var ldif = upgrade_sam_account(samba3.samaccounts[i],subobj.BASEDN);
+ ok = samdb.add(ldif);
+ if (!ok) {
+ message("... error: " + samdb.errstring());
+ ret = ret + 1;
+ }
+ message("\n");
+ }
+
+ message("Importing groups\n");
+ for (var i in samba3.groupmappings) {
+ message("... " + samba3.groupmappings[i].nt_name);
+ var ldif = upgrade_sam_group(samba3.groupmappings[i],subobj.BASEDN);
+ ok = samdb.add(ldif);
+ if (!ok) {
+ message("... error: " + samdb.errstring());
+ ret = ret + 1;
+ }
+ message("\n");
+ }
+
+ message("Importing registry data\n");
+ var hives = new Array("hkcr","hkcu","hklm","hkpd","hku","hkpt");
+ for (var i in hives) {
+ message("... " + hives[i] + "\n");
+ var regdb = ldb_init();
+ ok = regdb.connect(hives[i] + ".ldb");
+ assert(ok);
+ var ldif = upgrade_registry(samba3.registry, hives[i]);
+ for (var j in ldif) {
+ message("... ... " + j);
+ ok = regdb.add(ldif[j]);
+ if (!ok) {
+ message("... error: " + regdb.errstring());
+ ret = ret + 1;
+ }
+ message("\n");
+ }
+ }
+
+ message("Importing WINS data\n");
+ var winsdb = ldb_init();
+ ok = winsdb.connect("wins.ldb");
+ assert(ok);
+ ldb_erase(winsdb);
+
+ var ldif = upgrade_wins(samba3);
+ ok = winsdb.add(ldif);
+ assert(ok);
+
+ return ret;
+}