From b9f5810d996cfaca6afa4116ea02418ce6370953 Mon Sep 17 00:00:00 2001 From: howard-stearns Date: Fri, 15 Sep 2017 17:09:07 -0700 Subject: [PATCH 01/13] snapshot --- libraries/entities/src/EntityItem.h | 34 ++++++++++++++++++- libraries/entities/src/EntityItemProperties.h | 4 ++- .../src/EntityItemPropertiesDefaults.h | 12 ++++++- libraries/entities/src/EntityPropertyFlags.h | 13 ++++++- 4 files changed, 59 insertions(+), 4 deletions(-) diff --git a/libraries/entities/src/EntityItem.h b/libraries/entities/src/EntityItem.h index 84742587e9..76887a8fea 100644 --- a/libraries/entities/src/EntityItem.h +++ b/libraries/entities/src/EntityItem.h @@ -303,8 +303,29 @@ public: uint8_t getPendingOwnershipPriority() const { return _simulationOwner.getPendingPriority(); } void rememberHasSimulationOwnershipBid() const; + // Certifiable Properties + QString getItemName() const; + void setItemName(const QString& value); + QString getItemDescription() const; + void setItemDescription(const QString& value); + QStringList getItemCategories() const; + void setItemCategories(const QStringList& value); + QString getItemArtist() const; + void setItemArtist(const QString& value); + QString getItemLicense() const; + void setItemLicense(const QString& value); + int getLimitedRun() const; + void setLimitedRun(int); QString getMarketplaceID() const; void setMarketplaceID(const QString& value); + int getEditionNumber() const; + void setEditionNumber(int); + QString getCertificateID() const; + void setCertificateID(const QString& value); + QString getStaticCertificateJSON() const; + QString getStaticCertificateHash() const; + bool verifyStaticCertificateProperties() const; + QString getVerifiedCertificateId(); bool getShouldHighlight() const; void setShouldHighlight(const bool value); @@ -525,12 +546,23 @@ protected: bool _locked { ENTITY_ITEM_DEFAULT_LOCKED }; QString _userData { ENTITY_ITEM_DEFAULT_USER_DATA }; SimulationOwner _simulationOwner; - QString _marketplaceID { ENTITY_ITEM_DEFAULT_MARKETPLACE_ID }; bool _shouldHighlight { false }; QString _name { ENTITY_ITEM_DEFAULT_NAME }; QString _href; //Hyperlink href QString _description; //Hyperlink description + // Certificate Properties + QString _itemName { ENTITY_ITEM_DEFAULT_ITEM_NAME }; + QString _itemDescription { ENTITY_ITEM_DEFAULT_ITEM_DESCRIPTION }; + QStringList _itemCategories { ENTITY_ITEM_DEFAULT_ITEM_CATEGORIES }; + QString _itemArtist { ENTITY_ITEM_DEFAULT_ITEM_ARTIST }; + QString _itemLicense { ENTITY_ITEM_DEFAULT_ITEM_LICENSE }; + int _limitedRun { ENTITY_ITEM_DEFAULT_LIMITED_RUN }; + QString _marketplaceID { ENTITY_ITEM_DEFAULT_MARKETPLACE_ID }; + int _editionNumber { ENTITY_ITEM_DEFAULT_EDITION_NUMBER }; + QString _marketplaceID { ENTITY_ITEM_DEFAULT_CERTIFICATE_ID }; + + // NOTE: Damping is applied like this: v *= pow(1 - damping, dt) // // Hence the damping coefficient must range from 0 (no damping) to 1 (immediate stop). diff --git a/libraries/entities/src/EntityItemProperties.h b/libraries/entities/src/EntityItemProperties.h index dd8ce952d3..212d707de0 100644 --- a/libraries/entities/src/EntityItemProperties.h +++ b/libraries/entities/src/EntityItemProperties.h @@ -170,7 +170,6 @@ public: DEFINE_PROPERTY(PROP_RADIUS_START, RadiusStart, radiusStart, float, particle::DEFAULT_RADIUS_START); DEFINE_PROPERTY(PROP_RADIUS_FINISH, RadiusFinish, radiusFinish, float, particle::DEFAULT_RADIUS_FINISH); DEFINE_PROPERTY(PROP_EMITTER_SHOULD_TRAIL, EmitterShouldTrail, emitterShouldTrail, bool, particle::DEFAULT_EMITTER_SHOULD_TRAIL); - DEFINE_PROPERTY_REF(PROP_MARKETPLACE_ID, MarketplaceID, marketplaceID, QString, ENTITY_ITEM_DEFAULT_MARKETPLACE_ID); DEFINE_PROPERTY_GROUP(KeyLight, keyLight, KeyLightPropertyGroup); DEFINE_PROPERTY_REF(PROP_VOXEL_VOLUME_SIZE, VoxelVolumeSize, voxelVolumeSize, glm::vec3, PolyVoxEntityItem::DEFAULT_VOXEL_VOLUME_SIZE); DEFINE_PROPERTY_REF(PROP_VOXEL_DATA, VoxelData, voxelData, QByteArray, PolyVoxEntityItem::DEFAULT_VOXEL_DATA); @@ -203,6 +202,9 @@ public: DEFINE_PROPERTY_REF(PROP_QUERY_AA_CUBE, QueryAACube, queryAACube, AACube, AACube()); DEFINE_PROPERTY_REF(PROP_SHAPE, Shape, shape, QString, "Sphere"); + // Certifiable Properties - related to Proof of Purchase certificates + DEFINE_PROPERTY_REF(PROP_MARKETPLACE_ID, MarketplaceID, marketplaceID, QString, ENTITY_ITEM_DEFAULT_MARKETPLACE_ID); + // these are used when bouncing location data into and out of scripts DEFINE_PROPERTY_REF(PROP_LOCAL_POSITION, LocalPosition, localPosition, glmVec3, ENTITY_ITEM_ZERO_VEC3); DEFINE_PROPERTY_REF(PROP_LOCAL_ROTATION, LocalRotation, localRotation, glmQuat, ENTITY_ITEM_DEFAULT_ROTATION); diff --git a/libraries/entities/src/EntityItemPropertiesDefaults.h b/libraries/entities/src/EntityItemPropertiesDefaults.h index d52c5d9aab..5949c3aefb 100644 --- a/libraries/entities/src/EntityItemPropertiesDefaults.h +++ b/libraries/entities/src/EntityItemPropertiesDefaults.h @@ -26,9 +26,19 @@ const glm::vec3 ENTITY_ITEM_HALF_VEC3 = glm::vec3(0.5f); const bool ENTITY_ITEM_DEFAULT_LOCKED = false; const QString ENTITY_ITEM_DEFAULT_USER_DATA = QString(""); -const QString ENTITY_ITEM_DEFAULT_MARKETPLACE_ID = QString(""); const QUuid ENTITY_ITEM_DEFAULT_SIMULATOR_ID = QUuid(); +// Certificate Properties +const QString ENTITY_ITEM_DEFAULT_ITEM_NAME = QString(""); +const QString ENTITY_ITEM_DEFAULT_ITEM_DESCRIPTION = QString(""); +const QStringList ENTITY_ITEM_DEFAULT_ITEM_CATEGORIES = QStringList(); +const QString ENTITY_ITEM_DEFAULT_ITEM_ARTIST = QString(""); +const QString ENTITY_ITEM_DEFAULT_ITEM_LICENSE = QString(""); +const int ENTITY_ITEM_DEFAULT_LIMITED_RUN = -1; +const QString ENTITY_ITEM_DEFAULT_MARKETPLACE_ID = QString(""); +const int ENTITY_ITEM_DEFAULT_EDITION_NUMBER = -1; +const QString ENTITY_ITEM_DEFAULT_CERTIFICATE_ID = QString(""); + const float ENTITY_ITEM_DEFAULT_ALPHA = 1.0f; const float ENTITY_ITEM_DEFAULT_LOCAL_RENDER_ALPHA = 1.0f; const bool ENTITY_ITEM_DEFAULT_VISIBLE = true; diff --git a/libraries/entities/src/EntityPropertyFlags.h b/libraries/entities/src/EntityPropertyFlags.h index d97be6348f..3aa5423505 100644 --- a/libraries/entities/src/EntityPropertyFlags.h +++ b/libraries/entities/src/EntityPropertyFlags.h @@ -187,7 +187,18 @@ enum EntityPropertyList { PROP_SERVER_SCRIPTS, PROP_FILTER_URL, - + + // Certificable Properties + PROP_ITEM_NAME, + PROP_ITEM_DESCRIPTION, + PROP_ITEM_CATEGORIES, + PROP_ITEM_ARTIST, + PROP_ITEM_LICENSE, + PROP_LIMITED_RUN, + // PROP_MARKETPLACE_ID is above + PROP_EDITION_NUMBER, + PROP_CERTIFICATE_ID, + //////////////////////////////////////////////////////////////////////////////////////////////////// // ATTENTION: add new properties to end of list just ABOVE this line PROP_AFTER_LAST_ITEM, From 7724fc204bb6dd283d3e39dd0463d17422c43530 Mon Sep 17 00:00:00 2001 From: Howard Stearns Date: Fri, 22 Sep 2017 14:19:54 -0700 Subject: [PATCH 02/13] working checkpoint --- libraries/entities/src/EntityItem.cpp | 87 ++++++++++++-- libraries/entities/src/EntityItem.h | 20 ++-- .../entities/src/EntityItemProperties.cpp | 111 ++++++++++++++++++ libraries/entities/src/EntityItemProperties.h | 19 +++ .../src/EntityItemPropertiesDefaults.h | 6 +- .../networking/src/udt/PacketHeaders.cpp | 2 +- libraries/networking/src/udt/PacketHeaders.h | 1 + 7 files changed, 222 insertions(+), 24 deletions(-) diff --git a/libraries/entities/src/EntityItem.cpp b/libraries/entities/src/EntityItem.cpp index 107af837fe..506d2b9e05 100644 --- a/libraries/entities/src/EntityItem.cpp +++ b/libraries/entities/src/EntityItem.cpp @@ -94,7 +94,18 @@ EntityPropertyFlags EntityItem::getEntityProperties(EncodeBitstreamParams& param requestedProperties += PROP_DYNAMIC; requestedProperties += PROP_LOCKED; requestedProperties += PROP_USER_DATA; + + // Certifiable properties + requestedProperties += PROP_ITEM_NAME; + requestedProperties += PROP_ITEM_DESCRIPTION; + requestedProperties += PROP_ITEM_CATEGORIES; + requestedProperties += PROP_ITEM_ARTIST; + requestedProperties += PROP_ITEM_LICENSE; + requestedProperties += PROP_LIMITED_RUN; requestedProperties += PROP_MARKETPLACE_ID; + requestedProperties += PROP_EDITION_NUMBER; + requestedProperties += PROP_CERTIFICATE_ID; + requestedProperties += PROP_NAME; requestedProperties += PROP_HREF; requestedProperties += PROP_DESCRIPTION; @@ -239,7 +250,18 @@ OctreeElement::AppendState EntityItem::appendEntityData(OctreePacketData* packet APPEND_ENTITY_PROPERTY(PROP_DYNAMIC, getDynamic()); APPEND_ENTITY_PROPERTY(PROP_LOCKED, getLocked()); APPEND_ENTITY_PROPERTY(PROP_USER_DATA, getUserData()); + + // Certifiable Properties APPEND_ENTITY_PROPERTY(PROP_MARKETPLACE_ID, getMarketplaceID()); + APPEND_ENTITY_PROPERTY(PROP_ITEM_NAME, getItemName()); + APPEND_ENTITY_PROPERTY(PROP_ITEM_DESCRIPTION, getItemDescription()); + APPEND_ENTITY_PROPERTY(PROP_ITEM_CATEGORIES, getItemCategories()); + APPEND_ENTITY_PROPERTY(PROP_ITEM_ARTIST, getItemArtist()); + APPEND_ENTITY_PROPERTY(PROP_ITEM_LICENSE, getItemLicense()); + APPEND_ENTITY_PROPERTY(PROP_LIMITED_RUN, getLimitedRun()); + APPEND_ENTITY_PROPERTY(PROP_EDITION_NUMBER, getEditionNumber()); + APPEND_ENTITY_PROPERTY(PROP_CERTIFICATE_ID, getCertificateID()); + APPEND_ENTITY_PROPERTY(PROP_NAME, getName()); APPEND_ENTITY_PROPERTY(PROP_COLLISION_SOUND_URL, getCollisionSoundURL()); APPEND_ENTITY_PROPERTY(PROP_HREF, getHref()); @@ -790,6 +812,16 @@ int EntityItem::readEntityDataFromBuffer(const unsigned char* data, int bytesLef if (args.bitstreamVersion >= VERSION_ENTITIES_HAS_MARKETPLACE_ID) { READ_ENTITY_PROPERTY(PROP_MARKETPLACE_ID, QString, setMarketplaceID); } + if (args.bitstreamVersion >= VERSION_ENTITIES_HAS_CERTIFICATE_PROPERTIES) { + READ_ENTITY_PROPERTY(PROP_ITEM_NAME, QString, setItemName); + READ_ENTITY_PROPERTY(PROP_ITEM_DESCRIPTION, QString, setItemDescription); + READ_ENTITY_PROPERTY(PROP_ITEM_CATEGORIES, QString, setItemCategories); + READ_ENTITY_PROPERTY(PROP_ITEM_ARTIST, QString, setItemArtist); + READ_ENTITY_PROPERTY(PROP_ITEM_LICENSE, QString, setItemLicense); + READ_ENTITY_PROPERTY(PROP_LIMITED_RUN, quint32, setLimitedRun); + READ_ENTITY_PROPERTY(PROP_EDITION_NUMBER, quint32, setEditionNumber); + READ_ENTITY_PROPERTY(PROP_CERTIFICATE_ID, QString, setCertificateID); + } READ_ENTITY_PROPERTY(PROP_NAME, QString, setName); READ_ENTITY_PROPERTY(PROP_COLLISION_SOUND_URL, QString, setCollisionSoundURL); @@ -1207,7 +1239,18 @@ EntityItemProperties EntityItem::getProperties(EntityPropertyFlags desiredProper COPY_ENTITY_PROPERTY_TO_PROPERTIES(dynamic, getDynamic); COPY_ENTITY_PROPERTY_TO_PROPERTIES(locked, getLocked); COPY_ENTITY_PROPERTY_TO_PROPERTIES(userData, getUserData); + + // Certifiable Properties + COPY_ENTITY_PROPERTY_TO_PROPERTIES(itemName, getItemName); + COPY_ENTITY_PROPERTY_TO_PROPERTIES(itemDescription, getItemDescription); + COPY_ENTITY_PROPERTY_TO_PROPERTIES(itemCategories, getItemCategories); + COPY_ENTITY_PROPERTY_TO_PROPERTIES(itemArtist, getItemArtist); + COPY_ENTITY_PROPERTY_TO_PROPERTIES(itemLicense, getItemLicense); + COPY_ENTITY_PROPERTY_TO_PROPERTIES(limitedRun, getLimitedRun); COPY_ENTITY_PROPERTY_TO_PROPERTIES(marketplaceID, getMarketplaceID); + COPY_ENTITY_PROPERTY_TO_PROPERTIES(editionNumber, getEditionNumber); + COPY_ENTITY_PROPERTY_TO_PROPERTIES(certificateID, getCertificateID); + COPY_ENTITY_PROPERTY_TO_PROPERTIES(name, getName); COPY_ENTITY_PROPERTY_TO_PROPERTIES(href, getHref); COPY_ENTITY_PROPERTY_TO_PROPERTIES(description, getDescription); @@ -1302,7 +1345,18 @@ bool EntityItem::setProperties(const EntityItemProperties& properties) { SET_ENTITY_PROPERTY_FROM_PROPERTIES(localRenderAlpha, setLocalRenderAlpha); SET_ENTITY_PROPERTY_FROM_PROPERTIES(visible, setVisible); SET_ENTITY_PROPERTY_FROM_PROPERTIES(userData, setUserData); + + // Certifiable properties + SET_ENTITY_PROPERTY_FROM_PROPERTIES(itemName, setItemName); + SET_ENTITY_PROPERTY_FROM_PROPERTIES(itemDescription, setItemDescription); + SET_ENTITY_PROPERTY_FROM_PROPERTIES(itemCategories, setItemCategories); + SET_ENTITY_PROPERTY_FROM_PROPERTIES(itemArtist, setItemArtist); + SET_ENTITY_PROPERTY_FROM_PROPERTIES(itemLicense, setItemLicense); + SET_ENTITY_PROPERTY_FROM_PROPERTIES(limitedRun, setLimitedRun); SET_ENTITY_PROPERTY_FROM_PROPERTIES(marketplaceID, setMarketplaceID); + SET_ENTITY_PROPERTY_FROM_PROPERTIES(editionNumber, setEditionNumber); + SET_ENTITY_PROPERTY_FROM_PROPERTIES(certificateID, setCertificateID); + SET_ENTITY_PROPERTY_FROM_PROPERTIES(name, setName); SET_ENTITY_PROPERTY_FROM_PROPERTIES(href, setHref); SET_ENTITY_PROPERTY_FROM_PROPERTIES(description, setDescription); @@ -2757,19 +2811,32 @@ void EntityItem::setUserData(const QString& value) { }); } -QString EntityItem::getMarketplaceID() const { - QString result; - withReadLock([&] { - result = _marketplaceID; - }); - return result; +// Certificate Properties +#define DEFINE_PROPERTY_GETTER(type, accessor, var) \ +type EntityItem::get##accessor() const { \ + type result; \ + withReadLock([&] { \ + result = _##var; \ + }); \ + return result; \ } -void EntityItem::setMarketplaceID(const QString& value) { - withWriteLock([&] { - _marketplaceID = value; - }); +#define DEFINE_PROPERTY_SETTER(type, accessor, var) \ +void EntityItem::set##accessor(const type##& value) { \ + withWriteLock([&] { \ + _##var = value; \ + }); \ } +#define DEFINE_PROPERTY_ACCESSOR(type, accessor, var) DEFINE_PROPERTY_GETTER(type, accessor, var) DEFINE_PROPERTY_SETTER(type, accessor, var) +DEFINE_PROPERTY_ACCESSOR(QString, ItemName, itemName) +DEFINE_PROPERTY_ACCESSOR(QString, ItemDescription, itemDescription) +DEFINE_PROPERTY_ACCESSOR(QString, ItemCategories, itemCategories) +DEFINE_PROPERTY_ACCESSOR(QString, ItemArtist, itemArtist) +DEFINE_PROPERTY_ACCESSOR(QString, ItemLicense, itemLicense) +DEFINE_PROPERTY_ACCESSOR(quint32, LimitedRun, limitedRun) +DEFINE_PROPERTY_ACCESSOR(QString, MarketplaceID, marketplaceID) +DEFINE_PROPERTY_ACCESSOR(quint32, EditionNumber, editionNumber) +DEFINE_PROPERTY_ACCESSOR(QString, CertificateID, certificateID) uint32_t EntityItem::getDirtyFlags() const { uint32_t result; diff --git a/libraries/entities/src/EntityItem.h b/libraries/entities/src/EntityItem.h index 5f3587fc43..9c20b3ba32 100644 --- a/libraries/entities/src/EntityItem.h +++ b/libraries/entities/src/EntityItem.h @@ -308,18 +308,18 @@ public: void setItemName(const QString& value); QString getItemDescription() const; void setItemDescription(const QString& value); - QStringList getItemCategories() const; - void setItemCategories(const QStringList& value); + QString getItemCategories() const; + void setItemCategories(const QString& value); QString getItemArtist() const; void setItemArtist(const QString& value); QString getItemLicense() const; void setItemLicense(const QString& value); - int getLimitedRun() const; - void setLimitedRun(int); + quint32 getLimitedRun() const; + void setLimitedRun(const quint32&); QString getMarketplaceID() const; void setMarketplaceID(const QString& value); - int getEditionNumber() const; - void setEditionNumber(int); + quint32 getEditionNumber() const; + void setEditionNumber(const quint32&); QString getCertificateID() const; void setCertificateID(const QString& value); QString getStaticCertificateJSON() const; @@ -555,13 +555,13 @@ protected: // Certificate Properties QString _itemName { ENTITY_ITEM_DEFAULT_ITEM_NAME }; QString _itemDescription { ENTITY_ITEM_DEFAULT_ITEM_DESCRIPTION }; - QStringList _itemCategories { ENTITY_ITEM_DEFAULT_ITEM_CATEGORIES }; + QString _itemCategories { ENTITY_ITEM_DEFAULT_ITEM_CATEGORIES }; QString _itemArtist { ENTITY_ITEM_DEFAULT_ITEM_ARTIST }; QString _itemLicense { ENTITY_ITEM_DEFAULT_ITEM_LICENSE }; - int _limitedRun { ENTITY_ITEM_DEFAULT_LIMITED_RUN }; + quint32 _limitedRun { ENTITY_ITEM_DEFAULT_LIMITED_RUN }; + QString _certificateID { ENTITY_ITEM_DEFAULT_CERTIFICATE_ID }; + quint32 _editionNumber { ENTITY_ITEM_DEFAULT_EDITION_NUMBER }; QString _marketplaceID { ENTITY_ITEM_DEFAULT_MARKETPLACE_ID }; - int _editionNumber { ENTITY_ITEM_DEFAULT_EDITION_NUMBER }; - QString _marketplaceID { ENTITY_ITEM_DEFAULT_CERTIFICATE_ID }; // NOTE: Damping is applied like this: v *= pow(1 - damping, dt) diff --git a/libraries/entities/src/EntityItemProperties.cpp b/libraries/entities/src/EntityItemProperties.cpp index d6de4ec614..48eb3462c4 100644 --- a/libraries/entities/src/EntityItemProperties.cpp +++ b/libraries/entities/src/EntityItemProperties.cpp @@ -288,7 +288,18 @@ EntityPropertyFlags EntityItemProperties::getChangedProperties() const { CHECK_PROPERTY_CHANGE(PROP_RADIUS_SPREAD, radiusSpread); CHECK_PROPERTY_CHANGE(PROP_RADIUS_START, radiusStart); CHECK_PROPERTY_CHANGE(PROP_RADIUS_FINISH, radiusFinish); + + // Certifiable properties + CHECK_PROPERTY_CHANGE(PROP_ITEM_NAME, itemName); + CHECK_PROPERTY_CHANGE(PROP_ITEM_DESCRIPTION, itemDescription); + CHECK_PROPERTY_CHANGE(PROP_ITEM_CATEGORIES, itemCategories); + CHECK_PROPERTY_CHANGE(PROP_ITEM_ARTIST, itemArtist); + CHECK_PROPERTY_CHANGE(PROP_ITEM_LICENSE, itemLicense); + CHECK_PROPERTY_CHANGE(PROP_LIMITED_RUN, limitedRun); CHECK_PROPERTY_CHANGE(PROP_MARKETPLACE_ID, marketplaceID); + CHECK_PROPERTY_CHANGE(PROP_EDITION_NUMBER, editionNumber); + CHECK_PROPERTY_CHANGE(PROP_CERTIFICATE_ID, certificateID); + CHECK_PROPERTY_CHANGE(PROP_NAME, name); CHECK_PROPERTY_CHANGE(PROP_BACKGROUND_MODE, backgroundMode); CHECK_PROPERTY_CHANGE(PROP_SOURCE_URL, sourceUrl); @@ -405,7 +416,18 @@ QScriptValue EntityItemProperties::copyToScriptValue(QScriptEngine* engine, bool COPY_PROPERTY_TO_QSCRIPTVALUE(PROP_ACTION_DATA, actionData); COPY_PROPERTY_TO_QSCRIPTVALUE(PROP_LOCKED, locked); COPY_PROPERTY_TO_QSCRIPTVALUE(PROP_USER_DATA, userData); + + // Certifiable properties + COPY_PROPERTY_TO_QSCRIPTVALUE(PROP_ITEM_NAME, itemName); + COPY_PROPERTY_TO_QSCRIPTVALUE(PROP_ITEM_DESCRIPTION, itemDescription); + COPY_PROPERTY_TO_QSCRIPTVALUE(PROP_ITEM_CATEGORIES, itemCategories); + COPY_PROPERTY_TO_QSCRIPTVALUE(PROP_ITEM_ARTIST, itemArtist); + COPY_PROPERTY_TO_QSCRIPTVALUE(PROP_ITEM_LICENSE, itemLicense); + COPY_PROPERTY_TO_QSCRIPTVALUE(PROP_LIMITED_RUN, limitedRun); COPY_PROPERTY_TO_QSCRIPTVALUE(PROP_MARKETPLACE_ID, marketplaceID); + COPY_PROPERTY_TO_QSCRIPTVALUE(PROP_EDITION_NUMBER, editionNumber); + COPY_PROPERTY_TO_QSCRIPTVALUE(PROP_CERTIFICATE_ID, certificateID); + COPY_PROPERTY_TO_QSCRIPTVALUE(PROP_NAME, name); COPY_PROPERTY_TO_QSCRIPTVALUE(PROP_COLLISION_SOUND_URL, collisionSoundURL); @@ -671,7 +693,18 @@ void EntityItemProperties::copyFromScriptValue(const QScriptValue& object, bool COPY_PROPERTY_FROM_QSCRIPTVALUE(radiusSpread, float, setRadiusSpread); COPY_PROPERTY_FROM_QSCRIPTVALUE(radiusStart, float, setRadiusStart); COPY_PROPERTY_FROM_QSCRIPTVALUE(radiusFinish, float, setRadiusFinish); + + // Certifiable properties + COPY_PROPERTY_FROM_QSCRIPTVALUE(itemName, QString, setItemName); + COPY_PROPERTY_FROM_QSCRIPTVALUE(itemDescription, QString, setItemDescription); + COPY_PROPERTY_FROM_QSCRIPTVALUE(itemCategories, QString, setItemCategories); + COPY_PROPERTY_FROM_QSCRIPTVALUE(itemArtist, QString, setItemArtist); + COPY_PROPERTY_FROM_QSCRIPTVALUE(itemLicense, QString, setItemLicense); + COPY_PROPERTY_FROM_QSCRIPTVALUE(limitedRun, quint32, setLimitedRun); COPY_PROPERTY_FROM_QSCRIPTVALUE(marketplaceID, QString, setMarketplaceID); + COPY_PROPERTY_FROM_QSCRIPTVALUE(editionNumber, quint32, setEditionNumber); + COPY_PROPERTY_FROM_QSCRIPTVALUE(certificateID, QString, setCertificateID); + COPY_PROPERTY_FROM_QSCRIPTVALUE(name, QString, setName); COPY_PROPERTY_FROM_QSCRIPTVALUE(collisionSoundURL, QString, setCollisionSoundURL); @@ -809,7 +842,18 @@ void EntityItemProperties::merge(const EntityItemProperties& other) { COPY_PROPERTY_IF_CHANGED(radiusSpread); COPY_PROPERTY_IF_CHANGED(radiusStart); COPY_PROPERTY_IF_CHANGED(radiusFinish); + + // Certifiable properties + COPY_PROPERTY_IF_CHANGED(itemName); + COPY_PROPERTY_IF_CHANGED(itemDescription); + COPY_PROPERTY_IF_CHANGED(itemCategories); + COPY_PROPERTY_IF_CHANGED(itemArtist); + COPY_PROPERTY_IF_CHANGED(itemLicense); + COPY_PROPERTY_IF_CHANGED(limitedRun); COPY_PROPERTY_IF_CHANGED(marketplaceID); + COPY_PROPERTY_IF_CHANGED(editionNumber); + COPY_PROPERTY_IF_CHANGED(certificateID); + COPY_PROPERTY_IF_CHANGED(name); COPY_PROPERTY_IF_CHANGED(collisionSoundURL); @@ -981,7 +1025,18 @@ void EntityItemProperties::entityPropertyFlagsFromScriptValue(const QScriptValue ADD_PROPERTY_TO_MAP(PROP_RADIUS_SPREAD, RadiusSpread, radiusSpread, float); ADD_PROPERTY_TO_MAP(PROP_RADIUS_START, RadiusStart, radiusStart, float); ADD_PROPERTY_TO_MAP(PROP_RADIUS_FINISH, RadiusFinish, radiusFinish, float); + + // Certifiable properties + ADD_PROPERTY_TO_MAP(PROP_ITEM_NAME, ItemName, itemName, QString); + ADD_PROPERTY_TO_MAP(PROP_ITEM_DESCRIPTION, ItemDescription, itemDescription, QString); + ADD_PROPERTY_TO_MAP(PROP_ITEM_CATEGORIES, ItemCategories, itemCategories, QString); + ADD_PROPERTY_TO_MAP(PROP_ITEM_ARTIST, ItemArtist, itemArtist, QString); + ADD_PROPERTY_TO_MAP(PROP_ITEM_LICENSE, ItemLicense, itemLicense, QString); + ADD_PROPERTY_TO_MAP(PROP_LIMITED_RUN, LimitedRun, limitedRun, quint32); ADD_PROPERTY_TO_MAP(PROP_MARKETPLACE_ID, MarketplaceID, marketplaceID, QString); + ADD_PROPERTY_TO_MAP(PROP_EDITION_NUMBER, EditionNumber, editionNumber, quint32); + ADD_PROPERTY_TO_MAP(PROP_CERTIFICATE_ID, CertificateID, certificateID, QString); + ADD_PROPERTY_TO_MAP(PROP_KEYLIGHT_COLOR, KeyLightColor, keyLightColor, xColor); ADD_PROPERTY_TO_MAP(PROP_KEYLIGHT_INTENSITY, KeyLightIntensity, keyLightIntensity, float); ADD_PROPERTY_TO_MAP(PROP_KEYLIGHT_AMBIENT_INTENSITY, KeyLightAmbientIntensity, keyLightAmbientIntensity, float); @@ -1334,7 +1389,17 @@ bool EntityItemProperties::encodeEntityEditPacket(PacketType command, EntityItem properties.getType() == EntityTypes::Sphere) { APPEND_ENTITY_PROPERTY(PROP_SHAPE, properties.getShape()); } + // certifiable properties + APPEND_ENTITY_PROPERTY(PROP_ITEM_NAME, properties.getItemName()); + APPEND_ENTITY_PROPERTY(PROP_ITEM_DESCRIPTION, properties.getItemDescription()); + APPEND_ENTITY_PROPERTY(PROP_ITEM_CATEGORIES, properties.getItemCategories()); + APPEND_ENTITY_PROPERTY(PROP_ITEM_ARTIST, properties.getItemArtist()); + APPEND_ENTITY_PROPERTY(PROP_ITEM_LICENSE, properties.getItemLicense()); + APPEND_ENTITY_PROPERTY(PROP_LIMITED_RUN, properties.getLimitedRun()); APPEND_ENTITY_PROPERTY(PROP_MARKETPLACE_ID, properties.getMarketplaceID()); + APPEND_ENTITY_PROPERTY(PROP_EDITION_NUMBER, properties.getEditionNumber()); + APPEND_ENTITY_PROPERTY(PROP_CERTIFICATE_ID, properties.getCertificateID()); + APPEND_ENTITY_PROPERTY(PROP_NAME, properties.getName()); APPEND_ENTITY_PROPERTY(PROP_COLLISION_SOUND_URL, properties.getCollisionSoundURL()); APPEND_ENTITY_PROPERTY(PROP_ACTION_DATA, properties.getActionData()); @@ -1632,7 +1697,17 @@ bool EntityItemProperties::decodeEntityEditPacket(const unsigned char* data, int READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_SHAPE, QString, setShape); } + // certifiable properties + READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_ITEM_NAME, QString, setItemName); + READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_ITEM_DESCRIPTION, QString, setItemDescription); + READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_ITEM_CATEGORIES, QString, setItemCategories); + READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_ITEM_ARTIST, QString, setItemArtist); + READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_ITEM_LICENSE, QString, setItemLicense); + READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_LIMITED_RUN, quint32, setLimitedRun); READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_MARKETPLACE_ID, QString, setMarketplaceID); + READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_EDITION_NUMBER, quint32, setEditionNumber); + READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_CERTIFICATE_ID, QString, setCertificateID); + READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_NAME, QString, setName); READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_COLLISION_SOUND_URL, QString, setCollisionSoundURL); READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_ACTION_DATA, QByteArray, setActionData); @@ -1746,7 +1821,16 @@ void EntityItemProperties::markAllChanged() { //_alphaStartChanged = true; //_alphaFinishChanged = true; + // Certifiable properties + _itemNameChanged = true; + _itemDescriptionChanged = true; + _itemCategoriesChanged = true; + _itemArtistChanged = true; + _itemLicenseChanged = true; + _limitedRunChanged = true; _marketplaceIDChanged = true; + _editionNumberChanged = true; + _certificateIDChanged = true; _keyLight.markAllChanged(); @@ -2053,9 +2137,36 @@ QList EntityItemProperties::listChangedProperties() { if (radiusFinishChanged()) { out += "radiusFinish"; } + + // Certifiable properties + if (itemNameChanged()) { + out += "itemName"; + } + if (itemDescriptionChanged()) { + out += "itemDescription"; + } + if (itemCategoriesChanged()) { + out += "itemCategories"; + } + if (itemArtistChanged()) { + out += "itemArtist"; + } + if (itemLicenseChanged()) { + out += "itemLicense"; + } + if (limitedRunChanged()) { + out += "limitedRun"; + } if (marketplaceIDChanged()) { out += "marketplaceID"; } + if (editionNumberChanged()) { + out += "editionNumber"; + } + if (certificateIDChanged()) { + out += "certificateID"; + } + if (backgroundModeChanged()) { out += "backgroundMode"; } diff --git a/libraries/entities/src/EntityItemProperties.h b/libraries/entities/src/EntityItemProperties.h index 212d707de0..0ca97dcadc 100644 --- a/libraries/entities/src/EntityItemProperties.h +++ b/libraries/entities/src/EntityItemProperties.h @@ -203,7 +203,15 @@ public: DEFINE_PROPERTY_REF(PROP_SHAPE, Shape, shape, QString, "Sphere"); // Certifiable Properties - related to Proof of Purchase certificates + DEFINE_PROPERTY_REF(PROP_ITEM_NAME, ItemName, itemName, QString, ENTITY_ITEM_DEFAULT_ITEM_NAME); + DEFINE_PROPERTY_REF(PROP_ITEM_DESCRIPTION, ItemDescription, itemDescription, QString, ENTITY_ITEM_DEFAULT_ITEM_DESCRIPTION); + DEFINE_PROPERTY_REF(PROP_ITEM_CATEGORIES, ItemCategories, itemCategories, QString, ENTITY_ITEM_DEFAULT_ITEM_CATEGORIES); + DEFINE_PROPERTY_REF(PROP_ITEM_ARTIST, ItemArtist, itemArtist, QString, ENTITY_ITEM_DEFAULT_ITEM_ARTIST); + DEFINE_PROPERTY_REF(PROP_ITEM_LICENSE, ItemLicense, itemLicense, QString, ENTITY_ITEM_DEFAULT_ITEM_LICENSE); + DEFINE_PROPERTY_REF(PROP_LIMITED_RUN, LimitedRun, limitedRun, quint32, ENTITY_ITEM_DEFAULT_LIMITED_RUN); DEFINE_PROPERTY_REF(PROP_MARKETPLACE_ID, MarketplaceID, marketplaceID, QString, ENTITY_ITEM_DEFAULT_MARKETPLACE_ID); + DEFINE_PROPERTY_REF(PROP_EDITION_NUMBER, EditionNumber, editionNumber, quint32, ENTITY_ITEM_DEFAULT_EDITION_NUMBER); + DEFINE_PROPERTY_REF(PROP_CERTIFICATE_ID, CertificateID, certificateID, QString, ENTITY_ITEM_DEFAULT_CERTIFICATE_ID); // these are used when bouncing location data into and out of scripts DEFINE_PROPERTY_REF(PROP_LOCAL_POSITION, LocalPosition, localPosition, glmVec3, ENTITY_ITEM_ZERO_VEC3); @@ -428,7 +436,18 @@ inline QDebug operator<<(QDebug debug, const EntityItemProperties& properties) { DEBUG_PROPERTY_IF_CHANGED(debug, properties, RadiusSpread, radiusSpread, ""); DEBUG_PROPERTY_IF_CHANGED(debug, properties, RadiusStart, radiusStart, ""); DEBUG_PROPERTY_IF_CHANGED(debug, properties, RadiusFinish, radiusFinish, ""); + + // Certifiable Properties + DEBUG_PROPERTY_IF_CHANGED(debug, properties, ItemName, itemName, ""); + DEBUG_PROPERTY_IF_CHANGED(debug, properties, ItemDescription, itemDescription, ""); + DEBUG_PROPERTY_IF_CHANGED(debug, properties, ItemCategories, itemCategories, ""); + DEBUG_PROPERTY_IF_CHANGED(debug, properties, ItemArtist, itemArtist, ""); + DEBUG_PROPERTY_IF_CHANGED(debug, properties, ItemLicense, itemLicense, ""); + DEBUG_PROPERTY_IF_CHANGED(debug, properties, LimitedRun, limitedRun, ""); DEBUG_PROPERTY_IF_CHANGED(debug, properties, MarketplaceID, marketplaceID, ""); + DEBUG_PROPERTY_IF_CHANGED(debug, properties, EditionNumber, editionNumber, ""); + DEBUG_PROPERTY_IF_CHANGED(debug, properties, CertificateID, certificateID, ""); + DEBUG_PROPERTY_IF_CHANGED(debug, properties, BackgroundMode, backgroundMode, ""); DEBUG_PROPERTY_IF_CHANGED(debug, properties, VoxelVolumeSize, voxelVolumeSize, ""); DEBUG_PROPERTY_IF_CHANGED(debug, properties, VoxelData, voxelData, ""); diff --git a/libraries/entities/src/EntityItemPropertiesDefaults.h b/libraries/entities/src/EntityItemPropertiesDefaults.h index 5949c3aefb..1c52e9edd4 100644 --- a/libraries/entities/src/EntityItemPropertiesDefaults.h +++ b/libraries/entities/src/EntityItemPropertiesDefaults.h @@ -31,12 +31,12 @@ const QUuid ENTITY_ITEM_DEFAULT_SIMULATOR_ID = QUuid(); // Certificate Properties const QString ENTITY_ITEM_DEFAULT_ITEM_NAME = QString(""); const QString ENTITY_ITEM_DEFAULT_ITEM_DESCRIPTION = QString(""); -const QStringList ENTITY_ITEM_DEFAULT_ITEM_CATEGORIES = QStringList(); +const QString ENTITY_ITEM_DEFAULT_ITEM_CATEGORIES = QString(""); const QString ENTITY_ITEM_DEFAULT_ITEM_ARTIST = QString(""); const QString ENTITY_ITEM_DEFAULT_ITEM_LICENSE = QString(""); -const int ENTITY_ITEM_DEFAULT_LIMITED_RUN = -1; +const quint32 ENTITY_ITEM_DEFAULT_LIMITED_RUN = -1; const QString ENTITY_ITEM_DEFAULT_MARKETPLACE_ID = QString(""); -const int ENTITY_ITEM_DEFAULT_EDITION_NUMBER = -1; +const quint32 ENTITY_ITEM_DEFAULT_EDITION_NUMBER = -1; const QString ENTITY_ITEM_DEFAULT_CERTIFICATE_ID = QString(""); const float ENTITY_ITEM_DEFAULT_ALPHA = 1.0f; diff --git a/libraries/networking/src/udt/PacketHeaders.cpp b/libraries/networking/src/udt/PacketHeaders.cpp index b95f2ff6a0..2f3f65c90b 100644 --- a/libraries/networking/src/udt/PacketHeaders.cpp +++ b/libraries/networking/src/udt/PacketHeaders.cpp @@ -30,7 +30,7 @@ PacketVersion versionForPacketType(PacketType packetType) { case PacketType::EntityEdit: case PacketType::EntityData: case PacketType::EntityPhysics: - return VERSION_ENTITIES_ANIMATION_ALLOW_TRANSLATION_PROPERTIES; + return VERSION_ENTITIES_HAS_CERTIFICATE_PROPERTIES; case PacketType::EntityQuery: return static_cast(EntityQueryPacketVersion::JSONFilterWithFamilyTree); case PacketType::AvatarIdentity: diff --git a/libraries/networking/src/udt/PacketHeaders.h b/libraries/networking/src/udt/PacketHeaders.h index 4fefc6ab3a..92f9a6ffb7 100644 --- a/libraries/networking/src/udt/PacketHeaders.h +++ b/libraries/networking/src/udt/PacketHeaders.h @@ -266,6 +266,7 @@ const PacketVersion VERSION_ENTITIES_BULLET_DYNAMICS = 70; const PacketVersion VERSION_ENTITIES_HAS_SHOULD_HIGHLIGHT = 71; const PacketVersion VERSION_ENTITIES_HAS_HIGHLIGHT_SCRIPTING_INTERFACE = 72; const PacketVersion VERSION_ENTITIES_ANIMATION_ALLOW_TRANSLATION_PROPERTIES = 73; +const PacketVersion VERSION_ENTITIES_HAS_CERTIFICATE_PROPERTIES = 74; enum class EntityQueryPacketVersion: PacketVersion { JSONFilter = 18, From f25e22b463a4527d31eb98a1403e1a64d157b2b4 Mon Sep 17 00:00:00 2001 From: Howard Stearns Date: Fri, 22 Sep 2017 15:06:39 -0700 Subject: [PATCH 03/13] entityInstanceNumber --- libraries/entities/src/EntityItem.cpp | 6 ++++++ libraries/entities/src/EntityItem.h | 3 +++ libraries/entities/src/EntityItemProperties.cpp | 11 +++++++++++ libraries/entities/src/EntityItemProperties.h | 2 ++ libraries/entities/src/EntityItemPropertiesDefaults.h | 3 ++- libraries/entities/src/EntityPropertyFlags.h | 1 + 6 files changed, 25 insertions(+), 1 deletion(-) diff --git a/libraries/entities/src/EntityItem.cpp b/libraries/entities/src/EntityItem.cpp index 506d2b9e05..ff0b382a67 100644 --- a/libraries/entities/src/EntityItem.cpp +++ b/libraries/entities/src/EntityItem.cpp @@ -104,6 +104,7 @@ EntityPropertyFlags EntityItem::getEntityProperties(EncodeBitstreamParams& param requestedProperties += PROP_LIMITED_RUN; requestedProperties += PROP_MARKETPLACE_ID; requestedProperties += PROP_EDITION_NUMBER; + requestedProperties += PROP_ENTITY_INSTANCE_NUMBER; requestedProperties += PROP_CERTIFICATE_ID; requestedProperties += PROP_NAME; @@ -260,6 +261,7 @@ OctreeElement::AppendState EntityItem::appendEntityData(OctreePacketData* packet APPEND_ENTITY_PROPERTY(PROP_ITEM_LICENSE, getItemLicense()); APPEND_ENTITY_PROPERTY(PROP_LIMITED_RUN, getLimitedRun()); APPEND_ENTITY_PROPERTY(PROP_EDITION_NUMBER, getEditionNumber()); + APPEND_ENTITY_PROPERTY(PROP_ENTITY_INSTANCE_NUMBER, getEntityInstanceNumber()); APPEND_ENTITY_PROPERTY(PROP_CERTIFICATE_ID, getCertificateID()); APPEND_ENTITY_PROPERTY(PROP_NAME, getName()); @@ -820,6 +822,7 @@ int EntityItem::readEntityDataFromBuffer(const unsigned char* data, int bytesLef READ_ENTITY_PROPERTY(PROP_ITEM_LICENSE, QString, setItemLicense); READ_ENTITY_PROPERTY(PROP_LIMITED_RUN, quint32, setLimitedRun); READ_ENTITY_PROPERTY(PROP_EDITION_NUMBER, quint32, setEditionNumber); + READ_ENTITY_PROPERTY(PROP_ENTITY_INSTANCE_NUMBER, quint32, setEntityInstanceNumber); READ_ENTITY_PROPERTY(PROP_CERTIFICATE_ID, QString, setCertificateID); } @@ -1249,6 +1252,7 @@ EntityItemProperties EntityItem::getProperties(EntityPropertyFlags desiredProper COPY_ENTITY_PROPERTY_TO_PROPERTIES(limitedRun, getLimitedRun); COPY_ENTITY_PROPERTY_TO_PROPERTIES(marketplaceID, getMarketplaceID); COPY_ENTITY_PROPERTY_TO_PROPERTIES(editionNumber, getEditionNumber); + COPY_ENTITY_PROPERTY_TO_PROPERTIES(entityInstanceNumber, getEntityInstanceNumber); COPY_ENTITY_PROPERTY_TO_PROPERTIES(certificateID, getCertificateID); COPY_ENTITY_PROPERTY_TO_PROPERTIES(name, getName); @@ -1355,6 +1359,7 @@ bool EntityItem::setProperties(const EntityItemProperties& properties) { SET_ENTITY_PROPERTY_FROM_PROPERTIES(limitedRun, setLimitedRun); SET_ENTITY_PROPERTY_FROM_PROPERTIES(marketplaceID, setMarketplaceID); SET_ENTITY_PROPERTY_FROM_PROPERTIES(editionNumber, setEditionNumber); + SET_ENTITY_PROPERTY_FROM_PROPERTIES(entityInstanceNumber, setEntityInstanceNumber); SET_ENTITY_PROPERTY_FROM_PROPERTIES(certificateID, setCertificateID); SET_ENTITY_PROPERTY_FROM_PROPERTIES(name, setName); @@ -2836,6 +2841,7 @@ DEFINE_PROPERTY_ACCESSOR(QString, ItemLicense, itemLicense) DEFINE_PROPERTY_ACCESSOR(quint32, LimitedRun, limitedRun) DEFINE_PROPERTY_ACCESSOR(QString, MarketplaceID, marketplaceID) DEFINE_PROPERTY_ACCESSOR(quint32, EditionNumber, editionNumber) +DEFINE_PROPERTY_ACCESSOR(quint32, EntityInstanceNumber, entityInstanceNumber) DEFINE_PROPERTY_ACCESSOR(QString, CertificateID, certificateID) uint32_t EntityItem::getDirtyFlags() const { diff --git a/libraries/entities/src/EntityItem.h b/libraries/entities/src/EntityItem.h index 9c20b3ba32..244fd362bf 100644 --- a/libraries/entities/src/EntityItem.h +++ b/libraries/entities/src/EntityItem.h @@ -320,6 +320,8 @@ public: void setMarketplaceID(const QString& value); quint32 getEditionNumber() const; void setEditionNumber(const quint32&); + quint32 getEntityInstanceNumber() const; + void setEntityInstanceNumber(const quint32&); QString getCertificateID() const; void setCertificateID(const QString& value); QString getStaticCertificateJSON() const; @@ -561,6 +563,7 @@ protected: quint32 _limitedRun { ENTITY_ITEM_DEFAULT_LIMITED_RUN }; QString _certificateID { ENTITY_ITEM_DEFAULT_CERTIFICATE_ID }; quint32 _editionNumber { ENTITY_ITEM_DEFAULT_EDITION_NUMBER }; + quint32 _entityInstanceNumber { ENTITY_ITEM_DEFAULT_ENTITY_INSTANCE_NUMBER }; QString _marketplaceID { ENTITY_ITEM_DEFAULT_MARKETPLACE_ID }; diff --git a/libraries/entities/src/EntityItemProperties.cpp b/libraries/entities/src/EntityItemProperties.cpp index 48eb3462c4..e3752fc790 100644 --- a/libraries/entities/src/EntityItemProperties.cpp +++ b/libraries/entities/src/EntityItemProperties.cpp @@ -298,6 +298,7 @@ EntityPropertyFlags EntityItemProperties::getChangedProperties() const { CHECK_PROPERTY_CHANGE(PROP_LIMITED_RUN, limitedRun); CHECK_PROPERTY_CHANGE(PROP_MARKETPLACE_ID, marketplaceID); CHECK_PROPERTY_CHANGE(PROP_EDITION_NUMBER, editionNumber); + CHECK_PROPERTY_CHANGE(PROP_ENTITY_INSTANCE_NUMBER, entityInstanceNumber); CHECK_PROPERTY_CHANGE(PROP_CERTIFICATE_ID, certificateID); CHECK_PROPERTY_CHANGE(PROP_NAME, name); @@ -426,6 +427,7 @@ QScriptValue EntityItemProperties::copyToScriptValue(QScriptEngine* engine, bool COPY_PROPERTY_TO_QSCRIPTVALUE(PROP_LIMITED_RUN, limitedRun); COPY_PROPERTY_TO_QSCRIPTVALUE(PROP_MARKETPLACE_ID, marketplaceID); COPY_PROPERTY_TO_QSCRIPTVALUE(PROP_EDITION_NUMBER, editionNumber); + COPY_PROPERTY_TO_QSCRIPTVALUE(PROP_ENTITY_INSTANCE_NUMBER, entityInstanceNumber); COPY_PROPERTY_TO_QSCRIPTVALUE(PROP_CERTIFICATE_ID, certificateID); COPY_PROPERTY_TO_QSCRIPTVALUE(PROP_NAME, name); @@ -703,6 +705,7 @@ void EntityItemProperties::copyFromScriptValue(const QScriptValue& object, bool COPY_PROPERTY_FROM_QSCRIPTVALUE(limitedRun, quint32, setLimitedRun); COPY_PROPERTY_FROM_QSCRIPTVALUE(marketplaceID, QString, setMarketplaceID); COPY_PROPERTY_FROM_QSCRIPTVALUE(editionNumber, quint32, setEditionNumber); + COPY_PROPERTY_FROM_QSCRIPTVALUE(entityInstanceNumber, quint32, setEntityInstanceNumber); COPY_PROPERTY_FROM_QSCRIPTVALUE(certificateID, QString, setCertificateID); COPY_PROPERTY_FROM_QSCRIPTVALUE(name, QString, setName); @@ -852,6 +855,7 @@ void EntityItemProperties::merge(const EntityItemProperties& other) { COPY_PROPERTY_IF_CHANGED(limitedRun); COPY_PROPERTY_IF_CHANGED(marketplaceID); COPY_PROPERTY_IF_CHANGED(editionNumber); + COPY_PROPERTY_IF_CHANGED(entityInstanceNumber); COPY_PROPERTY_IF_CHANGED(certificateID); COPY_PROPERTY_IF_CHANGED(name); @@ -1035,6 +1039,7 @@ void EntityItemProperties::entityPropertyFlagsFromScriptValue(const QScriptValue ADD_PROPERTY_TO_MAP(PROP_LIMITED_RUN, LimitedRun, limitedRun, quint32); ADD_PROPERTY_TO_MAP(PROP_MARKETPLACE_ID, MarketplaceID, marketplaceID, QString); ADD_PROPERTY_TO_MAP(PROP_EDITION_NUMBER, EditionNumber, editionNumber, quint32); + ADD_PROPERTY_TO_MAP(PROP_ENTITY_INSTANCE_NUMBER, EntityInstanceNumber, entityInstanceNumber, quint32); ADD_PROPERTY_TO_MAP(PROP_CERTIFICATE_ID, CertificateID, certificateID, QString); ADD_PROPERTY_TO_MAP(PROP_KEYLIGHT_COLOR, KeyLightColor, keyLightColor, xColor); @@ -1398,6 +1403,7 @@ bool EntityItemProperties::encodeEntityEditPacket(PacketType command, EntityItem APPEND_ENTITY_PROPERTY(PROP_LIMITED_RUN, properties.getLimitedRun()); APPEND_ENTITY_PROPERTY(PROP_MARKETPLACE_ID, properties.getMarketplaceID()); APPEND_ENTITY_PROPERTY(PROP_EDITION_NUMBER, properties.getEditionNumber()); + APPEND_ENTITY_PROPERTY(PROP_ENTITY_INSTANCE_NUMBER, properties.getEntityInstanceNumber()); APPEND_ENTITY_PROPERTY(PROP_CERTIFICATE_ID, properties.getCertificateID()); APPEND_ENTITY_PROPERTY(PROP_NAME, properties.getName()); @@ -1706,6 +1712,7 @@ bool EntityItemProperties::decodeEntityEditPacket(const unsigned char* data, int READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_LIMITED_RUN, quint32, setLimitedRun); READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_MARKETPLACE_ID, QString, setMarketplaceID); READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_EDITION_NUMBER, quint32, setEditionNumber); + READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_ENTITY_INSTANCE_NUMBER, quint32, setEntityInstanceNumber); READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_CERTIFICATE_ID, QString, setCertificateID); READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_NAME, QString, setName); @@ -1830,6 +1837,7 @@ void EntityItemProperties::markAllChanged() { _limitedRunChanged = true; _marketplaceIDChanged = true; _editionNumberChanged = true; + _entityInstanceNumberChanged = true; _certificateIDChanged = true; _keyLight.markAllChanged(); @@ -2163,6 +2171,9 @@ QList EntityItemProperties::listChangedProperties() { if (editionNumberChanged()) { out += "editionNumber"; } + if (entityInstanceNumberChanged()) { + out += "entityInstanceNumber"; + } if (certificateIDChanged()) { out += "certificateID"; } diff --git a/libraries/entities/src/EntityItemProperties.h b/libraries/entities/src/EntityItemProperties.h index 0ca97dcadc..1f5b4a4660 100644 --- a/libraries/entities/src/EntityItemProperties.h +++ b/libraries/entities/src/EntityItemProperties.h @@ -211,6 +211,7 @@ public: DEFINE_PROPERTY_REF(PROP_LIMITED_RUN, LimitedRun, limitedRun, quint32, ENTITY_ITEM_DEFAULT_LIMITED_RUN); DEFINE_PROPERTY_REF(PROP_MARKETPLACE_ID, MarketplaceID, marketplaceID, QString, ENTITY_ITEM_DEFAULT_MARKETPLACE_ID); DEFINE_PROPERTY_REF(PROP_EDITION_NUMBER, EditionNumber, editionNumber, quint32, ENTITY_ITEM_DEFAULT_EDITION_NUMBER); + DEFINE_PROPERTY_REF(PROP_ENTITY_INSTANCE_NUMBER, EntityInstanceNumber, entityInstanceNumber, quint32, ENTITY_ITEM_DEFAULT_ENTITY_INSTANCE_NUMBER); DEFINE_PROPERTY_REF(PROP_CERTIFICATE_ID, CertificateID, certificateID, QString, ENTITY_ITEM_DEFAULT_CERTIFICATE_ID); // these are used when bouncing location data into and out of scripts @@ -446,6 +447,7 @@ inline QDebug operator<<(QDebug debug, const EntityItemProperties& properties) { DEBUG_PROPERTY_IF_CHANGED(debug, properties, LimitedRun, limitedRun, ""); DEBUG_PROPERTY_IF_CHANGED(debug, properties, MarketplaceID, marketplaceID, ""); DEBUG_PROPERTY_IF_CHANGED(debug, properties, EditionNumber, editionNumber, ""); + DEBUG_PROPERTY_IF_CHANGED(debug, properties, EntityInstanceNumber, entityInstanceNumber, ""); DEBUG_PROPERTY_IF_CHANGED(debug, properties, CertificateID, certificateID, ""); DEBUG_PROPERTY_IF_CHANGED(debug, properties, BackgroundMode, backgroundMode, ""); diff --git a/libraries/entities/src/EntityItemPropertiesDefaults.h b/libraries/entities/src/EntityItemPropertiesDefaults.h index 1c52e9edd4..8eae4766f0 100644 --- a/libraries/entities/src/EntityItemPropertiesDefaults.h +++ b/libraries/entities/src/EntityItemPropertiesDefaults.h @@ -36,7 +36,8 @@ const QString ENTITY_ITEM_DEFAULT_ITEM_ARTIST = QString(""); const QString ENTITY_ITEM_DEFAULT_ITEM_LICENSE = QString(""); const quint32 ENTITY_ITEM_DEFAULT_LIMITED_RUN = -1; const QString ENTITY_ITEM_DEFAULT_MARKETPLACE_ID = QString(""); -const quint32 ENTITY_ITEM_DEFAULT_EDITION_NUMBER = -1; +const quint32 ENTITY_ITEM_DEFAULT_EDITION_NUMBER = 0; +const quint32 ENTITY_ITEM_DEFAULT_ENTITY_INSTANCE_NUMBER = 0; const QString ENTITY_ITEM_DEFAULT_CERTIFICATE_ID = QString(""); const float ENTITY_ITEM_DEFAULT_ALPHA = 1.0f; diff --git a/libraries/entities/src/EntityPropertyFlags.h b/libraries/entities/src/EntityPropertyFlags.h index 3aa5423505..c03630f8bf 100644 --- a/libraries/entities/src/EntityPropertyFlags.h +++ b/libraries/entities/src/EntityPropertyFlags.h @@ -197,6 +197,7 @@ enum EntityPropertyList { PROP_LIMITED_RUN, // PROP_MARKETPLACE_ID is above PROP_EDITION_NUMBER, + PROP_ENTITY_INSTANCE_NUMBER, PROP_CERTIFICATE_ID, //////////////////////////////////////////////////////////////////////////////////////////////////// From 8fdd405593efd41cca385237013e9b5026b78dc9 Mon Sep 17 00:00:00 2001 From: Howard Stearns Date: Fri, 22 Sep 2017 15:10:30 -0700 Subject: [PATCH 04/13] consistent comments --- libraries/entities/src/EntityItem.cpp | 4 ++-- libraries/entities/src/EntityItem.h | 2 +- .../entities/src/EntityItemProperties.cpp | 18 +++++++++--------- .../src/EntityItemPropertiesDefaults.h | 2 +- 4 files changed, 13 insertions(+), 13 deletions(-) diff --git a/libraries/entities/src/EntityItem.cpp b/libraries/entities/src/EntityItem.cpp index ff0b382a67..9084a4b878 100644 --- a/libraries/entities/src/EntityItem.cpp +++ b/libraries/entities/src/EntityItem.cpp @@ -1350,7 +1350,7 @@ bool EntityItem::setProperties(const EntityItemProperties& properties) { SET_ENTITY_PROPERTY_FROM_PROPERTIES(visible, setVisible); SET_ENTITY_PROPERTY_FROM_PROPERTIES(userData, setUserData); - // Certifiable properties + // Certifiable Properties SET_ENTITY_PROPERTY_FROM_PROPERTIES(itemName, setItemName); SET_ENTITY_PROPERTY_FROM_PROPERTIES(itemDescription, setItemDescription); SET_ENTITY_PROPERTY_FROM_PROPERTIES(itemCategories, setItemCategories); @@ -2816,7 +2816,7 @@ void EntityItem::setUserData(const QString& value) { }); } -// Certificate Properties +// Certifiable Properties #define DEFINE_PROPERTY_GETTER(type, accessor, var) \ type EntityItem::get##accessor() const { \ type result; \ diff --git a/libraries/entities/src/EntityItem.h b/libraries/entities/src/EntityItem.h index 244fd362bf..e2221ac58a 100644 --- a/libraries/entities/src/EntityItem.h +++ b/libraries/entities/src/EntityItem.h @@ -554,7 +554,7 @@ protected: QString _href; //Hyperlink href QString _description; //Hyperlink description - // Certificate Properties + // Certifiable Properties QString _itemName { ENTITY_ITEM_DEFAULT_ITEM_NAME }; QString _itemDescription { ENTITY_ITEM_DEFAULT_ITEM_DESCRIPTION }; QString _itemCategories { ENTITY_ITEM_DEFAULT_ITEM_CATEGORIES }; diff --git a/libraries/entities/src/EntityItemProperties.cpp b/libraries/entities/src/EntityItemProperties.cpp index e3752fc790..4e01bffe5f 100644 --- a/libraries/entities/src/EntityItemProperties.cpp +++ b/libraries/entities/src/EntityItemProperties.cpp @@ -289,7 +289,7 @@ EntityPropertyFlags EntityItemProperties::getChangedProperties() const { CHECK_PROPERTY_CHANGE(PROP_RADIUS_START, radiusStart); CHECK_PROPERTY_CHANGE(PROP_RADIUS_FINISH, radiusFinish); - // Certifiable properties + // Certifiable Properties CHECK_PROPERTY_CHANGE(PROP_ITEM_NAME, itemName); CHECK_PROPERTY_CHANGE(PROP_ITEM_DESCRIPTION, itemDescription); CHECK_PROPERTY_CHANGE(PROP_ITEM_CATEGORIES, itemCategories); @@ -418,7 +418,7 @@ QScriptValue EntityItemProperties::copyToScriptValue(QScriptEngine* engine, bool COPY_PROPERTY_TO_QSCRIPTVALUE(PROP_LOCKED, locked); COPY_PROPERTY_TO_QSCRIPTVALUE(PROP_USER_DATA, userData); - // Certifiable properties + // Certifiable Properties COPY_PROPERTY_TO_QSCRIPTVALUE(PROP_ITEM_NAME, itemName); COPY_PROPERTY_TO_QSCRIPTVALUE(PROP_ITEM_DESCRIPTION, itemDescription); COPY_PROPERTY_TO_QSCRIPTVALUE(PROP_ITEM_CATEGORIES, itemCategories); @@ -696,7 +696,7 @@ void EntityItemProperties::copyFromScriptValue(const QScriptValue& object, bool COPY_PROPERTY_FROM_QSCRIPTVALUE(radiusStart, float, setRadiusStart); COPY_PROPERTY_FROM_QSCRIPTVALUE(radiusFinish, float, setRadiusFinish); - // Certifiable properties + // Certifiable Properties COPY_PROPERTY_FROM_QSCRIPTVALUE(itemName, QString, setItemName); COPY_PROPERTY_FROM_QSCRIPTVALUE(itemDescription, QString, setItemDescription); COPY_PROPERTY_FROM_QSCRIPTVALUE(itemCategories, QString, setItemCategories); @@ -846,7 +846,7 @@ void EntityItemProperties::merge(const EntityItemProperties& other) { COPY_PROPERTY_IF_CHANGED(radiusStart); COPY_PROPERTY_IF_CHANGED(radiusFinish); - // Certifiable properties + // Certifiable Properties COPY_PROPERTY_IF_CHANGED(itemName); COPY_PROPERTY_IF_CHANGED(itemDescription); COPY_PROPERTY_IF_CHANGED(itemCategories); @@ -1030,7 +1030,7 @@ void EntityItemProperties::entityPropertyFlagsFromScriptValue(const QScriptValue ADD_PROPERTY_TO_MAP(PROP_RADIUS_START, RadiusStart, radiusStart, float); ADD_PROPERTY_TO_MAP(PROP_RADIUS_FINISH, RadiusFinish, radiusFinish, float); - // Certifiable properties + // Certifiable Properties ADD_PROPERTY_TO_MAP(PROP_ITEM_NAME, ItemName, itemName, QString); ADD_PROPERTY_TO_MAP(PROP_ITEM_DESCRIPTION, ItemDescription, itemDescription, QString); ADD_PROPERTY_TO_MAP(PROP_ITEM_CATEGORIES, ItemCategories, itemCategories, QString); @@ -1394,7 +1394,7 @@ bool EntityItemProperties::encodeEntityEditPacket(PacketType command, EntityItem properties.getType() == EntityTypes::Sphere) { APPEND_ENTITY_PROPERTY(PROP_SHAPE, properties.getShape()); } - // certifiable properties + // Certifiable Properties APPEND_ENTITY_PROPERTY(PROP_ITEM_NAME, properties.getItemName()); APPEND_ENTITY_PROPERTY(PROP_ITEM_DESCRIPTION, properties.getItemDescription()); APPEND_ENTITY_PROPERTY(PROP_ITEM_CATEGORIES, properties.getItemCategories()); @@ -1703,7 +1703,7 @@ bool EntityItemProperties::decodeEntityEditPacket(const unsigned char* data, int READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_SHAPE, QString, setShape); } - // certifiable properties + // Certifiable Properties READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_ITEM_NAME, QString, setItemName); READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_ITEM_DESCRIPTION, QString, setItemDescription); READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_ITEM_CATEGORIES, QString, setItemCategories); @@ -1828,7 +1828,7 @@ void EntityItemProperties::markAllChanged() { //_alphaStartChanged = true; //_alphaFinishChanged = true; - // Certifiable properties + // Certifiable Properties _itemNameChanged = true; _itemDescriptionChanged = true; _itemCategoriesChanged = true; @@ -2146,7 +2146,7 @@ QList EntityItemProperties::listChangedProperties() { out += "radiusFinish"; } - // Certifiable properties + // Certifiable Properties if (itemNameChanged()) { out += "itemName"; } diff --git a/libraries/entities/src/EntityItemPropertiesDefaults.h b/libraries/entities/src/EntityItemPropertiesDefaults.h index 8eae4766f0..ab5d1d8094 100644 --- a/libraries/entities/src/EntityItemPropertiesDefaults.h +++ b/libraries/entities/src/EntityItemPropertiesDefaults.h @@ -28,7 +28,7 @@ const bool ENTITY_ITEM_DEFAULT_LOCKED = false; const QString ENTITY_ITEM_DEFAULT_USER_DATA = QString(""); const QUuid ENTITY_ITEM_DEFAULT_SIMULATOR_ID = QUuid(); -// Certificate Properties +// Certifiable Properties const QString ENTITY_ITEM_DEFAULT_ITEM_NAME = QString(""); const QString ENTITY_ITEM_DEFAULT_ITEM_DESCRIPTION = QString(""); const QString ENTITY_ITEM_DEFAULT_ITEM_CATEGORIES = QString(""); From 4403c27b5275e4f26d110671c0dbb0c46350b62f Mon Sep 17 00:00:00 2001 From: Howard Stearns Date: Tue, 26 Sep 2017 14:14:37 -0700 Subject: [PATCH 05/13] working checkpoint. still needs verification/hashing, etc. --- libraries/entities/src/EntityItem.cpp | 25 ++++++++++++-- libraries/entities/src/EntityItem.h | 4 --- .../entities/src/EntityItemProperties.cpp | 20 +++++------ libraries/entities/src/ModelEntityItem.cpp | 34 +++++++++++-------- .../entities/src/ParticleEffectEntityItem.cpp | 10 +++--- libraries/entities/src/ZoneEntityItem.h | 2 +- 6 files changed, 59 insertions(+), 36 deletions(-) diff --git a/libraries/entities/src/EntityItem.cpp b/libraries/entities/src/EntityItem.cpp index 9084a4b878..5a205742ae 100644 --- a/libraries/entities/src/EntityItem.cpp +++ b/libraries/entities/src/EntityItem.cpp @@ -1568,6 +1568,27 @@ float EntityItem::getRadius() const { return 0.5f * glm::length(getDimensions()); } +// Checking Certifiable Properties +QString EntityItem::getStaticCertificateJSON() const { + // Produce a compact json of every non-default static certificate property, with the property names in alphabetical order. + // The static certificate properties include all an only those properties that cannot be changed without altering the identity + // of the entity as reviewed during the certification submission. + return "FIXME"; +} +QString EntityItem::getStaticCertificateHash() const { + // The base64 encoded, sha224 hash of static certificate json. + return "FIXME"; +} +bool EntityItem::verifyStaticCertificateProperties() const { + // True IIF a non-empty certificateID matches the static certificate json. + // I.e., if we can verify that the certificateID was produced by High Fidelity signing the static certificate hash. + if (_certificateID.isEmpty()) { + return false; + } + return false; // fixme +} + + void EntityItem::adjustShapeInfoByRegistration(ShapeInfo& info) const { if (_registrationPoint != ENTITY_ITEM_DEFAULT_REGISTRATION_POINT) { glm::mat4 scale = glm::scale(getDimensions()); @@ -2829,8 +2850,8 @@ type EntityItem::get##accessor() const { \ #define DEFINE_PROPERTY_SETTER(type, accessor, var) \ void EntityItem::set##accessor(const type##& value) { \ withWriteLock([&] { \ - _##var = value; \ - }); \ + _##var = value; \ + }); \ } #define DEFINE_PROPERTY_ACCESSOR(type, accessor, var) DEFINE_PROPERTY_GETTER(type, accessor, var) DEFINE_PROPERTY_SETTER(type, accessor, var) DEFINE_PROPERTY_ACCESSOR(QString, ItemName, itemName) diff --git a/libraries/entities/src/EntityItem.h b/libraries/entities/src/EntityItem.h index e2221ac58a..a6153c0234 100644 --- a/libraries/entities/src/EntityItem.h +++ b/libraries/entities/src/EntityItem.h @@ -327,10 +327,6 @@ public: QString getStaticCertificateJSON() const; QString getStaticCertificateHash() const; bool verifyStaticCertificateProperties() const; - QString getVerifiedCertificateId(); - - bool getShouldHighlight() const; - void setShouldHighlight(const bool value); // TODO: get rid of users of getRadius()... float getRadius() const; diff --git a/libraries/entities/src/EntityItemProperties.cpp b/libraries/entities/src/EntityItemProperties.cpp index 4e01bffe5f..007c5dcc6c 100644 --- a/libraries/entities/src/EntityItemProperties.cpp +++ b/libraries/entities/src/EntityItemProperties.cpp @@ -1394,6 +1394,11 @@ bool EntityItemProperties::encodeEntityEditPacket(PacketType command, EntityItem properties.getType() == EntityTypes::Sphere) { APPEND_ENTITY_PROPERTY(PROP_SHAPE, properties.getShape()); } + APPEND_ENTITY_PROPERTY(PROP_NAME, properties.getName()); + APPEND_ENTITY_PROPERTY(PROP_COLLISION_SOUND_URL, properties.getCollisionSoundURL()); + APPEND_ENTITY_PROPERTY(PROP_ACTION_DATA, properties.getActionData()); + APPEND_ENTITY_PROPERTY(PROP_ALPHA, properties.getAlpha()); + // Certifiable Properties APPEND_ENTITY_PROPERTY(PROP_ITEM_NAME, properties.getItemName()); APPEND_ENTITY_PROPERTY(PROP_ITEM_DESCRIPTION, properties.getItemDescription()); @@ -1405,11 +1410,6 @@ bool EntityItemProperties::encodeEntityEditPacket(PacketType command, EntityItem APPEND_ENTITY_PROPERTY(PROP_EDITION_NUMBER, properties.getEditionNumber()); APPEND_ENTITY_PROPERTY(PROP_ENTITY_INSTANCE_NUMBER, properties.getEntityInstanceNumber()); APPEND_ENTITY_PROPERTY(PROP_CERTIFICATE_ID, properties.getCertificateID()); - - APPEND_ENTITY_PROPERTY(PROP_NAME, properties.getName()); - APPEND_ENTITY_PROPERTY(PROP_COLLISION_SOUND_URL, properties.getCollisionSoundURL()); - APPEND_ENTITY_PROPERTY(PROP_ACTION_DATA, properties.getActionData()); - APPEND_ENTITY_PROPERTY(PROP_ALPHA, properties.getAlpha()); } if (propertyCount > 0) { @@ -1703,6 +1703,11 @@ bool EntityItemProperties::decodeEntityEditPacket(const unsigned char* data, int READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_SHAPE, QString, setShape); } + READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_NAME, QString, setName); + READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_COLLISION_SOUND_URL, QString, setCollisionSoundURL); + READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_ACTION_DATA, QByteArray, setActionData); + READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_ALPHA, float, setAlpha); + // Certifiable Properties READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_ITEM_NAME, QString, setItemName); READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_ITEM_DESCRIPTION, QString, setItemDescription); @@ -1715,11 +1720,6 @@ bool EntityItemProperties::decodeEntityEditPacket(const unsigned char* data, int READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_ENTITY_INSTANCE_NUMBER, quint32, setEntityInstanceNumber); READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_CERTIFICATE_ID, QString, setCertificateID); - READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_NAME, QString, setName); - READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_COLLISION_SOUND_URL, QString, setCollisionSoundURL); - READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_ACTION_DATA, QByteArray, setActionData); - READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_ALPHA, float, setAlpha); - return valid; } diff --git a/libraries/entities/src/ModelEntityItem.cpp b/libraries/entities/src/ModelEntityItem.cpp index b02cf04651..b50ed008a7 100644 --- a/libraries/entities/src/ModelEntityItem.cpp +++ b/libraries/entities/src/ModelEntityItem.cpp @@ -215,16 +215,18 @@ void ModelEntityItem::debugDump() const { } void ModelEntityItem::setShapeType(ShapeType type) { - if (type != _shapeType) { - if (type == SHAPE_TYPE_STATIC_MESH && _dynamic) { - // dynamic and STATIC_MESH are incompatible - // since the shape is being set here we clear the dynamic bit - _dynamic = false; - _dirtyFlags |= Simulation::DIRTY_MOTION_TYPE; + withWriteLock([&] { + if (type != _shapeType) { + if (type == SHAPE_TYPE_STATIC_MESH && _dynamic) { + // dynamic and STATIC_MESH are incompatible + // since the shape is being set here we clear the dynamic bit + _dynamic = false; + _dirtyFlags |= Simulation::DIRTY_MOTION_TYPE; + } + _shapeType = type; + _dirtyFlags |= Simulation::DIRTY_SHAPE | Simulation::DIRTY_MASS; } - _shapeType = type; - _dirtyFlags |= Simulation::DIRTY_SHAPE | Simulation::DIRTY_MASS; - } + }); } ShapeType ModelEntityItem::getShapeType() const { @@ -257,13 +259,15 @@ void ModelEntityItem::setModelURL(const QString& url) { } void ModelEntityItem::setCompoundShapeURL(const QString& url) { - if (_compoundShapeURL != url) { - ShapeType oldType = computeTrueShapeType(); - _compoundShapeURL = url; - if (oldType != computeTrueShapeType()) { - _dirtyFlags |= Simulation::DIRTY_SHAPE | Simulation::DIRTY_MASS; + withWriteLock([&] { + if (_compoundShapeURL != url) { + ShapeType oldType = computeTrueShapeType(); + _compoundShapeURL = url; + if (oldType != computeTrueShapeType()) { + _dirtyFlags |= Simulation::DIRTY_SHAPE | Simulation::DIRTY_MASS; + } } - } + }); } void ModelEntityItem::setAnimationURL(const QString& url) { diff --git a/libraries/entities/src/ParticleEffectEntityItem.cpp b/libraries/entities/src/ParticleEffectEntityItem.cpp index 9bbf4323da..c6616f8cd3 100644 --- a/libraries/entities/src/ParticleEffectEntityItem.cpp +++ b/libraries/entities/src/ParticleEffectEntityItem.cpp @@ -633,10 +633,12 @@ void ParticleEffectEntityItem::debugDump() const { } void ParticleEffectEntityItem::setShapeType(ShapeType type) { - if (type != _shapeType) { - _shapeType = type; - _dirtyFlags |= Simulation::DIRTY_SHAPE | Simulation::DIRTY_MASS; - } + withWriteLock([&] { + if (type != _shapeType) { + _shapeType = type; + _dirtyFlags |= Simulation::DIRTY_SHAPE | Simulation::DIRTY_MASS; + } + }); } void ParticleEffectEntityItem::setMaxParticles(quint32 maxParticles) { diff --git a/libraries/entities/src/ZoneEntityItem.h b/libraries/entities/src/ZoneEntityItem.h index 14e7cd2f40..c3be53599c 100644 --- a/libraries/entities/src/ZoneEntityItem.h +++ b/libraries/entities/src/ZoneEntityItem.h @@ -56,7 +56,7 @@ public: static void setDrawZoneBoundaries(bool value) { _drawZoneBoundaries = value; } virtual bool isReadyToComputeShape() const override { return false; } - void setShapeType(ShapeType type) override { _shapeType = type; } + void setShapeType(ShapeType type) override { withWriteLock([&] { _shapeType = type; }); } virtual ShapeType getShapeType() const override; virtual bool hasCompoundShapeURL() const; From d1350a03c2bf81cab25c3c44eb138239df25296c Mon Sep 17 00:00:00 2001 From: Howard Stearns Date: Thu, 28 Sep 2017 17:06:07 -0700 Subject: [PATCH 06/13] working checkpoint, but with a lot of debug/development stuff --- libraries/entities/src/EntityItem.cpp | 100 +++++++++++++++++- libraries/entities/src/EntityItem.h | 4 +- .../controllerModules/hudOverlayPointer.js | 2 +- 3 files changed, 98 insertions(+), 8 deletions(-) diff --git a/libraries/entities/src/EntityItem.cpp b/libraries/entities/src/EntityItem.cpp index 5a205742ae..5b9d10a759 100644 --- a/libraries/entities/src/EntityItem.cpp +++ b/libraries/entities/src/EntityItem.cpp @@ -1569,15 +1569,45 @@ float EntityItem::getRadius() const { } // Checking Certifiable Properties -QString EntityItem::getStaticCertificateJSON() const { +#include // fixme +#include +#include +#include +#include // fixme +#define ADD_STRING_PROPERTY(n, N) if (!propertySet.get##N().isEmpty()) json[#n] = propertySet.get##N() +#define ADD_ENUM_PROPERTY(n, N) json[#n] = propertySet.get##N##AsString() +#define ADD_INT_PROPERTY(n, N) if (propertySet.get##N() != 0) json[#n] = (propertySet.get##N() == -1) ? -1.0 : ((double) propertySet.get##N()) +QByteArray EntityItem::getStaticCertificateJSON() const { // Produce a compact json of every non-default static certificate property, with the property names in alphabetical order. // The static certificate properties include all an only those properties that cannot be changed without altering the identity // of the entity as reviewed during the certification submission. - return "FIXME"; + + QJsonObject json; + EntityItemProperties propertySet = getProperties(); // Note: neither EntityItem nor EntityitemProperties "properties" are QObject "properties"! + // It is important that this be reproducible in the same order each time. Since we also generate these on the server, we do it alphabetically + // to help maintainence in two different code bases. + // animation + ADD_STRING_PROPERTY(collisionSoundURL, CollisionSoundURL); + ADD_STRING_PROPERTY(compoundShapeURL, CompoundShapeURL); + ADD_INT_PROPERTY(editionNumber, EditionNumber); + ADD_INT_PROPERTY(entityInstanceNumber, EntityInstanceNumber); + ADD_STRING_PROPERTY(itemArtist, ItemArtist); + ADD_STRING_PROPERTY(itemCategories, ItemCategories); + ADD_STRING_PROPERTY(itemDescription, ItemDescription); + ADD_STRING_PROPERTY(itemLicense, ItemLicense); + ADD_STRING_PROPERTY(itemName, ItemName); + ADD_INT_PROPERTY(limitedRun, LimitedRun); + ADD_STRING_PROPERTY(marketplaceID, MarketplaceID); + ADD_STRING_PROPERTY(modelURL, ModelURL); + ADD_STRING_PROPERTY(script, Script); + ADD_ENUM_PROPERTY(shapeType, ShapeType); + json["type"] = EntityTypes::getEntityTypeName(propertySet.getType()); + + return QJsonDocument(json).toJson(QJsonDocument::Compact); } -QString EntityItem::getStaticCertificateHash() const { +QByteArray EntityItem::getStaticCertificateHash() const { // The base64 encoded, sha224 hash of static certificate json. - return "FIXME"; + return QCryptographicHash::hash(getStaticCertificateJSON(), QCryptographicHash::Sha256); } bool EntityItem::verifyStaticCertificateProperties() const { // True IIF a non-empty certificateID matches the static certificate json. @@ -1585,7 +1615,67 @@ bool EntityItem::verifyStaticCertificateProperties() const { if (_certificateID.isEmpty()) { return false; } - return false; // fixme + // FIXME: really verify(hifi-pub-key, certificateID-as-signature-for-getStaticCertifcateHash) + + //const char text[] = "{\"collisionSoundURL\":\"colSound02\",\"compoundShapeURL\":\"http://mpassets.highfidelity.com/31479af7-94b0-45f2-84ba-478d27e5af90-v1/gnome_phys.obj\",\"entityInstanceNumber\":2,\"itemName\":\"Explosive Garden Nomex\",\"limitedRun\":-1,\"marketplaceID\":\"31479af7-94b0-45f2-84ba-478d27e5af90\",\"modelURL\":\"http://mpassets.highfidelity.com/31479af7-94b0-45f2-84ba-478d27e5af90-v1/gnome_green.fbx\",\"script\":\"http://mpassets.highfidelity.com/31479af7-94b0-45f2-84ba-478d27e5af90-v1/explodingGnomeEntity.js\",\"shapeType\":\"compound\",\"type\":\"Model\"}"; + // auto textLength = sizeof(text); + auto hash = getStaticCertificateHash(); + const char* text = hash.constData(); + auto textLength = hash.length(); + qDebug() << "HRS FIXME text" << getStaticCertificateJSON() << "hash base64" << hash.toBase64(); + + //const char signatureBase64[] = "QpRnN7XGeVFnF/a+FVjZDWhdbHM3P5Cu69rL0/X2DMnqQEGwhx/oBs/7guTs6aNuO+ahmbTTc0+Nqdcqv36KGA=="; + //auto signatureBytes = QByteArray::fromBase64(signatureBase64); + //const char* signature = signatureBytes.constData(); + //auto signatureLength = signatureBytes.length(); + + const char key[] = "-----BEGIN RSA PRIVATE KEY-----\n\ +MIIBOQIBAAJBALCoBiDAZOClO26tC5pd7JikBL61WIgpAqbcNnrV/TcG6LPI7Zbi\n\ +MjdUixmTNvYMRZH3Wlqtl2IKG1W68y3stKECAwEAAQJABvOlwhYwIhL+gr12jm2R\n\ +yPPzZ9nVEQ6kFxLlZfIT09119fd6OU1X5d4sHWfMfSIEgjwQIDS3ZU1kY3XKo87X\n\ +zQIhAOPHlYa1OC7BLhaTouy68qIU2vCKLP8mt4S31/TT0UOnAiEAxor6gU6yupTQ\n\ +yuyV3yHvr5LkZKBGqhjmOTmDfgtX7ncCIChGbgX3nQuHVOLhD/nTxHssPNozVGl5\n\ +KxHof+LmYSYZAiB4U+yEh9SsXdq40W/3fpLMPuNq1PRezJ5jGidGMcvF+wIgUNec\n\ +3Kg2U+CVZr8/bDT/vXRrsKj1zfobYuvbfVH02QY=\n\ +-----END RSA PRIVATE KEY-----"; + BIO* vbio = BIO_new(BIO_s_mem()); + int vlen = BIO_write(vbio, key, sizeof(key)); + RSA* vrsa = PEM_read_bio_RSAPrivateKey(vbio, NULL, NULL, NULL); + qDebug() << "HRS FIXME private key bufio" << !!vbio << vlen << !!vrsa << key; + + QByteArray signature(RSA_size(vrsa), 0); + unsigned int signatureLength = 0; + int signOK = RSA_sign(NID_sha256, reinterpret_cast(text), textLength, reinterpret_cast(signature.data()), &signatureLength, vrsa); + QByteArray signature64 = signature.toBase64(); + qDebug() << "HRS FIXME signature" << signature64.length() << signature64 << "ok:" << signOK; + + ///* + const char publicKey[] = "-----BEGIN PUBLIC KEY-----\n\ +MFwwDQYJKoZIhvcNAQEBBQADSwAwSAJBALCoBiDAZOClO26tC5pd7JikBL61WIgp\n\ +AqbcNnrV/TcG6LPI7ZbiMjdUixmTNvYMRZH3Wlqtl2IKG1W68y3stKECAwEAAQ==\n\ +-----END PUBLIC KEY-----"; + //*/ + // const char publicKey[] = "MFwwDQYJKoZIhvcNAQEBBQADSwAwSAJBALCoBiDAZOClO26tC5pd7JikBL61WIgpAqbcNnrV/TcG6LPI7ZbiMjdUixmTNvYMRZH3Wlqtl2IKG1W68y3stKECAwEAAQ=="; + //const unsigned char* publicKeyData = reinterpret_cast(publicKey); + //RSA* rsaPublicKey = d2i_RSA_PUBKEY(NULL, &publicKeyData, sizeof(publicKey)); + qDebug() << "HRS FIXME key:" << sizeof(publicKey) << QString(publicKey) << "text:" << textLength << QString(text) << "signature:" << signatureLength << QString(signature); + + + //BIO *bio = BIO_new_mem_buf((void*)publicKey, sizeof(publicKey)); + BIO* bio = BIO_new(BIO_s_mem()); + int len = BIO_write(bio, publicKey, sizeof(publicKey)); + EVP_PKEY* evp_key = PEM_read_bio_PUBKEY(bio, NULL, NULL, NULL); + qDebug() << "HRS FIXME bufio" << !!bio << len << !!evp_key; + //RSA *rsa; + //PEM_read_bio_RSA_PUBKEY(bio, &rsa, 0, NULL); + RSA* rsa = EVP_PKEY_get1_RSA(evp_key); + //RSA* rsa = PEM_read_bio_RSAPublicKey(bio, NULL, NULL, NULL); + qDebug() << "HRS FIXME rsa" << !!rsa; + + bool answer = RSA_verify(NID_sha256, reinterpret_cast(text), textLength, reinterpret_cast(signature.constData()), signatureLength, rsa); + qDebug() << "HRS FIXME key:" << sizeof(publicKey) << QString(publicKey) << "text:" << textLength << QString(text) << "signature:" << signatureLength << QString(signature) << "verified:" << answer; + //return _certificateID == getStaticCertificateHash(); + return answer; } diff --git a/libraries/entities/src/EntityItem.h b/libraries/entities/src/EntityItem.h index a6153c0234..b92f6120f0 100644 --- a/libraries/entities/src/EntityItem.h +++ b/libraries/entities/src/EntityItem.h @@ -324,8 +324,8 @@ public: void setEntityInstanceNumber(const quint32&); QString getCertificateID() const; void setCertificateID(const QString& value); - QString getStaticCertificateJSON() const; - QString getStaticCertificateHash() const; + QByteArray getStaticCertificateJSON() const; + QByteArray getStaticCertificateHash() const; bool verifyStaticCertificateProperties() const; // TODO: get rid of users of getRadius()... diff --git a/scripts/system/controllers/controllerModules/hudOverlayPointer.js b/scripts/system/controllers/controllerModules/hudOverlayPointer.js index 487e491201..b953ddf002 100644 --- a/scripts/system/controllers/controllerModules/hudOverlayPointer.js +++ b/scripts/system/controllers/controllerModules/hudOverlayPointer.js @@ -239,7 +239,7 @@ function cleanup() { ControllerDispatcherUtils.disableDispatcherModule("LeftHudOverlayPointer"); - ControllerDispatcherUtils.disbaleDispatcherModule("RightHudOverlayPointer"); + ControllerDispatcherUtils.disableDispatcherModule("RightHudOverlayPointer"); } Script.scriptEnding.connect(cleanup); From 58255abe12b4272d7f46afbd79b8cda6d71be4b2 Mon Sep 17 00:00:00 2001 From: Howard Stearns Date: Fri, 29 Sep 2017 16:32:25 -0700 Subject: [PATCH 07/13] animation url and computing certificateID --- libraries/entities/src/EntityItem.cpp | 105 ++++++++---------- libraries/entities/src/EntityItem.h | 8 +- .../entities/src/EntityScriptingInterface.cpp | 28 +++++ .../entities/src/EntityScriptingInterface.h | 5 + 4 files changed, 88 insertions(+), 58 deletions(-) diff --git a/libraries/entities/src/EntityItem.cpp b/libraries/entities/src/EntityItem.cpp index 5b9d10a759..0c8f6c6882 100644 --- a/libraries/entities/src/EntityItem.cpp +++ b/libraries/entities/src/EntityItem.cpp @@ -13,6 +13,11 @@ #include #include +#include +#include // see comments for DEBUG_CERT +#include +#include +#include #include @@ -32,7 +37,6 @@ #include "EntitySimulation.h" #include "EntityDynamicFactoryInterface.h" - int EntityItem::_maxActionsDataSize = 800; quint64 EntityItem::_rememberDeletedActionTime = 20 * USECS_PER_SECOND; @@ -1569,11 +1573,6 @@ float EntityItem::getRadius() const { } // Checking Certifiable Properties -#include // fixme -#include -#include -#include -#include // fixme #define ADD_STRING_PROPERTY(n, N) if (!propertySet.get##N().isEmpty()) json[#n] = propertySet.get##N() #define ADD_ENUM_PROPERTY(n, N) json[#n] = propertySet.get##N##AsString() #define ADD_INT_PROPERTY(n, N) if (propertySet.get##N() != 0) json[#n] = (propertySet.get##N() == -1) ? -1.0 : ((double) propertySet.get##N()) @@ -1586,7 +1585,9 @@ QByteArray EntityItem::getStaticCertificateJSON() const { EntityItemProperties propertySet = getProperties(); // Note: neither EntityItem nor EntityitemProperties "properties" are QObject "properties"! // It is important that this be reproducible in the same order each time. Since we also generate these on the server, we do it alphabetically // to help maintainence in two different code bases. - // animation + if (!propertySet.getAnimation().getURL().isEmpty()) { + json["animation.url"] = propertySet.getAnimation().getURL(); + } ADD_STRING_PROPERTY(collisionSoundURL, CollisionSoundURL); ADD_STRING_PROPERTY(compoundShapeURL, CompoundShapeURL); ADD_INT_PROPERTY(editionNumber, EditionNumber); @@ -1606,30 +1607,18 @@ QByteArray EntityItem::getStaticCertificateJSON() const { return QJsonDocument(json).toJson(QJsonDocument::Compact); } QByteArray EntityItem::getStaticCertificateHash() const { - // The base64 encoded, sha224 hash of static certificate json. return QCryptographicHash::hash(getStaticCertificateJSON(), QCryptographicHash::Sha256); } -bool EntityItem::verifyStaticCertificateProperties() const { - // True IIF a non-empty certificateID matches the static certificate json. - // I.e., if we can verify that the certificateID was produced by High Fidelity signing the static certificate hash. - if (_certificateID.isEmpty()) { - return false; - } - // FIXME: really verify(hifi-pub-key, certificateID-as-signature-for-getStaticCertifcateHash) - - //const char text[] = "{\"collisionSoundURL\":\"colSound02\",\"compoundShapeURL\":\"http://mpassets.highfidelity.com/31479af7-94b0-45f2-84ba-478d27e5af90-v1/gnome_phys.obj\",\"entityInstanceNumber\":2,\"itemName\":\"Explosive Garden Nomex\",\"limitedRun\":-1,\"marketplaceID\":\"31479af7-94b0-45f2-84ba-478d27e5af90\",\"modelURL\":\"http://mpassets.highfidelity.com/31479af7-94b0-45f2-84ba-478d27e5af90-v1/gnome_green.fbx\",\"script\":\"http://mpassets.highfidelity.com/31479af7-94b0-45f2-84ba-478d27e5af90-v1/explodingGnomeEntity.js\",\"shapeType\":\"compound\",\"type\":\"Model\"}"; - // auto textLength = sizeof(text); - auto hash = getStaticCertificateHash(); - const char* text = hash.constData(); - auto textLength = hash.length(); - qDebug() << "HRS FIXME text" << getStaticCertificateJSON() << "hash base64" << hash.toBase64(); - //const char signatureBase64[] = "QpRnN7XGeVFnF/a+FVjZDWhdbHM3P5Cu69rL0/X2DMnqQEGwhx/oBs/7guTs6aNuO+ahmbTTc0+Nqdcqv36KGA=="; - //auto signatureBytes = QByteArray::fromBase64(signatureBase64); - //const char* signature = signatureBytes.constData(); - //auto signatureLength = signatureBytes.length(); +#ifdef DEBUG_CERT +QString EntityItem::computeCertificateID() { + // Until the marketplace generates it, compute and answer the certificateID here. + // Does not set it, as that will have to be done from script engine in order to update server, etc. + const auto hash = getStaticCertificateHash(); + const auto text = reinterpret_cast(hash.constData()); + const unsigned int textLength = hash.length(); - const char key[] = "-----BEGIN RSA PRIVATE KEY-----\n\ + const char privateKey[] = "-----BEGIN RSA PRIVATE KEY-----\n\ MIIBOQIBAAJBALCoBiDAZOClO26tC5pd7JikBL61WIgpAqbcNnrV/TcG6LPI7Zbi\n\ MjdUixmTNvYMRZH3Wlqtl2IKG1W68y3stKECAwEAAQJABvOlwhYwIhL+gr12jm2R\n\ yPPzZ9nVEQ6kFxLlZfIT09119fd6OU1X5d4sHWfMfSIEgjwQIDS3ZU1kY3XKo87X\n\ @@ -1638,47 +1627,49 @@ yuyV3yHvr5LkZKBGqhjmOTmDfgtX7ncCIChGbgX3nQuHVOLhD/nTxHssPNozVGl5\n\ KxHof+LmYSYZAiB4U+yEh9SsXdq40W/3fpLMPuNq1PRezJ5jGidGMcvF+wIgUNec\n\ 3Kg2U+CVZr8/bDT/vXRrsKj1zfobYuvbfVH02QY=\n\ -----END RSA PRIVATE KEY-----"; - BIO* vbio = BIO_new(BIO_s_mem()); - int vlen = BIO_write(vbio, key, sizeof(key)); - RSA* vrsa = PEM_read_bio_RSAPrivateKey(vbio, NULL, NULL, NULL); - qDebug() << "HRS FIXME private key bufio" << !!vbio << vlen << !!vrsa << key; + BIO* bio = BIO_new_mem_buf((void*)privateKey, sizeof(privateKey)); + RSA* rsa = PEM_read_bio_RSAPrivateKey(bio, NULL, NULL, NULL); - QByteArray signature(RSA_size(vrsa), 0); - unsigned int signatureLength = 0; - int signOK = RSA_sign(NID_sha256, reinterpret_cast(text), textLength, reinterpret_cast(signature.data()), &signatureLength, vrsa); - QByteArray signature64 = signature.toBase64(); - qDebug() << "HRS FIXME signature" << signature64.length() << signature64 << "ok:" << signOK; + QByteArray signature(RSA_size(rsa), 0); + unsigned int signatureLength = 0; + const int signOK = RSA_sign(NID_sha256, text, textLength, reinterpret_cast(signature.data()), &signatureLength, rsa); + BIO_free(bio); + if (!signOK) { + qCWarning(entities) << "Unable to compute signature for" << getName() << getEntityItemID(); + return ""; + } + return signature.toBase64(); +#endif +} + +bool EntityItem::verifyStaticCertificateProperties() { + // True IIF a non-empty certificateID matches the static certificate json. + // I.e., if we can verify that the certificateID was produced by High Fidelity signing the static certificate hash. + + if (getCertificateID().isEmpty()) { + return false; + } + const auto signatureBytes = QByteArray::fromBase64(getCertificateID().toLatin1()); + const auto signature = reinterpret_cast(signatureBytes.constData()); + const unsigned int signatureLength = signatureBytes.length(); + + const auto hash = getStaticCertificateHash(); + const auto text = reinterpret_cast(hash.constData()); + const unsigned int textLength = hash.length(); - ///* + // After DEBUG_CERT ends, we will get/cache this once from the marketplace when needed, and it likely won't be RSA. const char publicKey[] = "-----BEGIN PUBLIC KEY-----\n\ MFwwDQYJKoZIhvcNAQEBBQADSwAwSAJBALCoBiDAZOClO26tC5pd7JikBL61WIgp\n\ AqbcNnrV/TcG6LPI7ZbiMjdUixmTNvYMRZH3Wlqtl2IKG1W68y3stKECAwEAAQ==\n\ -----END PUBLIC KEY-----"; - //*/ - // const char publicKey[] = "MFwwDQYJKoZIhvcNAQEBBQADSwAwSAJBALCoBiDAZOClO26tC5pd7JikBL61WIgpAqbcNnrV/TcG6LPI7ZbiMjdUixmTNvYMRZH3Wlqtl2IKG1W68y3stKECAwEAAQ=="; - //const unsigned char* publicKeyData = reinterpret_cast(publicKey); - //RSA* rsaPublicKey = d2i_RSA_PUBKEY(NULL, &publicKeyData, sizeof(publicKey)); - qDebug() << "HRS FIXME key:" << sizeof(publicKey) << QString(publicKey) << "text:" << textLength << QString(text) << "signature:" << signatureLength << QString(signature); - - - //BIO *bio = BIO_new_mem_buf((void*)publicKey, sizeof(publicKey)); - BIO* bio = BIO_new(BIO_s_mem()); - int len = BIO_write(bio, publicKey, sizeof(publicKey)); + BIO *bio = BIO_new_mem_buf((void*)publicKey, sizeof(publicKey)); EVP_PKEY* evp_key = PEM_read_bio_PUBKEY(bio, NULL, NULL, NULL); - qDebug() << "HRS FIXME bufio" << !!bio << len << !!evp_key; - //RSA *rsa; - //PEM_read_bio_RSA_PUBKEY(bio, &rsa, 0, NULL); RSA* rsa = EVP_PKEY_get1_RSA(evp_key); - //RSA* rsa = PEM_read_bio_RSAPublicKey(bio, NULL, NULL, NULL); - qDebug() << "HRS FIXME rsa" << !!rsa; - - bool answer = RSA_verify(NID_sha256, reinterpret_cast(text), textLength, reinterpret_cast(signature.constData()), signatureLength, rsa); - qDebug() << "HRS FIXME key:" << sizeof(publicKey) << QString(publicKey) << "text:" << textLength << QString(text) << "signature:" << signatureLength << QString(signature) << "verified:" << answer; - //return _certificateID == getStaticCertificateHash(); + bool answer = RSA_verify(NID_sha256, text, textLength, signature, signatureLength, rsa); + BIO_free(bio); return answer; } - void EntityItem::adjustShapeInfoByRegistration(ShapeInfo& info) const { if (_registrationPoint != ENTITY_ITEM_DEFAULT_REGISTRATION_POINT) { glm::mat4 scale = glm::scale(getDimensions()); diff --git a/libraries/entities/src/EntityItem.h b/libraries/entities/src/EntityItem.h index b92f6120f0..c2f505fa91 100644 --- a/libraries/entities/src/EntityItem.h +++ b/libraries/entities/src/EntityItem.h @@ -36,6 +36,9 @@ #include "SimulationFlags.h" #include "EntityDynamicInterface.h" +// FIXME: The server-side marketplace will soon create the certificateID. At that point, all of the DEBUG_CERT stuff will go away. +#define DEBUG_CERT 1 + class EntitySimulation; class EntityTreeElement; class EntityTreeElementExtraEncodeData; @@ -326,7 +329,10 @@ public: void setCertificateID(const QString& value); QByteArray getStaticCertificateJSON() const; QByteArray getStaticCertificateHash() const; - bool verifyStaticCertificateProperties() const; + bool verifyStaticCertificateProperties(); +#ifdef DEBUG_CERT + QString EntityItem::computeCertificateID(); +#endif // TODO: get rid of users of getRadius()... float getRadius() const; diff --git a/libraries/entities/src/EntityScriptingInterface.cpp b/libraries/entities/src/EntityScriptingInterface.cpp index f91bc14fe4..6626b8d3f7 100644 --- a/libraries/entities/src/EntityScriptingInterface.cpp +++ b/libraries/entities/src/EntityScriptingInterface.cpp @@ -1753,3 +1753,31 @@ glm::mat4 EntityScriptingInterface::getEntityLocalTransform(const QUuid& entityI } return result; } + +bool EntityScriptingInterface::verifyStaticCertificateProperties(const QUuid& entityID) { + bool result; + if (_entityTree) { + _entityTree->withReadLock([&] { + EntityItemPointer entity = _entityTree->findEntityByEntityItemID(EntityItemID(entityID)); + if (entity) { + result = entity->verifyStaticCertificateProperties(); + } + }); + } + return result; +} + +#ifdef DEBUG_CERT +QString EntityScriptingInterface::computeCertificateID(const QUuid& entityID) { + QString result; + if (_entityTree) { + _entityTree->withReadLock([&] { + EntityItemPointer entity = _entityTree->findEntityByEntityItemID(EntityItemID(entityID)); + if (entity) { + result = entity->computeCertificateID(); + } + }); + } + return result; +} +#endif \ No newline at end of file diff --git a/libraries/entities/src/EntityScriptingInterface.h b/libraries/entities/src/EntityScriptingInterface.h index 9b2b6360f3..32a8a83be3 100644 --- a/libraries/entities/src/EntityScriptingInterface.h +++ b/libraries/entities/src/EntityScriptingInterface.h @@ -374,6 +374,11 @@ public slots: */ Q_INVOKABLE glm::mat4 getEntityLocalTransform(const QUuid& entityID); + Q_INVOKABLE bool verifyStaticCertificateProperties(const QUuid& entityID); +#ifdef DEBUG_CERT + Q_INVOKABLE QString computeCertificateID(const QUuid& entityID); +#endif + signals: void collisionWithEntity(const EntityItemID& idA, const EntityItemID& idB, const Collision& collision); From 0f6884dd80037e2ff3da6532a375f9cb2cf1a524 Mon Sep 17 00:00:00 2001 From: Howard Stearns Date: Mon, 2 Oct 2017 09:44:10 -0700 Subject: [PATCH 08/13] fix mac/linux compiler error --- libraries/entities/src/EntityItem.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libraries/entities/src/EntityItem.h b/libraries/entities/src/EntityItem.h index 12c1624366..c26f1694a9 100644 --- a/libraries/entities/src/EntityItem.h +++ b/libraries/entities/src/EntityItem.h @@ -332,7 +332,7 @@ public: QByteArray getStaticCertificateHash() const; bool verifyStaticCertificateProperties(); #ifdef DEBUG_CERT - QString EntityItem::computeCertificateID(); + QString computeCertificateID(); #endif // TODO: get rid of users of getRadius()... From 5c5f052bc27067800a7bf37d918459d0e892078b Mon Sep 17 00:00:00 2001 From: Howard Stearns Date: Mon, 2 Oct 2017 10:28:47 -0700 Subject: [PATCH 09/13] explicit free, and remove header that isn't available on mac/linux --- libraries/entities/src/EntityItem.cpp | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/libraries/entities/src/EntityItem.cpp b/libraries/entities/src/EntityItem.cpp index dbdfbdb0e6..ebe7c53bd4 100644 --- a/libraries/entities/src/EntityItem.cpp +++ b/libraries/entities/src/EntityItem.cpp @@ -14,8 +14,7 @@ #include #include #include -#include // see comments for DEBUG_CERT -#include +#include // see comments for DEBUG_CERT #include #include @@ -1637,6 +1636,7 @@ KxHof+LmYSYZAiB4U+yEh9SsXdq40W/3fpLMPuNq1PRezJ5jGidGMcvF+wIgUNec\n\ unsigned int signatureLength = 0; const int signOK = RSA_sign(NID_sha256, text, textLength, reinterpret_cast(signature.data()), &signatureLength, rsa); BIO_free(bio); + RSA_free(rsa); if (!signOK) { qCWarning(entities) << "Unable to compute signature for" << getName() << getEntityItemID(); return ""; @@ -1670,6 +1670,8 @@ AqbcNnrV/TcG6LPI7ZbiMjdUixmTNvYMRZH3Wlqtl2IKG1W68y3stKECAwEAAQ==\n\ RSA* rsa = EVP_PKEY_get1_RSA(evp_key); bool answer = RSA_verify(NID_sha256, text, textLength, signature, signatureLength, rsa); BIO_free(bio); + RSA_free(rsa); + EVP_PKEY_free(evp_key); return answer; } From 7b0321c1e199290aaa28a48921e6b5512d238696 Mon Sep 17 00:00:00 2001 From: Howard Stearns Date: Mon, 2 Oct 2017 12:30:25 -0700 Subject: [PATCH 10/13] guess for mac/linux openssl --- libraries/entities/CMakeLists.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/libraries/entities/CMakeLists.txt b/libraries/entities/CMakeLists.txt index 19341ec3e2..322d69da16 100644 --- a/libraries/entities/CMakeLists.txt +++ b/libraries/entities/CMakeLists.txt @@ -1,3 +1,4 @@ set(TARGET_NAME entities) setup_hifi_library(Network Script) +include_directories(SYSTEM "${OPENSSL_INCLUDE_DIR}") link_hifi_libraries(shared networking octree avatars) From 136381adb90e1fdb3c70d49d9714f23da7955578 Mon Sep 17 00:00:00 2001 From: Howard Stearns Date: Mon, 2 Oct 2017 13:56:15 -0700 Subject: [PATCH 11/13] fatal compiler warning on mac/linux --- libraries/entities/src/EntityItem.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libraries/entities/src/EntityItem.cpp b/libraries/entities/src/EntityItem.cpp index ebe7c53bd4..6ea0cd0bc7 100644 --- a/libraries/entities/src/EntityItem.cpp +++ b/libraries/entities/src/EntityItem.cpp @@ -2938,7 +2938,7 @@ type EntityItem::get##accessor() const { \ } #define DEFINE_PROPERTY_SETTER(type, accessor, var) \ -void EntityItem::set##accessor(const type##& value) { \ +void EntityItem::set##accessor(const type & value) { \ withWriteLock([&] { \ _##var = value; \ }); \ From 0b7af66016ca3a8c8753447726bcc00f0b47aec4 Mon Sep 17 00:00:00 2001 From: Howard Stearns Date: Mon, 2 Oct 2017 15:38:59 -0700 Subject: [PATCH 12/13] more linux warnings --- libraries/entities/src/EntityItem.cpp | 2 +- libraries/entities/src/EntityScriptingInterface.cpp | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/libraries/entities/src/EntityItem.cpp b/libraries/entities/src/EntityItem.cpp index 6ea0cd0bc7..a1b7ff54de 100644 --- a/libraries/entities/src/EntityItem.cpp +++ b/libraries/entities/src/EntityItem.cpp @@ -1577,7 +1577,7 @@ float EntityItem::getRadius() const { // Checking Certifiable Properties #define ADD_STRING_PROPERTY(n, N) if (!propertySet.get##N().isEmpty()) json[#n] = propertySet.get##N() #define ADD_ENUM_PROPERTY(n, N) json[#n] = propertySet.get##N##AsString() -#define ADD_INT_PROPERTY(n, N) if (propertySet.get##N() != 0) json[#n] = (propertySet.get##N() == -1) ? -1.0 : ((double) propertySet.get##N()) +#define ADD_INT_PROPERTY(n, N) if (propertySet.get##N() != 0) json[#n] = (propertySet.get##N() == (quint32) -1) ? -1.0 : ((double) propertySet.get##N()) QByteArray EntityItem::getStaticCertificateJSON() const { // Produce a compact json of every non-default static certificate property, with the property names in alphabetical order. // The static certificate properties include all an only those properties that cannot be changed without altering the identity diff --git a/libraries/entities/src/EntityScriptingInterface.cpp b/libraries/entities/src/EntityScriptingInterface.cpp index 06eea6c5ed..2ee2ce9b21 100644 --- a/libraries/entities/src/EntityScriptingInterface.cpp +++ b/libraries/entities/src/EntityScriptingInterface.cpp @@ -1767,7 +1767,7 @@ glm::mat4 EntityScriptingInterface::getEntityLocalTransform(const QUuid& entityI } bool EntityScriptingInterface::verifyStaticCertificateProperties(const QUuid& entityID) { - bool result; + bool result = false; if (_entityTree) { _entityTree->withReadLock([&] { EntityItemPointer entity = _entityTree->findEntityByEntityItemID(EntityItemID(entityID)); @@ -1781,7 +1781,7 @@ bool EntityScriptingInterface::verifyStaticCertificateProperties(const QUuid& en #ifdef DEBUG_CERT QString EntityScriptingInterface::computeCertificateID(const QUuid& entityID) { - QString result; + QString result = false; if (_entityTree) { _entityTree->withReadLock([&] { EntityItemPointer entity = _entityTree->findEntityByEntityItemID(EntityItemID(entityID)); From 9b0ebf0e072a86cfd6e923dc3fe8e61d10c03e2d Mon Sep 17 00:00:00 2001 From: Howard Stearns Date: Mon, 2 Oct 2017 16:18:28 -0700 Subject: [PATCH 13/13] doh! string not boolean --- libraries/entities/src/EntityScriptingInterface.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libraries/entities/src/EntityScriptingInterface.cpp b/libraries/entities/src/EntityScriptingInterface.cpp index 2ee2ce9b21..f5117dddc0 100644 --- a/libraries/entities/src/EntityScriptingInterface.cpp +++ b/libraries/entities/src/EntityScriptingInterface.cpp @@ -1781,7 +1781,7 @@ bool EntityScriptingInterface::verifyStaticCertificateProperties(const QUuid& en #ifdef DEBUG_CERT QString EntityScriptingInterface::computeCertificateID(const QUuid& entityID) { - QString result = false; + QString result { "" }; if (_entityTree) { _entityTree->withReadLock([&] { EntityItemPointer entity = _entityTree->findEntityByEntityItemID(EntityItemID(entityID));