mirror of
https://github.com/HifiExperiments/overte.git
synced 2025-07-23 13:04:10 +02:00
Static FST verification now working
This commit is contained in:
parent
5c31fcc920
commit
b2e54f46e1
2 changed files with 24 additions and 19 deletions
|
@ -40,9 +40,7 @@ void MixerAvatar::fetchAvatarFST() {
|
||||||
if (marketIdMatch.hasMatch()) {
|
if (marketIdMatch.hasMatch()) {
|
||||||
QMutexLocker certifyLocker(&_avatarCertifyLock);
|
QMutexLocker certifyLocker(&_avatarCertifyLock);
|
||||||
_marketplaceIdString = marketIdMatch.captured(1);
|
_marketplaceIdString = marketIdMatch.captured(1);
|
||||||
_certificateId = QUrl::fromPercentEncoding(marketIdMatch.captured(2).toUtf8());
|
_certificateIdFromURL = QUrl::fromPercentEncoding(marketIdMatch.captured(2).toUtf8());
|
||||||
} else {
|
|
||||||
_marketplaceIdString = "2119142f-0cd6-4126-b18e-06b53afcc0a9"; // XXX: plants entity, for testing
|
|
||||||
}
|
}
|
||||||
|
|
||||||
ResourceRequest* fstRequest = resourceManager->createResourceRequest(this, avatarURL);
|
ResourceRequest* fstRequest = resourceManager->createResourceRequest(this, avatarURL);
|
||||||
|
@ -61,11 +59,6 @@ void MixerAvatar::fetchAvatarFST() {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// TESTING
|
|
||||||
static const QString PLANT_CERTID{
|
|
||||||
"MEYCIQDxKA62xq/G/x1aWpXyJbGjIHm6SU4ceQu2ljtFRfeu/QIhAKw2uEfLId8sqLfEoErOlvu2UV2wbP3ttrYP1hoZT0Ge"
|
|
||||||
};
|
|
||||||
|
|
||||||
void MixerAvatar::fstRequestComplete() {
|
void MixerAvatar::fstRequestComplete() {
|
||||||
ResourceRequest* fstRequest = static_cast<ResourceRequest*>(QObject::sender());
|
ResourceRequest* fstRequest = static_cast<ResourceRequest*>(QObject::sender());
|
||||||
QMutexLocker certifyLocker(&_avatarCertifyLock);
|
QMutexLocker certifyLocker(&_avatarCertifyLock);
|
||||||
|
@ -93,7 +86,7 @@ void MixerAvatar::fstRequestComplete() {
|
||||||
networkRequest.setUrl(requestURL);
|
networkRequest.setUrl(requestURL);
|
||||||
|
|
||||||
QJsonObject request;
|
QJsonObject request;
|
||||||
request["certificate_id"] = _certificateId;
|
request["certificate_id"] = _certificateIdFromURL;
|
||||||
_verifyState = kRequestingOwner;
|
_verifyState = kRequestingOwner;
|
||||||
QNetworkReply* networkReply = networkAccessManager.put(networkRequest, QJsonDocument(request).toJson());
|
QNetworkReply* networkReply = networkAccessManager.put(networkRequest, QJsonDocument(request).toJson());
|
||||||
networkReply->setParent(this);
|
networkReply->setParent(this);
|
||||||
|
@ -139,36 +132,47 @@ bool MixerAvatar::generateFSTHash() {
|
||||||
|
|
||||||
bool MixerAvatar::validateFSTHash(const QString& publicKey) {
|
bool MixerAvatar::validateFSTHash(const QString& publicKey) {
|
||||||
// Guess we should refactor this stuff into a Authorization namespace ...
|
// Guess we should refactor this stuff into a Authorization namespace ...
|
||||||
return EntityItemProperties::verifySignature(publicKey, _certificateHash, QByteArray::fromBase64(_certificateId.toUtf8()));
|
return EntityItemProperties::verifySignature(publicKey, _certificateHash,
|
||||||
|
QByteArray::fromBase64(_certificateIdFromURL.toUtf8()));
|
||||||
}
|
}
|
||||||
|
|
||||||
QByteArray MixerAvatar::canonicalJson(const QString fstFile) {
|
QByteArray MixerAvatar::canonicalJson(const QString fstFile) {
|
||||||
QStringList fstLines = fstFile.split("\n", QString::SkipEmptyParts);
|
QStringList fstLines = fstFile.split("\n", QString::SkipEmptyParts);
|
||||||
static const QString fstKeywordsReg{
|
static const QString fstKeywordsReg{
|
||||||
"(marketplaceID|itemDescription|itemCategories|itemArtist|itemLicenseUrl|limitedRun|itemName|"
|
"(marketplaceID|itemDescription|itemCategories|itemArtist|itemLicenseUrl|limitedRun|itemName|"
|
||||||
"filename|texdir|script|editionNumber)"
|
"filename|texdir|script|editionNumber|certificateID)"
|
||||||
};
|
};
|
||||||
QRegularExpression fstLineRegExp{ QString("^\\s*") + fstKeywordsReg + "\\s*=\\s*(.*)$" };
|
QRegularExpression fstLineRegExp{ QString("^\\s*") + fstKeywordsReg + "\\s*=\\s*(\\S.*)$" };
|
||||||
QStringListIterator fstLineIter(fstLines);
|
QStringListIterator fstLineIter(fstLines);
|
||||||
|
|
||||||
QJsonObject certifiedItems;
|
QJsonObject certifiedItems;
|
||||||
QJsonArray scriptsArray;
|
QJsonArray scriptsArray;
|
||||||
|
QStringList scripts;
|
||||||
while (fstLineIter.hasNext()) {
|
while (fstLineIter.hasNext()) {
|
||||||
auto line = fstLineIter.next();
|
auto line = fstLineIter.next();
|
||||||
auto lineMatch = fstLineRegExp.match(line);
|
auto lineMatch = fstLineRegExp.match(line);
|
||||||
if (lineMatch.hasMatch()) {
|
if (lineMatch.hasMatch()) {
|
||||||
QString key = lineMatch.captured(1);
|
QString key = lineMatch.captured(1);
|
||||||
if (key == "limitedRun" || key == "editionNumber") {
|
if (key == "certificateID") {
|
||||||
certifiedItems[key] = QJsonValue(lineMatch.captured(2).toDouble());
|
_certificateIdFromFST = lineMatch.captured(2);
|
||||||
|
} else if (key == "limitedRun" || key == "editionNumber") {
|
||||||
|
double value = lineMatch.captured(2).toDouble();
|
||||||
|
if (value != 0.0) {
|
||||||
|
certifiedItems[key] = QJsonValue(value);
|
||||||
|
}
|
||||||
|
} else if (key == "script") {
|
||||||
|
scripts.append(lineMatch.captured(2));
|
||||||
} else {
|
} else {
|
||||||
certifiedItems[key] = QJsonValue(lineMatch.captured(2));
|
certifiedItems[key] = QJsonValue(lineMatch.captured(2));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (!scriptsArray.empty()) {
|
if (!scripts.empty()) {
|
||||||
certifiedItems["script"] = scriptsArray;
|
scripts.sort();
|
||||||
|
certifiedItems["script"] = QJsonArray::fromStringList(scripts);
|
||||||
}
|
}
|
||||||
QJsonDocument jsonDocCertifiedItems(certifiedItems);
|
QJsonDocument jsonDocCertifiedItems(certifiedItems);
|
||||||
// return R"({"editionNumber":34,"filename":"http://mpassets.highfidelity.com/7f142fde-541a-4902-b33a-25fa89dfba21-v1/Bridger/Hifi_Toon_Male_3.fbx","itemArtist":"EgyMax","itemCategories":"Avatars","itemDescription":"This is my first avatar. I hope you like it. More will come","itemLicenseUrl":"","itemName":"Bridger","limitedRun":"-1","marketplaceID":"7f142fde-541a-4902-b33a-25fa89dfba21","texdir":"http://mpassets.highfidelity.com/7f142fde-541a-4902-b33a-25fa89dfba21-v1/Bridger/textures"})";
|
//OK - this one works
|
||||||
|
//return R"({"editionNumber":34,"filename":"http://mpassets.highfidelity.com/7f142fde-541a-4902-b33a-25fa89dfba21-v1/Bridger/Hifi_Toon_Male_3.fbx","itemArtist":"EgyMax","itemCategories":"Avatars","itemDescription":"This is my first avatar. I hope you like it. More will come","itemName":"Bridger","limitedRun":-1,"marketplaceID":"7f142fde-541a-4902-b33a-25fa89dfba21","texdir":"http://mpassets.highfidelity.com/7f142fde-541a-4902-b33a-25fa89dfba21-v1/Bridger/textures"})";
|
||||||
return jsonDocCertifiedItems.toJson(QJsonDocument::Compact);
|
return jsonDocCertifiedItems.toJson(QJsonDocument::Compact);
|
||||||
}
|
}
|
||||||
|
|
|
@ -39,12 +39,13 @@ private:
|
||||||
QString _marketplaceIdString;
|
QString _marketplaceIdString;
|
||||||
QByteArray _avatarFSTContents;
|
QByteArray _avatarFSTContents;
|
||||||
QByteArray _certificateHash;
|
QByteArray _certificateHash;
|
||||||
QString _certificateId;
|
QString _certificateIdFromURL;
|
||||||
|
QString _certificateIdFromFST;
|
||||||
bool _avatarFSTValid { false };
|
bool _avatarFSTValid { false };
|
||||||
|
|
||||||
bool generateFSTHash();
|
bool generateFSTHash();
|
||||||
bool validateFSTHash(const QString& publicKey);
|
bool validateFSTHash(const QString& publicKey);
|
||||||
static QByteArray canonicalJson(const QString fstFile);
|
QByteArray canonicalJson(const QString fstFile);
|
||||||
|
|
||||||
private slots:
|
private slots:
|
||||||
void fstRequestComplete();
|
void fstRequestComplete();
|
||||||
|
|
Loading…
Reference in a new issue