39 #include <sys/param.h>
40 #include <sys/types.h>
50 int innetgr(
const char *netgroup,
const char *host,
const char *user,
76 const char *
Gtab[NGROUPS_MAX];
107 if (gtype ==
XrdAccNetGroup) {hp = &NetGroup_Names; HaveNetGroups = 1;}
108 else {hp = &Group_Names; HaveGroups = 1;}
112 Group_Name_Context.
Lock();
117 if (!(np = hp->
Find(name)))
119 if (!(np = hp->
Find(name)))
120 std::cerr <<
"XrdAccGroups: Unable to add group " <<name <<std::endl;
125 Group_Name_Context.
UnLock();
139 Group_Name_Context.
Lock();
144 else np = Group_Names.
Find(name);
148 Group_Name_Context.
UnLock();
165 char *Gtab[NGROUPS_MAX];
176 Group_Cache_Context.
Lock();
177 if ((glist = Group_Cache.
Find(user)))
180 Group_Cache_Context.
UnLock();
183 Group_Cache_Context.
UnLock();
196 Group_Build_Context.
Lock();
197 gtabi = addGroup(user, pw->pw_gid, 0, Gtab, 0);
205 while ((gr = getgrent()))
207 if (pw->pw_gid == gr->gr_gid)
continue;
208 for (cp = gr->gr_mem; cp && *cp; cp++)
209 if (strcmp(*cp, user) == 0)
210 gtabi = addGroup(user, gr->gr_gid,
211 Dotran(gr->gr_gid,gr->gr_name),
219 Group_Build_Context.
UnLock();
227 Group_Cache_Context.
Lock();
228 Group_Cache.
Add(user, glist, LifeTime);
229 Group_Cache_Context.
UnLock();
245 char uh_key[MAXHOSTNAMELEN+96];
257 strcpy(uh_key,
user);
259 strcpy(&uh_key[i+1],
host);
265 NetGroup_Cache_Context.
Lock();
266 if ((glist = NetGroup_Cache.
Find(uh_key)))
269 NetGroup_Cache_Context.
UnLock();
272 NetGroup_Cache_Context.
UnLock();
279 Group_Name_Context.
Lock();
281 Group_Name_Context.
UnLock();
286 (
const char **)GroupTab.
Gtab);
290 NetGroup_Cache_Context.
Lock();
291 NetGroup_Cache.
Add((
const char *)uh_key, glist, LifeTime);
292 NetGroup_Cache_Context.
UnLock();
298 (
const char **)GroupTab.
Gtab);
310 Group_Cache_Context.
Lock();
312 Group_Cache_Context.
UnLock();
316 NetGroup_Cache_Context.
Lock();
317 NetGroup_Cache.
Purge();
318 NetGroup_Cache_Context.
UnLock();
327 if ((
int)gid < 0) retrancnt = 0;
328 else {
if (retrancnt > (
int)(
sizeof(retrangid)/
sizeof(gid_t)))
return -1;
329 retrangid[retrancnt++] = gid;
342 int XrdAccGroups::addGroup(
const char *
user,
const gid_t gid,
char *gname,
351 if (
gtabi >= NGROUPS_MAX)
352 {
if (
gtabi == NGROUPS_MAX)
353 std::cerr <<
"XrdAccGroups: More than " <<
gtabi <<
"groups for " <<
user <<std::endl;
360 if (!gname || !gname[0])
362 if ((gp = getgrgid(gid)) == NULL)
return gtabi;
363 else gname = gp->gr_name;
370 if (!(gp = Group_Names.
Find(gname)) )
return gtabi;
382 char *XrdAccGroups::Dotran(
const gid_t gid,
char *gname)
389 for (i = 0; i < retrancnt; i++)
if (retrangid[i] == gid)
return (
char *)0;
407 if (innetgr(netgroup, (
const char *)grp->
host, (
const char *)grp->
user,
409 {
if (grp->
gtabi >= NGROUPS_MAX)
410 {
if (grp->
gtabi == NGROUPS_MAX)
411 std::cerr <<
"XrdAccGroups: More than " <<grp->
gtabi <<
"netgroups for " <<grp->
user <<std::endl;
int XrdAccCheckNetGroup(const char *netgroup, char *key, void *Arg)
XrdAccGroups XrdAccGroupMaster
const char * Gtab[NGROUPS_MAX]
char * AddName(const XrdAccGroupType gtype, const char *name)
int Retran(const gid_t gid)
XrdAccGroupList * Groups(const char *user)
XrdAccGroupList * NetGroups(const char *user, const char *host)
char * FindName(const XrdAccGroupType gtype, const char *name)
T * Apply(int(*func)(const char *, T *, void *), void *Arg)
T * Add(const char *KeyVal, T *KeyData, const int LifeTime=0, XrdOucHash_Options opt=Hash_default)
T * Find(const char *KeyVal, time_t *KeyTime=0)