mirror of
https://github.com/samba-team/samba.git
synced 2025-01-14 19:24:43 +03:00
Add find_alias, create_alias, delete_alias, get_aliasinfo, set_aliasinfo and
enum_aliases to passdb. create and delete are not yet filled, you have to do this with net groupmap and net idmap restore. Volker (This used to be commit f44bf63d1143ddf6a1a2fdc15a301e0dc0840d50)
This commit is contained in:
parent
309c0a65b7
commit
146d674c2c
@ -1270,6 +1270,115 @@ NTSTATUS pdb_default_delete_group_mapping_entry(struct pdb_methods *methods,
|
||||
NT_STATUS_OK : NT_STATUS_UNSUCCESSFUL;
|
||||
}
|
||||
|
||||
NTSTATUS pdb_default_find_alias(struct pdb_methods *methods,
|
||||
const char *name, DOM_SID *sid)
|
||||
{
|
||||
GROUP_MAP map;
|
||||
|
||||
if (!get_group_map_from_ntname(name, &map))
|
||||
return NT_STATUS_NO_SUCH_ALIAS;
|
||||
|
||||
if ((map.sid_name_use != SID_NAME_WKN_GRP) &&
|
||||
(map.sid_name_use != SID_NAME_ALIAS))
|
||||
return NT_STATUS_OBJECT_TYPE_MISMATCH;
|
||||
|
||||
sid_copy(sid, &map.sid);
|
||||
return NT_STATUS_OK;
|
||||
}
|
||||
|
||||
NTSTATUS pdb_default_create_alias(struct pdb_methods *methods,
|
||||
const char *name, uint32 *rid)
|
||||
{
|
||||
return NT_STATUS_ACCESS_DENIED;
|
||||
}
|
||||
|
||||
NTSTATUS pdb_default_delete_alias(struct pdb_methods *methods,
|
||||
const DOM_SID *sid)
|
||||
{
|
||||
return NT_STATUS_ACCESS_DENIED;
|
||||
}
|
||||
|
||||
NTSTATUS pdb_default_enum_aliases(struct pdb_methods *methods,
|
||||
const DOM_SID *sid,
|
||||
uint32 start_idx, uint32 max_entries,
|
||||
uint32 *num_aliases,
|
||||
struct acct_info **info)
|
||||
{
|
||||
extern DOM_SID global_sid_Builtin;
|
||||
|
||||
GROUP_MAP *map;
|
||||
int i, num_maps;
|
||||
enum SID_NAME_USE type = SID_NAME_UNKNOWN;
|
||||
|
||||
if (sid_compare(sid, get_global_sam_sid()) == 0)
|
||||
type = SID_NAME_ALIAS;
|
||||
|
||||
if (sid_compare(sid, &global_sid_Builtin) == 0)
|
||||
type = SID_NAME_WKN_GRP;
|
||||
|
||||
if (!enum_group_mapping(type, &map, &num_maps, False) ||
|
||||
(num_maps == 0)) {
|
||||
*num_aliases = 0;
|
||||
*info = NULL;
|
||||
goto done;
|
||||
}
|
||||
|
||||
if (start_idx > num_maps) {
|
||||
*num_aliases = 0;
|
||||
*info = NULL;
|
||||
goto done;
|
||||
}
|
||||
|
||||
*num_aliases = num_maps - start_idx;
|
||||
|
||||
if (*num_aliases > max_entries)
|
||||
*num_aliases = max_entries;
|
||||
|
||||
*info = malloc(sizeof(struct acct_info) * (*num_aliases));
|
||||
|
||||
for (i=0; i<*num_aliases; i++) {
|
||||
fstrcpy((*info)[i].acct_name, map[i+start_idx].nt_name);
|
||||
fstrcpy((*info)[i].acct_desc, map[i+start_idx].comment);
|
||||
sid_peek_rid(&map[i].sid, &(*info)[i+start_idx].rid);
|
||||
}
|
||||
|
||||
done:
|
||||
SAFE_FREE(map);
|
||||
return NT_STATUS_OK;
|
||||
}
|
||||
|
||||
NTSTATUS pdb_default_get_aliasinfo(struct pdb_methods *methods,
|
||||
const DOM_SID *sid,
|
||||
struct acct_info *info)
|
||||
{
|
||||
GROUP_MAP map;
|
||||
|
||||
if (!get_group_map_from_sid(*sid, &map))
|
||||
return NT_STATUS_NO_SUCH_ALIAS;
|
||||
|
||||
fstrcpy(info->acct_name, map.nt_name);
|
||||
fstrcpy(info->acct_desc, map.comment);
|
||||
sid_peek_rid(&map.sid, &info->rid);
|
||||
return NT_STATUS_OK;
|
||||
}
|
||||
|
||||
NTSTATUS pdb_default_set_aliasinfo(struct pdb_methods *methods,
|
||||
const DOM_SID *sid,
|
||||
struct acct_info *info)
|
||||
{
|
||||
GROUP_MAP map;
|
||||
|
||||
if (!get_group_map_from_sid(*sid, &map))
|
||||
return NT_STATUS_NO_SUCH_ALIAS;
|
||||
|
||||
fstrcpy(map.comment, info->acct_desc);
|
||||
|
||||
if (!add_mapping_entry(&map, TDB_REPLACE))
|
||||
return NT_STATUS_ACCESS_DENIED;
|
||||
|
||||
return NT_STATUS_OK;
|
||||
}
|
||||
|
||||
NTSTATUS pdb_default_enum_group_mapping(struct pdb_methods *methods,
|
||||
enum SID_NAME_USE sid_name_use,
|
||||
GROUP_MAP **rmap, int *num_entries,
|
||||
|
@ -382,13 +382,6 @@ typedef struct
|
||||
|
||||
} rid_name;
|
||||
|
||||
struct acct_info
|
||||
{
|
||||
fstring acct_name; /* account name */
|
||||
fstring acct_desc; /* account name */
|
||||
uint32 rid; /* domain-relative RID */
|
||||
};
|
||||
|
||||
/*
|
||||
* higher order functions for use with msrpc client code
|
||||
*/
|
||||
|
@ -232,6 +232,12 @@ typedef struct _GROUP_INFO {
|
||||
fstring comment;
|
||||
} GROUP_INFO;
|
||||
|
||||
struct acct_info
|
||||
{
|
||||
fstring acct_name; /* account name */
|
||||
fstring acct_desc; /* account name */
|
||||
uint32 rid; /* domain-relative RID */
|
||||
};
|
||||
|
||||
typedef struct sam_trust_passwd {
|
||||
TALLOC_CTX *mem_ctx;
|
||||
@ -262,7 +268,7 @@ typedef struct sam_trust_passwd {
|
||||
* this SAMBA will load. Increment this if *ANY* changes are made to the interface.
|
||||
*/
|
||||
|
||||
#define PASSDB_INTERFACE_VERSION 6
|
||||
#define PASSDB_INTERFACE_VERSION 7
|
||||
|
||||
typedef struct pdb_context
|
||||
{
|
||||
@ -310,6 +316,29 @@ typedef struct pdb_context
|
||||
GROUP_MAP **rmap, int *num_entries,
|
||||
BOOL unix_only);
|
||||
|
||||
NTSTATUS (*pdb_find_alias)(struct pdb_context *context,
|
||||
const char *name, DOM_SID *sid);
|
||||
|
||||
NTSTATUS (*pdb_create_alias)(struct pdb_context *context,
|
||||
const char *name, uint32 *rid);
|
||||
|
||||
NTSTATUS (*pdb_delete_alias)(struct pdb_context *context,
|
||||
const DOM_SID *sid);
|
||||
|
||||
NTSTATUS (*pdb_enum_aliases)(struct pdb_context *context,
|
||||
const DOM_SID *domain_sid,
|
||||
uint32 start_idx, uint32 num_entries,
|
||||
uint32 *num_aliases,
|
||||
struct acct_info **aliases);
|
||||
|
||||
NTSTATUS (*pdb_get_aliasinfo)(struct pdb_context *context,
|
||||
const DOM_SID *sid,
|
||||
struct acct_info *info);
|
||||
|
||||
NTSTATUS (*pdb_set_aliasinfo)(struct pdb_context *context,
|
||||
const DOM_SID *sid,
|
||||
struct acct_info *info);
|
||||
|
||||
NTSTATUS (*pdb_add_aliasmem)(struct pdb_context *context,
|
||||
const DOM_SID *alias,
|
||||
const DOM_SID *member);
|
||||
@ -430,6 +459,28 @@ typedef struct pdb_methods
|
||||
GROUP_MAP **rmap, int *num_entries,
|
||||
BOOL unix_only);
|
||||
|
||||
NTSTATUS (*find_alias)(struct pdb_methods *methods,
|
||||
const char *name, DOM_SID *sid);
|
||||
|
||||
NTSTATUS (*create_alias)(struct pdb_methods *methods,
|
||||
const char *name, uint32 *rid);
|
||||
|
||||
NTSTATUS (*delete_alias)(struct pdb_methods *methods,
|
||||
const DOM_SID *sid);
|
||||
|
||||
NTSTATUS (*enum_aliases)(struct pdb_methods *methods,
|
||||
const DOM_SID *domain_sid,
|
||||
uint32 start_idx, uint32 max_entries,
|
||||
uint32 *num_aliases, struct acct_info **info);
|
||||
|
||||
NTSTATUS (*get_aliasinfo)(struct pdb_methods *methods,
|
||||
const DOM_SID *sid,
|
||||
struct acct_info *info);
|
||||
|
||||
NTSTATUS (*set_aliasinfo)(struct pdb_methods *methods,
|
||||
const DOM_SID *sid,
|
||||
struct acct_info *info);
|
||||
|
||||
NTSTATUS (*add_aliasmem)(struct pdb_methods *methods,
|
||||
const DOM_SID *alias, const DOM_SID *member);
|
||||
NTSTATUS (*del_aliasmem)(struct pdb_methods *methods,
|
||||
|
@ -426,6 +426,95 @@ static NTSTATUS context_enum_group_mapping(struct pdb_context *context,
|
||||
num_entries, unix_only);
|
||||
}
|
||||
|
||||
static NTSTATUS context_find_alias(struct pdb_context *context,
|
||||
const char *name, DOM_SID *sid)
|
||||
{
|
||||
NTSTATUS ret = NT_STATUS_UNSUCCESSFUL;
|
||||
|
||||
if ((!context) || (!context->pdb_methods)) {
|
||||
DEBUG(0, ("invalid pdb_context specified!\n"));
|
||||
return ret;
|
||||
}
|
||||
|
||||
return context->pdb_methods->find_alias(context->pdb_methods,
|
||||
name, sid);
|
||||
}
|
||||
|
||||
static NTSTATUS context_create_alias(struct pdb_context *context,
|
||||
const char *name, uint32 *rid)
|
||||
{
|
||||
NTSTATUS ret = NT_STATUS_UNSUCCESSFUL;
|
||||
|
||||
if ((!context) || (!context->pdb_methods)) {
|
||||
DEBUG(0, ("invalid pdb_context specified!\n"));
|
||||
return ret;
|
||||
}
|
||||
|
||||
return context->pdb_methods->create_alias(context->pdb_methods,
|
||||
name, rid);
|
||||
}
|
||||
|
||||
static NTSTATUS context_delete_alias(struct pdb_context *context,
|
||||
const DOM_SID *sid)
|
||||
{
|
||||
NTSTATUS ret = NT_STATUS_UNSUCCESSFUL;
|
||||
|
||||
if ((!context) || (!context->pdb_methods)) {
|
||||
DEBUG(0, ("invalid pdb_context specified!\n"));
|
||||
return ret;
|
||||
}
|
||||
|
||||
return context->pdb_methods->delete_alias(context->pdb_methods, sid);
|
||||
}
|
||||
|
||||
static NTSTATUS context_enum_aliases(struct pdb_context *context,
|
||||
const DOM_SID *sid,
|
||||
uint32 start_idx, uint32 max_entries,
|
||||
uint32 *num_aliases,
|
||||
struct acct_info **info)
|
||||
{
|
||||
NTSTATUS ret = NT_STATUS_UNSUCCESSFUL;
|
||||
|
||||
if ((!context) || (!context->pdb_methods)) {
|
||||
DEBUG(0, ("invalid pdb_context specified!\n"));
|
||||
return ret;
|
||||
}
|
||||
|
||||
return context->pdb_methods->enum_aliases(context->pdb_methods,
|
||||
sid, start_idx, max_entries,
|
||||
num_aliases, info);
|
||||
}
|
||||
|
||||
static NTSTATUS context_get_aliasinfo(struct pdb_context *context,
|
||||
const DOM_SID *sid,
|
||||
struct acct_info *info)
|
||||
{
|
||||
NTSTATUS ret = NT_STATUS_UNSUCCESSFUL;
|
||||
|
||||
if ((!context) || (!context->pdb_methods)) {
|
||||
DEBUG(0, ("invalid pdb_context specified!\n"));
|
||||
return ret;
|
||||
}
|
||||
|
||||
return context->pdb_methods->get_aliasinfo(context->pdb_methods,
|
||||
sid, info);
|
||||
}
|
||||
|
||||
static NTSTATUS context_set_aliasinfo(struct pdb_context *context,
|
||||
const DOM_SID *sid,
|
||||
struct acct_info *info)
|
||||
{
|
||||
NTSTATUS ret = NT_STATUS_UNSUCCESSFUL;
|
||||
|
||||
if ((!context) || (!context->pdb_methods)) {
|
||||
DEBUG(0, ("invalid pdb_context specified!\n"));
|
||||
return ret;
|
||||
}
|
||||
|
||||
return context->pdb_methods->set_aliasinfo(context->pdb_methods,
|
||||
sid, info);
|
||||
}
|
||||
|
||||
static NTSTATUS context_add_aliasmem(struct pdb_context *context,
|
||||
const DOM_SID *alias,
|
||||
const DOM_SID *member)
|
||||
@ -834,6 +923,12 @@ static NTSTATUS make_pdb_context(struct pdb_context **context)
|
||||
(*context)->pdb_update_group_mapping_entry = context_update_group_mapping_entry;
|
||||
(*context)->pdb_delete_group_mapping_entry = context_delete_group_mapping_entry;
|
||||
(*context)->pdb_enum_group_mapping = context_enum_group_mapping;
|
||||
(*context)->pdb_find_alias = context_find_alias;
|
||||
(*context)->pdb_create_alias = context_create_alias;
|
||||
(*context)->pdb_delete_alias = context_delete_alias;
|
||||
(*context)->pdb_enum_aliases = context_enum_aliases;
|
||||
(*context)->pdb_get_aliasinfo = context_get_aliasinfo;
|
||||
(*context)->pdb_set_aliasinfo = context_set_aliasinfo;
|
||||
(*context)->pdb_add_aliasmem = context_add_aliasmem;
|
||||
(*context)->pdb_del_aliasmem = context_del_aliasmem;
|
||||
(*context)->pdb_enum_aliasmem = context_enum_aliasmem;
|
||||
@ -1158,6 +1253,83 @@ BOOL pdb_enum_group_mapping(enum SID_NAME_USE sid_name_use, GROUP_MAP **rmap,
|
||||
rmap, num_entries, unix_only));
|
||||
}
|
||||
|
||||
BOOL pdb_find_alias(const char *name, DOM_SID *sid)
|
||||
{
|
||||
struct pdb_context *pdb_context = pdb_get_static_context(False);
|
||||
|
||||
if (!pdb_context) {
|
||||
return False;
|
||||
}
|
||||
|
||||
return NT_STATUS_IS_OK(pdb_context->pdb_find_alias(pdb_context,
|
||||
name, sid));
|
||||
}
|
||||
|
||||
BOOL pdb_create_alias(const char *name, uint32 *rid)
|
||||
{
|
||||
struct pdb_context *pdb_context = pdb_get_static_context(False);
|
||||
|
||||
if (!pdb_context) {
|
||||
return False;
|
||||
}
|
||||
|
||||
return NT_STATUS_IS_OK(pdb_context->pdb_create_alias(pdb_context,
|
||||
name, rid));
|
||||
}
|
||||
|
||||
BOOL pdb_delete_alias(const DOM_SID *sid)
|
||||
{
|
||||
struct pdb_context *pdb_context = pdb_get_static_context(False);
|
||||
|
||||
if (!pdb_context) {
|
||||
return False;
|
||||
}
|
||||
|
||||
return NT_STATUS_IS_OK(pdb_context->pdb_delete_alias(pdb_context,
|
||||
sid));
|
||||
|
||||
}
|
||||
|
||||
BOOL pdb_enum_aliases(const DOM_SID *sid, uint32 start_idx, uint32 max_entries,
|
||||
uint32 *num_aliases, struct acct_info **info)
|
||||
{
|
||||
struct pdb_context *pdb_context = pdb_get_static_context(False);
|
||||
|
||||
if (!pdb_context) {
|
||||
return False;
|
||||
}
|
||||
|
||||
return NT_STATUS_IS_OK(pdb_context->pdb_enum_aliases(pdb_context, sid,
|
||||
start_idx,
|
||||
max_entries,
|
||||
num_aliases,
|
||||
info));
|
||||
}
|
||||
|
||||
BOOL pdb_get_aliasinfo(const DOM_SID *sid, struct acct_info *info)
|
||||
{
|
||||
struct pdb_context *pdb_context = pdb_get_static_context(False);
|
||||
|
||||
if (!pdb_context) {
|
||||
return False;
|
||||
}
|
||||
|
||||
return NT_STATUS_IS_OK(pdb_context->pdb_get_aliasinfo(pdb_context, sid,
|
||||
info));
|
||||
}
|
||||
|
||||
BOOL pdb_set_aliasinfo(const DOM_SID *sid, struct acct_info *info)
|
||||
{
|
||||
struct pdb_context *pdb_context = pdb_get_static_context(False);
|
||||
|
||||
if (!pdb_context) {
|
||||
return False;
|
||||
}
|
||||
|
||||
return NT_STATUS_IS_OK(pdb_context->pdb_set_aliasinfo(pdb_context, sid,
|
||||
info));
|
||||
}
|
||||
|
||||
BOOL pdb_add_aliasmem(const DOM_SID *alias, const DOM_SID *member)
|
||||
{
|
||||
struct pdb_context *pdb_context = pdb_get_static_context(False);
|
||||
@ -1401,6 +1573,12 @@ NTSTATUS make_pdb_methods(TALLOC_CTX *mem_ctx, PDB_METHODS **methods)
|
||||
(*methods)->update_group_mapping_entry = pdb_default_update_group_mapping_entry;
|
||||
(*methods)->delete_group_mapping_entry = pdb_default_delete_group_mapping_entry;
|
||||
(*methods)->enum_group_mapping = pdb_default_enum_group_mapping;
|
||||
(*methods)->find_alias = pdb_default_find_alias;
|
||||
(*methods)->create_alias = pdb_default_create_alias;
|
||||
(*methods)->delete_alias = pdb_default_delete_alias;
|
||||
(*methods)->enum_aliases = pdb_default_enum_aliases;
|
||||
(*methods)->get_aliasinfo = pdb_default_get_aliasinfo;
|
||||
(*methods)->set_aliasinfo = pdb_default_set_aliasinfo;
|
||||
(*methods)->add_aliasmem = pdb_default_add_aliasmem;
|
||||
(*methods)->del_aliasmem = pdb_default_del_aliasmem;
|
||||
(*methods)->enum_aliasmem = pdb_default_enum_aliasmem;
|
||||
|
Loading…
x
Reference in New Issue
Block a user