1
0
mirror of https://github.com/samba-team/samba.git synced 2024-12-28 07:21:54 +03:00
samba-mirror/source3/groupdb/builtindb.c
Luke Leighton 312f4f3960 - lib/unix_sec_ctxt.c
attempt at taking lib/uid.c and getting a unix security context
	change module that is independent of "cnums" and "snums".
	a security context is needed for pipes, not just IPC$ or other
	services.

- group database API

	added add_group/alias_member, del_group/alias_member,
	del_group/alias_entry functions.  del_builtin_entry() is
	deliberately set to NULL to cause an exception, you cannot
	delete builtin aliases.

- parse_lsa.c srv_lsa.c

	fixed lookup_names code, it was a load of trash and didn't do
	anything.

- cmd_samr.c rpcclient.c srv_samr.c

	added "deletegroup", "deletealias", "delaliasmem", "delgroupmem",
	"addgroupmem", "addaliasmem", "createalias", "creategroup", to
	both client and server code.

	server code calls into unix stubs right now, which don't actually
	do anything.  the only instance where they are expected to do
	anything is in appliance mode NOT even in the ldap code or anything.

	client code modified to call samr_lookup_names() for group code
	(because we can) and lsa_lookup_names() for alias code (because
	we have to).

- srv_lookup.c

	oops, lookup on unsplit name, we got lookup on DOMAIN, DOMAIN\name
	instead of DOMAIN, name.
(This used to be commit b8175702ef)
1998-12-07 17:23:48 +00:00

476 lines
13 KiB
C

