From 005a3c7c1239b156f7df2cd8e6d8efd107717f64 Mon Sep 17 00:00:00 2001 From: Stephen Birarda Date: Thu, 24 Jul 2014 17:17:57 -0700 Subject: [PATCH] persist and recall domain-server web sessions from ini settings --- domain-server/src/DomainServer.cpp | 28 ++++++++++++++++++- domain-server/src/DomainServer.h | 2 ++ .../src/DomainServerWebSessionData.cpp | 10 +++++++ .../src/DomainServerWebSessionData.h | 5 ++++ 4 files changed, 44 insertions(+), 1 deletion(-) diff --git a/domain-server/src/DomainServer.cpp b/domain-server/src/DomainServer.cpp index 4261b5033b..e462e05aa6 100644 --- a/domain-server/src/DomainServer.cpp +++ b/domain-server/src/DomainServer.cpp @@ -50,6 +50,9 @@ DomainServer::DomainServer(int argc, char* argv[]) : setOrganizationDomain("highfidelity.io"); setApplicationName("domain-server"); QSettings::setDefaultFormat(QSettings::IniFormat); + + qRegisterMetaType("DomainServerWebSessionData"); + qRegisterMetaTypeStreamOperators("DomainServerWebSessionData"); _argumentVariantMap = HifiConfigVariantMap::mergeCLParametersWithJSONConfig(arguments()); @@ -59,6 +62,8 @@ DomainServer::DomainServer(int argc, char* argv[]) : qDebug() << "Setting up LimitedNodeList and assignments."; setupNodeListAndAssignments(); + + loadExistingSessionsFromSettings(); } } @@ -1407,6 +1412,9 @@ void DomainServer::handleProfileRequestFinished() { } } + +const QString DS_SETTINGS_SESSIONS_GROUP = "web-sessions"; + Headers DomainServer::setupCookieHeadersFromProfileReply(QNetworkReply* profileReply) { Headers cookieHeaders; @@ -1417,7 +1425,14 @@ Headers DomainServer::setupCookieHeadersFromProfileReply(QNetworkReply* profileR QJsonObject userObject = profileDocument.object()["data"].toObject()["user"].toObject(); // add the profile to our in-memory data structure so we know who the user is when they send us their cookie - _cookieSessionHash.insert(cookieUUID, DomainServerWebSessionData(userObject)); + DomainServerWebSessionData sessionData(userObject); + _cookieSessionHash.insert(cookieUUID, sessionData); + + // persist the cookie to settings file so we can get it back on DS relaunch + QSettings localSettings; + localSettings.beginGroup(DS_SETTINGS_SESSIONS_GROUP); + QVariant sessionVariant = QVariant::fromValue(sessionData); + localSettings.setValue(cookieUUID.toString(), QVariant::fromValue(sessionData)); // setup expiry for cookie to 1 month from today QDateTime cookieExpiry = QDateTime::currentDateTimeUtc().addMonths(1); @@ -1435,6 +1450,17 @@ Headers DomainServer::setupCookieHeadersFromProfileReply(QNetworkReply* profileR return cookieHeaders; } +void DomainServer::loadExistingSessionsFromSettings() { + // read data for existing web sessions into memory so existing sessions can be leveraged + QSettings domainServerSettings; + domainServerSettings.beginGroup(DS_SETTINGS_SESSIONS_GROUP); + + foreach(const QString& uuidKey, domainServerSettings.childKeys()) { + _cookieSessionHash.insert(QUuid(uuidKey), domainServerSettings.value(uuidKey).value()); + qDebug() << "Pulled web session from settings - cookie UUID is" << uuidKey; + } +} + void DomainServer::refreshStaticAssignmentAndAddToQueue(SharedAssignmentPointer& assignment) { QUuid oldUUID = assignment->getUUID(); assignment->resetUUID(); diff --git a/domain-server/src/DomainServer.h b/domain-server/src/DomainServer.h index f8daa9a529..666994c818 100644 --- a/domain-server/src/DomainServer.h +++ b/domain-server/src/DomainServer.h @@ -93,6 +93,8 @@ private: void handleProfileRequestFinished(); Headers setupCookieHeadersFromProfileReply(QNetworkReply* profileReply); + void loadExistingSessionsFromSettings(); + QJsonObject jsonForSocket(const HifiSockAddr& socket); QJsonObject jsonObjectForNode(const SharedNodePointer& node); diff --git a/domain-server/src/DomainServerWebSessionData.cpp b/domain-server/src/DomainServerWebSessionData.cpp index b0c56cc59e..ee32a17570 100644 --- a/domain-server/src/DomainServerWebSessionData.cpp +++ b/domain-server/src/DomainServerWebSessionData.cpp @@ -51,3 +51,13 @@ void DomainServerWebSessionData::swap(DomainServerWebSessionData& otherSessionDa swap(_roles, otherSessionData._roles); } +QDataStream& operator<<(QDataStream &out, const DomainServerWebSessionData& session) { + out << session._username << session._roles; + return out; +} + +QDataStream& operator>>(QDataStream &in, DomainServerWebSessionData& session) { + in >> session._username >> session._roles; + return in; +} + diff --git a/domain-server/src/DomainServerWebSessionData.h b/domain-server/src/DomainServerWebSessionData.h index 15e4171b57..450bc13a9b 100644 --- a/domain-server/src/DomainServerWebSessionData.h +++ b/domain-server/src/DomainServerWebSessionData.h @@ -26,6 +26,9 @@ public: const QString& getUsername() const { return _username; } const QSet& getRoles() const { return _roles; } + friend QDataStream& operator<<(QDataStream &out, const DomainServerWebSessionData& session); + friend QDataStream& operator>>(QDataStream &in, DomainServerWebSessionData& session); + private: void swap(DomainServerWebSessionData& otherSessionData); @@ -33,4 +36,6 @@ private: QSet _roles; }; +Q_DECLARE_METATYPE(DomainServerWebSessionData) + #endif // hifi_DomainServerWebSessionData_h \ No newline at end of file