Clementine-audio-player-Mac.../3rdparty/keychain/mac_keychain.cpp

67 lines
1.5 KiB
C++

#include "mac_keychain.h"
#include <Security/Security.h>
const QString MacKeychain::kImplementationName = "Mac Keychain";
bool MacKeychain::isAvailable() {
return true;
}
const QString MacKeychain::getPassword(const QString& account) {
UInt32 password_length;
char* password;
OSStatus ret = SecKeychainFindGenericPassword(
NULL,
kServiceName.length(),
kServiceName.toStdString().c_str(),
account.length(),
account.toStdString().c_str(),
&password_length,
(void**)&password,
NULL);
if (ret == 0) {
QString pass = QString::fromAscii(password, password_length);
SecKeychainItemFreeContent(NULL, password);
return pass;
}
return QString::null;
}
bool MacKeychain::setPassword(const QString& account, const QString& password) {
SecKeychainItemRef item;
OSStatus ret = SecKeychainFindGenericPassword(
NULL,
kServiceName.length(),
kServiceName.toStdString().c_str(),
account.length(),
account.toStdString().c_str(),
NULL,
NULL,
&item);
if (ret == 0) {
ret = SecKeychainItemModifyAttributesAndData(
item,
NULL,
password.length(),
password.toStdString().c_str());
return ret == 0;
} else {
ret = SecKeychainAddGenericPassword(
NULL,
kServiceName.length(),
kServiceName.toStdString().c_str(),
account.length(),
account.toStdString().c_str(),
password.length(),
password.toStdString().c_str(),
NULL);
return ret == 0;
}
}