diff --git a/domain-server/resources/describe-settings.json b/domain-server/resources/describe-settings.json
index 59fa9c4f3d..7375a0f650 100644
--- a/domain-server/resources/describe-settings.json
+++ b/domain-server/resources/describe-settings.json
@@ -384,7 +384,7 @@
"name": "standard_permissions",
"type": "table",
"label": "Domain-Wide User Permissions",
- "help": "Indicate which users or groups can have which domain-wide permissions.",
+ "help": "Indicate which users or groups can have which domain-wide permissions.",
"caption": "Standard Permissions",
"can_add_new_rows": false,
@@ -394,7 +394,7 @@
"span": 1
},
{
- "label": "Permissions ?",
+ "label": "Permissions ?",
"span": 6
}
],
@@ -463,7 +463,7 @@
"span": 1
},
{
- "label": "Permissions ?",
+ "label": "Permissions ?",
"span": 6
}
],
diff --git a/libraries/entities/src/EntityTree.cpp b/libraries/entities/src/EntityTree.cpp
index ec1f8a50bc..820d97c915 100644
--- a/libraries/entities/src/EntityTree.cpp
+++ b/libraries/entities/src/EntityTree.cpp
@@ -148,11 +148,11 @@ bool EntityTree::updateEntityWithElement(EntityItemPointer entity, const EntityI
return false;
}
- if (!canRezPermanentEntities && (entity->getLifetime() != properties.getLifetime())) {
- // we don't allow a Node that can't create permanent entities to adjust lifetimes on existing ones
- if (properties.lifetimeChanged()) {
- qCDebug(entities) << "Refusing disallowed entity lifetime adjustment.";
- return false;
+ if (!canRezPermanentEntities) {
+ // we don't allow a Node that can't create permanent entities to raise lifetimes on existing ones
+ if (properties.getLifetime() == ENTITY_ITEM_IMMORTAL_LIFETIME || properties.getLifetime() > _maxTmpEntityLifetime) {
+ qCDebug(entities) << "Capping disallowed entity lifetime adjustment.";
+ properties.setLifetime(_maxTmpEntityLifetime);
}
}
@@ -321,26 +321,9 @@ bool EntityTree::updateEntityWithElement(EntityItemPointer entity, const EntityI
return true;
}
-bool EntityTree::permissionsAllowRez(const EntityItemProperties& properties, bool canRez, bool canRezTmp) {
- float lifeTime = properties.getLifetime();
-
- if (lifeTime == ENTITY_ITEM_IMMORTAL_LIFETIME || lifeTime > _maxTmpEntityLifetime) {
- // this is an attempt to rez a permanent or non-temporary entity.
- if (!canRez) {
- return false;
- }
- } else {
- // this is an attempt to rez a temporary entity.
- if (!canRezTmp) {
- return false;
- }
- }
-
- return true;
-}
-
EntityItemPointer EntityTree::addEntity(const EntityItemID& entityID, const EntityItemProperties& properties) {
EntityItemPointer result = NULL;
+ EntityItemProperties props = properties;
auto nodeList = DependencyManager::get();
if (!nodeList) {
@@ -348,16 +331,19 @@ EntityItemPointer EntityTree::addEntity(const EntityItemID& entityID, const Enti
return nullptr;
}
- bool clientOnly = properties.getClientOnly();
+ bool clientOnly = props.getClientOnly();
- if (!clientOnly && getIsClient() &&
- !permissionsAllowRez(properties, nodeList->getThisNodeCanRez(), nodeList->getThisNodeCanRezTmp())) {
- // if our Node isn't allowed to create entities in this domain, don't try.
- return nullptr;
+ if (!clientOnly && getIsClient() && !nodeList->getThisNodeCanRez() && nodeList->getThisNodeCanRezTmp()) {
+ // we are a client which is only allowed to rez temporary entities. cap the lifetime.
+ if (props.getLifetime() == ENTITY_ITEM_IMMORTAL_LIFETIME) {
+ props.setLifetime(_maxTmpEntityLifetime);
+ } else {
+ props.setLifetime(glm::min(props.getLifetime(), _maxTmpEntityLifetime));
+ }
}
bool recordCreationTime = false;
- if (properties.getCreated() == UNKNOWN_CREATED_TIME) {
+ if (props.getCreated() == UNKNOWN_CREATED_TIME) {
// the entity's creation time was not specified in properties, which means this is a NEW entity
// and we must record its creation time
recordCreationTime = true;
@@ -372,8 +358,8 @@ EntityItemPointer EntityTree::addEntity(const EntityItemID& entityID, const Enti
}
// construct the instance of the entity
- EntityTypes::EntityType type = properties.getType();
- result = EntityTypes::constructEntityItem(type, entityID, properties);
+ EntityTypes::EntityType type = props.getType();
+ result = EntityTypes::constructEntityItem(type, entityID, props);
if (result) {
if (recordCreationTime) {
@@ -922,11 +908,20 @@ int EntityTree::processEditPacketData(ReceivedMessage& message, const unsigned c
EntityItemID entityItemID;
EntityItemProperties properties;
startDecode = usecTimestampNow();
-
+
bool validEditPacket = EntityItemProperties::decodeEntityEditPacket(editData, maxLength, processedBytes,
entityItemID, properties);
endDecode = usecTimestampNow();
+ if (!senderNode->getCanRez() && senderNode->getCanRezTmp()) {
+ // this node is only allowed to rez temporary entities. cap the lifetime.
+ if (properties.getLifetime() == ENTITY_ITEM_IMMORTAL_LIFETIME) {
+ properties.setLifetime(_maxTmpEntityLifetime);
+ } else {
+ properties.setLifetime(glm::min(properties.getLifetime(), _maxTmpEntityLifetime));
+ }
+ }
+
// If we got a valid edit packet, then it could be a new entity or it could be an update to
// an existing entity... handle appropriately
if (validEditPacket) {
@@ -955,7 +950,7 @@ int EntityTree::processEditPacketData(ReceivedMessage& message, const unsigned c
endUpdate = usecTimestampNow();
_totalUpdates++;
} else if (message.getType() == PacketType::EntityAdd) {
- if (permissionsAllowRez(properties, senderNode->getCanRez(), senderNode->getCanRezTmp())) {
+ if (senderNode->getCanRez() || senderNode->getCanRezTmp()) {
// this is a new entity... assign a new entityID
properties.setCreated(properties.getLastEdited());
startCreate = usecTimestampNow();
diff --git a/libraries/entities/src/EntityTree.h b/libraries/entities/src/EntityTree.h
index 8afb8d878f..15daf3bf3c 100644
--- a/libraries/entities/src/EntityTree.h
+++ b/libraries/entities/src/EntityTree.h
@@ -64,7 +64,6 @@ public:
void setEntityMaxTmpLifetime(float maxTmpEntityLifetime) { _maxTmpEntityLifetime = maxTmpEntityLifetime; }
- bool permissionsAllowRez(const EntityItemProperties& properties, bool canRez, bool canRezTmp);
/// Implements our type specific root element factory
virtual OctreeElementPointer createNewElement(unsigned char* octalCode = NULL) override;
diff --git a/scripts/system/edit.js b/scripts/system/edit.js
index 42eddf11c3..b439de2c9d 100644
--- a/scripts/system/edit.js
+++ b/scripts/system/edit.js
@@ -332,7 +332,7 @@ var toolBar = (function() {
that.setActive = function(active) {
if (active != isActive) {
- if (active && !Entities.canAdjustLocks()) {
+ if (active && !Entities.canRez() && !Entities.canRezTmp()) {
Window.alert(INSUFFICIENT_PERMISSIONS_ERROR_MSG);
} else {
Messages.sendLocalMessage("edit-events", JSON.stringify({