Esempio n. 1
0
/**
 * Check whether a given parameter name is valid in the
 * smbconf registry backend.
 */
bool smbconf_reg_parameter_is_valid(const char *param_name)
{
	/* hard code the list of forbidden names here for now */
	const char *forbidden_names[] = {
		"state directory",
		"lock directory",
		"lock dir",
		"config backend",
		"include",
		/*
		 * "includes" has a special meaning internally.
		 * It is currently not necessary to list it here since it is
		 * not a valid parameter. But for clarity and safety, we keep
		 * it for now.
		 */
		INCLUDES_VALNAME,
		NULL
	};
	const char **forbidden = NULL;

	if (!lp_parameter_is_valid(param_name)) {
		return false;
	}

	for (forbidden = forbidden_names; *forbidden != NULL; forbidden++) {
		if (strwicmp(param_name, *forbidden) == 0) {
			return false;
		}
	}

	return true;
}
static bool smbconf_reg_valname_valid(const char *valname)
{
	return (!smbconf_reg_valname_forbidden(valname) &&
		lp_parameter_is_valid(valname));
}
Esempio n. 3
0
/**
 * add a value to a key.
 */
static sbcErr smbconf_reg_set_value(struct registry_key *key,
				    const char *valname,
				    const char *valstr)
{
	struct registry_value val;
	WERROR werr = WERR_OK;
	sbcErr err;
	char *subkeyname;
	const char *canon_valname;
	const char *canon_valstr;

	if (!lp_parameter_is_valid(valname)) {
		DEBUG(5, ("Invalid parameter '%s' given.\n", valname));
		err = SBC_ERR_INVALID_PARAM;
		goto done;
	}

	if (!smbconf_reg_parameter_is_valid(valname)) {
		DEBUG(5, ("Parameter '%s' not allowed in registry.\n",
			  valname));
		err = SBC_ERR_INVALID_PARAM;
		goto done;
	}

	subkeyname = strrchr_m(key->key->name, '\\');
	if ((subkeyname == NULL) || (*(subkeyname +1) == '\0')) {
		DEBUG(5, ("Invalid registry key '%s' given as "
			  "smbconf section.\n", key->key->name));
		err = SBC_ERR_INVALID_PARAM;
		goto done;
	}
	subkeyname++;
	if (!strequal(subkeyname, GLOBAL_NAME) &&
	    lp_parameter_is_global(valname))
	{
		DEBUG(5, ("Global parameter '%s' not allowed in "
			  "service definition ('%s').\n", valname,
			  subkeyname));
		err = SBC_ERR_INVALID_PARAM;
		goto done;
	}

	if (!lp_canonicalize_parameter_with_value(valname, valstr,
						  &canon_valname,
						  &canon_valstr))
	{
		/*
		 * We already know the parameter name is valid.
		 * So the value must be invalid.
		 */
		DEBUG(5, ("invalid value '%s' given for parameter '%s'\n",
			  valstr, valname));
		err = SBC_ERR_INVALID_PARAM;
		goto done;
	}

	ZERO_STRUCT(val);

	val.type = REG_SZ;
	if (!push_reg_sz(talloc_tos(), &val.data, canon_valstr)) {
		err = SBC_ERR_NOMEM;
		goto done;
	}

	werr = reg_setvalue(key, canon_valname, &val);
	if (!W_ERROR_IS_OK(werr)) {
		DEBUG(5, ("Error adding value '%s' to "
			  "key '%s': %s\n",
			  canon_valname, key->key->name, win_errstr(werr)));
		err = SBC_ERR_NOMEM;
		goto done;
	}

	err = SBC_ERR_OK;
done:
	return err;
}