Some more 'winbind default domain' support patches from Alexander Bokovoy
authorAndrew Bartlett <abartlet@samba.org>
Sun, 27 Jan 2002 12:12:22 +0000 (12:12 +0000)
committerAndrew Bartlett <abartlet@samba.org>
Sun, 27 Jan 2002 12:12:22 +0000 (12:12 +0000)
<a.bokovoy@sam-solutions.net>.

This patch is designed to remove the 'special cases' required for this support.

In particular this now kills off winbind_initgroups, as it appears no longer to
be required.

Andrew Bartlett

source/lib/username.c
source/lib/util_getent.c
source/nsswitch/wb_client.c
source/smbd/sec_ctx.c
source/smbd/service.c

index f256b1d6f858fc96b4c654c36c2a3914aba86563..ca191ce94e489d0b9cca72e1491167524f91967d 100644 (file)
@@ -36,6 +36,33 @@ BOOL name_is_local(const char *name)
        return !(strchr_m(name, *lp_winbind_separator()));
 }
 
+/*****************************************************************
+ Splits passed user or group name to domain and user/group name parts
+ Returns True if name was splitted and False otherwise.
+*****************************************************************/
+
+BOOL split_domain_and_name(const char *name, char *domain, char* username)
+{
+       char *p = strchr(name,*lp_winbind_separator());
+       
+       
+       /* Parse a string of the form DOMAIN/user into a domain and a user */
+       DEBUG(10,("split_domain_and_name: checking whether name |%s| local or not\n", name));
+       
+       if (p) {
+               fstrcpy(username, p+1);
+               fstrcpy(domain, name);
+               domain[PTR_DIFF(p, name)] = 0;
+       } else if (lp_winbind_use_default_domain()) {
+               fstrcpy(username, name);
+               fstrcpy(domain, lp_workgroup());
+       } else
+               return False;
+       
+       DEBUG(10,("split_domain_and_name: all is fine, domain is |%s| and name is |%s|\n", domain, username));
+       return True;
+}
+
 /****************************************************************************
  Get a users home directory.
 ****************************************************************************/
index 02be8e7c25e1435e2e877d278ff10c57e1b6a7a9..5fb24d98690672de44606b2f1db17e1c3151e9a1 100644 (file)
@@ -273,6 +273,12 @@ struct sys_userlist *get_users_in_group(const char *gname)
 {
        struct sys_userlist *list_head = NULL;
        struct group *gptr;
+       fstring domain;
+       fstring groupname;
+       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
@@ -280,7 +286,7 @@ struct sys_userlist *get_users_in_group(const char *gname)
         * pointless (and slow).
         */
 
-       if (strchr(gname,*lp_winbind_separator()) || lp_winbind_use_default_domain()) {
+       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);
index df2a1c1f6ef9c9ccc7987c2a1b79b96cb1836afa..87c16f959a7f100521f058aa891f758b7fd2abd9 100644 (file)
@@ -229,7 +229,7 @@ BOOL winbind_gid_to_sid(DOM_SID *sid, gid_t gid)
 }
 
 /* Fetch the list of groups a user is a member of from winbindd.  This is
-   used by winbind_initgroups and winbind_getgroups. */
+   used by winbind_getgroups. */
 
 static int wb_getgroups(const char *user, gid_t **groups)
 {
@@ -257,86 +257,6 @@ static int wb_getgroups(const char *user, gid_t **groups)
        return -1;
 }
 
-/* Call winbindd to initialise group membership.  This is necessary for
-   some systems (i.e RH5.2) that do not have an initgroups function as part
-   of the nss extension.  In RH5.2 this is implemented using getgrent()
-   which can be amazingly inefficient as well as having problems with
-   username case. */
-
-int winbind_initgroups(char *user, gid_t gid)
-{
-       gid_t *tgr, *groups = NULL;
-       int result;
-
-       /* Call normal initgroups if we are a local user */
-
-       if (!(strchr(user, *lp_winbind_separator()) || lp_winbind_use_default_domain())) {
-               return initgroups(user, gid);
-       }
-
-       result = wb_getgroups(user, &groups);
-
-       DEBUG(10,("winbind_getgroups: %s: result = %s\n", user, 
-                 result == -1 ? "FAIL" : "SUCCESS"));
-
-       if (result != -1) {
-               int ngroups = result, i;
-               BOOL is_member = False;
-
-               /* Check to see if the passed gid is already in the list */
-
-               for (i = 0; i < ngroups; i++) {
-                       if (groups[i] == gid) {
-                               is_member = True;
-                       }
-               }
-
-               /* Add group to list if necessary */
-
-               if (!is_member) {
-                       tgr = (gid_t *)Realloc(groups, sizeof(gid_t) * ngroups + 1);
-                       
-                       if (!tgr) {
-                               errno = ENOMEM;
-                               result = -1;
-                               goto done;
-                       }
-                       else groups = tgr;
-
-                       groups[ngroups] = gid;
-                       ngroups++;
-               }
-
-               /* Set the groups */
-
-               if (sys_setgroups(ngroups, groups) == -1) {
-                       errno = EPERM;
-                       result = -1;
-                       goto done;
-               }
-
-       } else {
-               /* The call failed but if 'winbind use default domain' is 'true', we
-                   should call normal initgroups. */
-                   
-               if (lp_winbind_use_default_domain()) {
-                       return initgroups(user, gid);
-               } else {
-                       /* The call failed.  Set errno to something so we don't get
-                          a bogus value from the last failed system call. */
-
-                       errno = EIO;
-               }
-       }
-
-       /* Free response data if necessary */
-
- done:
-       SAFE_FREE(groups);
-
-       return result;
-}
-
 /* Return a list of groups the user is a member of.  This function is
    useful for large systems where inverting the group database would be too
    time consuming.  If size is zero, list is not modified and the total
index b774947d607e4ea17b327546c84f2d11cb6b1bbd..5802c97f3d19d7e4bcc9ba706bf5f5e15d115d43 100644 (file)
@@ -185,7 +185,7 @@ BOOL initialise_groups(char *user, uid_t uid, gid_t gid)
 
        /* Call initgroups() to get user groups */
 
-       if (winbind_initgroups(user,gid) == -1) {
+       if (initgroups(user,gid) == -1) {
                DEBUG(0,("Unable to initgroups. Error was %s\n", strerror(errno) ));
                if (getuid() == 0) {
                        if (gid < 0 || gid > 32767 || uid < 0 || uid > 32767) {
index ac2e2ee548f5e8733e9638e4d1375d3d8f134bcc..a9b9a9d4d944ec3c299feddfa56a493c053e09f3 100644 (file)
@@ -84,7 +84,7 @@ int add_home_service(const char *service, const char *homedir)
        int iHomeService;
        int iService;
        fstring new_service;
-       char *usr_p = NULL;
+       fstring domain;
 
        if (!service || !homedir)
                return -1;
@@ -99,11 +99,7 @@ int add_home_service(const char *service, const char *homedir)
         * include any macros.
         */
 
-       fstrcpy(new_service, service);
-
-       if ((usr_p = strchr_m(service,*lp_winbind_separator())) != NULL)
-               fstrcpy(new_service, usr_p+1);
-
+       split_domain_and_name(service, domain, new_service);
        lp_add_home(new_service, iHomeService, homedir);
        iService = lp_servicenumber(new_service);