Error handling

This commit is contained in:
Zach Fox 2017-10-19 17:17:54 -07:00
parent 74180bc4cd
commit c99e803ab7

View file

@ -14,6 +14,7 @@
#include <QtCore/QObject> #include <QtCore/QObject>
#include <QtEndian> #include <QtEndian>
#include <QJsonDocument> #include <QJsonDocument>
#include <openssl/err.h>
#include <openssl/rsa.h> #include <openssl/rsa.h>
#include <openssl/pem.h> #include <openssl/pem.h>
#include <openssl/x509.h> #include <openssl/x509.h>
@ -1624,6 +1625,7 @@ bool EntityItem::verifyStaticCertificateProperties() {
if (getCertificateID().isEmpty()) { if (getCertificateID().isEmpty()) {
return false; return false;
} }
const auto signatureBytes = QByteArray::fromBase64(getCertificateID().toLatin1()); const auto signatureBytes = QByteArray::fromBase64(getCertificateID().toLatin1());
const auto signature = reinterpret_cast<const unsigned char*>(signatureBytes.constData()); const auto signature = reinterpret_cast<const unsigned char*>(signatureBytes.constData());
const unsigned int signatureLength = signatureBytes.length(); const unsigned int signatureLength = signatureBytes.length();
@ -1632,14 +1634,41 @@ bool EntityItem::verifyStaticCertificateProperties() {
const auto text = reinterpret_cast<const unsigned char*>(hash.constData()); const auto text = reinterpret_cast<const unsigned char*>(hash.constData());
const unsigned int textLength = hash.length(); const unsigned int textLength = hash.length();
BIO *bio = BIO_new_mem_buf((void*)qPrintable(EntityItem::_marketplacePublicKey), -1); BIO *bio = BIO_new_mem_buf((void*)EntityItem::_marketplacePublicKey.toUtf8().constData(), -1);
EVP_PKEY* evp_key = PEM_read_bio_PUBKEY(bio, NULL, NULL, NULL); EVP_PKEY* evp_key = PEM_read_bio_PUBKEY(bio, NULL, NULL, NULL);
RSA* rsa = EVP_PKEY_get1_RSA(evp_key); if (evp_key) {
bool answer = RSA_verify(NID_sha256, text, textLength, signature, signatureLength, rsa); RSA* rsa = EVP_PKEY_get1_RSA(evp_key);
BIO_free(bio); if (rsa) {
RSA_free(rsa); bool answer = RSA_verify(NID_sha256, text, textLength, signature, signatureLength, rsa);
EVP_PKEY_free(evp_key); RSA_free(rsa);
return answer; if (bio) {
BIO_free(bio);
}
if (evp_key) {
EVP_PKEY_free(evp_key);
}
return answer;
} else {
if (bio) {
BIO_free(bio);
}
if (evp_key) {
EVP_PKEY_free(evp_key);
}
long error = ERR_get_error();
const char* error_str = ERR_error_string(error, NULL);
qCWarning(entities) << "Failed to verify static certificate properties! RSA error:" << error_str;
return false;
}
} else {
if (bio) {
BIO_free(bio);
}
long error = ERR_get_error();
const char* error_str = ERR_error_string(error, NULL);
qCWarning(entities) << "Failed to verify static certificate properties! RSA error:" << error_str;
return false;
}
} }
void EntityItem::adjustShapeInfoByRegistration(ShapeInfo& info) const { void EntityItem::adjustShapeInfoByRegistration(ShapeInfo& info) const {
@ -2975,32 +3004,41 @@ void EntityItem::somethingChangedNotification() {
} }
void EntityItem::retrieveMarketplacePublicKey() { void EntityItem::retrieveMarketplacePublicKey() {
QNetworkAccessManager& networkAccessManager = NetworkAccessManager::getInstance(); EntityItem::_marketplacePublicKey = "-----BEGIN PUBLIC KEY-----\n"
QNetworkRequest networkRequest; "MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAyNNpKuspPe9D8jbzrX5k\n"
networkRequest.setAttribute(QNetworkRequest::FollowRedirectsAttribute, true); "dyl7HvEGHzbXS2ydi0qUApyVZoPsmdx4vtpx6XgwxY8+9X/CDBIIWT2DnfOSzeOQ\n"
QUrl requestURL = NetworkingConstants::METAVERSE_SERVER_URL; "D3zdcK2ro0HRiWuCzGKp9BM2GppkoiCZaJjpCiM7XOrBuI5OHp+5csb21nJs/Djo\n"
requestURL.setPath("/api/v1/commerce/marketplace_key"); "a6eCj3NlkJEjR2SQepPU89dKbS13g6B5uxH7IgerPmJmsCTEmst87AMGJU0SWyiA\n"
QJsonObject request; "0DSzom/QDODGYAwmC9+++l+xD7pm/zT2NHRom0tbr6Il51PSAcnmxHOcdxuJeRN7\n"
networkRequest.setUrl(requestURL); "9ep9dg0aTpKBvVbef9WGWj2QgdQ8qR+b9zoiWDq5vlgeLH2WH/AcDAIyyTr/ydeo\n"
"CQIDAQAB\n"
"-----END PUBLIC KEY-----\n";
//QNetworkAccessManager& networkAccessManager = NetworkAccessManager::getInstance();
//QNetworkRequest networkRequest;
//networkRequest.setAttribute(QNetworkRequest::FollowRedirectsAttribute, true);
//QUrl requestURL = NetworkingConstants::METAVERSE_SERVER_URL;
//requestURL.setPath("/api/v1/commerce/marketplace_key");
//QJsonObject request;
//networkRequest.setUrl(requestURL);
QNetworkReply* networkReply = NULL; //QNetworkReply* networkReply = NULL;
networkReply = networkAccessManager.get(networkRequest); //networkReply = networkAccessManager.get(networkRequest);
connect(networkReply, &QNetworkReply::finished, [=]() { //connect(networkReply, &QNetworkReply::finished, [=]() {
QJsonObject jsonObject = QJsonDocument::fromJson(networkReply->readAll()).object(); // QJsonObject jsonObject = QJsonDocument::fromJson(networkReply->readAll()).object();
jsonObject = jsonObject["data"].toObject(); // jsonObject = jsonObject["data"].toObject();
if (networkReply->error() == QNetworkReply::NoError) { // if (networkReply->error() == QNetworkReply::NoError) {
if (!jsonObject["public_key"].toString().isEmpty()) { // if (!jsonObject["public_key"].toString().isEmpty()) {
EntityItem::_marketplacePublicKey = jsonObject["public_key"].toString(); // EntityItem::_marketplacePublicKey = jsonObject["public_key"].toString();
qCWarning(entities) << "Marketplace public key has been set to" << _marketplacePublicKey; // qCWarning(entities) << "Marketplace public key has been set to" << _marketplacePublicKey;
} else { // } else {
qCWarning(entities) << "Marketplace public key is empty!"; // qCWarning(entities) << "Marketplace public key is empty!";
} // }
} else { // } else {
qCWarning(entities) << "Call to" << networkRequest.url() << "failed! Error:" << networkReply->error(); // qCWarning(entities) << "Call to" << networkRequest.url() << "failed! Error:" << networkReply->error();
} // }
networkReply->deleteLater(); // networkReply->deleteLater();
}); //});
} }