From 6b5cffa5e4e0c664313148451fb234159808e60d Mon Sep 17 00:00:00 2001 From: Kalila L Date: Fri, 26 Feb 2021 06:14:06 -0500 Subject: [PATCH] Initial pass at adding canRezAvatarEntities. --- assignment-client/src/avatars/AvatarMixer.cpp | 8 ++- .../resources/describe-settings.json | 50 +++++++++++++++++++ domain-server/src/DomainGatekeeper.cpp | 2 + .../src/DomainServerSettingsManager.cpp | 3 ++ .../entities/src/EntityScriptingInterface.cpp | 6 +++ .../entities/src/EntityScriptingInterface.h | 19 ++++++- libraries/networking/src/LimitedNodeList.cpp | 4 ++ libraries/networking/src/LimitedNodeList.h | 2 + libraries/networking/src/Node.h | 1 + libraries/networking/src/NodePermissions.cpp | 2 + libraries/networking/src/NodePermissions.h | 3 +- 11 files changed, 96 insertions(+), 4 deletions(-) diff --git a/assignment-client/src/avatars/AvatarMixer.cpp b/assignment-client/src/avatars/AvatarMixer.cpp index 27b7d0d302..91c2dba70e 100644 --- a/assignment-client/src/avatars/AvatarMixer.cpp +++ b/assignment-client/src/avatars/AvatarMixer.cpp @@ -1124,11 +1124,15 @@ void AvatarMixer::handleOctreePacket(QSharedPointer message, Sh } case PacketType::EntityData: - _entityViewer.processDatagram(*message, senderNode); + if (senderNode->getCanRezAvatarEntities()) { + _entityViewer.processDatagram(*message, senderNode); + } break; case PacketType::EntityErase: - _entityViewer.processEraseMessage(*message, senderNode); + if (senderNode->getCanRezAvatarEntities()) { + _entityViewer.processEraseMessage(*message, senderNode); + } break; default: diff --git a/domain-server/resources/describe-settings.json b/domain-server/resources/describe-settings.json index dd39249023..598b4870fb 100644 --- a/domain-server/resources/describe-settings.json +++ b/domain-server/resources/describe-settings.json @@ -363,6 +363,13 @@ "editable": true, "default": false }, + { + "name": "id_can_rez_avatar_entities", + "label": "Rez Attachments", + "type": "checkbox", + "editable": true, + "default": false + }, { "name": "id_can_adjust_locks", "label": "Lock / Unlock", @@ -449,6 +456,7 @@ }, { "id_can_adjust_locks": true, + "id_can_rez_avatar_entities": true, "id_can_connect": true, "id_can_connect_past_max_capacity": true, "id_can_kick": true, @@ -525,6 +533,13 @@ "editable": true, "default": false }, + { + "name": "id_can_rez_avatar_entities", + "label": "Rez Attachments", + "type": "checkbox", + "editable": true, + "default": false + }, { "name": "id_can_adjust_locks", "label": "Lock / Unlock", @@ -651,6 +666,13 @@ "editable": true, "default": false }, + { + "name": "id_can_rez_avatar_entities", + "label": "Rez Attachments", + "type": "checkbox", + "editable": true, + "default": false + }, { "name": "id_can_adjust_locks", "label": "Lock / Unlock", @@ -750,6 +772,13 @@ "editable": true, "default": false }, + { + "name": "id_can_rez_avatar_entities", + "label": "Rez Attachments", + "type": "checkbox", + "editable": true, + "default": false + }, { "name": "id_can_adjust_locks", "label": "Lock / Unlock", @@ -849,6 +878,13 @@ "editable": true, "default": false }, + { + "name": "id_can_rez_avatar_entities", + "label": "Rez Attachments", + "type": "checkbox", + "editable": true, + "default": false + }, { "name": "id_can_adjust_locks", "label": "Lock / Unlock", @@ -948,6 +984,13 @@ "editable": true, "default": false }, + { + "name": "id_can_rez_avatar_entities", + "label": "Rez Attachments", + "type": "checkbox", + "editable": true, + "default": false + }, { "name": "id_can_adjust_locks", "label": "Lock / Unlock", @@ -1047,6 +1090,13 @@ "editable": true, "default": false }, + { + "name": "id_can_rez_avatar_entities", + "label": "Rez Attachments", + "type": "checkbox", + "editable": true, + "default": false + }, { "name": "id_can_adjust_locks", "label": "Lock / Unlock", diff --git a/domain-server/src/DomainGatekeeper.cpp b/domain-server/src/DomainGatekeeper.cpp index 7126c525bc..035caaa328 100644 --- a/domain-server/src/DomainGatekeeper.cpp +++ b/domain-server/src/DomainGatekeeper.cpp @@ -353,6 +353,7 @@ void DomainGatekeeper::updateNodePermissions() { userPerms.permissions |= NodePermissions::Permission::canWriteToAssetServer; userPerms.permissions |= NodePermissions::Permission::canReplaceDomainContent; userPerms.permissions |= NodePermissions::Permission::canGetAndSetPrivateUserData; + userPerms.permissions |= NodePermissions::Permission::canRezAvatarEntities; } 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 @@ -448,6 +449,7 @@ SharedNodePointer DomainGatekeeper::processAssignmentConnectRequest(const NodeCo userPerms.permissions |= NodePermissions::Permission::canWriteToAssetServer; userPerms.permissions |= NodePermissions::Permission::canReplaceDomainContent; userPerms.permissions |= NodePermissions::Permission::canGetAndSetPrivateUserData; + userPerms.permissions |= NodePermissions::Permission::canRezAvatarEntities; newNode->setPermissions(userPerms); return newNode; } diff --git a/domain-server/src/DomainServerSettingsManager.cpp b/domain-server/src/DomainServerSettingsManager.cpp index 08cf56b188..42a0ffa64e 100644 --- a/domain-server/src/DomainServerSettingsManager.cpp +++ b/domain-server/src/DomainServerSettingsManager.cpp @@ -363,6 +363,9 @@ void DomainServerSettingsManager::setupConfigMap(const QString& userConfigFilena foreach (auto permissionsSet, permissionsSets) { for (auto entry : permissionsSet) { const auto& userKey = entry.first; + + permissionsSet[userKey]->set(NodePermissions::Permission::canRezAvatarEntities); + if (onlyEditorsAreRezzers) { if (permissionsSet[userKey]->can(NodePermissions::Permission::canAdjustLocks)) { permissionsSet[userKey]->set(NodePermissions::Permission::canRezPermanentEntities); diff --git a/libraries/entities/src/EntityScriptingInterface.cpp b/libraries/entities/src/EntityScriptingInterface.cpp index 36beb9f0d3..a5bffecb14 100644 --- a/libraries/entities/src/EntityScriptingInterface.cpp +++ b/libraries/entities/src/EntityScriptingInterface.cpp @@ -57,6 +57,7 @@ EntityScriptingInterface::EntityScriptingInterface(bool bidOnSimulationOwnership connect(nodeList.data(), &NodeList::canRezTmpCertifiedChanged, this, &EntityScriptingInterface::canRezTmpCertifiedChanged); connect(nodeList.data(), &NodeList::canWriteAssetsChanged, this, &EntityScriptingInterface::canWriteAssetsChanged); connect(nodeList.data(), &NodeList::canGetAndSetPrivateUserDataChanged, this, &EntityScriptingInterface::canGetAndSetPrivateUserDataChanged); + connect(nodeList.data(), &NodeList::canRezAvatarEntitiesChanged, this, &EntityScriptingInterface::canRezAvatarEntitiesChanged); auto& packetReceiver = nodeList->getPacketReceiver(); packetReceiver.registerListener(PacketType::EntityScriptCallMethod, @@ -114,6 +115,11 @@ bool EntityScriptingInterface::canGetAndSetPrivateUserData() { return nodeList->getThisNodeCanGetAndSetPrivateUserData(); } +bool EntityScriptingInterface::canRezAvatarEntities() { + auto nodeList = DependencyManager::get(); + return nodeList->getThisNodeCanRezAvatarEntities(); +} + 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 14d853fbaf..4647e26335 100644 --- a/libraries/entities/src/EntityScriptingInterface.h +++ b/libraries/entities/src/EntityScriptingInterface.h @@ -289,6 +289,14 @@ public slots: * privateUserData property of entities, otherwise false. */ Q_INVOKABLE bool canGetAndSetPrivateUserData(); + + /**jsdoc + * Checks whether or not the script can rez avatar entities. + * @function Entities.canRezAvatarEntities + * @returns {boolean} true if the domain server will allow the script to rez avatar entities, + * otherwise false. + */ + Q_INVOKABLE bool canRezAvatarEntities(); /**jsdoc *

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

@@ -2255,11 +2263,20 @@ signals: /**jsdoc * Triggered when your ability to get and set private user data changes. * @function Entities.canGetAndSetPrivateUserDataChanged - * @param {boolean} canGetAndSetPrivateUserData - true if the script change the privateUserData + * @param {boolean} canGetAndSetPrivateUserData - true if the script can change the privateUserData * property of an entity, false if it can't. * @returns {Signal} */ void canGetAndSetPrivateUserDataChanged(bool canGetAndSetPrivateUserData); + + /**jsdoc + * Triggered when your ability to use avatar entities is changed. + * @function Entities.canRezAvatarEntitiesChanged + * @param {boolean} canRezAvatarEntities - true if the script can change edit avatar entities, + * false if it can't. + * @returns {Signal} + */ + void canRezAvatarEntitiesChanged(bool canRezAvatarEntities); /**jsdoc diff --git a/libraries/networking/src/LimitedNodeList.cpp b/libraries/networking/src/LimitedNodeList.cpp index 3da5b53dcb..653611ae8c 100644 --- a/libraries/networking/src/LimitedNodeList.cpp +++ b/libraries/networking/src/LimitedNodeList.cpp @@ -198,6 +198,10 @@ void LimitedNodeList::setPermissions(const NodePermissions& newPermissions) { newPermissions.can(NodePermissions::Permission::canGetAndSetPrivateUserData)) { emit canGetAndSetPrivateUserDataChanged(_permissions.can(NodePermissions::Permission::canGetAndSetPrivateUserData)); } + if (originalPermissions.can(NodePermissions::Permission::canRezAvatarEntities) != + newPermissions.can(NodePermissions::Permission::canRezAvatarEntities)) { + emit canRezAvatarEntitiesChanged(_permissions.can(NodePermissions::Permission::canRezAvatarEntities)); + } } void LimitedNodeList::setSocketLocalPort(quint16 socketLocalPort) { diff --git a/libraries/networking/src/LimitedNodeList.h b/libraries/networking/src/LimitedNodeList.h index 59d18fe047..189f3e1b08 100644 --- a/libraries/networking/src/LimitedNodeList.h +++ b/libraries/networking/src/LimitedNodeList.h @@ -133,6 +133,7 @@ public: bool getThisNodeCanKick() const { return _permissions.can(NodePermissions::Permission::canKick); } 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); } quint16 getSocketLocalPort() const { return _nodeSocket.localPort(); } Q_INVOKABLE void setSocketLocalPort(quint16 socketLocalPort); @@ -390,6 +391,7 @@ signals: void canKickChanged(bool canKick); void canReplaceContentChanged(bool canReplaceContent); void canGetAndSetPrivateUserDataChanged(bool canGetAndSetPrivateUserData); + void canRezAvatarEntitiesChanged(bool canRezAvatarEntities); protected slots: void connectedForLocalSocketTest(); diff --git a/libraries/networking/src/Node.h b/libraries/networking/src/Node.h index 07c599913b..7435ebaaf8 100644 --- a/libraries/networking/src/Node.h +++ b/libraries/networking/src/Node.h @@ -84,6 +84,7 @@ public: bool getCanKick() const { return _permissions.can(NodePermissions::Permission::canKick); } 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); } using NodesIgnoredPair = std::pair, bool>; diff --git a/libraries/networking/src/NodePermissions.cpp b/libraries/networking/src/NodePermissions.cpp index e0de649c05..e89b7b4dfd 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_kick"].toBool() ? Permission::canKick : Permission::none; 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_rez_attachments"].toBool() ? Permission::canRezAvatarEntities : Permission::none; } QVariant NodePermissions::toVariant(QHash groupRanks) { @@ -96,6 +97,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_rez_avatar_entities"] = can(Permission::canRezAvatarEntities); return QVariant(values); } diff --git a/libraries/networking/src/NodePermissions.h b/libraries/networking/src/NodePermissions.h index 82c008feef..e3bfc69d07 100644 --- a/libraries/networking/src/NodePermissions.h +++ b/libraries/networking/src/NodePermissions.h @@ -80,7 +80,8 @@ public: canReplaceDomainContent = 128, canRezPermanentCertifiedEntities = 256, canRezTemporaryCertifiedEntities = 512, - canGetAndSetPrivateUserData = 1024 + canGetAndSetPrivateUserData = 1024, + canRezAvatarEntities = 2048 }; Q_DECLARE_FLAGS(Permissions, Permission) Permissions permissions;