allow domain-server to serve settings publicly, fix retry in DomainHandler

This commit is contained in:
Stephen Birarda 2014-07-28 14:56:26 -07:00
parent 6334116070
commit dbf41c8a42
4 changed files with 44 additions and 30 deletions

View file

@ -940,6 +940,12 @@ bool DomainServer::handleHTTPRequest(HTTPConnection* connection, const QUrl& url
const QString UUID_REGEX_STRING = "[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}"; const QString UUID_REGEX_STRING = "[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}";
// allow sub-handlers to handle requests that do not require authentication
if (_settingsManager.handlePublicHTTPRequest(connection, url)) {
return true;
}
// all requests below require a cookie to prove authentication so check that first
if (!isAuthenticatedRequest(connection, url)) { if (!isAuthenticatedRequest(connection, url)) {
// this is not an authenticated request // this is not an authenticated request
// return true from the handler since it was handled with a 401 or re-direct to auth // return true from the handler since it was handled with a 401 or re-direct to auth
@ -1186,7 +1192,7 @@ bool DomainServer::handleHTTPRequest(HTTPConnection* connection, const QUrl& url
} }
// didn't process the request, let our DomainServerSettingsManager or HTTPManager handle // didn't process the request, let our DomainServerSettingsManager or HTTPManager handle
return _settingsManager.handleHTTPRequest(connection, url); return _settingsManager.handleAuthenticatedHTTPRequest(connection, url);
} }
const QString HIFI_SESSION_COOKIE_KEY = "DS_WEB_SESSION_UUID"; const QString HIFI_SESSION_COOKIE_KEY = "DS_WEB_SESSION_UUID";

View file

