mirror of
https://github.com/overte-org/overte.git
synced 2025-04-14 15:47:02 +02:00
Get Domain creation working; revise metaverse forwarding. (TLS init fail issue present)
This commit is contained in:
parent
74b185f6c6
commit
c266b003fb
5 changed files with 168 additions and 34 deletions
|
@ -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.
|
||||||
|
|
|
@ -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");
|
||||||
|
|
|
@ -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);
|
||||||
|
|
|
@ -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 = { },
|
||||||
|
|
|
@ -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);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue