diff --git a/Sources/Plasma/FeatureLib/pfPasswordStore/CMakeLists.txt b/Sources/Plasma/FeatureLib/pfPasswordStore/CMakeLists.txt index 2ab83c4e..cfd25436 100644 --- a/Sources/Plasma/FeatureLib/pfPasswordStore/CMakeLists.txt +++ b/Sources/Plasma/FeatureLib/pfPasswordStore/CMakeLists.txt @@ -15,6 +15,11 @@ set(pfPasswordStore_SOURCES add_library(pfPasswordStore STATIC ${pfPasswordStore_HEADERS} ${pfPasswordStore_SOURCES}) target_link_libraries(pfPasswordStore CoreLib plFile) +if(APPLE) + find_library(SECURITY_LIBRARY Security) + target_link_libraries(pfPasswordStore ${SECURITY_LIBRARY}) +endif(APPLE) + source_group("Header Files" FILES ${pfPasswordStore_HEADERS}) source_group("Source Files" FILES ${pfPasswordStore_SOURCES}) diff --git a/Sources/Plasma/FeatureLib/pfPasswordStore/pfPasswordStore.cpp b/Sources/Plasma/FeatureLib/pfPasswordStore/pfPasswordStore.cpp index e3880f1b..3395a87e 100644 --- a/Sources/Plasma/FeatureLib/pfPasswordStore/pfPasswordStore.cpp +++ b/Sources/Plasma/FeatureLib/pfPasswordStore/pfPasswordStore.cpp @@ -54,8 +54,12 @@ pfPasswordStore* pfPasswordStore::Instance() if (store == nullptr) { #ifdef HS_BUILD_FOR_WIN32 store = new pfWin32PasswordStore(); +#else +#ifdef HS_BUILD_FOR_OSX + store = new pfMacPasswordStore(); #else store = new pfFilePasswordStore(); +#endif #endif } @@ -198,3 +202,52 @@ bool pfWin32PasswordStore::SetPassword(const plString& username, const plString& 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_impl.h b/Sources/Plasma/FeatureLib/pfPasswordStore/pfPasswordStore_impl.h index 0f104ef9..637f9842 100644 --- a/Sources/Plasma/FeatureLib/pfPasswordStore/pfPasswordStore_impl.h +++ b/Sources/Plasma/FeatureLib/pfPasswordStore/pfPasswordStore_impl.h @@ -80,8 +80,18 @@ public: * @todo A Linux libsecret-based storage mechanism. */ +#ifdef HS_BUILD_FOR_OSX /** -* @todo An OSX KeyChain-based storage mechanism. -*/ + * An OSX Keychain password storage mechanism. + */ +class pfMacPasswordStore : public pfPasswordStore +{ +public: + pfMacPasswordStore() { } + + virtual const plString GetPassword(const plString& username); + virtual bool SetPassword(const plString& username, const plString& password); +}; +#endif //HS_BUILD_FOR_OSX #endif //pfPasswordStore_impl_inc