@ -47,24 +47,8 @@ DomainServerSettingsManager::DomainServerSettingsManager() :
const QString DESCRIPTION_SETTINGS_KEY = "settings"; const QString DESCRIPTION_SETTINGS_KEY = "settings";
const QString SETTING_DEFAULT_KEY = "default"; const QString SETTING_DEFAULT_KEY = "default";
bool DomainServerSettingsManager::handleHTTPRequest(HTTPConnection* connection, const QUrl &url) { bool DomainServerSettingsManager::handlePublicHTTPRequest(HTTPConnection* connection, const QUrl &url) {
if (connection->requestOperation() == QNetworkAccessManager::PostOperation && url.path() == "/settings.json") { if (connection->requestOperation() == QNetworkAccessManager::GetOperation && url.path() == "/settings.json") {
// this is a POST operation to change one or more settings
QJsonDocument postedDocument = QJsonDocument::fromJson(connection->requestContent());
QJsonObject postedObject = postedDocument.object();
// we recurse one level deep below each group for the appropriate setting
recurseJSONObjectAndOverwriteSettings(postedObject, _settingsMap, _descriptionObject);
// store whatever the current _settingsMap is to file
persistToFile();
// return success to the caller
QString jsonSuccess = "{\"status\": \"success\"}";
connection->respond(HTTPConnection::StatusCode200, jsonSuccess.toUtf8(), "application/json");
return true;
} else if (connection->requestOperation() == QNetworkAccessManager::GetOperation && url.path() == "/settings.json") {
// this is a GET operation for our settings // this is a GET operation for our settings
// check if there is a query parameter for settings affecting a particular type of assignment // check if there is a query parameter for settings affecting a particular type of assignment
@ -135,6 +119,28 @@ bool DomainServerSettingsManager::handleHTTPRequest(HTTPConnection* connection,
return false; return false;
} }
bool DomainServerSettingsManager::handleAuthenticatedHTTPRequest(HTTPConnection *connection, const QUrl &url) {
if (connection->requestOperation() == QNetworkAccessManager::PostOperation && url.path() == "/settings.json") {
// this is a POST operation to change one or more settings
QJsonDocument postedDocument = QJsonDocument::fromJson(connection->requestContent());
QJsonObject postedObject = postedDocument.object();
// we recurse one level deep below each group for the appropriate setting
recurseJSONObjectAndOverwriteSettings(postedObject, _settingsMap, _descriptionObject);
// store whatever the current _settingsMap is to file
persistToFile();
// return success to the caller
QString jsonSuccess = "{\"status\": \"success\"}";
connection->respond(HTTPConnection::StatusCode200, jsonSuccess.toUtf8(), "application/json");
return true;
}
return false;
}
void DomainServerSettingsManager::recurseJSONObjectAndOverwriteSettings(const QJsonObject& postedObject, void DomainServerSettingsManager::recurseJSONObjectAndOverwriteSettings(const QJsonObject& postedObject,
QVariantMap& settingsVariant, QVariantMap& settingsVariant,
QJsonObject descriptionObject) { QJsonObject descriptionObject) {

View file

@ -16,11 +16,12 @@
#include <HTTPManager.h> #include <HTTPManager.h>
class DomainServerSettingsManager : public QObject, HTTPRequestHandler { class DomainServerSettingsManager : public QObject {
Q_OBJECT Q_OBJECT
public: public:
DomainServerSettingsManager(); DomainServerSettingsManager();
bool handleHTTPRequest(HTTPConnection* connection, const QUrl& url); bool handlePublicHTTPRequest(HTTPConnection* connection, const QUrl& url);
bool handleAuthenticatedHTTPRequest(HTTPConnection* connection, const QUrl& url);
QByteArray getJSONSettingsMap() const; QByteArray getJSONSettingsMap() const;
private: private:

View file

@ -11,6 +11,7 @@
#include <QtCore/QJsonDocument> #include <QtCore/QJsonDocument>
#include "Assignment.h"
#include "NodeList.h" #include "NodeList.h"
#include "PacketHeaders.h" #include "PacketHeaders.h"
#include "UserActivityLogger.h" #include "UserActivityLogger.h"
@ -133,10 +134,9 @@ void DomainHandler::requestDomainSettings() const {
settingsJSONURL.setScheme("http"); settingsJSONURL.setScheme("http");
settingsJSONURL.setHost(_hostname); settingsJSONURL.setHost(_hostname);
settingsJSONURL.setPort(DOMAIN_SERVER_HTTP_PORT); settingsJSONURL.setPort(DOMAIN_SERVER_HTTP_PORT);
settingsJSONURL.setPath("/settings.json"); settingsJSONURL.setPath("/settingz.json/");
settingsJSONURL.setQuery(QString("type=%1").arg(NodeList::getInstance()->getOwnerType())); Assignment::Type assignmentType = Assignment::typeForNodeType(NodeList::getInstance()->getOwnerType());
settingsJSONURL.setQuery(QString("type=%1").arg(assignmentType));
qDebug() << settingsJSONURL;
QNetworkReply* reply = NetworkAccessManager::getInstance().get(QNetworkRequest(settingsJSONURL)); QNetworkReply* reply = NetworkAccessManager::getInstance().get(QNetworkRequest(settingsJSONURL));
connect(reply, &QNetworkReply::finished, this, &DomainHandler::settingsRequestFinished); connect(reply, &QNetworkReply::finished, this, &DomainHandler::settingsRequestFinished);
@ -147,11 +147,12 @@ const int MAX_SETTINGS_REQUEST_FAILED_ATTEMPTS = 5;
void DomainHandler::settingsRequestFinished() { void DomainHandler::settingsRequestFinished() {
QNetworkReply* settingsReply = reinterpret_cast<QNetworkReply*>(sender()); QNetworkReply* settingsReply = reinterpret_cast<QNetworkReply*>(sender());
if (settingsReply->error() == QNetworkReply::NoError) { int replyCode = settingsReply->attribute(QNetworkRequest::HttpStatusCodeAttribute).toInt();
if (settingsReply->error() == QNetworkReply::NoError && replyCode != 301 && replyCode != 302) {
// parse the JSON to a QJsonObject and save it // parse the JSON to a QJsonObject and save it
_settingsObject = QJsonDocument::fromJson(settingsReply->readAll()).object(); _settingsObject = QJsonDocument::fromJson(settingsReply->readAll()).object();
qDebug() << settingsReply->attribute(QNetworkRequest::HttpStatusCodeAttribute);
qDebug() << "Received domain settings."; qDebug() << "Received domain settings.";
// reset failed settings requests to 0, we got them // reset failed settings requests to 0, we got them
@ -165,9 +166,9 @@ void DomainHandler::settingsRequestFinished() {
qDebug() << "Failed to retreive domain-server settings" << MAX_SETTINGS_REQUEST_FAILED_ATTEMPTS << "times. Re-setting connection to domain."; qDebug() << "Failed to retreive domain-server settings" << MAX_SETTINGS_REQUEST_FAILED_ATTEMPTS << "times. Re-setting connection to domain.";
clearSettings(); clearSettings();
clearConnectionInfo(); clearConnectionInfo();
} } else {
requestDomainSettings();
requestDomainSettings(); }
} }
} }