diff options
-rw-r--r-- | source4/lib/registry/hive.c | 2 | ||||
-rw-r--r-- | source4/lib/registry/patchfile.c | 4 | ||||
-rw-r--r-- | source4/lib/registry/samba.c | 5 | ||||
-rw-r--r-- | source4/scripting/ejs/config.mk | 6 | ||||
-rw-r--r-- | source4/scripting/ejs/smbcalls_reg.c | 91 | ||||
-rw-r--r-- | source4/scripting/libjs/provision.js | 11 | ||||
-rw-r--r-- | source4/setup/hklm.ldif | 43 | ||||
-rw-r--r-- | source4/setup/provision.reg | 6 |
8 files changed, 116 insertions, 52 deletions
diff --git a/source4/lib/registry/hive.c b/source4/lib/registry/hive.c index b2c826b93d..97ce883e66 100644 --- a/source4/lib/registry/hive.c +++ b/source4/lib/registry/hive.c @@ -39,6 +39,8 @@ _PUBLIC_ WERROR reg_open_hive(TALLOC_CTX *parent_ctx, const char *location, fd = open(location, O_RDWR); if (fd == -1) { + if (errno == ENOENT) + return WERR_NOT_FOUND; return WERR_BADFILE; } diff --git a/source4/lib/registry/patchfile.c b/source4/lib/registry/patchfile.c index 50c8f54397..8df873d56b 100644 --- a/source4/lib/registry/patchfile.c +++ b/source4/lib/registry/patchfile.c @@ -252,7 +252,9 @@ _PUBLIC_ WERROR reg_generate_diff(struct registry_context *ctx1, /** * Load diff file */ -_PUBLIC_ WERROR reg_diff_load(const char *filename, const struct reg_diff_callbacks *callbacks, void *callback_data) +_PUBLIC_ WERROR reg_diff_load(const char *filename, + const struct reg_diff_callbacks *callbacks, + void *callback_data) { int fd; char hdr[4]; diff --git a/source4/lib/registry/samba.c b/source4/lib/registry/samba.c index 244c467a2c..6aaaa118d0 100644 --- a/source4/lib/registry/samba.c +++ b/source4/lib/registry/samba.c @@ -36,7 +36,12 @@ WERROR mount_samba_hive(struct registry_context *ctx, location = talloc_asprintf(ctx, "%s/%s.ldb", lp_private_dir(), name); + error = reg_open_hive(ctx, location, auth_info, creds, &hive); + + if (W_ERROR_EQUAL(error, WERR_NOT_FOUND)) + error = reg_open_ldb_file(ctx, location, auth_info, creds, &hive); + if (!W_ERROR_IS_OK(error)) return error; diff --git a/source4/scripting/ejs/config.mk b/source4/scripting/ejs/config.mk index f1c17ad21d..5d562ee344 100644 --- a/source4/scripting/ejs/config.mk +++ b/source4/scripting/ejs/config.mk @@ -17,6 +17,12 @@ SUBSYSTEM = smbcalls INIT_FUNCTION = smb_setup_ejs_ldb PRIVATE_DEPENDENCIES = LIBLDB SAMDB LIBNDR +[MODULE::smbcalls_reg] +OBJ_FILES = smbcalls_reg.o +SUBSYSTEM = smbcalls +INIT_FUNCTION = smb_setup_ejs_reg +PRIVATE_DEPENDENCIES = registry SAMDB LIBNDR + [MODULE::smbcalls_nbt] OBJ_FILES = smbcalls_nbt.o SUBSYSTEM = smbcalls diff --git a/source4/scripting/ejs/smbcalls_reg.c b/source4/scripting/ejs/smbcalls_reg.c new file mode 100644 index 0000000000..4d84587fa4 --- /dev/null +++ b/source4/scripting/ejs/smbcalls_reg.c @@ -0,0 +1,91 @@ +/* + Unix SMB/CIFS implementation. + + provide hooks into smbd C calls from ejs scripts + + Copyright (C) Jelmer Vernooij 2007 + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see <http://www.gnu.org/licenses/>. +*/ + +#include "includes.h" +#include "scripting/ejs/smbcalls.h" +#include "lib/appweb/ejs/ejs.h" +#include "db_wrap.h" +#include "dsdb/samdb/samdb.h" +#include "librpc/ndr/libndr.h" +#include "lib/registry/registry.h" + +/* + get the connected db + */ +static struct registry_context *ejs_get_reg_context(int eid) +{ + struct registry_context *rctx = mprGetThisPtr(eid, "registry"); + if (rctx == NULL) { + ejsSetErrorMsg(eid, "unable to find registry"); + } + return rctx; +} + +static int ejs_apply_patchfile(MprVarHandle eid, int argc, struct MprVar **argv) +{ + struct registry_context *rctx; + WERROR error; + + /* validate arguments */ + if (argc != 1) { + ejsSetErrorMsg(eid, "reg.apply_patchfile invalid number of arguments"); + return -1; + } + + rctx = ejs_get_reg_context(eid); + if (rctx == NULL) { + return -1; + } + + error = reg_diff_apply(mprToString(argv[0]), rctx); + + mpr_Return(eid, mprWERROR(error)); + + return 0; +} + +/* + initialise registry ejs subsystem +*/ +static int ejs_reg_open(MprVarHandle eid, int argc, struct MprVar **argv) +{ + struct MprVar *reg = mprInitObject(eid, "registry", argc, argv); + struct registry_context *rctx; + WERROR error; + + error = reg_open_samba(mprMemCtx(), &rctx, NULL, NULL); + SMB_ASSERT(W_ERROR_IS_OK(error)); + + mprSetPtrChild(reg, "registry", rctx); + mprSetCFunction(reg, "apply_patchfile", ejs_apply_patchfile); + + return 0; +} + + +/* + setup C functions that be called from ejs +*/ +NTSTATUS smb_setup_ejs_reg(void) +{ + ejsDefineCFunction(-1, "reg_open", ejs_reg_open, NULL, MPR_VAR_SCRIPT_HANDLE); + return NT_STATUS_OK; +} diff --git a/source4/scripting/libjs/provision.js b/source4/scripting/libjs/provision.js index 1054a9a508..6ec29748f6 100644 --- a/source4/scripting/libjs/provision.js +++ b/source4/scripting/libjs/provision.js @@ -376,12 +376,6 @@ function provision_default_paths(subobj) var paths = new Object(); paths.smbconf = lp.get("config file"); paths.shareconf = lp.get("private dir") + "/" + "share.ldb"; - paths.hklm = "hklm.ldb"; - paths.hkcu = "hkcu.ldb"; - paths.hkcr = "hkcr.ldb"; - paths.hku = "hku.ldb"; - paths.hkpd = "hkpd.ldb"; - paths.hkpt = "hkpt.ldb"; paths.samdb = lp.get("sam database"); paths.secrets = lp.get("secrets database"); paths.keytab = "secrets.keytab"; @@ -582,8 +576,9 @@ function provision(subobj, message, blank, paths, session_info, credentials, lda setup_ldb("secrets_init.ldif", info, paths.secrets); setup_ldb("secrets.ldif", info, paths.secrets, false); - message("Setting up hklm.ldb\n"); - setup_ldb("hklm.ldif", info, paths.hklm); + message("Setting up the registry\n"); + var reg = reg_open(); + reg.apply_patchfile(lp.get("setup directory") + "/provision.reg") message("Setting up sam.ldb partitions\n"); /* Also wipes the database */ diff --git a/source4/setup/hklm.ldif b/source4/setup/hklm.ldif deleted file mode 100644 index 419a4c504a..0000000000 --- a/source4/setup/hklm.ldif +++ /dev/null @@ -1,43 +0,0 @@ -dn: @INDEXLIST -@IDXATTR: key - -dn: @ATTRIBUTES -key: CASE_INSENSITIVE -value: CASE_INSENSITIVE - -dn: key=control,key=currentcontrolset,key=system,hive=NONE -key: control - -dn: value=ProductType,key=productoptions,key=control,key=currentcontrolset,key=system,hive=NONE -value: ProductType -data: LanmanNT -type: 1 - -dn: key=productoptions,key=control,key=currentcontrolset,key=system,hive=NONE -key: productoptions - -dn: key=system,hive=NONE -key: system - -dn: key=print,key=control,key=currentcontrolset,key=system,hive=NONE -key: print - -dn: key=currentcontrolset,key=system,hive=NONE -key: currentcontrolset - -dn: key=Terminal Server,key=control,key=currentcontrolset,key=system,hive=NONE -key: Terminal Server - -dn: key=Services,key=CurrentControlSet,key=System,hive=NONE -key: Services - -dn: key=Netlogon,key=Services,key=CurrentControlSet,key=System,hive=NONE -key: Netlogon - -dn: key=Parameters,key=Netlogon,key=Services,key=CurrentControlSet,key=System,hive=NONE -key: Parameters - -dn: value=RefusePasswordChange,key=Parameters,key=Netlogon,key=Services,key=CurrentControlSet,key=System,hive=NONE -value: RefusePasswordChange -type: 4 -data: 0 diff --git a/source4/setup/provision.reg b/source4/setup/provision.reg index 337d1fccd2..867f3e204c 100644 --- a/source4/setup/provision.reg +++ b/source4/setup/provision.reg @@ -2,6 +2,12 @@ REGEDIT4 [HKEY_LOCAL_MACHINE] +[HKEY_LOCAL_MACHINE\System] + +[HKEY_LOCAL_MACHINE\System\CurrentControlSet] + +[HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control] + [HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\ProductOptions] ProductType="LanmanNT" |