diff options
Diffstat (limited to 'source3/lib')
-rw-r--r-- | source3/lib/substitute.c | 52 | ||||
-rw-r--r-- | source3/lib/util_getent.c | 30 |
2 files changed, 69 insertions, 13 deletions
diff --git a/source3/lib/substitute.c b/source3/lib/substitute.c index e878ee8cbf..09921c145d 100644 --- a/source3/lib/substitute.c +++ b/source3/lib/substitute.c @@ -279,6 +279,58 @@ void standard_sub_advanced(int snum, const char *user, const char *connectpath, standard_sub_basic(smb_name, str); } +const char *standard_sub_specified(TALLOC_CTX *mem_ctx, const char *input_string, + const char *username, + const char *domain, + uid_t uid, + gid_t gid) +{ + pstring input_pstring; + char *p, *s; + + pstrcpy(input_pstring, input_string); + + for (s=input_pstring; (p=strchr_m(s, '%')); s=p) { + + int l = sizeof(pstring) - (int)(p-input_pstring); + + switch (*(p+1)) { + case 'U' : + string_sub(p,"%U",username,l); + break; + case 'u' : + string_sub(p,"%u",username,l); + break; + case 'G' : + case 'g' : + if (gid != -1) { + string_sub(p,"%G",gidtoname(gid),l); + string_sub(p,"%g",gidtoname(gid),l); + } else { + string_sub(p,"%G","NO_GROUP",l); + string_sub(p,"%g","NO_GROUP",l); + } + break; + case 'D' : + string_sub(p,"%D", domain,l); + break; + case 'N' : + string_sub(p,"%N", automount_server(username),l); + break; + case '\0': + p++; + break; /* don't run off the end of the string */ + + default: p+=2; + break; + } + } + + standard_sub_basic(username, input_pstring); + + return talloc_strdup(mem_ctx, input_pstring); +} + /**************************************************************************** Do some standard substitutions in a string. ****************************************************************************/ diff --git a/source3/lib/util_getent.c b/source3/lib/util_getent.c index 02e4b932de..2e76121aae 100644 --- a/source3/lib/util_getent.c +++ b/source3/lib/util_getent.c @@ -277,20 +277,24 @@ struct sys_userlist *get_users_in_group(const char *gname) DOM_SID sid; enum SID_NAME_USE name_type; - (void) split_domain_and_name(gname, domain, groupname); - - /* - * If we're doing this via winbindd, don't do the - * entire group list enumeration as we know this is - * pointless (and slow). - */ - - if (winbind_lookup_name(domain, groupname, &sid, &name_type) && name_type == SID_NAME_DOM_GRP) { - if ((gptr = (struct group *)getgrnam(gname)) == NULL) - return NULL; - return add_members_to_userlist(list_head, gptr); + /* No point using winbind if we can't split it in the + first place */ + if (split_domain_and_name(gname, domain, groupname)) { + + /* + * If we're doing this via winbindd, don't do the + * entire group list enumeration as we know this is + * pointless (and slow). + */ + + if (winbind_lookup_name(domain, groupname, &sid, &name_type) + && name_type == SID_NAME_DOM_GRP) { + if ((gptr = (struct group *)getgrnam(gname)) == NULL) + return NULL; + return add_members_to_userlist(list_head, gptr); + } } - + setgrent(); while((gptr = getgrent()) != NULL) { if (strequal(gname, gptr->gr_name)) { |