From 55872d6baea2e501bde161d3e3530d6e64c44dbb Mon Sep 17 00:00:00 2001 From: Joseph Davies Date: Fri, 26 Dec 2014 22:10:29 -0800 Subject: [PATCH] Split pfPasswordStore into platform-specific files. --- .../FeatureLib/pfPasswordStore/CMakeLists.txt | 18 +++ .../pfPasswordStore/pfPasswordStore.cpp | 109 ------------------ .../pfPasswordStore/pfPasswordStore_Mac.cpp | 91 +++++++++++++++ .../pfPasswordStore/pfPasswordStore_Unix.cpp | 58 ++++++++++ .../pfPasswordStore/pfPasswordStore_Win.cpp | 103 +++++++++++++++++ 5 files changed, 270 insertions(+), 109 deletions(-) create mode 100644 Sources/Plasma/FeatureLib/pfPasswordStore/pfPasswordStore_Mac.cpp create mode 100644 Sources/Plasma/FeatureLib/pfPasswordStore/pfPasswordStore_Unix.cpp create mode 100644 Sources/Plasma/FeatureLib/pfPasswordStore/pfPasswordStore_Win.cpp diff --git a/Sources/Plasma/FeatureLib/pfPasswordStore/CMakeLists.txt b/Sources/Plasma/FeatureLib/pfPasswordStore/CMakeLists.txt index cfd25436..db876e3b 100644 --- a/Sources/Plasma/FeatureLib/pfPasswordStore/CMakeLists.txt +++ b/Sources/Plasma/FeatureLib/pfPasswordStore/CMakeLists.txt @@ -12,6 +12,24 @@ set(pfPasswordStore_SOURCES pfPasswordStore.cpp ) +if(WIN32 AND NOT CYGWIN) + set(pfPasswordStore_SOURCES ${pfPasswordStore_SOURCES} + pfPasswordStore_Win.cpp + ) +endif(WIN32 AND NOT CYGWIN) + +if(UNIX) + set(pfPasswordStore_SOURCES ${pfPasswordStore_SOURCES} + pfPasswordStore_Unix.cpp + ) +endif(UNIX) + +if(APPLE) + set(pfPasswordStore_SOURCES ${pfPasswordStore_SOURCES} + pfPasswordStore_Mac.cpp + ) +endif(APPLE) + add_library(pfPasswordStore STATIC ${pfPasswordStore_HEADERS} ${pfPasswordStore_SOURCES}) target_link_libraries(pfPasswordStore CoreLib plFile) diff --git a/Sources/Plasma/FeatureLib/pfPasswordStore/pfPasswordStore.cpp b/Sources/Plasma/FeatureLib/pfPasswordStore/pfPasswordStore.cpp index 3395a87e..32d85f33 100644 --- a/Sources/Plasma/FeatureLib/pfPasswordStore/pfPasswordStore.cpp +++ b/Sources/Plasma/FeatureLib/pfPasswordStore/pfPasswordStore.cpp @@ -142,112 +142,3 @@ bool pfFilePasswordStore::SetPassword(const plString& username, const plString& return false; } - - - -#ifdef HS_BUILD_FOR_WIN32 -#include "hsWindows.h" -#include - -/***************************************************************************** - ** pfWin32PasswordStore ** - *****************************************************************************/ -const plString pfWin32PasswordStore::GetPassword(const plString& username) -{ - PCREDENTIALW credential; - plString target = plString::Format("%s__%s", plProduct::UUID(), username.c_str()); - plString password = plString::Null; - - if (!CredReadW(target.ToWchar().GetData(), CRED_TYPE_GENERIC, 0, &credential)) { - return password; - } - - password = plString::FromUtf8(reinterpret_cast(credential->CredentialBlob), credential->CredentialBlobSize); - - memset(credential->CredentialBlob, 0, credential->CredentialBlobSize); - CredFree(credential); - - return password; -} - - -bool pfWin32PasswordStore::SetPassword(const plString& username, const plString& password) -{ - CREDENTIALW credential; - plString target = plString::Format("%s__%s", plProduct::UUID(), username.c_str()); - - if (password.IsNull()) { - if (CredDeleteW(target.ToWchar().GetData(), CRED_TYPE_GENERIC, 0)) { - return true; - } - return false; - } - - plStringBuffer tbuff = target.ToWchar(); - plStringBuffer pbuff = password.ToUtf8(); - plStringBuffer ubuff = username.ToWchar(); - - memset(&credential, 0, sizeof(CREDENTIALW)); - credential.Type = CRED_TYPE_GENERIC; - credential.TargetName = (LPWSTR)tbuff.GetData(); - credential.CredentialBlobSize = pbuff.GetSize(); - credential.CredentialBlob = (LPBYTE)pbuff.GetData(); - credential.Persist = CRED_PERSIST_LOCAL_MACHINE; - credential.UserName = (LPWSTR)ubuff.GetData(); - - if (!CredWriteW(&credential, 0)) { - return false; - } - - return true; -} -#endif - - - -#ifdef HS_BUILD_FOR_OSX -#include - -/***************************************************************************** - ** pfMacPasswordStore ** - *****************************************************************************/ -const plString pfMacPasswordStore::GetPassword(const plString& username) -{ - plString service = plProduct::UUID(); - - void* passwd = nullptr; - uint32_t passwd_len = 0; - - if (SecKeychainFindGenericPassword(nullptr, - service.GetSize(), - service.c_str(), - username.GetSize(), - username.c_str(), - &passwd_len, - &passwd, - nullptr) != errSecSuccess) - { - return plString::Null; - } - - plString ret(reinterpret_cast(passwd), size_t(passwd_len)); - - SecKeychainItemFreeContent(nullptr, passwd); - - return ret; -} - -bool pfMacPasswordStore::SetPassword(const plString& username, const plString& password) -{ - plString service = plProduct::UUID(); - - return SecKeychainAddGenericPassword(nullptr, - service.GetSize(), - service.c_str(), - username.GetSize(), - username.c_str(), - password.GetSize(), - password.c_str(), - nullptr) == errSecSuccess; -} -#endif diff --git a/Sources/Plasma/FeatureLib/pfPasswordStore/pfPasswordStore_Mac.cpp b/Sources/Plasma/FeatureLib/pfPasswordStore/pfPasswordStore_Mac.cpp new file mode 100644 index 00000000..78b728b7 --- /dev/null +++ b/Sources/Plasma/FeatureLib/pfPasswordStore/pfPasswordStore_Mac.cpp @@ -0,0 +1,91 @@ +/*==LICENSE==* + +CyanWorlds.com Engine - MMOG client, server and tools +Copyright (C) 2011 Cyan Worlds, Inc. + +This program is free software: you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program. If not, see . + +Additional permissions under GNU GPL version 3 section 7 + +If you modify this Program, or any covered work, by linking or +combining it with any of RAD Game Tools Bink SDK, Autodesk 3ds Max SDK, +NVIDIA PhysX SDK, Microsoft DirectX SDK, OpenSSL library, Independent +JPEG Group JPEG library, Microsoft Windows Media SDK, or Apple QuickTime SDK +(or a modified version of those libraries), +containing parts covered by the terms of the Bink SDK EULA, 3ds Max EULA, +PhysX SDK EULA, DirectX SDK EULA, OpenSSL and SSLeay licenses, IJG +JPEG Library README, Windows Media SDK EULA, or QuickTime SDK EULA, the +licensors of this Program grant you additional +permission to convey the resulting work. Corresponding Source for a +non-source form of such a combination shall include the source code for +the parts of OpenSSL and IJG JPEG Library used as well as that of the covered +work. + +You can contact Cyan Worlds, Inc. by email legal@cyan.com + or by snail mail at: + Cyan Worlds, Inc. + 14617 N Newport Hwy + Mead, WA 99021 + +*==LICENSE==*/ + +#include "pfPasswordStore.h" +#include "pfPasswordStore_impl.h" + +#include "plProduct.h" + +#include + +/***************************************************************************** + ** pfMacPasswordStore ** + *****************************************************************************/ +const plString pfMacPasswordStore::GetPassword(const plString& username) +{ + plString service = plProduct::UUID(); + + void* passwd = nullptr; + uint32_t passwd_len = 0; + + if (SecKeychainFindGenericPassword(nullptr, + service.GetSize(), + service.c_str(), + username.GetSize(), + username.c_str(), + &passwd_len, + &passwd, + nullptr) != errSecSuccess) + { + return plString::Null; + } + + plString ret(reinterpret_cast(passwd), size_t(passwd_len)); + + SecKeychainItemFreeContent(nullptr, passwd); + + return ret; +} + +bool pfMacPasswordStore::SetPassword(const plString& username, const plString& password) +{ + plString service = plProduct::UUID(); + + return SecKeychainAddGenericPassword(nullptr, + service.GetSize(), + service.c_str(), + username.GetSize(), + username.c_str(), + password.GetSize(), + password.c_str(), + nullptr) == errSecSuccess; +} diff --git a/Sources/Plasma/FeatureLib/pfPasswordStore/pfPasswordStore_Unix.cpp b/Sources/Plasma/FeatureLib/pfPasswordStore/pfPasswordStore_Unix.cpp new file mode 100644 index 00000000..6725c885 --- /dev/null +++ b/Sources/Plasma/FeatureLib/pfPasswordStore/pfPasswordStore_Unix.cpp @@ -0,0 +1,58 @@ +/*==LICENSE==* + +CyanWorlds.com Engine - MMOG client, server and tools +Copyright (C) 2011 Cyan Worlds, Inc. + +This program is free software: you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program. If not, see . + +Additional permissions under GNU GPL version 3 section 7 + +If you modify this Program, or any covered work, by linking or +combining it with any of RAD Game Tools Bink SDK, Autodesk 3ds Max SDK, +NVIDIA PhysX SDK, Microsoft DirectX SDK, OpenSSL library, Independent +JPEG Group JPEG library, Microsoft Windows Media SDK, or Apple QuickTime SDK +(or a modified version of those libraries), +containing parts covered by the terms of the Bink SDK EULA, 3ds Max EULA, +PhysX SDK EULA, DirectX SDK EULA, OpenSSL and SSLeay licenses, IJG +JPEG Library README, Windows Media SDK EULA, or QuickTime SDK EULA, the +licensors of this Program grant you additional +permission to convey the resulting work. Corresponding Source for a +non-source form of such a combination shall include the source code for +the parts of OpenSSL and IJG JPEG Library used as well as that of the covered +work. + +You can contact Cyan Worlds, Inc. by email legal@cyan.com + or by snail mail at: + Cyan Worlds, Inc. + 14617 N Newport Hwy + Mead, WA 99021 + +*==LICENSE==*/ + +#include "pfPasswordStore.h" +#include "pfPasswordStore_impl.h" + +#include "plProduct.h" + + +/***************************************************************************** + ** pfUnixPasswordStore ** + *****************************************************************************/ +const plString pfUnixPasswordStore::GetPassword(const plString& username) +{ +} + +bool pfUnixPasswordStore::SetPassword(const plString& username, const plString& password) +{ +} diff --git a/Sources/Plasma/FeatureLib/pfPasswordStore/pfPasswordStore_Win.cpp b/Sources/Plasma/FeatureLib/pfPasswordStore/pfPasswordStore_Win.cpp new file mode 100644 index 00000000..ca0ecd6b --- /dev/null +++ b/Sources/Plasma/FeatureLib/pfPasswordStore/pfPasswordStore_Win.cpp @@ -0,0 +1,103 @@ +/*==LICENSE==* + +CyanWorlds.com Engine - MMOG client, server and tools +Copyright (C) 2011 Cyan Worlds, Inc. + +This program is free software: you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program. If not, see . + +Additional permissions under GNU GPL version 3 section 7 + +If you modify this Program, or any covered work, by linking or +combining it with any of RAD Game Tools Bink SDK, Autodesk 3ds Max SDK, +NVIDIA PhysX SDK, Microsoft DirectX SDK, OpenSSL library, Independent +JPEG Group JPEG library, Microsoft Windows Media SDK, or Apple QuickTime SDK +(or a modified version of those libraries), +containing parts covered by the terms of the Bink SDK EULA, 3ds Max EULA, +PhysX SDK EULA, DirectX SDK EULA, OpenSSL and SSLeay licenses, IJG +JPEG Library README, Windows Media SDK EULA, or QuickTime SDK EULA, the +licensors of this Program grant you additional +permission to convey the resulting work. Corresponding Source for a +non-source form of such a combination shall include the source code for +the parts of OpenSSL and IJG JPEG Library used as well as that of the covered +work. + +You can contact Cyan Worlds, Inc. by email legal@cyan.com + or by snail mail at: + Cyan Worlds, Inc. + 14617 N Newport Hwy + Mead, WA 99021 + +*==LICENSE==*/ + +#include "pfPasswordStore.h" +#include "pfPasswordStore_impl.h" + +#include "plProduct.h" +#include "plFormat.h" + +#include "hsWindows.h" +#include + +/***************************************************************************** + ** pfWin32PasswordStore ** + *****************************************************************************/ +const plString pfWin32PasswordStore::GetPassword(const plString& username) +{ + PCREDENTIALW credential; + plString target = plFormat("%s__%s", plProduct::UUID(), username); + plString password = plString::Null; + + if (!CredReadW(target.ToWchar().GetData(), CRED_TYPE_GENERIC, 0, &credential)) { + return password; + } + + password = plString::FromUtf8(reinterpret_cast(credential->CredentialBlob), credential->CredentialBlobSize); + + memset(credential->CredentialBlob, 0, credential->CredentialBlobSize); + CredFree(credential); + + return password; +} + + +bool pfWin32PasswordStore::SetPassword(const plString& username, const plString& password) +{ + CREDENTIALW credential; + plString target = plFormat("%s__%s", plProduct::UUID(), username); + + if (password.IsNull()) { + if (CredDeleteW(target.ToWchar().GetData(), CRED_TYPE_GENERIC, 0)) { + return true; + } + return false; + } + + plStringBuffer tbuff = target.ToWchar(); + plStringBuffer pbuff = password.ToUtf8(); + plStringBuffer ubuff = username.ToWchar(); + + memset(&credential, 0, sizeof(CREDENTIALW)); + credential.Type = CRED_TYPE_GENERIC; + credential.TargetName = (LPWSTR)tbuff.GetData(); + credential.CredentialBlobSize = pbuff.GetSize(); + credential.CredentialBlob = (LPBYTE)pbuff.GetData(); + credential.Persist = CRED_PERSIST_LOCAL_MACHINE; + credential.UserName = (LPWSTR)ubuff.GetData(); + + if (!CredWriteW(&credential, 0)) { + return false; + } + + return true; +}