Zebediah Figura : netapi32: Move change_password_smb() to the Unix library.

Alexandre Julliard julliard at winehq.org
Tue Apr 13 16:31:20 CDT 2021


Module: wine
Branch: master
Commit: 1542fe9bcaac512aa46000f9fc25c894a48061ab
URL:    https://source.winehq.org/git/wine.git/?a=commit;h=1542fe9bcaac512aa46000f9fc25c894a48061ab

Author: Zebediah Figura <z.figura12 at gmail.com>
Date:   Mon Apr 12 22:35:42 2021 -0500

netapi32: Move change_password_smb() to the Unix library.

Signed-off-by: Zebediah Figura <z.figura12 at gmail.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>

---

 dlls/netapi32/netapi32.c | 161 +----------------------------------------------
 dlls/netapi32/unixlib.c  |  99 +++++++++++++++++++++++++++++
 dlls/netapi32/unixlib.h  |   2 +
 3 files changed, 104 insertions(+), 158 deletions(-)

diff --git a/dlls/netapi32/netapi32.c b/dlls/netapi32/netapi32.c
index 62c4ba138ac..44d23a602c7 100644
--- a/dlls/netapi32/netapi32.c
+++ b/dlls/netapi32/netapi32.c
@@ -25,14 +25,6 @@
 #include "wine/port.h"
 
 #include <stdarg.h>
-#include <fcntl.h>
-#include <errno.h>
-#ifdef HAVE_SYS_WAIT_H
-#include <sys/wait.h>
-#endif
-#ifdef HAVE_UNISTD_H
-#include <unistd.h>
-#endif
 
 #include "ntstatus.h"
 #define WIN32_NO_STATUS
@@ -68,60 +60,6 @@ DEFINE_GUID(GUID_NULL,0,0,0,0,0,0,0,0,0,0,0);
 
 static HINSTANCE netapi32_instance;
 
-static CPTABLEINFO unix_cptable;
-static ULONG unix_cp;
-
-static BOOL get_unix_codepage(void)
-{
-    static const WCHAR wineunixcpW[] = {'W','I','N','E','U','N','I','X','C','P',0};
-    UNICODE_STRING name, value;
-    WCHAR value_buffer[13];
-    SIZE_T size;
-    void *ptr;
-
-    if (unix_cp) return TRUE;
-
-    RtlInitUnicodeString( &name, wineunixcpW );
-    value.Buffer = value_buffer;
-    value.MaximumLength = sizeof(value_buffer);
-    if (!RtlQueryEnvironmentVariable_U( NULL, &name, &value ))
-        RtlUnicodeStringToInteger( &value, 10, &unix_cp );
-    if (NtGetNlsSectionPtr( 11, unix_cp, NULL, &ptr, &size ))
-        return FALSE;
-    RtlInitCodePageTable( ptr, &unix_cptable );
-    return TRUE;
-}
-
-static DWORD netapi_wcstoumbs( const WCHAR *src, char *dst, DWORD dstlen )
-{
-    DWORD srclen = (strlenW( src ) + 1) * sizeof(WCHAR);
-    DWORD len;
-
-    get_unix_codepage();
-
-    if (unix_cp == CP_UTF8)
-    {
-        RtlUnicodeToUTF8N( dst, dstlen, &len, src, srclen );
-        return len;
-    }
-    else
-    {
-        len = (strlenW( src ) * 2) + 1;
-        if (dst) RtlUnicodeToCustomCPN( &unix_cptable, dst, dstlen, &len, src, srclen );
-        return len;
-    }
-}
-
-static char *strdup_unixcp( const WCHAR *str )
-{
-    char *ret;
-
-    int len = netapi_wcstoumbs( str, NULL, 0 );
-    if ((ret = HeapAlloc( GetProcessHeap(), 0, len )))
-        netapi_wcstoumbs( str, ret, len );
-    return ret;
-}
-
 static INIT_ONCE init_once = INIT_ONCE_STATIC_INIT;
 
 static const struct samba_funcs *samba_funcs;
@@ -2087,101 +2025,6 @@ NET_API_STATUS WINAPI NetUserModalsGet(
     return NERR_Success;
 }
 
