diff --git a/domain-server/resources/describe-settings.json b/domain-server/resources/describe-settings.json index ebfb519eac..7b7d87800b 100644 --- a/domain-server/resources/describe-settings.json +++ b/domain-server/resources/describe-settings.json @@ -1,5 +1,5 @@ { - "version": 2.6, + "version": 2.7, "settings": [ { "name": "metaverse", @@ -479,6 +479,13 @@ "type": "checkbox", "editable": true, "default": false + }, + { + "name": "id_can_view_asset_urls", + "label": "View Asset URLs", + "type": "checkbox", + "editable": true, + "default": false } ], "non-deletable-row-key": "permissions_id", @@ -505,6 +512,7 @@ "id_can_rez_tmp": true, "id_can_write_to_asset_server": true, "id_can_get_and_set_private_user_data": true, + "id_can_view_asset_urls": true, "permissions_id": "localhost" }, { @@ -633,6 +641,13 @@ "type": "checkbox", "editable": true, "default": false + }, + { + "name": "id_can_view_asset_urls", + "label": "View Asset URLs", + "type": "checkbox", + "editable": true, + "default": false } ] }, @@ -752,6 +767,13 @@ "type": "checkbox", "editable": true, "default": false + }, + { + "name": "id_can_view_asset_urls", + "label": "View Asset URLs", + "type": "checkbox", + "editable": true, + "default": false } ] }, @@ -844,6 +866,13 @@ "type": "checkbox", "editable": true, "default": false + }, + { + "name": "id_can_view_asset_urls", + "label": "View Asset URLs", + "type": "checkbox", + "editable": true, + "default": false } ] }, @@ -936,6 +965,13 @@ "type": "checkbox", "editable": true, "default": false + }, + { + "name": "id_can_view_asset_urls", + "label": "View Asset URLs", + "type": "checkbox", + "editable": true, + "default": false } ] }, @@ -1022,13 +1058,20 @@ "editable": true, "default": false }, - { - "name": "id_can_get_and_set_private_user_data", - "label": "Get and Set Private User Data", - "type": "checkbox", - "editable": true, - "default": false - } + { + "name": "id_can_get_and_set_private_user_data", + "label": "Get and Set Private User Data", + "type": "checkbox", + "editable": true, + "default": false + }, + { + "name": "id_can_view_asset_urls", + "label": "View Asset URLs", + "type": "checkbox", + "editable": true, + "default": false + } ] }, { @@ -1120,6 +1163,13 @@ "type": "checkbox", "editable": true, "default": false + }, + { + "name": "id_can_view_asset_urls", + "label": "View Asset URLs", + "type": "checkbox", + "editable": true, + "default": false } ] }, diff --git a/domain-server/src/DomainGatekeeper.cpp b/domain-server/src/DomainGatekeeper.cpp index a30ddd1623..ff5ae875bc 100644 --- a/domain-server/src/DomainGatekeeper.cpp +++ b/domain-server/src/DomainGatekeeper.cpp @@ -353,6 +353,7 @@ void DomainGatekeeper::updateNodePermissions() { userPerms.permissions |= NodePermissions::Permission::canReplaceDomainContent; userPerms.permissions |= NodePermissions::Permission::canGetAndSetPrivateUserData; userPerms.permissions |= NodePermissions::Permission::canRezAvatarEntities; + userPerms.permissions |= NodePermissions::Permission::canViewAssetURLs; } else { // at this point we don't have a sending socket for packets from this node - assume it is the active socket // or the public socket if we haven't activated a socket for the node yet @@ -446,6 +447,7 @@ SharedNodePointer DomainGatekeeper::processAssignmentConnectRequest(const NodeCo userPerms.permissions |= NodePermissions::Permission::canReplaceDomainContent; userPerms.permissions |= NodePermissions::Permission::canGetAndSetPrivateUserData; userPerms.permissions |= NodePermissions::Permission::canRezAvatarEntities; + userPerms.permissions |= NodePermissions::Permission::canViewAssetURLs; newNode->setPermissions(userPerms); return newNode; } diff --git a/domain-server/src/DomainServerSettingsManager.cpp b/domain-server/src/DomainServerSettingsManager.cpp index c59fc43d34..bcea7f0e01 100644 --- a/domain-server/src/DomainServerSettingsManager.cpp +++ b/domain-server/src/DomainServerSettingsManager.cpp @@ -547,6 +547,29 @@ void DomainServerSettingsManager::setupConfigMap(const QString& userConfigFilena // No migration needed to version 2.6. + if (oldVersion < 2.7) { + // Default values for new canViewAssetURLs permission. + unpackPermissions(); + std::list> permissionsSets{ + _standardAgentPermissions.get(), + _agentPermissions.get(), + _ipPermissions.get(), + _macPermissions.get(), + _machineFingerprintPermissions.get(), + _groupPermissions.get(), + _groupForbiddens.get() + }; + foreach (auto permissionsSet, permissionsSets) { + for (auto entry : permissionsSet) { + const auto& userKey = entry.first; + if (permissionsSet[userKey]->can(NodePermissions::Permission::canConnectToDomain)) { + permissionsSet[userKey]->set(NodePermissions::Permission::canViewAssetURLs); + } + } + } + packPermissions(); + } + // write the current description version to our settings *versionVariant = _descriptionVersion; diff --git a/libraries/avatars/src/AvatarData.cpp b/libraries/avatars/src/AvatarData.cpp index 21cfec65d4..a02936792d 100644 --- a/libraries/avatars/src/AvatarData.cpp +++ b/libraries/avatars/src/AvatarData.cpp @@ -1681,6 +1681,14 @@ float AvatarData::getUpdateRate(const QString& rateName) const { return 0.0f; } +QString AvatarData::getSkeletonModelURLFromScript() const { + if (DependencyManager::get()->getThisNodeCanViewAssetURLs()) { + return _skeletonModelURL.toString(); + } else { + return QString(); + } +} + int AvatarData::getAverageBytesReceivedPerSecond() const { return lrint(_averageBytesReceived.getAverageSampleValuePerSecond()); } diff --git a/libraries/avatars/src/ScriptAvatarData.cpp b/libraries/avatars/src/ScriptAvatarData.cpp index 3b5397fd55..1d93a6e954 100644 --- a/libraries/avatars/src/ScriptAvatarData.cpp +++ b/libraries/avatars/src/ScriptAvatarData.cpp @@ -13,6 +13,7 @@ #include "ScriptAvatarData.h" +#include #include #include @@ -204,7 +205,8 @@ bool ScriptAvatarData::getLookAtSnappingEnabled() const { // QString ScriptAvatarData::getSkeletonModelURLFromScript() const { if (AvatarSharedPointer sharedAvatarData = _avatarData.lock()) { - if (sharedAvatarData->isMyAvatar() && !sharedAvatarData->isMyAvatarURLProtected()) { + auto nodeList = DependencyManager::get(); + if (sharedAvatarData->isMyAvatar() && !sharedAvatarData->isMyAvatarURLProtected() && nodeList->getThisNodeCanViewAssetURLs()) { return sharedAvatarData->getSkeletonModelURLFromScript(); } diff --git a/libraries/entities/src/EntityItemProperties.cpp b/libraries/entities/src/EntityItemProperties.cpp index 9886b341fa..843c8251c5 100644 --- a/libraries/entities/src/EntityItemProperties.cpp +++ b/libraries/entities/src/EntityItemProperties.cpp @@ -1566,6 +1566,7 @@ ScriptValue EntityItemProperties::copyToScriptValue(ScriptEngine* engine, bool s return properties; } + auto nodeList = DependencyManager::get(); if (_idSet && (!pseudoPropertyFlagsActive || pseudoPropertyFlags.test(EntityPseudoPropertyFlag::ID))) { COPY_PROPERTY_TO_QSCRIPTVALUE_GETTER_ALWAYS(id, _id.toString()); } @@ -1634,7 +1635,7 @@ ScriptValue EntityItemProperties::copyToScriptValue(ScriptEngine* engine, bool s COPY_PROXY_PROPERTY_TO_QSCRIPTVALUE_GETTER(PROP_COLLISION_MASK, collisionMask, collidesWith, getCollisionMaskAsString()); COPY_PROPERTY_TO_QSCRIPTVALUE(PROP_DYNAMIC, dynamic); COPY_PROXY_PROPERTY_TO_QSCRIPTVALUE_GETTER(PROP_DYNAMIC, dynamic, collisionsWillMove, getDynamic()); // legacy support - COPY_PROPERTY_TO_QSCRIPTVALUE(PROP_COLLISION_SOUND_URL, collisionSoundURL); + COPY_PROPERTY_TO_QSCRIPTVALUE_IF_URL_PERMISSION(PROP_COLLISION_SOUND_URL, collisionSoundURL); COPY_PROPERTY_TO_QSCRIPTVALUE(PROP_ACTION_DATA, actionData); // Cloning @@ -1660,7 +1661,7 @@ ScriptValue EntityItemProperties::copyToScriptValue(ScriptEngine* engine, bool s // Particles only if (_type == EntityTypes::ParticleEffect) { COPY_PROPERTY_TO_QSCRIPTVALUE_GETTER(PROP_SHAPE_TYPE, shapeType, getShapeTypeAsString()); - COPY_PROPERTY_TO_QSCRIPTVALUE(PROP_COMPOUND_SHAPE_URL, compoundShapeURL); + COPY_PROPERTY_TO_QSCRIPTVALUE_IF_URL_PERMISSION(PROP_COMPOUND_SHAPE_URL, compoundShapeURL); COPY_PROPERTY_TO_QSCRIPTVALUE_TYPED(PROP_COLOR, color, u8vec3Color); COPY_PROPERTY_TO_QSCRIPTVALUE(PROP_ALPHA, alpha); _pulse.copyToScriptValue(_desiredProperties, properties, engine, skipDefaults, defaultEntityProperties, returnNothingOnEmptyPropertyFlags); @@ -1710,11 +1711,11 @@ ScriptValue EntityItemProperties::copyToScriptValue(ScriptEngine* engine, bool s // Models only if (_type == EntityTypes::Model) { COPY_PROPERTY_TO_QSCRIPTVALUE_GETTER(PROP_SHAPE_TYPE, shapeType, getShapeTypeAsString()); - COPY_PROPERTY_TO_QSCRIPTVALUE(PROP_COMPOUND_SHAPE_URL, compoundShapeURL); + COPY_PROPERTY_TO_QSCRIPTVALUE_IF_URL_PERMISSION(PROP_COMPOUND_SHAPE_URL, compoundShapeURL); COPY_PROPERTY_TO_QSCRIPTVALUE_TYPED(PROP_COLOR, color, u8vec3Color); COPY_PROPERTY_TO_QSCRIPTVALUE(PROP_TEXTURES, textures); - COPY_PROPERTY_TO_QSCRIPTVALUE(PROP_MODEL_URL, modelURL); + COPY_PROPERTY_TO_QSCRIPTVALUE_IF_URL_PERMISSION(PROP_MODEL_URL, modelURL); COPY_PROPERTY_TO_QSCRIPTVALUE(PROP_MODEL_SCALE, modelScale); COPY_PROPERTY_TO_QSCRIPTVALUE(PROP_JOINT_ROTATIONS_SET, jointRotationsSet); COPY_PROPERTY_TO_QSCRIPTVALUE(PROP_JOINT_ROTATIONS, jointRotations); @@ -1777,7 +1778,7 @@ ScriptValue EntityItemProperties::copyToScriptValue(ScriptEngine* engine, bool s // Zones only if (_type == EntityTypes::Zone) { COPY_PROPERTY_TO_QSCRIPTVALUE_GETTER(PROP_SHAPE_TYPE, shapeType, getShapeTypeAsString()); - COPY_PROPERTY_TO_QSCRIPTVALUE(PROP_COMPOUND_SHAPE_URL, compoundShapeURL); + COPY_PROPERTY_TO_QSCRIPTVALUE_IF_URL_PERMISSION(PROP_COMPOUND_SHAPE_URL, compoundShapeURL); _keyLight.copyToScriptValue(_desiredProperties, properties, engine, skipDefaults, defaultEntityProperties, returnNothingOnEmptyPropertyFlags); _ambientLight.copyToScriptValue(_desiredProperties, properties, engine, skipDefaults, defaultEntityProperties, returnNothingOnEmptyPropertyFlags); @@ -1787,7 +1788,7 @@ ScriptValue EntityItemProperties::copyToScriptValue(ScriptEngine* engine, bool s COPY_PROPERTY_TO_QSCRIPTVALUE(PROP_FLYING_ALLOWED, flyingAllowed); COPY_PROPERTY_TO_QSCRIPTVALUE(PROP_GHOSTING_ALLOWED, ghostingAllowed); - COPY_PROPERTY_TO_QSCRIPTVALUE(PROP_FILTER_URL, filterURL); + COPY_PROPERTY_TO_QSCRIPTVALUE_IF_URL_PERMISSION(PROP_FILTER_URL, filterURL); COPY_PROPERTY_TO_QSCRIPTVALUE_GETTER(PROP_KEY_LIGHT_MODE, keyLightMode, getKeyLightModeAsString()); COPY_PROPERTY_TO_QSCRIPTVALUE_GETTER(PROP_AMBIENT_LIGHT_MODE, ambientLightMode, getAmbientLightModeAsString()); @@ -1804,9 +1805,9 @@ ScriptValue EntityItemProperties::copyToScriptValue(ScriptEngine* engine, bool s COPY_PROPERTY_TO_QSCRIPTVALUE(PROP_ALPHA, alpha); _pulse.copyToScriptValue(_desiredProperties, properties, engine, skipDefaults, defaultEntityProperties, returnNothingOnEmptyPropertyFlags); - COPY_PROPERTY_TO_QSCRIPTVALUE(PROP_SOURCE_URL, sourceUrl); + COPY_PROPERTY_TO_QSCRIPTVALUE_IF_URL_PERMISSION(PROP_SOURCE_URL, sourceUrl); COPY_PROPERTY_TO_QSCRIPTVALUE(PROP_DPI, dpi); - COPY_PROPERTY_TO_QSCRIPTVALUE(PROP_SCRIPT_URL, scriptURL); + COPY_PROPERTY_TO_QSCRIPTVALUE_IF_URL_PERMISSION(PROP_SCRIPT_URL, scriptURL); COPY_PROPERTY_TO_QSCRIPTVALUE(PROP_MAX_FPS, maxFPS); COPY_PROPERTY_TO_QSCRIPTVALUE_GETTER(PROP_INPUT_MODE, inputMode, getInputModeAsString()); COPY_PROPERTY_TO_QSCRIPTVALUE(PROP_SHOW_KEYBOARD_FOCUS_HIGHLIGHT, showKeyboardFocusHighlight); @@ -1819,9 +1820,9 @@ ScriptValue EntityItemProperties::copyToScriptValue(ScriptEngine* engine, bool s COPY_PROPERTY_TO_QSCRIPTVALUE(PROP_VOXEL_VOLUME_SIZE, voxelVolumeSize); COPY_PROPERTY_TO_QSCRIPTVALUE(PROP_VOXEL_DATA, voxelData); COPY_PROPERTY_TO_QSCRIPTVALUE(PROP_VOXEL_SURFACE_STYLE, voxelSurfaceStyle); - COPY_PROPERTY_TO_QSCRIPTVALUE(PROP_X_TEXTURE_URL, xTextureURL); - COPY_PROPERTY_TO_QSCRIPTVALUE(PROP_Y_TEXTURE_URL, yTextureURL); - COPY_PROPERTY_TO_QSCRIPTVALUE(PROP_Z_TEXTURE_URL, zTextureURL); + COPY_PROPERTY_TO_QSCRIPTVALUE_IF_URL_PERMISSION(PROP_X_TEXTURE_URL, xTextureURL); + COPY_PROPERTY_TO_QSCRIPTVALUE_IF_URL_PERMISSION(PROP_Y_TEXTURE_URL, yTextureURL); + COPY_PROPERTY_TO_QSCRIPTVALUE_IF_URL_PERMISSION(PROP_Z_TEXTURE_URL, zTextureURL); COPY_PROPERTY_TO_QSCRIPTVALUE(PROP_X_N_NEIGHBOR_ID, xNNeighborID); COPY_PROPERTY_TO_QSCRIPTVALUE(PROP_Y_N_NEIGHBOR_ID, yNNeighborID); @@ -1855,7 +1856,7 @@ ScriptValue EntityItemProperties::copyToScriptValue(ScriptEngine* engine, bool s // Materials if (_type == EntityTypes::Material) { - COPY_PROPERTY_TO_QSCRIPTVALUE(PROP_MATERIAL_URL, materialURL); + COPY_PROPERTY_TO_QSCRIPTVALUE_IF_URL_PERMISSION(PROP_MATERIAL_URL, materialURL); COPY_PROPERTY_TO_QSCRIPTVALUE_GETTER(PROP_MATERIAL_MAPPING_MODE, materialMappingMode, getMaterialMappingModeAsString()); COPY_PROPERTY_TO_QSCRIPTVALUE(PROP_MATERIAL_PRIORITY, priority); COPY_PROPERTY_TO_QSCRIPTVALUE(PROP_PARENT_MATERIAL_NAME, parentMaterialName); @@ -1872,13 +1873,13 @@ ScriptValue EntityItemProperties::copyToScriptValue(ScriptEngine* engine, bool s COPY_PROPERTY_TO_QSCRIPTVALUE(PROP_ALPHA, alpha); _pulse.copyToScriptValue(_desiredProperties, properties, engine, skipDefaults, defaultEntityProperties, returnNothingOnEmptyPropertyFlags); - COPY_PROPERTY_TO_QSCRIPTVALUE(PROP_IMAGE_URL, imageURL); + COPY_PROPERTY_TO_QSCRIPTVALUE_IF_URL_PERMISSION(PROP_IMAGE_URL, imageURL); COPY_PROPERTY_TO_QSCRIPTVALUE(PROP_EMISSIVE, emissive); COPY_PROPERTY_TO_QSCRIPTVALUE(PROP_KEEP_ASPECT_RATIO, keepAspectRatio); COPY_PROPERTY_TO_QSCRIPTVALUE(PROP_SUB_IMAGE, subImage); // Handle conversions to old 'textures' property from "imageURL" - if (((!returnNothingOnEmptyPropertyFlags && _desiredProperties.isEmpty()) || _desiredProperties.getHasProperty(PROP_IMAGE_URL)) && + if (nodeList->getThisNodeCanViewAssetURLs() && ((!returnNothingOnEmptyPropertyFlags && _desiredProperties.isEmpty()) || _desiredProperties.getHasProperty(PROP_IMAGE_URL)) && (!skipDefaults || defaultEntityProperties._imageURL != _imageURL)) { ScriptValue textures = engine->newObject(); textures.setProperty("tex.picture", _imageURL); diff --git a/libraries/entities/src/EntityItemPropertiesMacros.h b/libraries/entities/src/EntityItemPropertiesMacros.h index b278486041..a55e775f34 100644 --- a/libraries/entities/src/EntityItemPropertiesMacros.h +++ b/libraries/entities/src/EntityItemPropertiesMacros.h @@ -218,6 +218,13 @@ inline ScriptValue convertScriptValue(ScriptEngine* e, const AACube& v) { return properties.setProperty(#P, V); \ } +#define COPY_PROPERTY_TO_QSCRIPTVALUE_IF_URL_PERMISSION(p, P) \ + if (nodeList->getThisNodeCanViewAssetURLs() && ((!returnNothingOnEmptyPropertyFlags && _desiredProperties.isEmpty()) || _desiredProperties.getHasProperty(p)) && \ + (!skipDefaults || defaultEntityProperties._##P != _##P)) { \ + ScriptValue V = convertScriptValue(engine, _##P); \ + properties.setProperty(#P, V); \ + } + typedef QVector qVectorVec3; typedef QVector qVectorQuat; typedef QVector qVectorBool; diff --git a/libraries/entities/src/EntityScriptingInterface.cpp b/libraries/entities/src/EntityScriptingInterface.cpp index 1b610d1ffc..0d2a5738a2 100644 --- a/libraries/entities/src/EntityScriptingInterface.cpp +++ b/libraries/entities/src/EntityScriptingInterface.cpp @@ -97,6 +97,7 @@ EntityScriptingInterface::EntityScriptingInterface(bool bidOnSimulationOwnership connect(nodeList.data(), &NodeList::canWriteAssetsChanged, this, &EntityScriptingInterface::canWriteAssetsChanged); connect(nodeList.data(), &NodeList::canGetAndSetPrivateUserDataChanged, this, &EntityScriptingInterface::canGetAndSetPrivateUserDataChanged); connect(nodeList.data(), &NodeList::canRezAvatarEntitiesChanged, this, &EntityScriptingInterface::canRezAvatarEntitiesChanged); + connect(nodeList.data(), &NodeList::canViewAssetURLsChanged, this, &EntityScriptingInterface::canViewAssetURLsChanged); auto& packetReceiver = nodeList->getPacketReceiver(); packetReceiver.registerListener(PacketType::EntityScriptCallMethod, @@ -291,6 +292,11 @@ bool EntityScriptingInterface::canRezAvatarEntities() { return nodeList->getThisNodeCanRezAvatarEntities(); } +bool EntityScriptingInterface::canViewAssetURLs() { + auto nodeList = DependencyManager::get(); + return nodeList->getThisNodeCanViewAssetURLs(); +} + void EntityScriptingInterface::setEntityTree(EntityTreePointer elementTree) { if (_entityTree) { disconnect(_entityTree.get(), &EntityTree::addingEntityPointer, this, &EntityScriptingInterface::onAddingEntity); diff --git a/libraries/entities/src/EntityScriptingInterface.h b/libraries/entities/src/EntityScriptingInterface.h index d4597df2aa..8d74e6821c 100644 --- a/libraries/entities/src/EntityScriptingInterface.h +++ b/libraries/entities/src/EntityScriptingInterface.h @@ -288,6 +288,14 @@ public slots: */ Q_INVOKABLE bool canRezAvatarEntities(); + /*@jsdoc + * Checks whether or not the script can view asset URLs + * @function Entities.canViewAssetURLs + * @returns {boolean} true if the domain server will allow the script to view asset URLs, + * otherwise false. + */ + Q_INVOKABLE bool canViewAssetURLs(); + /*@jsdoc *

How an entity is hosted and sent to others for display.

* @@ -2249,6 +2257,14 @@ signals: */ void canRezAvatarEntitiesChanged(bool canRezAvatarEntities); + /*@jsdoc + * Triggered when your ability to view asset URLs is changed. + * @function Entities.canViewAssetURLsChanged + * @param {boolean} canViewAssetURLs - true if the script can view asset URLs, + * false if it can't. + * @returns {Signal} + */ + void canViewAssetURLsChanged(bool canViewAssetURLs); /*@jsdoc * Triggered when a mouse button is clicked while the mouse cursor is on an entity, or a controller trigger is fully diff --git a/libraries/networking/src/LimitedNodeList.cpp b/libraries/networking/src/LimitedNodeList.cpp index e4d3f0a207..33b2fcad78 100644 --- a/libraries/networking/src/LimitedNodeList.cpp +++ b/libraries/networking/src/LimitedNodeList.cpp @@ -197,6 +197,10 @@ void LimitedNodeList::setPermissions(const NodePermissions& newPermissions) { newPermissions.can(NodePermissions::Permission::canRezAvatarEntities)) { emit canRezAvatarEntitiesChanged(_permissions.can(NodePermissions::Permission::canRezAvatarEntities)); } + if (originalPermissions.can(NodePermissions::Permission::canViewAssetURLs) != + newPermissions.can(NodePermissions::Permission::canViewAssetURLs)) { + emit canViewAssetURLsChanged(_permissions.can(NodePermissions::Permission::canViewAssetURLs)); + } } void LimitedNodeList::setSocketLocalPort(SocketType socketType, quint16 socketLocalPort) { diff --git a/libraries/networking/src/LimitedNodeList.h b/libraries/networking/src/LimitedNodeList.h index 0634538880..103f7e0755 100644 --- a/libraries/networking/src/LimitedNodeList.h +++ b/libraries/networking/src/LimitedNodeList.h @@ -132,6 +132,7 @@ public: bool getThisNodeCanReplaceContent() const { return _permissions.can(NodePermissions::Permission::canReplaceDomainContent); } bool getThisNodeCanGetAndSetPrivateUserData() const { return _permissions.can(NodePermissions::Permission::canGetAndSetPrivateUserData); } bool getThisNodeCanRezAvatarEntities() const { return _permissions.can(NodePermissions::Permission::canRezAvatarEntities); } + bool getThisNodeCanViewAssetURLs() const { return _permissions.can(NodePermissions::Permission::canViewAssetURLs); } quint16 getSocketLocalPort(SocketType socketType) const { return _nodeSocket.localPort(socketType); } Q_INVOKABLE void setSocketLocalPort(SocketType socketType, quint16 socketLocalPort); @@ -392,6 +393,7 @@ signals: void canReplaceContentChanged(bool canReplaceContent); void canGetAndSetPrivateUserDataChanged(bool canGetAndSetPrivateUserData); void canRezAvatarEntitiesChanged(bool canRezAvatarEntities); + void canViewAssetURLsChanged(bool canViewAssetURLs); protected slots: void connectedForLocalSocketTest(); diff --git a/libraries/networking/src/Node.h b/libraries/networking/src/Node.h index cc056ea7d0..92a4c424c8 100644 --- a/libraries/networking/src/Node.h +++ b/libraries/networking/src/Node.h @@ -84,6 +84,7 @@ public: bool getCanReplaceContent() const { return _permissions.can(NodePermissions::Permission::canReplaceDomainContent); } bool getCanGetAndSetPrivateUserData() const { return _permissions.can(NodePermissions::Permission::canGetAndSetPrivateUserData); } bool getCanRezAvatarEntities() const { return _permissions.can(NodePermissions::Permission::canRezAvatarEntities); } + bool getCanViewAssetURLs() const { return _permissions.can(NodePermissions::Permission::canViewAssetURLs); } using NodesIgnoredPair = std::pair, bool>; diff --git a/libraries/networking/src/NodePermissions.cpp b/libraries/networking/src/NodePermissions.cpp index e7cf953645..8a23c7dbd3 100644 --- a/libraries/networking/src/NodePermissions.cpp +++ b/libraries/networking/src/NodePermissions.cpp @@ -68,6 +68,7 @@ NodePermissions::NodePermissions(QMap perms) { permissions |= perms["id_can_replace_content"].toBool() ? Permission::canReplaceDomainContent : Permission::none; permissions |= perms["id_can_get_and_set_private_user_data"].toBool() ? Permission::canGetAndSetPrivateUserData : Permission::none; + permissions |= perms["id_can_view_asset_urls"].toBool() ? Permission::canViewAssetURLs : Permission::none; } QVariant NodePermissions::toVariant(QHash groupRanks) { @@ -95,6 +96,7 @@ QVariant NodePermissions::toVariant(QHash groupRanks) { values["id_can_kick"] = can(Permission::canKick); values["id_can_replace_content"] = can(Permission::canReplaceDomainContent); values["id_can_get_and_set_private_user_data"] = can(Permission::canGetAndSetPrivateUserData); + values["id_can_view_asset_urls"] = can(Permission::canViewAssetURLs); return QVariant(values); } @@ -167,6 +169,9 @@ QDebug operator<<(QDebug debug, const NodePermissions& perms) { if (perms.can(NodePermissions::Permission::canGetAndSetPrivateUserData)) { debug << " get-and-set-private-user-data"; } + if (perms.can(NodePermissions::Permission::canViewAssetURLs)) { + debug << " can-view-asset-urls"; + } debug.nospace() << "]"; return debug.nospace(); } diff --git a/libraries/networking/src/NodePermissions.h b/libraries/networking/src/NodePermissions.h index 29baf130e6..81eaf68457 100644 --- a/libraries/networking/src/NodePermissions.h +++ b/libraries/networking/src/NodePermissions.h @@ -79,7 +79,8 @@ public: canKick = 64, canReplaceDomainContent = 128, canGetAndSetPrivateUserData = 1024, - canRezAvatarEntities = 2048 + canRezAvatarEntities = 2048, + canViewAssetURLs = 4096 }; Q_DECLARE_FLAGS(Permissions, Permission) Permissions permissions;