Don't substitute own avatar; FST URL regex fixes; better error handling

This commit is contained in:
Simon Walton 2019-04-29 18:20:54 -07:00
parent ae68478aea
commit 7c405b0714
3 changed files with 21 additions and 15 deletions

View file

@ -370,6 +370,9 @@ void AvatarMixer::manageIdentityData(const SharedNodePointer& node) {
MixerAvatar& avatar = nodeData->getAvatar(); MixerAvatar& avatar = nodeData->getAvatar();
bool sendIdentity = avatar.needsIdentityUpdate(); bool sendIdentity = avatar.needsIdentityUpdate();
if (sendIdentity) {
nodeData->flagIdentityChange();
}
if (nodeData->getAvatarSessionDisplayNameMustChange()) { if (nodeData->getAvatarSessionDisplayNameMustChange()) {
const QString& existingBaseDisplayName = avatar.getSessionDisplayName(); const QString& existingBaseDisplayName = avatar.getSessionDisplayName();
if (!existingBaseDisplayName.isEmpty()) { if (!existingBaseDisplayName.isEmpty()) {

View file

@ -27,24 +27,27 @@
#include "ClientTraitsHandler.h" #include "ClientTraitsHandler.h"
#include "AvatarLogging.h" #include "AvatarLogging.h"
const QString MixerAvatar::VERIFY_FAIL_MODEL { "qrc:/meshes/verifyFailed.fst" };
void MixerAvatar::fetchAvatarFST() { void MixerAvatar::fetchAvatarFST() {
_verifyState = nonCertified; _verifyState = nonCertified;
_pendingEvent = false;
QUrl avatarURL = getSkeletonModelURL();
auto avatarString = avatarURL.toString();
qCDebug(avatars) << "MixerAvatar::fetchAvatarFST: called with" << avatarString;
if (avatarURL.isEmpty() || avatarURL.isLocalFile() || avatarURL.scheme() == "qrc") {
// Not network FST.
return;
}
_certificateIdFromURL.clear(); _certificateIdFromURL.clear();
_certificateIdFromFST.clear(); _certificateIdFromFST.clear();
_marketplaceIdFromURL.clear(); _marketplaceIdFromURL.clear();
_marketplaceIdFromFST.clear(); _marketplaceIdFromFST.clear();
auto resourceManager = DependencyManager::get<ResourceManager>(); auto resourceManager = DependencyManager::get<ResourceManager>();
QUrl avatarURL = getSkeletonModelURL();
if (avatarURL.isEmpty()) {
return;
}
//auto avatarURLString = avatarURL.toDisplayString();
// Match UUID + (optionally) URL cert // Match UUID + (optionally) URL cert
static const QRegularExpression marketIdRegex{ static const QRegularExpression marketIdRegex{
"^https://metaverse.highfidelity.com/api/v.+/commerce/entity_edition/([-0-9a-z]{36})(.*?certificate_id=([\\w/+%]+)|.*).*$" "^https://.*?highfidelity\\.com/api/.*?/commerce/entity_edition/([-0-9a-z]{36})(.*?certificate_id=([\\w/+%]+)|.*).*$"
}; };
auto marketIdMatch = marketIdRegex.match(avatarURL.toDisplayString()); auto marketIdMatch = marketIdRegex.match(avatarURL.toDisplayString());
if (marketIdMatch.hasMatch()) { if (marketIdMatch.hasMatch()) {
@ -58,18 +61,17 @@ void MixerAvatar::fetchAvatarFST() {
ResourceRequest* fstRequest = resourceManager->createResourceRequest(this, avatarURL); ResourceRequest* fstRequest = resourceManager->createResourceRequest(this, avatarURL);
if (fstRequest) { if (fstRequest) {
QMutexLocker certifyLocker(&_avatarCertifyLock); QMutexLocker certifyLocker(&_avatarCertifyLock);
qCDebug(avatars) << "Requesting FST at" << avatarURL;
if (_avatarRequest) {
_avatarRequest->deleteLater();
}
_avatarRequest = fstRequest; _avatarRequest = fstRequest;
connect(fstRequest, &ResourceRequest::finished, this, &MixerAvatar::fstRequestComplete);
_verifyState = requestingFST; _verifyState = requestingFST;
connect(fstRequest, &ResourceRequest::finished, this, &MixerAvatar::fstRequestComplete);
fstRequest->send(); fstRequest->send();
} else { } else {
qCDebug(avatars) << "Couldn't create FST request for" << avatarURL; qCDebug(avatars) << "Couldn't create FST request for" << avatarURL;
_verifyState = error; _verifyState = error;
} }
_needsIdentityUpdate = true;
} }
void MixerAvatar::fstRequestComplete() { void MixerAvatar::fstRequestComplete() {
@ -176,6 +178,7 @@ void MixerAvatar::ownerRequestComplete() {
qCDebug(avatars) << "Owner lookup failed for" << getDisplayName() << ":" qCDebug(avatars) << "Owner lookup failed for" << getDisplayName() << ":"
<< jsonData.toObject()["message"].toString(); << jsonData.toObject()["message"].toString();
_verifyState = error; _verifyState = error;
_pendingEvent = false;
} }
} }
networkReply->deleteLater(); networkReply->deleteLater();
@ -263,6 +266,7 @@ void MixerAvatar::processCertifyEvents() {
{ {
if (_challengeResponse.length() < 8) { if (_challengeResponse.length() < 8) {
_verifyState = error; _verifyState = error;
_pendingEvent = false;
break; break;
} }
@ -282,7 +286,6 @@ void MixerAvatar::processCertifyEvents() {
_needsIdentityUpdate = true; _needsIdentityUpdate = true;
if (_verifyState == verificationFailed) { if (_verifyState == verificationFailed) {
qCDebug(avatars) << "Dynamic verification FAILED for " << getDisplayName() << getSessionUUID(); qCDebug(avatars) << "Dynamic verification FAILED for " << getDisplayName() << getSessionUUID();
setSkeletonModelURL(QUrl(VERIFY_FAIL_MODEL));
} else { } else {
qCDebug(avatars) << "Dynamic verification SUCCEEDED for " << getDisplayName() << getSessionUUID(); qCDebug(avatars) << "Dynamic verification SUCCEEDED for " << getDisplayName() << getSessionUUID();
} }
@ -324,7 +327,6 @@ void MixerAvatar::sendOwnerChallenge() {
_challengeTimeout.setInterval(CHALLENGE_TIMEOUT_MS); _challengeTimeout.setInterval(CHALLENGE_TIMEOUT_MS);
_challengeTimeout.connect(&_challengeTimeout, &QTimer::timeout, [this]() { _challengeTimeout.connect(&_challengeTimeout, &QTimer::timeout, [this]() {
_verifyState = verificationFailed; _verifyState = verificationFailed;
setSkeletonModelURL(QUrl(VERIFY_FAIL_MODEL));
_needsIdentityUpdate = true; _needsIdentityUpdate = true;
}); });
} }

View file

@ -326,7 +326,8 @@ void AvatarHashMap::processAvatarIdentityPacket(QSharedPointer<ReceivedMessage>
bool displayNameChanged = false; bool displayNameChanged = false;
// In this case, the "sendingNode" is the Avatar Mixer. // In this case, the "sendingNode" is the Avatar Mixer.
avatar->processAvatarIdentity(avatarIdentityStream, identityChanged, displayNameChanged); avatar->processAvatarIdentity(avatarIdentityStream, identityChanged, displayNameChanged);
if (avatar->isCertifyFailed()) { if (avatar->isCertifyFailed() && identityUUID != EMPTY) {
qCDebug(avatars) << "Avatar" << avatar->getSessionDisplayName() << "marked as VERIFY-FAILED";
avatar->setSkeletonModelURL(PathUtils::resourcesUrl(VERIFY_FAIL_MODEL)); avatar->setSkeletonModelURL(PathUtils::resourcesUrl(VERIFY_FAIL_MODEL));
} }
_replicas.processAvatarIdentity(identityUUID, message->getMessage(), identityChanged, displayNameChanged); _replicas.processAvatarIdentity(identityUUID, message->getMessage(), identityChanged, displayNameChanged);