-static NET_API_STATUS change_password_smb( LPCWSTR domainname, LPCWSTR username,
-    LPCWSTR oldpassword, LPCWSTR newpassword )
-{
-#ifdef HAVE_FORK
-    NET_API_STATUS ret = NERR_Success;
-    static char option_silent[] = "-s";
-    static char option_user[] = "-U";
-    static char option_remote[] = "-r";
-    static char smbpasswd[] = "smbpasswd";
-    int pipe_out[2];
-    pid_t pid, wret;
-    int status;
-    char *server = NULL, *user, *argv[7], *old = NULL, *new = NULL;
-
-    if (domainname && !(server = strdup_unixcp( domainname ))) return ERROR_OUTOFMEMORY;
-    if (!(user = strdup_unixcp( username )))
-    {
-        ret = ERROR_OUTOFMEMORY;
-        goto end;
-    }
-    if (!(old = strdup_unixcp( oldpassword )))
-    {
-        ret = ERROR_OUTOFMEMORY;
-        goto end;
-    }
-    if (!(new = strdup_unixcp( newpassword )))
-    {
-        ret = ERROR_OUTOFMEMORY;
-        goto end;
-    }
-    argv[0] = smbpasswd;
-    argv[1] = option_silent;
-    argv[2] = option_user;
-    argv[3] = user;
-    if (server)
-    {
-        argv[4] = option_remote;
-        argv[5] = server;
-        argv[6] = NULL;
-    }
-    else argv[4] = NULL;
-
-    if (pipe( pipe_out ) == -1)
-    {
-        ret = NERR_InternalError;
-        goto end;
-    }
-    fcntl( pipe_out[0], F_SETFD, FD_CLOEXEC );
-    fcntl( pipe_out[1], F_SETFD, FD_CLOEXEC );
-
-    switch ((pid = fork()))
-    {
-    case -1:
-        close( pipe_out[0] );
-        close( pipe_out[1] );
-        ret = NERR_InternalError;
-        goto end;
-    case 0:
-        dup2( pipe_out[0], 0 );
-        close( pipe_out[0] );
-        close( pipe_out[1] );
-        execvp( "smbpasswd", argv );
-        ERR( "can't execute smbpasswd, is it installed?\n" );
-        _exit(1);
-    default:
-        close( pipe_out[0] );
-        break;
-    }
-    write( pipe_out[1], old, strlen( old ) );
-    write( pipe_out[1], "\n", 1 );
-    write( pipe_out[1], new, strlen( new ) );
-    write( pipe_out[1], "\n", 1 );
-    write( pipe_out[1], new, strlen( new ) );
-    write( pipe_out[1], "\n", 1 );
-    close( pipe_out[1] );
-
-    do {
-        wret = waitpid(pid, &status, 0);
-    } while (wret < 0 && errno == EINTR);
-
-    if (ret == NERR_Success && (wret < 0 || !WIFEXITED(status) || WEXITSTATUS(status)))
-        ret = NERR_InternalError;
-
-end:
-    HeapFree( GetProcessHeap(), 0, server );
-    HeapFree( GetProcessHeap(), 0, user );
-    HeapFree( GetProcessHeap(), 0, old );
-    HeapFree( GetProcessHeap(), 0, new );
-    return ret;
-#else
-    ERR( "no fork support on this platform\n" );
-    return NERR_InternalError;
-#endif
-}
-
 /******************************************************************************
  *                NetUserChangePassword  (NETAPI32.@)
  * PARAMS
@@ -2204,7 +2047,9 @@ NET_API_STATUS WINAPI NetUserChangePassword(LPCWSTR domainname, LPCWSTR username
 
     TRACE("(%s, %s, ..., ...)\n", debugstr_w(domainname), debugstr_w(username));
 
-    if (!change_password_smb( domainname, username, oldpassword, newpassword ))
+    if (!samba_init()) return ERROR_DLL_INIT_FAILED;
+
+    if (!samba_funcs->change_password( domainname, username, oldpassword, newpassword ))
         return NERR_Success;
 
     if(domainname)
diff --git a/dlls/netapi32/unixlib.c b/dlls/netapi32/unixlib.c
index 3610abe2bde..1506e616c06 100644
--- a/dlls/netapi32/unixlib.c
+++ b/dlls/netapi32/unixlib.c
@@ -27,6 +27,14 @@
 #include "wine/port.h"
 
 #include <stdarg.h>
+#include <fcntl.h>
+#include <errno.h>
+#ifdef HAVE_SYS_WAIT_H
+#include <sys/wait.h>
+#endif
+#ifdef HAVE_UNISTD_H
+#include <unistd.h>
+#endif
 
 #include "ntstatus.h"
 #define WIN32_NO_STATUS
@@ -949,12 +957,103 @@ static void libnetapi_init(void)
 
 #endif /* SONAME_LIBNETAPI */
 
