// If objectID is specified (not UUID.Zero), then that object (owned by "owner") is trying to rez another object. // pass 0 for landImpact if you do not want this method to do any Land Impact limit checks. private bool CheckRezPerms(ILandObject parcel, UUID owner, UUID objectID, Vector3 objectPosition, bool isTemp, Scene scene) { DebugPermissionInformation(MethodInfo.GetCurrentMethod().Name); if (m_bypassPermissions) return m_bypassPermissionsValue; // User or object owner is an admin? if (IsGodUser(owner)) return true; // we're done here, no need to check more // This code block handles the Scenic option of EO (and partner) only. if (scene.RegionInfo.AllowRezzers == ProductRulesWho.OnlyEO) { // only the estate OWNER or PARTNER can rez in scenic regions unless it's a temprez object if (scene.IsEstateOwner(owner)) return true; if (scene.RegionInfo.AllowPartnerRez) if (scene.IsEstateOwnerPartner(owner)) return true; if (!isTemp) // non-temp rezzing not allowed return false; } // At this point, we need to test a specific parcel. if (parcel == null) return false; // Is this a Plus region? if (scene.RegionInfo.Product == ProductRulesUse.PlusUse) { // If this is an unclaimed Plus parcel (or community land) if (scene.IsEstateOwner(parcel.landData.OwnerID)) return scene.IsEstateManager(owner); // only EM can rez // Else only the Plus user (and possibly partner) can rez in a Plus parcel. if (owner == parcel.landData.OwnerID) return true; // Otherwise, only the Plus user's partner can rez in a Plus parcel. if (scene.RegionInfo.AllowPartnerRez) { UserProfileData parcelOwner = m_scene.CommsManager.UserService.GetUserProfile(parcel.landData.OwnerID); if (parcelOwner != null) if (parcelOwner.Partner != UUID.Zero) if (parcelOwner.Partner == owner) return true; } return false; } // Create enabled for everyone? if ((parcel.landData.Flags & ((int)ParcelFlags.CreateObjects)) == (uint)ParcelFlags.CreateObjects) return true; // we're done here, no need to check more ulong roleNeeded = (ulong)GroupPowers.AllowRez; if ((parcel.landData.Flags & (uint)ParcelFlags.CreateGroupObjects) == (uint)ParcelFlags.CreateGroupObjects) roleNeeded = (ulong)GroupPowers.None; // if group rezzing is enabled, we just need to be a member, no specific role ability // Is an object rezzing the other object? if (objectID != UUID.Zero) { // A scripted object is doing the rezzing... SceneObjectGroup group = this.FindObjectGroup(objectID); if (group == null) return false; // Now continue the rezzing permissions checks if (group.OwnerID == parcel.landData.OwnerID) return true; // Owner doesn't match the land parcel, check partner perms. if (scene.RegionInfo.AllowPartnerRez) { // this one is will not be called based on current products (Scenic, Plus) but completes the rule set for objects. UserProfileData parcelOwner = m_scene.CommsManager.UserService.GetUserProfile(parcel.landData.OwnerID); if (parcelOwner != null) if (parcelOwner.Partner != UUID.Zero) if (parcelOwner.Partner == group.OwnerID) return true; } // Owner doesn't match the land parcel, check group perms. UUID activeGroupId = group.GroupID; // Handle the special case of active group for a worn attachment if (group.RootPart.IsAttachment) { ScenePresence sp = m_scene.GetScenePresence(group.RootPart.AttachedAvatar); if (sp == null) return false; IClientAPI client = sp.ControllingClient; activeGroupId = client.ActiveGroupId; } // See if the agent or object doing the rezzing has permission itself. if ((parcel.landData.Flags & (uint)ParcelFlags.CreateGroupObjects) == (uint)ParcelFlags.CreateGroupObjects) { if (activeGroupId == parcel.landData.GroupID) return true; } // Create role enabled for this group member on group land? if (GenericParcelPermission(group.OwnerID, parcel, roleNeeded)) return true; // we're done here, no need to check more return false; } // An agent/avatar is doing the rezzing... // Create role enabled for this group member on group land, or parcel is group-enabled? if (GenericParcelPermission(owner, parcel, roleNeeded)) return true; // we're done here, no need to check more // Owner doesn't match the land parcel, check partner perms. if (scene.RegionInfo.AllowPartnerRez) { // this one is will not be called based on current products (Scenic, Plus) but completes the rule set for the remaining cases. UserProfileData parcelOwner = m_scene.CommsManager.UserService.GetUserProfile(parcel.landData.OwnerID); if (parcelOwner != null) if (parcelOwner.Partner != UUID.Zero) if (parcelOwner.Partner == owner) return true; } return false; }