1
0
mirror of https://github.com/samba-team/samba.git synced 2025-07-29 15:42:04 +03:00
Files
samba-mirror/source3/passdb/passgrpldap.c
Luke Leighton 4323fd4072 added ldap files by Matthew Chapman.
(This used to be commit 2bc031e8fa)
1998-12-07 22:52:49 +00:00

191 lines
4.7 KiB
C

/*
Unix SMB/Netbios implementation.
Version 2.0.
LDAP passgrp database for SAMBA
Copyright (C) Matthew Chapman 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 Mass Ave, Cambridge, MA 02139, USA.
*/
#include "includes.h"
#ifdef WITH_LDAP
#include <lber.h>
#include <ldap.h>
extern int DEBUGLEVEL;
/* Internal state */
extern LDAP *ldap_struct;
extern LDAPMessage *ldap_results;
extern LDAPMessage *ldap_entry;
/***************************************************************
Enumerate RIDs of groups which user is a member of, of type
given by attribute.
****************************************************************/
static void ldappassgrp_member(char *attribute, uint32 **rids, int *numrids)
{
char **values;
uint32 *ridlist;
int i;
if((values = ldap_get_values(ldap_struct, ldap_entry, attribute))) {
*numrids = i = ldap_count_values(values);
*rids = ridlist = malloc(i * sizeof(uint32));
do {
ridlist[--i] = atoi(values[i]);
} while(i > 0);
ldap_value_free(values);
} else {
*numrids = 0;
*rids = NULL;
}
}
/***************************************************************
Begin/end smbgrp enumeration.
****************************************************************/
static void *ldappassgrp_enumfirst(BOOL update)
{
if (!ldap_open_connection(False))
return NULL;
ldap_search_for("&(objectclass=sambaAccount)(|(group=*)(alias=*))");
return ldap_struct;
}
static void ldappassgrp_enumclose(void *vp)
{
ldap_close_connection();
}
/*************************************************************************
Save/restore the current position in a query
*************************************************************************/
static SMB_BIG_UINT ldappassgrp_getdbpos(void *vp)
{
return (SMB_BIG_UINT)((ulong)ldap_entry);
}
static BOOL ldappassgrp_setdbpos(void *vp, SMB_BIG_UINT tok)
{
ldap_entry = (LDAPMessage *)((ulong)tok);
return (True);
}
/*************************************************************************
Return limited smb_passwd information, and group membership.
*************************************************************************/
static struct smb_passwd *ldappassgrp_getpwbynam(const char *name,
uint32 **grp_rids, int *num_grps,
uint32 **als_rids, int *num_alss)
{
struct smb_passwd *ret;
if(!ldap_open_connection(False))
return NULL;
ldap_search_by_ntname(name);
ldappassgrp_member("group", grp_rids, num_grps);
ldappassgrp_member("alias", als_rids, num_alss);
ret = ldap_getpw();
ldap_close_connection();
return ret;
}
static struct smb_passwd *ldappassgrp_getpwbyuid(uid_t userid,
uint32 **grp_rids, int *num_grps,
uint32 **als_rids, int *num_alss)
{
struct smb_passwd *ret;
if(!ldap_open_connection(False))
return NULL;
ldap_search_by_uid(userid);
ldappassgrp_member("group", grp_rids, num_grps);
ldappassgrp_member("alias", als_rids, num_alss);
ret = ldap_getpw();
ldap_close_connection();
return ret;
}
static struct smb_passwd *ldappassgrp_getpwbyrid(uint32 user_rid,
uint32 **grp_rids, int *num_grps,
uint32 **als_rids, int *num_alss)
{
struct smb_passwd *ret;
if(!ldap_open_connection(False))
return NULL;
ldap_search_by_rid(user_rid);
ldappassgrp_member("group", grp_rids, num_grps);
ldappassgrp_member("alias", als_rids, num_alss);
ret = ldap_getpw();
ldap_close_connection();
return ret;
}
static struct smb_passwd *ldappassgrp_getcurrentpw(void *vp,
uint32 **grp_rids, int *num_grps,
uint32 **als_rids, int *num_alss)
{
ldappassgrp_member("group", grp_rids, num_grps);
ldappassgrp_member("alias", als_rids, num_alss);
return ldap_getpw();
}
static struct passgrp_ops ldappassgrp_ops =
{
ldappassgrp_enumfirst,
ldappassgrp_enumclose,
ldappassgrp_getdbpos,
ldappassgrp_setdbpos,
ldappassgrp_getpwbynam,
ldappassgrp_getpwbyuid,
ldappassgrp_getpwbyrid,
ldappassgrp_getcurrentpw,
};
struct passgrp_ops *ldap_initialise_password_grp(void)
{
return &ldappassgrp_ops;
}
#else
void passgrpldap_dummy_function(void);
void passgrpldap_dummy_function(void) { } /* stop some compilers complaining */
#endif