allow for creation of domain-server keypair in AccountManager

This commit is contained in:
Stephen Birarda 2016-02-19 14:34:19 -08:00
parent 75429e39bc
commit af181e00b1
4 changed files with 35 additions and 9 deletions

View file

@ -526,6 +526,8 @@ void DomainServer::setupICEHeartbeatForFullNetworking() {
// we need this DS to know what our public IP is - start trying to figure that out now // we need this DS to know what our public IP is - start trying to figure that out now
limitedNodeList->startSTUNPublicSocketUpdate(); limitedNodeList->startSTUNPublicSocketUpdate();
// to send ICE heartbeats we'd better have a private key locally with an uploaded public key
if (!_iceHeartbeatTimer) { if (!_iceHeartbeatTimer) {
// setup a timer to heartbeat with the ice-server every so often // setup a timer to heartbeat with the ice-server every so often
_iceHeartbeatTimer = new QTimer { this }; _iceHeartbeatTimer = new QTimer { this };

View file

@ -82,7 +82,7 @@ AccountManager::AccountManager() :
connect(&_accountInfo, &DataServerAccountInfo::balanceChanged, this, &AccountManager::accountInfoBalanceChanged); connect(&_accountInfo, &DataServerAccountInfo::balanceChanged, this, &AccountManager::accountInfoBalanceChanged);
// once we have a profile in account manager make sure we generate a new keypair // once we have a profile in account manager make sure we generate a new keypair
connect(this, &AccountManager::profileChanged, this, &AccountManager::generateNewKeypair); connect(this, &AccountManager::profileChanged, this, &AccountManager::generateNewUserKeypair);
} }
const QString DOUBLE_SLASH_SUBSTITUTE = "slashslash"; const QString DOUBLE_SLASH_SUBSTITUTE = "slashslash";
@ -482,23 +482,32 @@ void AccountManager::requestProfileError(QNetworkReply::NetworkError error) {
qCDebug(networking) << "AccountManager requestProfileError - " << error; qCDebug(networking) << "AccountManager requestProfileError - " << error;
} }
void AccountManager::generateNewKeypair() { void AccountManager::generateNewKeypair(bool isUserKeypair, const QUuid& domainID) {
if (!isUserKeypair && domainID.isNull()) {
qWarning() << "AccountManager::generateNewKeypair called for domain keypair with no domain ID. Will not generate keypair.";
return;
}
// setup a new QThread to generate the keypair on, in case it takes a while // setup a new QThread to generate the keypair on, in case it takes a while
QThread* generateThread = new QThread(this); QThread* generateThread = new QThread(this);
generateThread->setObjectName("Account Manager Generator Thread"); generateThread->setObjectName("Account Manager Generator Thread");
// setup a keypair generator // setup a keypair generator
RSAKeypairGenerator* keypairGenerator = new RSAKeypairGenerator(); RSAKeypairGenerator* keypairGenerator = new RSAKeypairGenerator();
if (!isUserKeypair) {
keypairGenerator->setDomainID(domainID);
}
connect(generateThread, &QThread::started, keypairGenerator, &RSAKeypairGenerator::generateKeypair); connect(generateThread, &QThread::started, keypairGenerator, &RSAKeypairGenerator::generateKeypair);
connect(keypairGenerator, &RSAKeypairGenerator::generatedKeypair, this, &AccountManager::processGeneratedKeypair); connect(keypairGenerator, &RSAKeypairGenerator::generatedKeypair, this, &AccountManager::processGeneratedKeypair);
connect(keypairGenerator, &RSAKeypairGenerator::errorGeneratingKeypair, connect(keypairGenerator, &RSAKeypairGenerator::errorGeneratingKeypair,
this, &AccountManager::handleKeypairGenerationError); this, &AccountManager::handleKeypairGenerationError);
connect(keypairGenerator, &QObject::destroyed, generateThread, &QThread::quit); connect(keypairGenerator, &QObject::destroyed, generateThread, &QThread::quit);
connect(generateThread, &QThread::finished, generateThread, &QThread::deleteLater); connect(generateThread, &QThread::finished, generateThread, &QThread::deleteLater);
keypairGenerator->moveToThread(generateThread); keypairGenerator->moveToThread(generateThread);
qCDebug(networking) << "Starting worker thread to generate 2048-bit RSA key-pair."; qCDebug(networking) << "Starting worker thread to generate 2048-bit RSA key-pair.";
generateThread->start(); generateThread->start();
} }

View file

@ -87,7 +87,9 @@ public slots:
void logout(); void logout();
void updateBalance(); void updateBalance();
void accountInfoBalanceChanged(qint64 newBalance); void accountInfoBalanceChanged(qint64 newBalance);
void generateNewKeypair(); void generateNewUserKeypair() { generateNewKeypair(); }
void generateNewDomainKeypair(const QUuid& domainID) { generateNewKeypair(false, domainID); }
signals: signals:
void authRequired(); void authRequired();
void authEndpointChanged(); void authEndpointChanged();
@ -97,10 +99,12 @@ signals:
void loginFailed(); void loginFailed();
void logoutComplete(); void logoutComplete();
void balanceChanged(qint64 newBalance); void balanceChanged(qint64 newBalance);
private slots: private slots:
void processReply(); void processReply();
void handleKeypairGenerationError(); void handleKeypairGenerationError();
void processGeneratedKeypair(const QByteArray& publicKey, const QByteArray& privateKey); void processGeneratedKeypair(const QByteArray& publicKey, const QByteArray& privateKey);
private: private:
AccountManager(); AccountManager();
AccountManager(AccountManager const& other); // not implemented AccountManager(AccountManager const& other); // not implemented
@ -111,6 +115,8 @@ private:
void passSuccessToCallback(QNetworkReply* reply); void passSuccessToCallback(QNetworkReply* reply);
void passErrorToCallback(QNetworkReply* reply); void passErrorToCallback(QNetworkReply* reply);
void generateNewKeypair(bool isUserKeypair = true, const QUuid& domainID = QUuid());
QUrl _authURL; QUrl _authURL;
QMap<QNetworkReply*, JSONCallbackParameters> _pendingCallbackMap; QMap<QNetworkReply*, JSONCallbackParameters> _pendingCallbackMap;

View file

@ -12,17 +12,26 @@
#ifndef hifi_RSAKeypairGenerator_h #ifndef hifi_RSAKeypairGenerator_h
#define hifi_RSAKeypairGenerator_h #define hifi_RSAKeypairGenerator_h
#include <qobject.h> #include <QtCore/QObject>
#include <QtCore/QUuid>
class RSAKeypairGenerator : public QObject { class RSAKeypairGenerator : public QObject {
Q_OBJECT Q_OBJECT
public: public:
RSAKeypairGenerator(QObject* parent = 0); RSAKeypairGenerator(QObject* parent = 0);
void setDomainID(const QUuid& domainID) { _domainID = domainID; }
const QUuid& getDomainID() const { return _domainID; }
public slots: public slots:
void generateKeypair(); void generateKeypair();
signals: signals:
void errorGeneratingKeypair(); void errorGeneratingKeypair();
void generatedKeypair(const QByteArray& publicKey, const QByteArray& privateKey); void generatedKeypair(const QByteArray& publicKey, const QByteArray& privateKey);
private:
QUuid _domainID;
}; };
#endif // hifi_RSAKeypairGenerator_h #endif // hifi_RSAKeypairGenerator_h