1
0
mirror of https://github.com/samba-team/samba.git synced 2025-01-14 19:24:43 +03:00
samba-mirror/source3/nsswitch/idmap_passdb.c
Simo Sorce c50c8d0dc3 r20774: I thought I committed this before Xmas holidays ...
This change is needed to make it possible to not expire
caches in disconnected mode.

Jerry, please can you look at this and confirm it is ok?

Simo.
(This used to be commit 9e8715e4e15d9cede8f4aa9652642995392617e6)
2007-10-10 12:17:08 -05:00

132 lines
3.0 KiB
C

/*
Unix SMB/CIFS implementation.
idmap PASSDB backend
Copyright (C) Simo Sorce 2006
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"
#undef DBGC_CLASS
#define DBGC_CLASS DBGC_IDMAP
/*****************************
Initialise idmap database.
*****************************/
static NTSTATUS idmap_pdb_init(struct idmap_domain *dom, const char *compat_params)
{
return NT_STATUS_OK;
}
/**********************************
lookup a set of unix ids.
**********************************/
static NTSTATUS idmap_pdb_unixids_to_sids(struct idmap_domain *dom, struct id_map **ids)
{
int i;
for (i = 0; ids[i]; i++) {
/* unmapped by default */
ids[i]->status = ID_UNMAPPED;
switch (ids[i]->xid.type) {
case ID_TYPE_UID:
if (pdb_uid_to_sid((uid_t)ids[i]->xid.id, ids[i]->sid)) {
ids[i]->status = ID_MAPPED;
}
break;
case ID_TYPE_GID:
if (pdb_gid_to_sid((gid_t)ids[i]->xid.id, ids[i]->sid)) {
ids[i]->status = ID_MAPPED;
}
break;
default: /* ?? */
ids[i]->status = ID_UNKNOWN;
}
}
return NT_STATUS_OK;
}
/**********************************
lookup a set of sids.
**********************************/
static NTSTATUS idmap_pdb_sids_to_unixids(struct idmap_domain *dom, struct id_map **ids)
{
int i;
for (i = 0; ids[i]; i++) {
enum lsa_SidType type;
union unid_t id;
if (pdb_sid_to_id(ids[i]->sid, &id, &type)) {
switch (type) {
case SID_NAME_USER:
ids[i]->xid.id = id.uid;
ids[i]->xid.type = ID_TYPE_UID;
ids[i]->status = ID_MAPPED;
break;
case SID_NAME_DOM_GRP:
case SID_NAME_ALIAS:
case SID_NAME_WKN_GRP:
ids[i]->xid.id = id.gid;
ids[i]->xid.type = ID_TYPE_GID;
ids[i]->status = ID_MAPPED;
break;
default: /* ?? */
/* make sure it is marked as unmapped */
ids[i]->status = ID_UNKNOWN;
break;
}
} else {
/* Query Failed */
ids[i]->status = ID_UNMAPPED;
}
}
return NT_STATUS_OK;
}
/**********************************
Close the idmap tdb instance
**********************************/
static NTSTATUS idmap_pdb_close(struct idmap_domain *dom)
{
return NT_STATUS_OK;
}
static struct idmap_methods passdb_methods = {
.init = idmap_pdb_init,
.unixids_to_sids = idmap_pdb_unixids_to_sids,
.sids_to_unixids = idmap_pdb_sids_to_unixids,
.close_fn =idmap_pdb_close
};
NTSTATUS idmap_passdb_init(void)
{
return smb_register_idmap(SMB_IDMAP_INTERFACE_VERSION, "passdb", &passdb_methods);
}