Kai Blin : netapi32: Implement NetUserDel.

Alexandre Julliard julliard at wine.codeweavers.com
Mon Mar 26 08:12:54 CDT 2007


Module: wine
Branch: master
Commit: 2207f20b5ff6edfa5cac6720f3530ae5da392b55
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=2207f20b5ff6edfa5cac6720f3530ae5da392b55

Author: Kai Blin <kai.blin at gmail.com>
Date:   Sat Mar 24 09:01:32 2007 +0100

netapi32: Implement NetUserDel.

---

 dlls/netapi32/access.c       |   51 ++++++++++++++++++++++-------------------
 dlls/netapi32/tests/access.c |    5 +++-
 2 files changed, 31 insertions(+), 25 deletions(-)

diff --git a/dlls/netapi32/access.c b/dlls/netapi32/access.c
index 6d84b40..8cc3cad 100644
--- a/dlls/netapi32/access.c
+++ b/dlls/netapi32/access.c
@@ -91,26 +91,22 @@ static NET_API_STATUS NETAPI_ValidateServername(LPCWSTR ServerName)
 }
 
 /************************************************************
- *                NETAPI_IsKnownUser
+ *                NETAPI_FindUser
  *
- * Checks whether the user name indicates current user.
+ * Looks for a user in the user database.
+ * Returns a pointer to the entry in the user list when the user
+ * is found, NULL otherwise.
  */
-static BOOL NETAPI_IsKnownUser(LPCWSTR UserName)
+static struct sam_user* NETAPI_FindUser(LPCWSTR UserName)
 {
-    DWORD dwSize = UNLEN + 1;
-    BOOL Result;
-    LPWSTR buf;
+    struct sam_user *user;
 
-    if (!lstrcmpW(UserName, sAdminUserName) ||
-        !lstrcmpW(UserName, sGuestUserName))
-        return TRUE;
-    NetApiBufferAllocate(dwSize * sizeof(WCHAR), (LPVOID *) &buf);
-    Result = GetUserNameW(buf, &dwSize);
-
-    Result = Result && !lstrcmpW(UserName, buf);
-    NetApiBufferFree(buf);
-
-    return Result;
+    LIST_FOR_EACH_ENTRY(user, &user_list, struct sam_user, entry)
+    {
+        if(lstrcmpW(user->user_name, UserName) == 0)
+            return user;
+    }
+    return NULL;
 }
 
 /************************************************************
@@ -198,17 +194,24 @@ NET_API_STATUS WINAPI NetUserAdd(LPCWSTR servername,
 NET_API_STATUS WINAPI NetUserDel(LPCWSTR servername, LPCWSTR username)
 {
     NET_API_STATUS status;
-    FIXME("(%s, %s) stub!\n", debugstr_w(servername), debugstr_w(username));
+    struct sam_user *user;
 
-    status = NETAPI_ValidateServername(servername);
-    if (status != NERR_Success)
+    TRACE("(%s, %s)\n", debugstr_w(servername), debugstr_w(username));
+
+    if((status = NETAPI_ValidateServername(servername))!= NERR_Success)
         return status;
 
-    if (!NETAPI_IsKnownUser(username))
+    if ((user = NETAPI_FindUser(username)) == NULL)
         return NERR_UserNotFound;
 
-    /* Delete the user here */
-    return status;
+    list_remove(&user->entry);
+
+    HeapFree(GetProcessHeap(), 0, user->home_dir);
+    HeapFree(GetProcessHeap(), 0, user->user_comment);
+    HeapFree(GetProcessHeap(), 0, user->user_logon_script_path);
+    HeapFree(GetProcessHeap(), 0, user);
+
+    return NERR_Success;
 }
 
 /************************************************************
@@ -232,7 +235,7 @@ NetUserGetInfo(LPCWSTR servername, LPCWSTR username, DWORD level,
         return NERR_InvalidComputer;
     }
 
-    if(!NETAPI_IsKnownUser(username))
+    if(!NETAPI_FindUser(username))
     {
         TRACE("User %s is unknown.\n", debugstr_w(username));
         return NERR_UserNotFound;
@@ -404,7 +407,7 @@ NetUserGetLocalGroups(LPCWSTR servername, LPCWSTR username, DWORD level,
     if (status != NERR_Success)
         return status;
 
-    if (!NETAPI_IsKnownUser(username))
+    if (!NETAPI_FindUser(username))
         return NERR_UserNotFound;
 
     if (bufptr) *bufptr = NULL;
diff --git a/dlls/netapi32/tests/access.c b/dlls/netapi32/tests/access.c
index 226e3d6..4922ed6 100644
--- a/dlls/netapi32/tests/access.c
+++ b/dlls/netapi32/tests/access.c
@@ -259,7 +259,10 @@ static void run_userhandling_tests(void)
     todo_wine ok(ret == NERR_Success, "Changing the password failed.\n");
 
     ret = pNetUserDel(NULL, sTestUserName);
-    todo_wine ok(ret == NERR_Success, "Deleting the user failed.\n");
+    ok(ret == NERR_Success, "Deleting the user failed.\n");
+
+    ret = pNetUserDel(NULL, sTestUserName);
+    ok(ret == NERR_UserNotFound, "Deleting a nonexistent user returned 0x%08x\n",ret);
 }
 
 START_TEST(access)




More information about the wine-cvs mailing list