mirror of
https://github.com/samba-team/samba.git
synced 2025-01-03 01:18:10 +03:00
r18983: Add some comments for the LDAP based GPO routines.
Guenther
(This used to be commit 2c21ee684c
)
This commit is contained in:
parent
73f4ac012a
commit
031506eb51
@ -20,11 +20,11 @@
|
|||||||
|
|
||||||
|
|
||||||
enum GPO_LINK_TYPE {
|
enum GPO_LINK_TYPE {
|
||||||
GP_LINK_UNKOWN,
|
GP_LINK_UNKOWN = 0,
|
||||||
GP_LINK_MACHINE,
|
GP_LINK_MACHINE = 1,
|
||||||
GP_LINK_SITE,
|
GP_LINK_SITE = 2,
|
||||||
GP_LINK_DOMAIN,
|
GP_LINK_DOMAIN = 3,
|
||||||
GP_LINK_OU
|
GP_LINK_OU = 4
|
||||||
};
|
};
|
||||||
|
|
||||||
/* GPO_OPTIONS */
|
/* GPO_OPTIONS */
|
||||||
@ -41,8 +41,6 @@ enum GPO_LINK_TYPE {
|
|||||||
struct GROUP_POLICY_OBJECT {
|
struct GROUP_POLICY_OBJECT {
|
||||||
uint32 options; /* GPFLAGS_* */
|
uint32 options; /* GPFLAGS_* */
|
||||||
uint32 version;
|
uint32 version;
|
||||||
uint16 version_user;
|
|
||||||
uint16 version_machine;
|
|
||||||
const char *ds_path;
|
const char *ds_path;
|
||||||
const char *file_sys_path;
|
const char *file_sys_path;
|
||||||
const char *display_name;
|
const char *display_name;
|
||||||
@ -65,8 +63,8 @@ struct GROUP_POLICY_OBJECT {
|
|||||||
|
|
||||||
/* 'gPOptions', maybe a bitmask as well */
|
/* 'gPOptions', maybe a bitmask as well */
|
||||||
enum GPO_INHERIT {
|
enum GPO_INHERIT {
|
||||||
GPOPTIONS_INHERIT,
|
GPOPTIONS_INHERIT = 0,
|
||||||
GPOPTIONS_BLOCK_INHERITANCE
|
GPOPTIONS_BLOCK_INHERITANCE = 1
|
||||||
};
|
};
|
||||||
|
|
||||||
/* 'flags' in a 'groupPolicyContainer' object */
|
/* 'flags' in a 'groupPolicyContainer' object */
|
||||||
|
@ -22,6 +22,10 @@
|
|||||||
|
|
||||||
#ifdef HAVE_LDAP
|
#ifdef HAVE_LDAP
|
||||||
|
|
||||||
|
/****************************************************************
|
||||||
|
parse the raw extension string into a GP_EXT structure
|
||||||
|
****************************************************************/
|
||||||
|
|
||||||
ADS_STATUS ads_parse_gp_ext(TALLOC_CTX *mem_ctx,
|
ADS_STATUS ads_parse_gp_ext(TALLOC_CTX *mem_ctx,
|
||||||
const char *extension_raw,
|
const char *extension_raw,
|
||||||
struct GP_EXT *gp_ext)
|
struct GP_EXT *gp_ext)
|
||||||
@ -131,6 +135,10 @@ parse_error:
|
|||||||
return ADS_ERROR(LDAP_NO_MEMORY);
|
return ADS_ERROR(LDAP_NO_MEMORY);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/****************************************************************
|
||||||
|
parse the raw link string into a GP_LINK structure
|
||||||
|
****************************************************************/
|
||||||
|
|
||||||
ADS_STATUS ads_parse_gplink(TALLOC_CTX *mem_ctx,
|
ADS_STATUS ads_parse_gplink(TALLOC_CTX *mem_ctx,
|
||||||
const char *gp_link_raw,
|
const char *gp_link_raw,
|
||||||
uint32 options,
|
uint32 options,
|
||||||
@ -206,6 +214,10 @@ parse_error:
|
|||||||
return ADS_ERROR(LDAP_NO_MEMORY);
|
return ADS_ERROR(LDAP_NO_MEMORY);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/****************************************************************
|
||||||
|
helper call to get a GP_LINK structure from a linkdn
|
||||||
|
****************************************************************/
|
||||||
|
|
||||||
ADS_STATUS ads_get_gpo_link(ADS_STRUCT *ads,
|
ADS_STATUS ads_get_gpo_link(ADS_STRUCT *ads,
|
||||||
TALLOC_CTX *mem_ctx,
|
TALLOC_CTX *mem_ctx,
|
||||||
const char *link_dn,
|
const char *link_dn,
|
||||||
@ -238,6 +250,7 @@ ADS_STATUS ads_get_gpo_link(ADS_STRUCT *ads,
|
|||||||
return ADS_ERROR(LDAP_NO_SUCH_ATTRIBUTE);
|
return ADS_ERROR(LDAP_NO_SUCH_ATTRIBUTE);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* perfectly leggal to have no options */
|
||||||
if (!ads_pull_uint32(ads, res, "gPOptions", &gp_options)) {
|
if (!ads_pull_uint32(ads, res, "gPOptions", &gp_options)) {
|
||||||
DEBUG(10,("ads_get_gpo_link: no 'gPOptions' attribute found\n"));
|
DEBUG(10,("ads_get_gpo_link: no 'gPOptions' attribute found\n"));
|
||||||
gp_options = 0;
|
gp_options = 0;
|
||||||
@ -248,6 +261,10 @@ ADS_STATUS ads_get_gpo_link(ADS_STRUCT *ads,
|
|||||||
return ads_parse_gplink(mem_ctx, gp_link, gp_options, gp_link_struct);
|
return ads_parse_gplink(mem_ctx, gp_link, gp_options, gp_link_struct);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/****************************************************************
|
||||||
|
helper call to add a gp link
|
||||||
|
****************************************************************/
|
||||||
|
|
||||||
ADS_STATUS ads_add_gpo_link(ADS_STRUCT *ads,
|
ADS_STATUS ads_add_gpo_link(ADS_STRUCT *ads,
|
||||||
TALLOC_CTX *mem_ctx,
|
TALLOC_CTX *mem_ctx,
|
||||||
const char *link_dn,
|
const char *link_dn,
|
||||||
@ -260,7 +277,6 @@ ADS_STATUS ads_add_gpo_link(ADS_STRUCT *ads,
|
|||||||
const char *gp_link, *gp_link_new;
|
const char *gp_link, *gp_link_new;
|
||||||
ADS_MODLIST mods;
|
ADS_MODLIST mods;
|
||||||
|
|
||||||
|
|
||||||
/* although ADS allows to set anything here, we better check here if
|
/* although ADS allows to set anything here, we better check here if
|
||||||
* the gpo_dn is sane */
|
* the gpo_dn is sane */
|
||||||
|
|
||||||
@ -288,14 +304,10 @@ ADS_STATUS ads_add_gpo_link(ADS_STRUCT *ads,
|
|||||||
}
|
}
|
||||||
|
|
||||||
ads_msgfree(ads, res);
|
ads_msgfree(ads, res);
|
||||||
if (gp_link_new == NULL) {
|
ADS_ERROR_HAVE_NO_MEMORY(gp_link_new);
|
||||||
return ADS_ERROR(LDAP_NO_MEMORY);
|
|
||||||
}
|
|
||||||
|
|
||||||
mods = ads_init_mods(mem_ctx);
|
mods = ads_init_mods(mem_ctx);
|
||||||
if (mods == NULL) {
|
ADS_ERROR_HAVE_NO_MEMORY(mods);
|
||||||
return ADS_ERROR(LDAP_NO_MEMORY);
|
|
||||||
}
|
|
||||||
|
|
||||||
status = ads_mod_str(mem_ctx, &mods, "gPLink", gp_link_new);
|
status = ads_mod_str(mem_ctx, &mods, "gPLink", gp_link_new);
|
||||||
if (!ADS_ERR_OK(status)) {
|
if (!ADS_ERR_OK(status)) {
|
||||||
@ -305,6 +317,10 @@ ADS_STATUS ads_add_gpo_link(ADS_STRUCT *ads,
|
|||||||
return ads_gen_mod(ads, link_dn, mods);
|
return ads_gen_mod(ads, link_dn, mods);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/****************************************************************
|
||||||
|
helper call to delete add a gp link
|
||||||
|
****************************************************************/
|
||||||
|
|
||||||
/* untested & broken */
|
/* untested & broken */
|
||||||
ADS_STATUS ads_delete_gpo_link(ADS_STRUCT *ads,
|
ADS_STATUS ads_delete_gpo_link(ADS_STRUCT *ads,
|
||||||
TALLOC_CTX *mem_ctx,
|
TALLOC_CTX *mem_ctx,
|
||||||
@ -349,14 +365,10 @@ ADS_STATUS ads_delete_gpo_link(ADS_STRUCT *ads,
|
|||||||
/* gp_link_new = talloc_asprintf(mem_ctx, "%s[%s;%d]", gp_link, gpo_dn, gpo_opt); */
|
/* gp_link_new = talloc_asprintf(mem_ctx, "%s[%s;%d]", gp_link, gpo_dn, gpo_opt); */
|
||||||
|
|
||||||
ads_msgfree(ads, res);
|
ads_msgfree(ads, res);
|
||||||
if (gp_link_new == NULL) {
|
ADS_ERROR_HAVE_NO_MEMORY(gp_link_new);
|
||||||
return ADS_ERROR(LDAP_NO_MEMORY);
|
|
||||||
}
|
|
||||||
|
|
||||||
mods = ads_init_mods(mem_ctx);
|
mods = ads_init_mods(mem_ctx);
|
||||||
if (mods == NULL) {
|
ADS_ERROR_HAVE_NO_MEMORY(mods);
|
||||||
return ADS_ERROR(LDAP_NO_MEMORY);
|
|
||||||
}
|
|
||||||
|
|
||||||
status = ads_mod_str(mem_ctx, &mods, "gPLink", gp_link_new);
|
status = ads_mod_str(mem_ctx, &mods, "gPLink", gp_link_new);
|
||||||
if (!ADS_ERR_OK(status)) {
|
if (!ADS_ERR_OK(status)) {
|
||||||
@ -366,6 +378,10 @@ ADS_STATUS ads_delete_gpo_link(ADS_STRUCT *ads,
|
|||||||
return ads_gen_mod(ads, link_dn, mods);
|
return ads_gen_mod(ads, link_dn, mods);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/****************************************************************
|
||||||
|
parse a GROUP_POLICY_OBJECT structure from an LDAPMessage result
|
||||||
|
****************************************************************/
|
||||||
|
|
||||||
ADS_STATUS ads_parse_gpo(ADS_STRUCT *ads,
|
ADS_STATUS ads_parse_gpo(ADS_STRUCT *ads,
|
||||||
TALLOC_CTX *mem_ctx,
|
TALLOC_CTX *mem_ctx,
|
||||||
LDAPMessage *res,
|
LDAPMessage *res,
|
||||||
@ -374,46 +390,33 @@ ADS_STATUS ads_delete_gpo_link(ADS_STRUCT *ads,
|
|||||||
{
|
{
|
||||||
ZERO_STRUCTP(gpo);
|
ZERO_STRUCTP(gpo);
|
||||||
|
|
||||||
if (res == NULL) {
|
ADS_ERROR_HAVE_NO_MEMORY(res);
|
||||||
return ADS_ERROR(LDAP_NO_MEMORY);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (gpo_dn) {
|
if (gpo_dn) {
|
||||||
gpo->ds_path = talloc_strdup(mem_ctx, gpo_dn);
|
gpo->ds_path = talloc_strdup(mem_ctx, gpo_dn);
|
||||||
} else {
|
} else {
|
||||||
gpo->ds_path = ads_get_dn(ads, res);
|
gpo->ds_path = ads_get_dn(ads, res);
|
||||||
}
|
}
|
||||||
if (gpo->ds_path == NULL) {
|
|
||||||
return ADS_ERROR(LDAP_NO_MEMORY);
|
ADS_ERROR_HAVE_NO_MEMORY(gpo->ds_path);
|
||||||
}
|
|
||||||
|
|
||||||
if (!ads_pull_uint32(ads, res, "versionNumber", &gpo->version)) {
|
if (!ads_pull_uint32(ads, res, "versionNumber", &gpo->version)) {
|
||||||
return ADS_ERROR(LDAP_NO_MEMORY);
|
return ADS_ERROR(LDAP_NO_MEMORY);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* split here for convenience */
|
|
||||||
gpo->version_user = GPO_VERSION_USER(gpo->version);
|
|
||||||
gpo->version_machine = GPO_VERSION_MACHINE(gpo->version);
|
|
||||||
|
|
||||||
/* sure ??? */
|
/* sure ??? */
|
||||||
if (!ads_pull_uint32(ads, res, "flags", &gpo->options)) {
|
if (!ads_pull_uint32(ads, res, "flags", &gpo->options)) {
|
||||||
return ADS_ERROR(LDAP_NO_MEMORY);
|
return ADS_ERROR(LDAP_NO_MEMORY);
|
||||||
}
|
}
|
||||||
|
|
||||||
gpo->file_sys_path = ads_pull_string(ads, mem_ctx, res, "gPCFileSysPath");
|
gpo->file_sys_path = ads_pull_string(ads, mem_ctx, res, "gPCFileSysPath");
|
||||||
if (gpo->file_sys_path == NULL) {
|
ADS_ERROR_HAVE_NO_MEMORY(gpo->file_sys_path);
|
||||||
return ADS_ERROR(LDAP_NO_MEMORY);
|
|
||||||
}
|
|
||||||
|
|
||||||
gpo->display_name = ads_pull_string(ads, mem_ctx, res, "displayName");
|
gpo->display_name = ads_pull_string(ads, mem_ctx, res, "displayName");
|
||||||
if (gpo->display_name == NULL) {
|
ADS_ERROR_HAVE_NO_MEMORY(gpo->display_name);
|
||||||
return ADS_ERROR(LDAP_NO_MEMORY);
|
|
||||||
}
|
|
||||||
|
|
||||||
gpo->name = ads_pull_string(ads, mem_ctx, res, "name");
|
gpo->name = ads_pull_string(ads, mem_ctx, res, "name");
|
||||||
if (gpo->name == NULL) {
|
ADS_ERROR_HAVE_NO_MEMORY(gpo->name);
|
||||||
return ADS_ERROR(LDAP_NO_MEMORY);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* ???, this is optional to have and what does it depend on, the 'flags' ?) */
|
/* ???, this is optional to have and what does it depend on, the 'flags' ?) */
|
||||||
gpo->machine_extensions = ads_pull_string(ads, mem_ctx, res, "gPCMachineExtensionNames");
|
gpo->machine_extensions = ads_pull_string(ads, mem_ctx, res, "gPCMachineExtensionNames");
|
||||||
@ -422,6 +425,10 @@ ADS_STATUS ads_delete_gpo_link(ADS_STRUCT *ads,
|
|||||||
return ADS_ERROR(LDAP_SUCCESS);
|
return ADS_ERROR(LDAP_SUCCESS);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/****************************************************************
|
||||||
|
get a GROUP_POLICY_OBJECT structure based on different input paramters
|
||||||
|
****************************************************************/
|
||||||
|
|
||||||
ADS_STATUS ads_get_gpo(ADS_STRUCT *ads,
|
ADS_STATUS ads_get_gpo(ADS_STRUCT *ads,
|
||||||
TALLOC_CTX *mem_ctx,
|
TALLOC_CTX *mem_ctx,
|
||||||
const char *gpo_dn,
|
const char *gpo_dn,
|
||||||
@ -458,9 +465,7 @@ ADS_STATUS ads_get_gpo(ADS_STRUCT *ads,
|
|||||||
"(&(objectclass=groupPolicyContainer)(%s=%s))",
|
"(&(objectclass=groupPolicyContainer)(%s=%s))",
|
||||||
display_name ? "displayName" : "name",
|
display_name ? "displayName" : "name",
|
||||||
display_name ? display_name : guid_name);
|
display_name ? display_name : guid_name);
|
||||||
if (filter == NULL) {
|
ADS_ERROR_HAVE_NO_MEMORY(filter);
|
||||||
return ADS_ERROR(LDAP_NO_MEMORY);
|
|
||||||
}
|
|
||||||
|
|
||||||
status = ads_do_search_all(ads, ads->config.bind_path,
|
status = ads_do_search_all(ads, ads->config.bind_path,
|
||||||
LDAP_SCOPE_SUBTREE, filter,
|
LDAP_SCOPE_SUBTREE, filter,
|
||||||
@ -491,6 +496,10 @@ ADS_STATUS ads_get_gpo(ADS_STRUCT *ads,
|
|||||||
return status;
|
return status;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/****************************************************************
|
||||||
|
add a gplink to the GROUP_POLICY_OBJECT linked list
|
||||||
|
****************************************************************/
|
||||||
|
|
||||||
ADS_STATUS add_gplink_to_gpo_list(ADS_STRUCT *ads,
|
ADS_STATUS add_gplink_to_gpo_list(ADS_STRUCT *ads,
|
||||||
TALLOC_CTX *mem_ctx,
|
TALLOC_CTX *mem_ctx,
|
||||||
struct GROUP_POLICY_OBJECT **gpo_list,
|
struct GROUP_POLICY_OBJECT **gpo_list,
|
||||||
@ -522,9 +531,7 @@ ADS_STATUS add_gplink_to_gpo_list(ADS_STRUCT *ads,
|
|||||||
}
|
}
|
||||||
|
|
||||||
new_gpo = TALLOC_P(mem_ctx, struct GROUP_POLICY_OBJECT);
|
new_gpo = TALLOC_P(mem_ctx, struct GROUP_POLICY_OBJECT);
|
||||||
if (new_gpo == NULL) {
|
ADS_ERROR_HAVE_NO_MEMORY(new_gpo);
|
||||||
return ADS_ERROR(LDAP_NO_MEMORY);
|
|
||||||
}
|
|
||||||
|
|
||||||
ZERO_STRUCTP(new_gpo);
|
ZERO_STRUCTP(new_gpo);
|
||||||
|
|
||||||
@ -545,6 +552,10 @@ ADS_STATUS add_gplink_to_gpo_list(ADS_STRUCT *ads,
|
|||||||
return ADS_ERROR(LDAP_SUCCESS);
|
return ADS_ERROR(LDAP_SUCCESS);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/****************************************************************
|
||||||
|
get the full list of GROUP_POLICY_OBJECTs for a given dn
|
||||||
|
****************************************************************/
|
||||||
|
|
||||||
ADS_STATUS ads_get_gpo_list(ADS_STRUCT *ads,
|
ADS_STATUS ads_get_gpo_list(ADS_STRUCT *ads,
|
||||||
TALLOC_CTX *mem_ctx,
|
TALLOC_CTX *mem_ctx,
|
||||||
const char *dn,
|
const char *dn,
|
||||||
|
@ -202,8 +202,10 @@ void dump_gpo(TALLOC_CTX *mem_ctx, struct GROUP_POLICY_OBJECT *gpo)
|
|||||||
DEBUGADD(lvl,("name:\t\t\t%s\n", gpo->name));
|
DEBUGADD(lvl,("name:\t\t\t%s\n", gpo->name));
|
||||||
DEBUGADD(lvl,("displayname:\t\t%s\n", gpo->display_name));
|
DEBUGADD(lvl,("displayname:\t\t%s\n", gpo->display_name));
|
||||||
DEBUGADD(lvl,("version:\t\t%d (0x%08x)\n", gpo->version, gpo->version));
|
DEBUGADD(lvl,("version:\t\t%d (0x%08x)\n", gpo->version, gpo->version));
|
||||||
DEBUGADD(lvl,("version_user:\t\t%d (0x%04x)\n", gpo->version_user, gpo->version_user));
|
DEBUGADD(lvl,("version_user:\t\t%d (0x%04x)\n", GPO_VERSION_USER(gpo->version),
|
||||||
DEBUGADD(lvl,("version_machine:\t%d (0x%04x)\n", gpo->version_machine, gpo->version_machine));
|
GPO_VERSION_USER(gpo->version)));
|
||||||
|
DEBUGADD(lvl,("version_machine:\t%d (0x%04x)\n", GPO_VERSION_MACHINE(gpo->version),
|
||||||
|
GPO_VERSION_MACHINE(gpo->version)));
|
||||||
DEBUGADD(lvl,("filesyspath:\t\t%s\n", gpo->file_sys_path));
|
DEBUGADD(lvl,("filesyspath:\t\t%s\n", gpo->file_sys_path));
|
||||||
DEBUGADD(lvl,("dspath:\t\t%s\n", gpo->ds_path));
|
DEBUGADD(lvl,("dspath:\t\t%s\n", gpo->ds_path));
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user