/*
Unix SMB/Netbios implementation.
Version 1.9.
Pasesword and authentication handling
Copyright (C) Jeremy Allison 1996-1998
Copyright (C) Luke Kenneth Caseson Leighton 1996-1998
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 2 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, write to the Free Software
Foundation, Inc., 675 Mases Ave, Cambridge, MA 02139, USA.
*/
#include "includes.h"
#include "nterr.h"
extern int DEBUGLEVEL;
extern fstring global_sam_name;
extern DOM_SID global_sam_sid;
/*
* NOTE. All these functions are abstracted into a structure
* that points to the correct function for the selected database. JRA.
*/
static struct aliasdb_ops *bidb_ops = NULL;
/***************************************************************
Initialise the builtin db operations.
***************************************************************/
BOOL initialise_builtin_db(void)
{
if (bidb_ops)
{
return True;
}
#ifdef WITH_NISPLUS
bidb_ops = nisplus_initialise_builtin_db();
#elif defined(WITH_LDAP)
bidb_ops = ldap_initialise_builtin_db();
#elif defined(USE_SMBUNIX_DB)
bidb_ops = unix_initialise_builtin_db();
#endif
return (bidb_ops != NULL);
}
/*
* Functions that return/manipulate a LOCAL_GRP.
*/
/************************************************************************
Utility function to search builtin database by gid: the LOCAL_GRP
structure does not have a gid member, so we have to convert here
from gid to builtin rid.
*************************************************************************/
LOCAL_GRP *iterate_getbuiltingid(gid_t gid, LOCAL_GRP_MEMBER **mem, int *num_mem)
{
DOM_NAME_MAP gmep;
uint32 rid;
if (!lookupsmbgrpgid(gid, &gmep))
{
DEBUG(0,("iterate_getbuiltingid: gid %d does not map to one of our Domain's Aliases\n", gid));
return NULL;
}
if (gmep.type != SID_NAME_ALIAS )
{
DEBUG(0,("iterate_getbuiltingid: gid %d does not map to one of our Domain's Aliases\n", gid));
return NULL;
}
sid_split_rid(&gmep.sid, &rid);
if (!sid_equal(&gmep.sid, &global_sam_sid))
{
DEBUG(0,("iterate_getbuiltingid: gid %d does not map into our Domain SID\n", gid));
return NULL;
}
return iterate_getbuiltinrid(rid, mem, num_mem);
}
/************************************************************************
Utility function to search builtin database by rid. use this if your database
does not have search facilities.
*************************************************************************/
LOCAL_GRP *iterate_getbuiltinrid(uint32 rid, LOCAL_GRP_MEMBER **mem, int *num_mem)
{
LOCAL_GRP *blt = NULL;
void *fp = NULL;
DEBUG(10, ("search by rid: 0x%x\n", rid));
/* Open the builtin database file - not for update. */
fp = startbuiltinent(False);
if (fp == NULL)
{
DEBUG(0, ("unable to open builtin database.\n"));
return NULL;
}
while ((blt = getbuiltinent(fp, mem, num_mem)) != NULL && blt->rid != rid)
{
DEBUG(10,("iterate: %s 0x%x", blt->name, blt->rid));
}
if (blt != NULL)
{
DEBUG(10, ("found builtin %s by rid: 0x%x\n", blt->name, rid));
}
endbuiltinent(fp);
return blt;
}
/************************************************************************
Utility function to search builtin database by name. use this if your database
does not have search facilities.
*************************************************************************/
LOCAL_GRP *iterate_getbuiltinntnam(const char *name, LOCAL_GRP_MEMBER **mem, int *num_mem)
{
LOCAL_GRP *blt = NULL;
void *fp = NULL;
DEBUG(10, ("search by name: %s\n", name));
/* Open the builtin database file - not for update. */
fp = startbuiltinent(False);
if (fp == NULL)
{
DEBUG(0, ("unable to open builtin database.\n"));
return NULL;
}
while ((blt = getbuiltinent(fp, mem, num_mem)) != NULL && !strequal(blt->name, name))
{
}
if (blt != NULL)
{
DEBUG(10, ("found by name: %s\n", name));
}
endbuiltinent(fp);
return blt;
}
/*************************************************************************
Routine to return the next entry in the smbdomainbuiltin list.
*************************************************************************/
BOOL add_domain_builtin(LOCAL_GRP **blts, int *num_blts, LOCAL_GRP *blt)
{
if (blts == NULL || num_blts == NULL || blt == NULL)
{
return False;
}
(*blts) = Realloc((*blts), ((*num_blts)+1) * sizeof(LOCAL_GRP));
if ((*blts) == NULL)
{
return False;
}
DEBUG(10,("adding builtin %s(%s)\n", blt->name, blt->comment));
fstrcpy((*blts)[(*num_blts)].name , blt->name);
fstrcpy((*blts)[(*num_blts)].comment, blt->comment);
(*blts)[(*num_blts)].rid = blt->rid;
(*num_blts)++;
return True;
}
/*************************************************************************
checks to see if a user is a member of a domain builtin
*************************************************************************/
static BOOL user_is_member(const char *user_name, LOCAL_GRP_MEMBER *mem, int num_mem)
{
int i;
pstring name;
slprintf(name, sizeof(name)-1, "%s\\%s", global_sam_name, user_name);
for (i = 0; i < num_mem; i++)
{
DEBUG(10,("searching against user %s...\n", mem[i].name));
if (strequal(mem[i].name, name))
{
DEBUG(10,("searching for user %s: found\n", name));
return True;
}
}
DEBUG(10,("searching for user %s: not found\n", name));
return False;
}
/*************************************************************************
gets an array of builtin aliases that a user is in. use this if your database
does not have search facilities
*************************************************************************/
BOOL iterate_getuserbuiltinntnam(const char *user_name, LOCAL_GRP **blts, int *num_blts)
{
LOCAL_GRP *blt = NULL;
LOCAL_GRP_MEMBER *mem = NULL;
int num_mem = 0;
void *fp = NULL;
DEBUG(10, ("search for userbuiltin by name: %s\n", user_name));
if (user_name == NULL || blts == NULL || num_blts == NULL)
{
return False;
}
(*blts) = NULL;
(*num_blts) = 0;
/* Open the builtin database file - not for update. */
fp = startbuiltinent(False);
if (fp == NULL)
{
DEBUG(0, ("unable to open builtin database.\n"));
return False;
}
/* iterate through all builtin aliases. search members for required user */
while ((blt = getbuiltinent(fp, &mem, &num_mem)) != NULL)
{
DEBUG(5,("builtin name %s members: %d\n", blt->name, num_mem));
if (num_mem != 0 && mem != NULL)
{
BOOL ret = True;
if (user_is_member(user_name, mem, num_mem))
{
ret = add_domain_builtin(blts, num_blts, blt);
}
free(mem);
mem = NULL;
num_mem = 0;
if (!ret)
{
(*num_blts) = 0;
break;
}
}
}
if ((*num_blts) != 0)
{
DEBUG(10, ("found %d user builtin aliases:\n", (*num_blts)));
}
endbuiltinent(fp);
return True;
}
/*************************************************************************
gets an array of builtin aliases that a user is in. use this if your database
does not have search facilities
*************************************************************************/
BOOL enumdombuiltins(LOCAL_GRP **blts, int *num_blts)
{
LOCAL_GRP *blt = NULL;
void *fp = NULL;
DEBUG(10, ("enum user builtin aliases\n"));
if (blts == NULL || num_blts == NULL)
{
return False;
}
(*blts) = NULL;
(*num_blts) = 0;
/* Open the builtin database file - not for update. */
fp = startbuiltinent(False);
if (fp == NULL)
{
DEBUG(0, ("unable to open builtin database.\n"));
return False;
}
/* iterate through all builtin aliases. */
while ((blt = getbuiltinent(fp, NULL, NULL)) != NULL)
{
if (!add_domain_builtin(blts, num_blts, blt))
{
DEBUG(0,("unable to add builtin while enumerating\n"));
return False;
}
}
if ((*num_blts) != 0)
{
DEBUG(10, ("found %d user builtin aliases:\n", (*num_blts)));
}
endbuiltinent(fp);
return True;
}
/***************************************************************
Start to enumerate the builtin database list. Returns a void pointer
to ensure no modification outside this module.
****************************************************************/
void *startbuiltinent(BOOL update)
{
return bidb_ops->startaliasent(update);
}
/***************************************************************
End enumeration of the builtin database list.
****************************************************************/
void endbuiltinent(void *vp)
{
bidb_ops->endaliasent(vp);
}
/*************************************************************************
Routine to return the next entry in the builtin database list.
*************************************************************************/
LOCAL_GRP *getbuiltinent(void *vp, LOCAL_GRP_MEMBER **mem, int *num_mem)
{
return bidb_ops->getaliasent(vp, mem, num_mem);
}
/************************************************************************
Routine to add an entry to the builtin database file.
*************************************************************************/
BOOL add_builtin_entry(LOCAL_GRP *newblt)
{
return bidb_ops->add_alias_entry(newblt);
}
/************************************************************************
Routine to search the builtin database file for an entry matching the builtinname.
and then replace the entry.
************************************************************************/
BOOL mod_builtin_entry(LOCAL_GRP* blt)
{
return bidb_ops->mod_alias_entry(blt);
}
/************************************************************************
Routine to add a member to an entry in the builtin database file.
*************************************************************************/
BOOL add_builtin_member(uint32 rid, DOM_SID *member_sid)
{
return bidb_ops->add_alias_member(rid, member_sid);
}
/************************************************************************
Routine to delete a member from an entry in the builtindatabase file.
*************************************************************************/
BOOL del_builtin_member(uint32 rid, DOM_SID *member_sid)
{
return bidb_ops->del_alias_member(rid, member_sid);
}
/************************************************************************
Routine to search builtin database by name.
*************************************************************************/
LOCAL_GRP *getbuiltinntnam(const char *name, LOCAL_GRP_MEMBER **mem, int *num_mem)
{
return bidb_ops->getaliasntnam(name, mem, num_mem);
}
/************************************************************************
Routine to search builtin database by builtin rid.
*************************************************************************/
LOCAL_GRP *getbuiltinrid(uint32 builtin_rid, LOCAL_GRP_MEMBER **mem, int *num_mem)
{
return bidb_ops->getaliasrid(builtin_rid, mem, num_mem);
}
/************************************************************************
Routine to search builtin database by gid.
*************************************************************************/
LOCAL_GRP *getbuiltingid(gid_t gid, LOCAL_GRP_MEMBER **mem, int *num_mem)
{
return bidb_ops->getaliasgid(gid, mem, num_mem);
}
/*************************************************************************
gets an array of builtin aliases that a user is in.
*************************************************************************/
BOOL getuserbuiltinntnam(const char *user_name, LOCAL_GRP **blt, int *num_blts)
{
return bidb_ops->getuseraliasntnam(user_name, blt, num_blts);
}
/*************************************************************
initialises a LOCAL_GRP.
**************************************************************/
void bidb_init_blt(LOCAL_GRP *blt)
{
if (blt == NULL) return;
ZERO_STRUCTP(blt);
}
/*************************************************************
turns an builtin entry into a string.
**************************************************************/
BOOL make_builtin_line(char *p, int max_len,
LOCAL_GRP *blt,
LOCAL_GRP_MEMBER **mem, int *num_mem)
{
int i;
int len;
len = slprintf(p, max_len-1, "%s:%s:%d:", blt->name, blt->comment, blt->rid);
if (len == -1)
{
DEBUG(0,("make_builtin_line: cannot create entry\n"));
return False;
}
p += len;
max_len -= len;
if (mem == NULL || num_mem == NULL)
{
return True;
}
for (i = 0; i < (*num_mem); i++)
{
len = strlen((*mem)[i].name);
p = safe_strcpy(p, (*mem)[i].name, max_len);
if (p == NULL)
{
DEBUG(0, ("make_builtin_line: out of space for builtin aliases!\n"));
return False;
}
max_len -= len;
if (i != (*num_mem)-1)
{
*p = ',';
p++;
max_len--;
}
}
return True;
}