mirror of
https://github.com/clementine-player/Clementine
synced 2024-12-25 17:12:35 +01:00
67 lines
1.5 KiB
C++
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;
|
||
|
}
|
||
|
}
|