+static NET_API_STATUS WINAPI change_password( const WCHAR *domainname, const WCHAR *username,
+                                              const WCHAR *oldpassword, const WCHAR *newpassword )
+{
+    NET_API_STATUS ret = NERR_Success;
+    static char option_silent[] = "-s";
+    static char option_user[] = "-U";
+    static char option_remote[] = "-r";
+    static char smbpasswd[] = "smbpasswd";
+    int pipe_out[2];
+    pid_t pid, wret;
+    int status;
+    char *server = NULL, *user, *argv[7], *old = NULL, *new = NULL;
+
+    if (domainname && !(server = strdup_unixcp( domainname ))) return ERROR_OUTOFMEMORY;
+    if (!(user = strdup_unixcp( username )))
+    {
+        ret = ERROR_OUTOFMEMORY;
+        goto end;
+    }
+    if (!(old = strdup_unixcp( oldpassword )))
+    {
+        ret = ERROR_OUTOFMEMORY;
+        goto end;
+    }
+    if (!(new = strdup_unixcp( newpassword )))
+    {
+        ret = ERROR_OUTOFMEMORY;
+        goto end;
+    }
+    argv[0] = smbpasswd;
+    argv[1] = option_silent;
+    argv[2] = option_user;
+    argv[3] = user;
+    if (server)
+    {
+        argv[4] = option_remote;
+        argv[5] = server;
+        argv[6] = NULL;
+    }
+    else argv[4] = NULL;
+
+    if (pipe( pipe_out ) == -1)
+    {
+        ret = NERR_InternalError;
+        goto end;
+    }
+    fcntl( pipe_out[0], F_SETFD, FD_CLOEXEC );
+    fcntl( pipe_out[1], F_SETFD, FD_CLOEXEC );
+
+    switch ((pid = fork()))
+    {
+    case -1:
+        close( pipe_out[0] );
+        close( pipe_out[1] );
+        ret = NERR_InternalError;
+        goto end;
+    case 0:
+        dup2( pipe_out[0], 0 );
+        close( pipe_out[0] );
+        close( pipe_out[1] );
+        execvp( "smbpasswd", argv );
+        ERR( "can't execute smbpasswd, is it installed?\n" );
+        _exit(1);
+    default:
+        close( pipe_out[0] );
+        break;
+    }
+    write( pipe_out[1], old, strlen( old ) );
+    write( pipe_out[1], "\n", 1 );
+    write( pipe_out[1], new, strlen( new ) );
+    write( pipe_out[1], "\n", 1 );
+    write( pipe_out[1], new, strlen( new ) );
+    write( pipe_out[1], "\n", 1 );
+    close( pipe_out[1] );
+
+    do {
+        wret = waitpid(pid, &status, 0);
+    } while (wret < 0 && errno == EINTR);
+
+    if (ret == NERR_Success && (wret < 0 || !WIFEXITED(status) || WEXITSTATUS(status)))
+        ret = NERR_InternalError;
+
+end:
+    RtlFreeHeap( GetProcessHeap(), 0, server );
+    RtlFreeHeap( GetProcessHeap(), 0, user );
+    RtlFreeHeap( GetProcessHeap(), 0, old );
+    RtlFreeHeap( GetProcessHeap(), 0, new );
+    return ret;
+}
+
 static const struct samba_funcs samba_funcs =
 {
     server_getinfo,
     share_add,
     share_del,
     wksta_getinfo,
+    change_password,
 };
 
 NTSTATUS CDECL __wine_init_unix_lib( HMODULE module, DWORD reason, const void *ptr_in, void *ptr_out )
diff --git a/dlls/netapi32/unixlib.h b/dlls/netapi32/unixlib.h
index 9e84c035965..d5f18044bb5 100644
--- a/dlls/netapi32/unixlib.h
+++ b/dlls/netapi32/unixlib.h
@@ -24,4 +24,6 @@ struct samba_funcs
     NET_API_STATUS (WINAPI *share_add)( const WCHAR *server, DWORD level, const BYTE *buffer, DWORD *err );
     NET_API_STATUS (WINAPI *share_del)( const WCHAR *server, const WCHAR *share, DWORD reserved );
     NET_API_STATUS (WINAPI *wksta_getinfo)( const WCHAR *server, DWORD level, BYTE **buffer );
+    NET_API_STATUS (WINAPI *change_password)( const WCHAR *domain, const WCHAR *user,
+                                              const WCHAR *old, const WCHAR *new );
 };




More information about the wine-cvs mailing list