summaryrefslogtreecommitdiff
path: root/source3/passdb/sampassldap.c
diff options
context:
space:
mode:
Diffstat (limited to 'source3/passdb/sampassldap.c')
-rw-r--r--source3/passdb/sampassldap.c422
1 files changed, 0 insertions, 422 deletions
diff --git a/source3/passdb/sampassldap.c b/source3/passdb/sampassldap.c
deleted file mode 100644
index fd503c3d27..0000000000
--- a/source3/passdb/sampassldap.c
+++ /dev/null
@@ -1,422 +0,0 @@
-/*
- Unix SMB/Netbios implementation.
- Version 2.0.
- LDAP protocol helper functions 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;
-
-
-/*******************************************************************
- NT name/RID search functions.
- ******************************************************************/
-
-BOOL ldap_search_by_rid(uint32 rid)
-{
- fstring filter;
-
- slprintf(filter, sizeof(filter)-1,
- "(&(rid=%x)(objectclass=sambaAccount))", rid);
- return ldap_search_for(filter);
-}
-
-BOOL ldap_search_by_ntname(const char *ntname)
-{
- fstring filter;
-
- slprintf(filter, sizeof(filter)-1,
- "(&(ntuid=%s)(objectclass=sambaAccount))", ntname);
- return ldap_search_for(filter);
-}
-
-
-/*******************************************************************
- Store NTTIMEs as time_t's.
- ******************************************************************/
-
-static void ldap_save_time(LDAPMod ***modlist, int modop, char *attribute,
- NTTIME *nttime)
-{
- fstring tstr;
- time_t t;
-
- t = nt_time_to_unix(nttime);
-
- if(t == -1)
- return;
-
- slprintf(tstr, sizeof(tstr)-1, "%08X", t);
- ldap_make_mod(modlist, modop, attribute, tstr);
-}
-
-static void ldap_read_time(char *attribute, NTTIME *nttime)
-{
- fstring timestr;
- time_t t;
-
- if(ldap_get_attribute(attribute, timestr))
- {
- t = (time_t)strtol(timestr, NULL, 16);
- unix_to_nt_time(nttime, t);
- }
-}
-
-
-/*******************************************************************
- Contruct a sam_passwd structure.
- ******************************************************************/
-
-static struct sam_passwd *ldapsam_getsam()
-{
- static pstring full_name;
- static pstring acct_desc;
- static pstring home_dir;
- static pstring home_drive;
- static pstring logon_script;
- static pstring profile_path;
- static pstring workstations;
- pstring temp;
- struct sam_passwd *sam21;
- struct smb_passwd *smbpw;
-
- if(!ldap_entry)
- return NULL;
-
- smbpw = ldap_getpw();
- sam21 = pwdb_smb_to_sam(smbpw);
-
- if(ldap_get_attribute("gidNumber", temp))
- sam21->unix_gid = atoi(temp);
-
- if(ldap_get_attribute("grouprid", temp))
- sam21->group_rid = strtol(temp, NULL, 16);
-
- if(ldap_get_attribute("cn", full_name))
- sam21->full_name = full_name;
-
- if(ldap_get_attribute("description", acct_desc))
- sam21->acct_desc = acct_desc;
-
- if(ldap_get_attribute("smbHome", home_dir))
- sam21->home_dir = home_dir;
-
- if(ldap_get_attribute("homeDrive", home_drive))
- sam21->dir_drive = home_drive;
-
- if(ldap_get_attribute("script", logon_script))
- sam21->logon_script = logon_script;
-
- if(ldap_get_attribute("profile", profile_path))
- sam21->profile_path = profile_path;
-
- if(ldap_get_attribute("workstations", workstations))
- sam21->workstations = workstations;
-
- ldap_read_time("pwdCanChange", &sam21->pass_can_change_time);
- ldap_read_time("pwdMustChange", &sam21->pass_must_change_time);
- ldap_read_time("logonTime", &sam21->logon_time);
- ldap_read_time("logoffTime", &sam21->logoff_time);
- ldap_read_time("kickoffTime", &sam21->kickoff_time);
-
- sam21->unknown_3 = 0xffffff; /* don't know */
- sam21->logon_divs = 168; /* hours per week */
- sam21->hours_len = 21; /* 21 times 8 bits = 168 */
- memset(sam21->hours, 0xff, sam21->hours_len); /* all hours */
- sam21->unknown_5 = 0x00020000; /* don't know */
- sam21->unknown_6 = 0x000004ec; /* don't know */
- sam21->unknown_str = NULL;
- sam21->munged_dial = NULL;
-
- ldap_entry = ldap_next_entry(ldap_struct, ldap_entry);
- return sam21;
-}
-
-
-/*******************************************************************
- Contruct a sam_disp_info structure.
- ******************************************************************/
-
-static struct sam_disp_info *ldapsam_getdispinfo()
-{
- static struct sam_disp_info dispinfo;
- static pstring nt_name;
- static pstring full_name;
- pstring temp;
-
- if(!ldap_entry)
- return NULL;
-
- if(!ldap_get_attribute("ntuid", nt_name) &&
- !ldap_get_attribute("uid", nt_name)) {
- DEBUG(0,("Missing uid\n"));
- return NULL; }
- dispinfo.nt_name = nt_name;
-
- DEBUG(2,("Retrieving account [%s]\n",nt_name));
-
- if(ldap_get_attribute("rid", temp))
- dispinfo.user_rid = strtol(temp, NULL, 16);
- else {
- DEBUG(0,("Missing rid\n"));
- return NULL; }
-
- if(ldap_get_attribute("cn", full_name))
- dispinfo.full_name = full_name;
- else
- dispinfo.full_name = NULL;
-
- ldap_entry = ldap_next_entry(ldap_struct, ldap_entry);
- return &dispinfo;
-}
-
-
-/************************************************************************
- Queues the necessary modifications to save a sam_passwd structure
- ************************************************************************/
-
-static void ldapsam_sammods(struct sam_passwd *newpwd, LDAPMod ***mods,
- int operation)
-{
- struct smb_passwd *smbpw;
- pstring temp;
-
- smbpw = pwdb_sam_to_smb(newpwd);
- ldap_smbpwmods(smbpw, mods, operation);
-
- slprintf(temp, sizeof(temp)-1, "%d", newpwd->unix_gid);
- ldap_make_mod(mods, operation, "gidNumber", temp);
-
- slprintf(temp, sizeof(temp)-1, "%x", newpwd->group_rid);
- ldap_make_mod(mods, operation, "grouprid", temp);
-
- ldap_make_mod(mods, operation, "cn", newpwd->full_name);
- ldap_make_mod(mods, operation, "description", newpwd->acct_desc);
- ldap_make_mod(mods, operation, "smbHome", newpwd->home_dir);
- ldap_make_mod(mods, operation, "homeDrive", newpwd->dir_drive);
- ldap_make_mod(mods, operation, "script", newpwd->logon_script);
- ldap_make_mod(mods, operation, "profile", newpwd->profile_path);
- ldap_make_mod(mods, operation, "workstations", newpwd->workstations);
-
- ldap_save_time(mods, operation, "pwdCanChange",
- &newpwd->pass_can_change_time);
- ldap_save_time(mods, operation, "pwdMustChange",
- &newpwd->pass_must_change_time);
- ldap_save_time(mods, operation, "logonTime",
- &newpwd->logon_time);
- ldap_save_time(mods, operation, "logoffTime",
- &newpwd->logoff_time);
- ldap_save_time(mods, operation, "kickoffTime",
- &newpwd->kickoff_time);
-}
-
-
-/***************************************************************
- Begin/end account enumeration.
- ****************************************************************/
-
-static void *ldapsam_enumfirst(BOOL update)
-{
- if (!ldap_connect())
- return NULL;
-
- ldap_search_for("objectclass=sambaAccount");
-
- return ldap_struct;
-}
-
-static void ldapsam_enumclose(void *vp)
-{
- ldap_disconnect();
-}
-
-
-/*************************************************************************
- Save/restore the current position in a query
- *************************************************************************/
-
-static SMB_BIG_UINT ldapsam_getdbpos(void *vp)
-{
- return (SMB_BIG_UINT)((ulong)ldap_entry);
-}
-
-static BOOL ldapsam_setdbpos(void *vp, SMB_BIG_UINT tok)
-{
- ldap_entry = (LDAPMessage *)((ulong)tok);
- return (True);
-}
-
-
-/*************************************************************************
- Return sam_passwd information.
- *************************************************************************/
-
-static struct sam_passwd *ldapsam_getsambynam(const char *name)
-{
- struct sam_passwd *ret;
-
- if(!ldap_connect())
- return NULL;
-
- ldap_search_by_ntname(name);
- ret = ldapsam_getsam();
-
- ldap_disconnect();
- return ret;
-}
-
-static struct sam_passwd *ldapsam_getsambyuid(uid_t userid)
-{
- struct sam_passwd *ret;
-
- if(!ldap_connect())
- return NULL;
-
- ldap_search_by_uid(userid);
- ret = ldapsam_getsam();
-
- ldap_disconnect();
- return ret;
-}
-
-static struct sam_passwd *ldapsam_getsambyrid(uint32 user_rid)
-{
- struct sam_passwd *ret;
-
- if(!ldap_connect())
- return NULL;
-
- ldap_search_by_rid(user_rid);
- ret = ldapsam_getsam();
-
- ldap_disconnect();
- return ret;
-}
-
-static struct sam_passwd *ldapsam_getcurrentsam(void *vp)
-{
- return ldapsam_getsam();
-}
-
-
-/************************************************************************
- Modify user information given a sam_passwd struct.
- *************************************************************************/
-
-static BOOL ldapsam_addsam(struct sam_passwd *newpwd)
-{
- LDAPMod **mods;
-
- if (!newpwd || !ldap_allocaterid(&newpwd->user_rid))
- return (False);
-
- ldapsam_sammods(newpwd, &mods, LDAP_MOD_ADD);
- return ldap_makemods("uid", newpwd->unix_name, mods, True);
-}
-
-static BOOL ldapsam_modsam(struct sam_passwd *pwd, BOOL override)
-{
- LDAPMod **mods;
-
- if (!pwd)
- return (False);
-
- ldapsam_sammods(pwd, &mods, LDAP_MOD_REPLACE);
- return ldap_makemods("uid", pwd->unix_name, mods, False);
-}
-
-
-/*************************************************************************
- Return sam_disp_info information.
- *************************************************************************/
-
-static struct sam_disp_info *ldapsam_getdispbynam(const char *name)
-{
- struct sam_disp_info *ret;
-
- if(!ldap_connect())
- return NULL;
-
- ldap_search_by_ntname(name);
- ret = ldapsam_getdispinfo();
-
- ldap_disconnect();
- return ret;
-}
-
-static struct sam_disp_info *ldapsam_getdispbyrid(uint32 user_rid)
-{
- struct sam_disp_info *ret;
-
- if(!ldap_connect())
- return NULL;
-
- ldap_search_by_rid(user_rid);
- ret = ldapsam_getdispinfo();
-
- ldap_disconnect();
- return ret;
-}
-
-static struct sam_disp_info *ldapsam_getcurrentdisp(void *vp)
-{
- return ldapsam_getdispinfo();
-}
-
-
-
-static struct sam_passdb_ops ldapsam_ops =
-{
- ldapsam_enumfirst,
- ldapsam_enumclose,
- ldapsam_getdbpos,
- ldapsam_setdbpos,
-
- ldapsam_getsambynam,
- ldapsam_getsambyuid,
- ldapsam_getsambyrid,
- ldapsam_getcurrentsam,
- ldapsam_addsam,
- ldapsam_modsam,
-
- ldapsam_getdispbynam,
- ldapsam_getdispbyrid,
- ldapsam_getcurrentdisp
-};
-
-struct sam_passdb_ops *ldap_initialise_sam_password_db(void)
-{
- return &ldapsam_ops;
-}
-
-#else
- void sampassldap_dummy_function(void);
- void sampassldap_dummy_function(void) { } /* stop some compilers complaining */
-#endif