diff options
author | Daniel Baumann <daniel.baumann@progress-linux.org> | 2024-04-07 17:32:43 +0000 |
---|---|---|
committer | Daniel Baumann <daniel.baumann@progress-linux.org> | 2024-04-07 17:32:43 +0000 |
commit | 6bf0a5cb5034a7e684dcc3500e841785237ce2dd (patch) | |
tree | a68f146d7fa01f0134297619fbe7e33db084e0aa /comm/mailnews/base/src/nsUserInfoWin.cpp | |
parent | Initial commit. (diff) | |
download | thunderbird-upstream.tar.xz thunderbird-upstream.zip |
Adding upstream version 1:115.7.0.upstream/1%115.7.0upstream
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
Diffstat (limited to 'comm/mailnews/base/src/nsUserInfoWin.cpp')
-rw-r--r-- | comm/mailnews/base/src/nsUserInfoWin.cpp | 99 |
1 files changed, 99 insertions, 0 deletions
diff --git a/comm/mailnews/base/src/nsUserInfoWin.cpp b/comm/mailnews/base/src/nsUserInfoWin.cpp new file mode 100644 index 0000000000..a5b69cf9a2 --- /dev/null +++ b/comm/mailnews/base/src/nsUserInfoWin.cpp @@ -0,0 +1,99 @@ +/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +#include "nsUserInfo.h" + +#include "mozilla/ArrayUtils.h" // ArrayLength +#include "nsString.h" +#include "windows.h" +#include "nsCRT.h" + +#define SECURITY_WIN32 +#include "lm.h" +#include "security.h" + +nsUserInfo::nsUserInfo() {} + +nsUserInfo::~nsUserInfo() {} + +NS_IMPL_ISUPPORTS(nsUserInfo, nsIUserInfo) + +NS_IMETHODIMP +nsUserInfo::GetUsername(nsAString& aUsername) { + aUsername.Truncate(); + + // UNLEN is the max username length as defined in lmcons.h + wchar_t username[UNLEN + 1]; + DWORD size = mozilla::ArrayLength(username); + if (!GetUserNameW(username, &size)) return NS_OK; + + aUsername.Assign(username); + return NS_OK; +} + +NS_IMETHODIMP +nsUserInfo::GetFullname(nsAString& aFullname) { + aFullname.Truncate(); + + wchar_t fullName[512]; + DWORD size = mozilla::ArrayLength(fullName); + + if (GetUserNameExW(NameDisplay, fullName, &size)) { + aFullname.Assign(fullName); + } else { + // Try to use the net APIs regardless of the error because it may be + // able to obtain the information. + wchar_t username[UNLEN + 1]; + size = mozilla::ArrayLength(username); + if (!GetUserNameW(username, &size)) { + return NS_OK; + } + + const DWORD level = 2; + LPBYTE info; + // If the NetUserGetInfo function has no full name info it will return + // success with an empty string. + NET_API_STATUS status = NetUserGetInfo(nullptr, username, level, &info); + if (status != NERR_Success) { + return NS_OK; + } + + aFullname.Assign(reinterpret_cast<USER_INFO_2*>(info)->usri2_full_name); + NetApiBufferFree(info); + } + + return NS_OK; +} + +NS_IMETHODIMP +nsUserInfo::GetDomain(nsAString& aDomain) { + aDomain.Truncate(); + + const DWORD level = 100; + LPBYTE info; + NET_API_STATUS status = NetWkstaGetInfo(nullptr, level, &info); + if (status == NERR_Success) { + aDomain.Assign(reinterpret_cast<WKSTA_INFO_100*>(info)->wki100_langroup); + NetApiBufferFree(info); + } + + return NS_OK; +} + +NS_IMETHODIMP +nsUserInfo::GetEmailAddress(nsAString& aEmailAddress) { + aEmailAddress.Truncate(); + + // RFC3696 says max length of an email address is 254 + wchar_t emailAddress[255]; + DWORD size = mozilla::ArrayLength(emailAddress); + + if (!GetUserNameExW(NameUserPrincipal, emailAddress, &size)) { + return NS_OK; + } + + aEmailAddress.Assign(emailAddress); + return NS_OK; +} |