OSDN Git Service

* security.cc (get_user_groups): Call Net function with NULL server
authorcorinna <corinna>
Wed, 18 Jul 2001 12:56:26 +0000 (12:56 +0000)
committercorinna <corinna>
Wed, 18 Jul 2001 12:56:26 +0000 (12:56 +0000)
        name under specific error conditions.
        (is_group_member): Ditto.
        (get_user_local_groups): Ditto.
        (get_user_primary_group): Ditto.

winsup/cygwin/ChangeLog
winsup/cygwin/security.cc

index 3818c17..cfd42e2 100644 (file)
@@ -1,3 +1,11 @@
+Wed 18 Jul 2001 12:54:17  Corinna Vinschen <corinna@vinschen.de>
+
+       * security.cc (get_user_groups): Call Net function with NULL server
+       name under specific error conditions.
+       (is_group_member): Ditto.
+       (get_user_local_groups): Ditto.
+       (get_user_primary_group): Ditto.
+
 Wed 18 Jul 2001 11:56:00  Corinna Vinschen <corinna@vinschen.de>
 
        * syscalls.cc (_unlink): Explicitely check for non-existant file.
index 6a5b86b..dd9b37b 100644 (file)
@@ -274,8 +274,12 @@ get_user_groups (WCHAR *wlogonserver, cygsidlist &grp_list, char *user)
   DWORD cnt, tot;
   NET_API_STATUS ret;
 
-  if ((ret = NetUserGetGroups (wlogonserver, wuser, 0, (LPBYTE *) &buf,
-                              MAX_PREFERRED_LENGTH, &cnt, &tot)))
+  ret = NetUserGetGroups (wlogonserver, wuser, 0, (LPBYTE *) &buf,
+                         MAX_PREFERRED_LENGTH, &cnt, &tot);
+  if (ret == ERROR_BAD_NETPATH || ret == RPC_S_SERVER_UNAVAILABLE)
+    ret = NetUserGetGroups (NULL, wuser, 0, (LPBYTE *) &buf,
+                           MAX_PREFERRED_LENGTH, &cnt, &tot);
+  if (ret)
     {
       debug_printf ("%d = NetUserGetGroups ()", ret);
       set_errno (ret);
@@ -319,22 +323,27 @@ is_group_member (WCHAR *wlogonserver, WCHAR *wgroup,
 {
   LPLOCALGROUP_MEMBERS_INFO_0 buf;
   DWORD cnt, tot;
-  BOOL ret = FALSE;
+  NET_API_STATUS ret;
+  BOOL retval = FALSE;
 
-  if (NetLocalGroupGetMembers (wlogonserver, wgroup, 0, (LPBYTE *) &buf,
-                               MAX_PREFERRED_LENGTH, &cnt, &tot, NULL))
+  ret = NetLocalGroupGetMembers (wlogonserver, wgroup, 0, (LPBYTE *) &buf,
+                                MAX_PREFERRED_LENGTH, &cnt, &tot, NULL);
+  if (ret == ERROR_BAD_NETPATH || ret == RPC_S_SERVER_UNAVAILABLE)
+    ret = NetLocalGroupGetMembers (NULL, wgroup, 0, (LPBYTE *) &buf,
+                                  MAX_PREFERRED_LENGTH, &cnt, &tot, NULL);
+  if (ret)
     return FALSE;
 
-  for (DWORD bidx = 0; !ret && bidx < cnt; ++bidx)
+  for (DWORD bidx = 0; !retval && bidx < cnt; ++bidx)
     if (EqualSid (usersid, buf[bidx].lgrmi0_sid))
-      ret = TRUE;
+      retval = TRUE;
     else
-      for (int glidx = 0; !ret && glidx < grp_list.count; ++glidx)
+      for (int glidx = 0; !retval && glidx < grp_list.count; ++glidx)
        if (EqualSid (grp_list.sids[glidx], buf[bidx].lgrmi0_sid))
-         ret = TRUE;
+         retval = TRUE;
 
   NetApiBufferFree (buf);
-  return ret;
+  return retval;
 }
 
 static BOOL
@@ -345,8 +354,12 @@ get_user_local_groups (WCHAR *wlogonserver, const char *logonserver,
   DWORD cnt, tot;
   NET_API_STATUS ret;
 
-  if ((ret = NetLocalGroupEnum (wlogonserver, 0, (LPBYTE *) &buf,
-                               MAX_PREFERRED_LENGTH, &cnt, &tot, NULL)))
+  ret = NetLocalGroupEnum (wlogonserver, 0, (LPBYTE *) &buf,
+                          MAX_PREFERRED_LENGTH, &cnt, &tot, NULL);
+  if (ret == ERROR_BAD_NETPATH || ret == RPC_S_SERVER_UNAVAILABLE)
+    ret = NetLocalGroupEnum (NULL, 0, (LPBYTE *) &buf,
+                            MAX_PREFERRED_LENGTH, &cnt, &tot, NULL);
+  if (ret)
     {
       debug_printf ("%d = NetLocalGroupEnum ()", ret);
       set_errno (ret);
@@ -410,7 +423,8 @@ get_user_primary_group (WCHAR *wlogonserver, const char *user,
 {
   LPUSER_INFO_3 buf;
   WCHAR wuser[UNLEN + 1];
-  BOOL ret = FALSE;
+  NET_API_STATUS ret;
+  BOOL retval = FALSE;
   UCHAR count;
 
   if (usersid == well_known_system_sid)
@@ -420,16 +434,24 @@ get_user_primary_group (WCHAR *wlogonserver, const char *user,
     }
 
   sys_mbstowcs (wuser, user, UNLEN + 1);
-  if (NetUserGetInfo (wlogonserver, wuser, 3, (LPBYTE *) &buf))
-    return FALSE;
+  ret = NetUserGetInfo (wlogonserver, wuser, 3, (LPBYTE *) &buf);
+  if (ret == ERROR_BAD_NETPATH || ret == RPC_S_SERVER_UNAVAILABLE)
+    ret = NetUserGetInfo (NULL, wuser, 3, (LPBYTE *) &buf);
+  if (ret)
+    {
+      debug_printf ("%d = NetUserGetInfo ()", ret);
+      set_errno (ret);
+      return FALSE;
+    }
+
   pgrpsid = usersid;
   if (IsValidSid (pgrpsid) && (count = *GetSidSubAuthorityCount (pgrpsid)) > 1)
     {
       *GetSidSubAuthority (pgrpsid, count - 1) = buf->usri3_primary_group_id;
-      ret = TRUE;
+      retval = TRUE;
     }
   NetApiBufferFree (buf);
-  return ret;
+  return retval;
 }
 
 static BOOL