https://git.reactos.org/?p=reactos.git;a=commitdiff;h=b4969dc0d729e913a3aa59...
commit b4969dc0d729e913a3aa593e9ddc4dbb12b432c6 Author: Eric Kohl eric.kohl@reactos.org AuthorDate: Sat Jul 7 22:06:08 2018 +0200 Commit: Eric Kohl eric.kohl@reactos.org CommitDate: Mon Jul 9 05:56:40 2018 +0200
[NET] Implement the undocumented /RANDOM option to generate random passwords --- base/applications/network/net/cmdUser.c | 45 +++++++++++++++++++++++++++++++++ 1 file changed, 45 insertions(+)
diff --git a/base/applications/network/net/cmdUser.c b/base/applications/network/net/cmdUser.c index 3ee392b6c5..7750d247da 100644 --- a/base/applications/network/net/cmdUser.c +++ b/base/applications/network/net/cmdUser.c @@ -10,6 +10,8 @@
#include "net.h"
+static WCHAR szPasswordChars[] = L"0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ@#$%_-+:"; + static int CompareUserInfo(const void *a, const void *b) @@ -356,6 +358,35 @@ ReadPassword( }
+static +VOID +GenerateRandomPassword( + LPWSTR *lpPassword, + LPBOOL lpAllocated) +{ + LPWSTR pPassword = NULL; + INT nCharsLen, i, nLength = 8; + + srand(GetTickCount()); + + pPassword = HeapAlloc(GetProcessHeap(), + HEAP_ZERO_MEMORY, + (nLength + 1) * sizeof(WCHAR)); + if (pPassword == NULL) + return; + + nCharsLen = wcslen(szPasswordChars); + + for (i = 0; i < nLength; i++) + { + pPassword[i] = szPasswordChars[rand() % nCharsLen]; + } + + *lpPassword = pPassword; + *lpAllocated = TRUE; +} + + INT cmdUser( INT argc, @@ -368,6 +399,7 @@ cmdUser( #if 0 BOOL bDomain = FALSE; #endif + BOOL bRandomPassword = FALSE; LPWSTR lpUserName = NULL; LPWSTR lpPassword = NULL; PUSER_INFO_4 pUserInfo = NULL; @@ -428,6 +460,12 @@ cmdUser( bDomain = TRUE; #endif } + else if (_wcsicmp(argv[j], L"/random") == 0) + { + bRandomPassword = TRUE; + GenerateRandomPassword(&lpPassword, + &bPasswordAllocated); + } }
if (bAdd && bDelete) @@ -616,6 +654,13 @@ cmdUser( ConPrintf(StdOut, L"Status: %lu\n", Status); }
+ if (Status == NERR_Success && + lpPassword != NULL && + bRandomPassword == TRUE) + { + ConPrintf(StdOut, L"The password for %s is: %s\n", lpUserName, lpPassword); + } + done: if ((bPasswordAllocated != FALSE) && (lpPassword != NULL)) HeapFree(GetProcessHeap(), 0, lpPassword);