Get Domain creation working; revise metaverse forwarding. (TLS init fail issue present)

This commit is contained in:
Kalila L 2021-09-10 02:06:50 -04:00
parent 74b185f6c6
commit c266b003fb
5 changed files with 168 additions and 34 deletions

View file

@ -73,10 +73,10 @@ export default {
methods: { methods: {
async onSubmit () { async onSubmit () {
const metaverseURL = await this.retrieveMetaverseUrl(); const metaverseUrl = await this.retrieveMetaverseUrl();
const result = await this.attemptLogin(metaverseURL, this.username, this.password); const result = await this.attemptLogin(metaverseUrl, this.username, this.password);
this.$emit("loginResult", { "success": result.success, "metaverse": metaverseURL, "data": result.response }); this.$emit("loginResult", { "success": result.success, "metaverse": metaverseUrl, "data": result.response });
}, },
// TODO: This needs to be addressed in a more modular fashion to reuse and save state across multiple components. // TODO: This needs to be addressed in a more modular fashion to reuse and save state across multiple components.

View file

@ -232,7 +232,7 @@
{{ connectMetaverseSuccess ? 'Connected' : 'Connect' }} {{ connectMetaverseSuccess ? 'Connected' : 'Connect' }}
</q-btn> </q-btn>
<q-btn <q-btn
@click="$refs.stepper.next()" @click="connectMetaverseSuccess ? $refs.stepper.next() : mainWizardStep = 6"
class="q-mb-md" class="q-mb-md"
:size="connectMetaverseSuccess ? 'md' : 'sm'" :size="connectMetaverseSuccess ? 'md' : 'sm'"
outline outline
@ -265,9 +265,58 @@
<q-step <q-step
:name="5" :name="5"
title="Access" title="Configure Metaverse"
caption="Recommended" caption="Recommended"
:done="mainWizardStep > 5" :done="mainWizardStep > 5"
>
<q-card
class="wizardCard"
>
<q-card-section>
<div class="text-h6 text-weight-light text-center">Let's give your Domain a label.</div>
<div class="text-h7 text-weight-light text-center">This is to help you identify your Domains in your Metaverse account.</div>
</q-card-section>
<q-card-section>
<q-input
v-model="domainLabel"
filled
dark
label="Label"
hint="Enter a nickname for your Domain."
lazy-rules
:rules="[ val => val && val.length > 0 || 'Please enter a label.']"
/>
</q-card-section>
<q-card-actions vertical align="right">
<q-btn
@click="saveMetaverseConfiguration"
class="q-mb-md"
size="md"
outline
text-color="white"
icon-right="chevron_right"
>
Next
</q-btn>
<q-btn
@click="$refs.stepper.previous()"
size="sm"
flat
icon="chevron_left"
>
Back
</q-btn>
</q-card-actions>
</q-card>
</q-step>
<q-step
:name="6"
title="Access"
caption="Recommended"
:done="mainWizardStep > 6"
> >
<q-card <q-card
class="wizardCard" class="wizardCard"
@ -276,7 +325,7 @@
<div class="text-h6 text-weight-light text-center">Let's configure some security settings for your world.</div> <div class="text-h6 text-weight-light text-center">Let's configure some security settings for your world.</div>
</q-card-section> </q-card-section>
<q-card-section> <q-card-section v-show="connectMetaverseSuccess">
<div class="text-h6 text-weight-light text-center">Who should be an <b>in-world admin</b> of your Domain?</div> <div class="text-h6 text-weight-light text-center">Who should be an <b>in-world admin</b> of your Domain?</div>
<q-select <q-select
label="Metaverse usernames (press enter)" label="Metaverse usernames (press enter)"
@ -323,7 +372,7 @@
Next Next
</q-btn> </q-btn>
<q-btn <q-btn
@click="$refs.stepper.previous()" @click="connectMetaverseSuccess ? $refs.stepper.previous() : mainWizardStep = 4"
size="sm" size="sm"
flat flat
icon="chevron_left" icon="chevron_left"
@ -335,10 +384,10 @@
</q-step> </q-step>
<q-step <q-step
:name="6" :name="7"
title="Administrator" title="Administrator"
caption="Highly Recommended" caption="Highly Recommended"
:done="mainWizardStep > 6" :done="mainWizardStep > 7"
> >
<q-card <q-card
class="wizardCard" class="wizardCard"
@ -444,10 +493,10 @@
</q-step> </q-step>
<q-step <q-step
:name="7" :name="8"
title="Performance" title="Performance"
caption="" caption=""
:done="mainWizardStep > 7" :done="mainWizardStep > 8"
> >
<q-card <q-card
class="wizardCard" class="wizardCard"
@ -492,10 +541,10 @@
</q-step> </q-step>
<q-step <q-step
:name="8" :name="9"
title="Done!" title="Done!"
caption="" caption=""
:done="mainWizardStep > 8" :done="mainWizardStep > 9"
> >
<q-card <q-card
class="wizardCard" class="wizardCard"
@ -615,6 +664,8 @@ export default defineComponent({
// TODO: Needs to be based off of the actual state of the server's connection (using Vuex and retrieving settings on page load.) // TODO: Needs to be based off of the actual state of the server's connection (using Vuex and retrieving settings on page load.)
connectMetaverseSuccess: false, connectMetaverseSuccess: false,
connectMetaverseDialog: false, connectMetaverseDialog: false,
// Metaverse Configuration
domainLabel: "",
// Security Step // Security Step
administratorsListSecurityModel: [], administratorsListSecurityModel: [],
connectionSecurityModel: ref(["everyone"]), connectionSecurityModel: ref(["everyone"]),
@ -658,10 +709,10 @@ export default defineComponent({
// Starter Content // Starter Content
starterContentToggle: true, starterContentToggle: true,
// Consts // Consts
WELCOME_TEXT_TIMEOUT: 4500, WELCOME_TEXT_TIMEOUT: 500,
MAIN_WIZARD_TRANSITION_TIME: 1000, MAIN_WIZARD_TRANSITION_TIME: 1000,
DEFAULT_METAVERSE_URL: "https://metaverse.vircadia.com/live", DEFAULT_METAVERSE_URL: "https://metaverse.vircadia.com/live",
FINAL_WIZARD_STEP: 8, FINAL_WIZARD_STEP: 9,
COMPLETE_WIZARD_REDIRECT_DELAY: 4000 COMPLETE_WIZARD_REDIRECT_DELAY: 4000
}; };
}, },
@ -686,6 +737,67 @@ export default defineComponent({
} }
}, },
saveMetaverseConfiguration () {
this.mainWizardStep++;
// TODO: Put this path in a constant somewhere.
axios.post(`/api/domains`, { "domain": { "label": this.domainLabel } },
{
params: {
label: this.domainLabel
},
headers: {
'content-type': 'application/x-www-form-urlencoded;charset=utf-8'
}
}
)
.then((response) => {
Log.info(Log.types.METAVERSE, "Successfully configured Domain with Metaverse.");
console.info("received", response);
const settingsToCommit = {
"metaverse": {
"automatic_networking": "full",
"id": response.data.domain.domainId
},
"descriptors": {
"world_name": this.domainLabel
}
};
this.commitMetaverseConfig(settingsToCommit);
})
.catch((error) => {
Log.error(Log.types.METAVERSE, `Failed to configure Domain with Metaverse: ${error}`);
this.$q.notify({
type: "negative",
textColor: "white",
icon: "warning",
message: `Failed to label your Domain on the Metaverse: ${error}`
});
});
},
async commitMetaverseConfig (jsonToCommit) {
const committed = await this.commitSettings(jsonToCommit);
if (committed === true) {
Log.info(Log.types.METAVERSE, "Successfully committed Domain server config for the Metaverse.");
this.$q.notify({
type: "positive",
textColor: "white",
icon: "cloud_done",
message: "Successfully labeled your Domain on your Metaverse account."
});
} else {
Log.error(Log.types.METAVERSE, "Failed to configure server with Metaverse: Could not commit config to settings.");
this.$q.notify({
type: "negative",
textColor: "white",
icon: "warning",
message: "Domain label with Metaverse attempt failed because the settings were unable to be saved."
});
}
},
async saveSecuritySettings () { async saveSecuritySettings () {
const friendsCanConnect = this.connectionSecurityModel.includes("friends"); const friendsCanConnect = this.connectionSecurityModel.includes("friends");
const friendsCanRez = this.rezSecurityModel.includes("friends"); const friendsCanRez = this.rezSecurityModel.includes("friends");

View file

@ -87,6 +87,7 @@ QString DomainServer::_userConfigFilename;
int DomainServer::_parentPID { -1 }; int DomainServer::_parentPID { -1 };
bool DomainServer::forwardMetaverseAPIRequest(HTTPConnection* connection, bool DomainServer::forwardMetaverseAPIRequest(HTTPConnection* connection,
const QUrl& requestUrl,
const QString& metaversePath, const QString& metaversePath,
const QString& requestSubobjectKey, const QString& requestSubobjectKey,
std::initializer_list<QString> requiredData, std::initializer_list<QString> requiredData,
@ -101,23 +102,43 @@ bool DomainServer::forwardMetaverseAPIRequest(HTTPConnection* connection,
QJsonObject subobject; QJsonObject subobject;
auto params = connection->parseUrlEncodedForm(); if (requestUrl.hasQuery()) {
QUrlQuery query(requestUrl);
for (auto& key : requiredData) { for (auto& key : requiredData) {
auto it = params.find(key); if (query.hasQueryItem(key)) {
if (it == params.end()) { subobject.insert(key, query.queryItemValue(key));
auto error = "Bad request, expected param '" + key + "'"; } else {
connection->respond(HTTPConnection::StatusCode400, error.toLatin1()); auto error = "Domain Server: Bad request, expected param '" + key + "'";
return true; connection->respond(HTTPConnection::StatusCode400, error.toLatin1());
return true;
}
} }
subobject.insert(key, it.value());
}
for (auto& key : optionalData) { for (auto& key : optionalData) {
auto it = params.find(key); if (query.hasQueryItem(key)) {
if (it != params.end()) { subobject.insert(key, query.queryItemValue(key));
}
}
} else {
auto params = connection->parseUrlEncodedForm();
for (auto& key : requiredData) {
auto it = params.find(key);
if (it == params.end()) {
auto error = "Domain Server: Bad request, expected param '" + key + "'";
connection->respond(HTTPConnection::StatusCode400, error.toLatin1());
return true;
}
subobject.insert(key, it.value()); subobject.insert(key, it.value());
} }
for (auto& key : optionalData) {
auto it = params.find(key);
if (it != params.end()) {
subobject.insert(key, it.value());
}
}
} }
QJsonObject root; QJsonObject root;
@ -2296,12 +2317,12 @@ bool DomainServer::handleHTTPRequest(HTTPConnection* connection, const QUrl& url
return true; return true;
} else if (url.path() == URI_API_DOMAINS) { } else if (url.path() == URI_API_DOMAINS) {
return forwardMetaverseAPIRequest(connection, "/api/v1/domains", ""); return forwardMetaverseAPIRequest(connection, url, "/api/v1/domains", "");
} else if (url.path().startsWith(URI_API_DOMAINS_ID)) { } else if (url.path().startsWith(URI_API_DOMAINS_ID)) {
auto id = url.path().mid(URI_API_DOMAINS_ID.length()); auto id = url.path().mid(URI_API_DOMAINS_ID.length());
return forwardMetaverseAPIRequest(connection, "/api/v1/domains/" + id, "", {}, {}, false); return forwardMetaverseAPIRequest(connection, url, "/api/v1/domains/" + id, "", {}, {}, false);
} else if (url.path() == URI_API_PLACES) { } else if (url.path() == URI_API_PLACES) {
return forwardMetaverseAPIRequest(connection, "/api/v1/user/places", ""); return forwardMetaverseAPIRequest(connection, url, "/api/v1/user/places", "");
} else { } else {
// check if this is for json stats for a node // check if this is for json stats for a node
const QString NODE_JSON_REGEX_STRING = QString("\\%1\\/(%2).json\\/?$").arg(URI_NODES).arg(UUID_REGEX_STRING); const QString NODE_JSON_REGEX_STRING = QString("\\%1\\/(%2).json\\/?$").arg(URI_NODES).arg(UUID_REGEX_STRING);
@ -2438,7 +2459,7 @@ bool DomainServer::handleHTTPRequest(HTTPConnection* connection, const QUrl& url
} }
} else if (url.path() == URI_API_DOMAINS) { } else if (url.path() == URI_API_DOMAINS) {
return forwardMetaverseAPIRequest(connection, "/api/v1/domains", "domain", { "label" }); return forwardMetaverseAPIRequest(connection, url, "/api/v1/domains", "domain", { "label" });
} else if (url.path().startsWith(URI_API_BACKUPS_RECOVER)) { } else if (url.path().startsWith(URI_API_BACKUPS_RECOVER)) {
auto id = url.path().mid(QString(URI_API_BACKUPS_RECOVER).length()); auto id = url.path().mid(QString(URI_API_BACKUPS_RECOVER).length());
@ -2465,7 +2486,7 @@ bool DomainServer::handleHTTPRequest(HTTPConnection* connection, const QUrl& url
return true; return true;
} }
auto domainID = domainSetting.toString(); auto domainID = domainSetting.toString();
return forwardMetaverseAPIRequest(connection, "/api/v1/domains/" + domainID, "domain", return forwardMetaverseAPIRequest(connection, url, "/api/v1/domains/" + domainID, "domain",
{ }, { "network_address", "network_port", "label" }); { }, { "network_address", "network_port", "label" });
} else if (url.path() == URI_API_PLACES) { } else if (url.path() == URI_API_PLACES) {
auto accessTokenVariant = _settingsManager.valueForKeyPath(ACCESS_TOKEN_KEY_PATH); auto accessTokenVariant = _settingsManager.valueForKeyPath(ACCESS_TOKEN_KEY_PATH);

View file

@ -228,6 +228,7 @@ private:
bool processPendingContent(HTTPConnection* connection, QString itemName, QString filename, QByteArray dataChunk); bool processPendingContent(HTTPConnection* connection, QString itemName, QString filename, QByteArray dataChunk);
bool forwardMetaverseAPIRequest(HTTPConnection* connection, bool forwardMetaverseAPIRequest(HTTPConnection* connection,
const QUrl& requestUrl,
const QString& metaversePath, const QString& metaversePath,
const QString& requestSubobject, const QString& requestSubobject,
std::initializer_list<QString> requiredData = { }, std::initializer_list<QString> requiredData = { },

View file

@ -176,7 +176,7 @@ QList<FormData> HTTPConnection::parseFormData() const {
break; break;
} }
} }
QByteArray start = "--" + boundary; QByteArray start = "--" + boundary;
QByteArray end = "\r\n--" + boundary + "--\r\n"; QByteArray end = "\r\n--" + boundary + "--\r\n";
@ -394,6 +394,6 @@ void HTTPConnection::readContent() {
if (_requestContent->bytesLeftToWrite() == 0) { if (_requestContent->bytesLeftToWrite() == 0) {
_socket->disconnect(this, SLOT(readContent())); _socket->disconnect(this, SLOT(readContent()));
_parentManager->handleHTTPRequest(this, _requestUrl.path()); _parentManager->handleHTTPRequest(this, _requestUrl);
} }
} }