From 219015d6994b2dfa9e33edc118c66642c8d85fc8 Mon Sep 17 00:00:00 2001 From: Justin Clarke Casey Date: Thu, 13 Nov 2008 17:22:18 +0000 Subject: * Attempt to make OpenSim.ini.example a bit more readable by * Some rearrangement within sections * Indenting section contents * Also, correct indentation levels in PermissionsModule --- .../Modules/World/Permissions/PermissionsModule.cs | 1012 ++++++------- bin/OpenSim.ini.example | 1506 ++++++++++---------- 2 files changed, 1267 insertions(+), 1251 deletions(-) diff --git a/OpenSim/Region/Environment/Modules/World/Permissions/PermissionsModule.cs b/OpenSim/Region/Environment/Modules/World/Permissions/PermissionsModule.cs index 0585213..5d48cbd 100644 --- a/OpenSim/Region/Environment/Modules/World/Permissions/PermissionsModule.cs +++ b/OpenSim/Region/Environment/Modules/World/Permissions/PermissionsModule.cs @@ -552,683 +552,683 @@ namespace OpenSim.Region.Environment.Modules.World.Permissions #endregion #region Permission Checks - private bool CanAbandonParcel(UUID user, ILandObject parcel, Scene scene) - { - DebugPermissionInformation(MethodInfo.GetCurrentMethod().Name); - if (m_bypassPermissions) return m_bypassPermissionsValue; - - return GenericParcelPermission(user, parcel); - } + private bool CanAbandonParcel(UUID user, ILandObject parcel, Scene scene) + { + DebugPermissionInformation(MethodInfo.GetCurrentMethod().Name); + if (m_bypassPermissions) return m_bypassPermissionsValue; - private bool CanReclaimParcel(UUID user, ILandObject parcel, Scene scene) - { - DebugPermissionInformation(MethodInfo.GetCurrentMethod().Name); - if (m_bypassPermissions) return m_bypassPermissionsValue; + return GenericParcelPermission(user, parcel); + } - return GenericParcelPermission(user, parcel); - } + private bool CanReclaimParcel(UUID user, ILandObject parcel, Scene scene) + { + DebugPermissionInformation(MethodInfo.GetCurrentMethod().Name); + if (m_bypassPermissions) return m_bypassPermissionsValue; - private bool CanBeGodLike(UUID user, Scene scene) - { - DebugPermissionInformation(MethodInfo.GetCurrentMethod().Name); - if (m_bypassPermissions) return m_bypassPermissionsValue; + return GenericParcelPermission(user, parcel); + } - return IsAdministrator(user); - } + private bool CanBeGodLike(UUID user, Scene scene) + { + DebugPermissionInformation(MethodInfo.GetCurrentMethod().Name); + if (m_bypassPermissions) return m_bypassPermissionsValue; - private bool CanDuplicateObject(int objectCount, UUID objectID, UUID owner, Scene scene, Vector3 objectPosition) - { - DebugPermissionInformation(MethodInfo.GetCurrentMethod().Name); - if (m_bypassPermissions) return m_bypassPermissionsValue; + return IsAdministrator(user); + } - if (!GenericObjectPermission(owner, objectID, true)) - { - //They can't even edit the object - return false; - } - //If they can rez, they can duplicate - return CanRezObject(objectCount, owner, objectPosition, scene); - } + private bool CanDuplicateObject(int objectCount, UUID objectID, UUID owner, Scene scene, Vector3 objectPosition) + { + DebugPermissionInformation(MethodInfo.GetCurrentMethod().Name); + if (m_bypassPermissions) return m_bypassPermissionsValue; - private bool CanDeleteObject(UUID objectID, UUID deleter, Scene scene) + if (!GenericObjectPermission(owner, objectID, true)) { - DebugPermissionInformation(MethodInfo.GetCurrentMethod().Name); - if (m_bypassPermissions) return m_bypassPermissionsValue; - - return GenericObjectPermission(deleter, objectID, false); + //They can't even edit the object + return false; } + //If they can rez, they can duplicate + return CanRezObject(objectCount, owner, objectPosition, scene); + } - private bool CanEditObject(UUID objectID, UUID editorID, Scene scene) - { - DebugPermissionInformation(MethodInfo.GetCurrentMethod().Name); - if (m_bypassPermissions) return m_bypassPermissionsValue; - + private bool CanDeleteObject(UUID objectID, UUID deleter, Scene scene) + { + DebugPermissionInformation(MethodInfo.GetCurrentMethod().Name); + if (m_bypassPermissions) return m_bypassPermissionsValue; - return GenericObjectPermission(editorID, objectID, false); - } + return GenericObjectPermission(deleter, objectID, false); + } - private bool CanEditObjectInventory(UUID objectID, UUID editorID, Scene scene) - { - DebugPermissionInformation(MethodInfo.GetCurrentMethod().Name); - if (m_bypassPermissions) return m_bypassPermissionsValue; + private bool CanEditObject(UUID objectID, UUID editorID, Scene scene) + { + DebugPermissionInformation(MethodInfo.GetCurrentMethod().Name); + if (m_bypassPermissions) return m_bypassPermissionsValue; - SceneObjectPart part = m_scene.GetSceneObjectPart(objectID); - // TODO: add group support! - // - if (part.OwnerID != editorID) - return false; - - return GenericObjectPermission(editorID, objectID, false); - } + return GenericObjectPermission(editorID, objectID, false); + } - private bool CanEditParcel(UUID user, ILandObject parcel, Scene scene) - { - DebugPermissionInformation(MethodInfo.GetCurrentMethod().Name); - if (m_bypassPermissions) return m_bypassPermissionsValue; + private bool CanEditObjectInventory(UUID objectID, UUID editorID, Scene scene) + { + DebugPermissionInformation(MethodInfo.GetCurrentMethod().Name); + if (m_bypassPermissions) return m_bypassPermissionsValue; - return GenericParcelPermission(user, parcel); - } + SceneObjectPart part = m_scene.GetSceneObjectPart(objectID); - private bool CanEditScript(UUID script, UUID objectID, UUID user, Scene scene) - { - DebugPermissionInformation(MethodInfo.GetCurrentMethod().Name); - if (m_bypassPermissions) return m_bypassPermissionsValue; + // TODO: add group support! + // + if (part.OwnerID != editorID) + return false; - // If you can view it, you can edit it - // There is no viewing a no mod script - // - return CanViewScript(script, objectID, user, scene); - } + return GenericObjectPermission(editorID, objectID, false); + } - private bool CanEditNotecard(UUID notecard, UUID objectID, UUID user, Scene scene) - { - DebugPermissionInformation(MethodInfo.GetCurrentMethod().Name); - if (m_bypassPermissions) return m_bypassPermissionsValue; + private bool CanEditParcel(UUID user, ILandObject parcel, Scene scene) + { + DebugPermissionInformation(MethodInfo.GetCurrentMethod().Name); + if (m_bypassPermissions) return m_bypassPermissionsValue; - if (objectID == UUID.Zero) // User inventory - { - CachedUserInfo userInfo = - scene.CommsManager.UserProfileCacheService.GetUserDetails(user); - - if (userInfo == null) - { - m_log.ErrorFormat("[PERMISSIONS]: Could not find user {0} for edit notecard check", user); - return false; - } - + return GenericParcelPermission(user, parcel); + } - if (userInfo.RootFolder == null) - return false; + private bool CanEditScript(UUID script, UUID objectID, UUID user, Scene scene) + { + DebugPermissionInformation(MethodInfo.GetCurrentMethod().Name); + if (m_bypassPermissions) return m_bypassPermissionsValue; - InventoryItemBase assetRequestItem = userInfo.RootFolder.FindItem(notecard); - if (assetRequestItem == null) // Library item - { - assetRequestItem = scene.CommsManager.UserProfileCacheService.LibraryRoot.FindItem(notecard); + // If you can view it, you can edit it + // There is no viewing a no mod script + // + return CanViewScript(script, objectID, user, scene); + } - if (assetRequestItem != null) // Implicitly readable - return true; - } + private bool CanEditNotecard(UUID notecard, UUID objectID, UUID user, Scene scene) + { + DebugPermissionInformation(MethodInfo.GetCurrentMethod().Name); + if (m_bypassPermissions) return m_bypassPermissionsValue; - // Notecards must be both mod and copy to be saveable - // This is because of they're not copy, you can't read - // them, and if they're not mod, well, then they're - // not mod. Duh. - // - if ((assetRequestItem.CurrentPermissions & - ((uint)PermissionMask.Modify | - (uint)PermissionMask.Copy)) != - ((uint)PermissionMask.Modify | - (uint)PermissionMask.Copy)) - return false; - } - else // Prim inventory + if (objectID == UUID.Zero) // User inventory + { + CachedUserInfo userInfo = + scene.CommsManager.UserProfileCacheService.GetUserDetails(user); + + if (userInfo == null) { - SceneObjectPart part = scene.GetSceneObjectPart(objectID); - - if (part == null) - return false; - - if (part.OwnerID != user) - return false; - - if ((part.OwnerMask & (uint)PermissionMask.Modify) == 0) - return false; - - TaskInventoryItem ti = part.GetInventoryItem(notecard); + m_log.ErrorFormat("[PERMISSIONS]: Could not find user {0} for edit notecard check", user); + return false; + } + - if (ti == null) - return false; + if (userInfo.RootFolder == null) + return false; - if (ti.OwnerID != user) - return false; + InventoryItemBase assetRequestItem = userInfo.RootFolder.FindItem(notecard); + if (assetRequestItem == null) // Library item + { + assetRequestItem = scene.CommsManager.UserProfileCacheService.LibraryRoot.FindItem(notecard); - // Require full perms - if ((ti.CurrentPermissions & - ((uint)PermissionMask.Modify | - (uint)PermissionMask.Copy)) != - ((uint)PermissionMask.Modify | - (uint)PermissionMask.Copy)) - return false; + if (assetRequestItem != null) // Implicitly readable + return true; } - return true; + // Notecards must be both mod and copy to be saveable + // This is because of they're not copy, you can't read + // them, and if they're not mod, well, then they're + // not mod. Duh. + // + if ((assetRequestItem.CurrentPermissions & + ((uint)PermissionMask.Modify | + (uint)PermissionMask.Copy)) != + ((uint)PermissionMask.Modify | + (uint)PermissionMask.Copy)) + return false; } - - private bool CanInstantMessage(UUID user, UUID target, Scene startScene) + else // Prim inventory { - DebugPermissionInformation(MethodInfo.GetCurrentMethod().Name); - if (m_bypassPermissions) return m_bypassPermissionsValue; - + SceneObjectPart part = scene.GetSceneObjectPart(objectID); - return GenericCommunicationPermission(user, target); - } - - private bool CanInventoryTransfer(UUID user, UUID target, Scene startScene) - { - DebugPermissionInformation(MethodInfo.GetCurrentMethod().Name); - if (m_bypassPermissions) return m_bypassPermissionsValue; + if (part == null) + return false; - return GenericCommunicationPermission(user, target); - } + if (part.OwnerID != user) + return false; - private bool CanIssueEstateCommand(UUID user, Scene requestFromScene, bool ownerCommand) - { - DebugPermissionInformation(MethodInfo.GetCurrentMethod().Name); - if (m_bypassPermissions) return m_bypassPermissionsValue; + if ((part.OwnerMask & (uint)PermissionMask.Modify) == 0) + return false; - if (IsAdministrator(user)) - return true; + TaskInventoryItem ti = part.GetInventoryItem(notecard); - if (m_scene.RegionInfo.EstateSettings.IsEstateOwner(user)) - return true; + if (ti == null) + return false; - if (ownerCommand) + if (ti.OwnerID != user) return false; - return GenericEstatePermission(user); + // Require full perms + if ((ti.CurrentPermissions & + ((uint)PermissionMask.Modify | + (uint)PermissionMask.Copy)) != + ((uint)PermissionMask.Modify | + (uint)PermissionMask.Copy)) + return false; } - private bool CanMoveObject(UUID objectID, UUID moverID, Scene scene) - { - DebugPermissionInformation(MethodInfo.GetCurrentMethod().Name); - if (m_bypassPermissions) - { - SceneObjectPart part = scene.GetSceneObjectPart(objectID); - if (part.OwnerID != moverID) - { - if (part.ParentGroup != null && !part.ParentGroup.IsDeleted) - { - if (part.ParentGroup.IsAttachment) - return false; - } - } - return m_bypassPermissionsValue; - } + return true; + } - bool permission = GenericObjectPermission(moverID, objectID, true); - if (!permission) - { - if (!m_scene.Entities.ContainsKey(objectID)) - { - return false; - } + private bool CanInstantMessage(UUID user, UUID target, Scene startScene) + { + DebugPermissionInformation(MethodInfo.GetCurrentMethod().Name); + if (m_bypassPermissions) return m_bypassPermissionsValue; - // The client - // may request to edit linked parts, and therefore, it needs - // to also check for SceneObjectPart - // If it's not an object, we cant edit it. - if ((!(m_scene.Entities[objectID] is SceneObjectGroup))) - { - return false; - } + return GenericCommunicationPermission(user, target); + } + private bool CanInventoryTransfer(UUID user, UUID target, Scene startScene) + { + DebugPermissionInformation(MethodInfo.GetCurrentMethod().Name); + if (m_bypassPermissions) return m_bypassPermissionsValue; - SceneObjectGroup task = (SceneObjectGroup)m_scene.Entities[objectID]; + return GenericCommunicationPermission(user, target); + } + private bool CanIssueEstateCommand(UUID user, Scene requestFromScene, bool ownerCommand) + { + DebugPermissionInformation(MethodInfo.GetCurrentMethod().Name); + if (m_bypassPermissions) return m_bypassPermissionsValue; - // UUID taskOwner = null; - // Added this because at this point in time it wouldn't be wise for - // the administrator object permissions to take effect. - // UUID objectOwner = task.OwnerID; + if (IsAdministrator(user)) + return true; - // Anyone can move - if ((task.RootPart.EveryoneMask & PERM_MOVE) != 0) - permission = true; + if (m_scene.RegionInfo.EstateSettings.IsEstateOwner(user)) + return true; - // Locked - if ((task.RootPart.OwnerMask & PERM_LOCKED) == 0) - permission = false; + if (ownerCommand) + return false; - } - else - { - bool locked = false; - if (!m_scene.Entities.ContainsKey(objectID)) - { - return false; - } + return GenericEstatePermission(user); + } - // If it's not an object, we cant edit it. - if ((!(m_scene.Entities[objectID] is SceneObjectGroup))) + private bool CanMoveObject(UUID objectID, UUID moverID, Scene scene) + { + DebugPermissionInformation(MethodInfo.GetCurrentMethod().Name); + if (m_bypassPermissions) + { + SceneObjectPart part = scene.GetSceneObjectPart(objectID); + if (part.OwnerID != moverID) + { + if (part.ParentGroup != null && !part.ParentGroup.IsDeleted) { - return false; + if (part.ParentGroup.IsAttachment) + return false; } - - - SceneObjectGroup group = (SceneObjectGroup)m_scene.Entities[objectID]; - - UUID objectOwner = group.OwnerID; - locked = ((group.RootPart.OwnerMask & PERM_LOCKED) == 0); - - - // This is an exception to the generic object permission. - // Administrators who lock their objects should not be able to move them, - // however generic object permission should return true. - // This keeps locked objects from being affected by random click + drag actions by accident - // and allows the administrator to grab or delete a locked object. - - // Administrators and estate managers are still able to click+grab locked objects not - // owned by them in the scene - // This is by design. - - if (locked && (moverID == objectOwner)) - return false; } - return permission; + return m_bypassPermissionsValue; } - private bool CanObjectEntry(UUID objectID, Vector3 newPoint, Scene scene) + bool permission = GenericObjectPermission(moverID, objectID, true); + if (!permission) { - DebugPermissionInformation(MethodInfo.GetCurrentMethod().Name); - if (m_bypassPermissions) return m_bypassPermissionsValue; - - if ((newPoint.X > 257f || newPoint.X < -1f || newPoint.Y > 257f || newPoint.Y < -1f)) + if (!m_scene.Entities.ContainsKey(objectID)) { - return true; + return false; } - ILandObject land = m_scene.LandChannel.GetLandObject(newPoint.X, newPoint.Y); + // The client + // may request to edit linked parts, and therefore, it needs + // to also check for SceneObjectPart - if (land == null) + // If it's not an object, we cant edit it. + if ((!(m_scene.Entities[objectID] is SceneObjectGroup))) { return false; } - if ((land.landData.Flags & ((int)Parcel.ParcelFlags.AllowAPrimitiveEntry)) != 0) - { - return true; - } - //TODO: check for group rights + SceneObjectGroup task = (SceneObjectGroup)m_scene.Entities[objectID]; + + + // UUID taskOwner = null; + // Added this because at this point in time it wouldn't be wise for + // the administrator object permissions to take effect. + // UUID objectOwner = task.OwnerID; + // Anyone can move + if ((task.RootPart.EveryoneMask & PERM_MOVE) != 0) + permission = true; + + // Locked + if ((task.RootPart.OwnerMask & PERM_LOCKED) == 0) + permission = false; + + } + else + { + bool locked = false; if (!m_scene.Entities.ContainsKey(objectID)) { return false; } // If it's not an object, we cant edit it. - if (!(m_scene.Entities[objectID] is SceneObjectGroup)) + if ((!(m_scene.Entities[objectID] is SceneObjectGroup))) { return false; } - SceneObjectGroup task = (SceneObjectGroup)m_scene.Entities[objectID]; - if (GenericParcelPermission(task.OwnerID, newPoint)) - { - return true; - } + SceneObjectGroup group = (SceneObjectGroup)m_scene.Entities[objectID]; + + UUID objectOwner = group.OwnerID; + locked = ((group.RootPart.OwnerMask & PERM_LOCKED) == 0); + + + // This is an exception to the generic object permission. + // Administrators who lock their objects should not be able to move them, + // however generic object permission should return true. + // This keeps locked objects from being affected by random click + drag actions by accident + // and allows the administrator to grab or delete a locked object. + + // Administrators and estate managers are still able to click+grab locked objects not + // owned by them in the scene + // This is by design. - //Otherwise, false! + if (locked && (moverID == objectOwner)) + return false; + } + return permission; + } + + private bool CanObjectEntry(UUID objectID, Vector3 newPoint, Scene scene) + { + DebugPermissionInformation(MethodInfo.GetCurrentMethod().Name); + if (m_bypassPermissions) return m_bypassPermissionsValue; + + if ((newPoint.X > 257f || newPoint.X < -1f || newPoint.Y > 257f || newPoint.Y < -1f)) + { + return true; + } + + ILandObject land = m_scene.LandChannel.GetLandObject(newPoint.X, newPoint.Y); + + if (land == null) + { return false; } - private bool CanReturnObject(UUID objectID, UUID returnerID, Scene scene) + if ((land.landData.Flags & ((int)Parcel.ParcelFlags.AllowAPrimitiveEntry)) != 0) { - DebugPermissionInformation(MethodInfo.GetCurrentMethod().Name); - if (m_bypassPermissions) return m_bypassPermissionsValue; + return true; + } + + //TODO: check for group rights - return GenericObjectPermission(returnerID, objectID, false); + if (!m_scene.Entities.ContainsKey(objectID)) + { + return false; } - private bool CanRezObject(int objectCount, UUID owner, Vector3 objectPosition, Scene scene) + // If it's not an object, we cant edit it. + if (!(m_scene.Entities[objectID] is SceneObjectGroup)) { - DebugPermissionInformation(MethodInfo.GetCurrentMethod().Name); - if (m_bypassPermissions) return m_bypassPermissionsValue; + return false; + } - bool permission = false; + SceneObjectGroup task = (SceneObjectGroup)m_scene.Entities[objectID]; - ILandObject land = m_scene.LandChannel.GetLandObject(objectPosition.X, objectPosition.Y); - if (land == null) return false; + if (GenericParcelPermission(task.OwnerID, newPoint)) + { + return true; + } - if ((land.landData.Flags & ((int)Parcel.ParcelFlags.CreateObjects)) == - (int)Parcel.ParcelFlags.CreateObjects) - permission = true; + //Otherwise, false! + return false; + } - //TODO: check for group rights + private bool CanReturnObject(UUID objectID, UUID returnerID, Scene scene) + { + DebugPermissionInformation(MethodInfo.GetCurrentMethod().Name); + if (m_bypassPermissions) return m_bypassPermissionsValue; - if (IsAdministrator(owner)) - { - permission = true; - } + return GenericObjectPermission(returnerID, objectID, false); + } - if (GenericParcelPermission(owner, objectPosition)) - { - permission = true; - } + private bool CanRezObject(int objectCount, UUID owner, Vector3 objectPosition, Scene scene) + { + DebugPermissionInformation(MethodInfo.GetCurrentMethod().Name); + if (m_bypassPermissions) return m_bypassPermissionsValue; - return permission; - } + bool permission = false; - private bool CanRunConsoleCommand(UUID user, Scene requestFromScene) - { - DebugPermissionInformation(MethodInfo.GetCurrentMethod().Name); - if (m_bypassPermissions) return m_bypassPermissionsValue; + ILandObject land = m_scene.LandChannel.GetLandObject(objectPosition.X, objectPosition.Y); + if (land == null) return false; + if ((land.landData.Flags & ((int)Parcel.ParcelFlags.CreateObjects)) == + (int)Parcel.ParcelFlags.CreateObjects) + permission = true; - return IsAdministrator(user); - } + //TODO: check for group rights - private bool CanRunScript(UUID script, UUID objectID, UUID user, Scene scene) + if (IsAdministrator(owner)) { - DebugPermissionInformation(MethodInfo.GetCurrentMethod().Name); - if (m_bypassPermissions) return m_bypassPermissionsValue; - - return true; + permission = true; } - private bool CanSellParcel(UUID user, ILandObject parcel, Scene scene) + if (GenericParcelPermission(owner, objectPosition)) { - DebugPermissionInformation(MethodInfo.GetCurrentMethod().Name); - if (m_bypassPermissions) return m_bypassPermissionsValue; - - return GenericParcelPermission(user, parcel); + permission = true; } - private bool CanTakeObject(UUID objectID, UUID stealer, Scene scene) - { - DebugPermissionInformation(MethodInfo.GetCurrentMethod().Name); - if (m_bypassPermissions) return m_bypassPermissionsValue; + return permission; + } - return GenericObjectPermission(stealer,objectID, false); - } + private bool CanRunConsoleCommand(UUID user, Scene requestFromScene) + { + DebugPermissionInformation(MethodInfo.GetCurrentMethod().Name); + if (m_bypassPermissions) return m_bypassPermissionsValue; - private bool CanTakeCopyObject(UUID objectID, UUID userID, Scene inScene) - { - DebugPermissionInformation(MethodInfo.GetCurrentMethod().Name); - if (m_bypassPermissions) return m_bypassPermissionsValue; - bool permission = GenericObjectPermission(userID, objectID,false); - if (!permission) - { - if (!m_scene.Entities.ContainsKey(objectID)) - { - return false; - } + return IsAdministrator(user); + } - // If it's not an object, we cant edit it. - if (!(m_scene.Entities[objectID] is SceneObjectGroup)) - { - return false; - } + private bool CanRunScript(UUID script, UUID objectID, UUID user, Scene scene) + { + DebugPermissionInformation(MethodInfo.GetCurrentMethod().Name); + if (m_bypassPermissions) return m_bypassPermissionsValue; - SceneObjectGroup task = (SceneObjectGroup)m_scene.Entities[objectID]; - // UUID taskOwner = null; - // Added this because at this point in time it wouldn't be wise for - // the administrator object permissions to take effect. - // UUID objectOwner = task.OwnerID; + return true; + } + private bool CanSellParcel(UUID user, ILandObject parcel, Scene scene) + { + DebugPermissionInformation(MethodInfo.GetCurrentMethod().Name); + if (m_bypassPermissions) return m_bypassPermissionsValue; - if ((task.RootPart.EveryoneMask & PERM_COPY) != 0) - permission = true; - } - return permission; - } + return GenericParcelPermission(user, parcel); + } - private bool CanTerraformLand(UUID user, Vector3 position, Scene requestFromScene) - { - DebugPermissionInformation(MethodInfo.GetCurrentMethod().Name); - if (m_bypassPermissions) return m_bypassPermissionsValue; + private bool CanTakeObject(UUID objectID, UUID stealer, Scene scene) + { + DebugPermissionInformation(MethodInfo.GetCurrentMethod().Name); + if (m_bypassPermissions) return m_bypassPermissionsValue; - // Estate override - if (GenericEstatePermission(user)) - return true; + return GenericObjectPermission(stealer,objectID, false); + } - float X = position.X; - float Y = position.Y; + private bool CanTakeCopyObject(UUID objectID, UUID userID, Scene inScene) + { + DebugPermissionInformation(MethodInfo.GetCurrentMethod().Name); + if (m_bypassPermissions) return m_bypassPermissionsValue; - if (X > 255) - X = 255; - if (Y > 255) - Y = 255; - if (X < 0) - X = 0; - if (Y < 0) - Y = 0; + bool permission = GenericObjectPermission(userID, objectID,false); + if (!permission) + { + if (!m_scene.Entities.ContainsKey(objectID)) + { + return false; + } - ILandObject parcel = m_scene.LandChannel.GetLandObject(X, Y); - if (parcel == null) + // If it's not an object, we cant edit it. + if (!(m_scene.Entities[objectID] is SceneObjectGroup)) + { return false; + } - // Others allowed to terraform? - if ((parcel.landData.Flags & ((int)Parcel.ParcelFlags.AllowTerraform)) != 0) - return true; + SceneObjectGroup task = (SceneObjectGroup)m_scene.Entities[objectID]; + // UUID taskOwner = null; + // Added this because at this point in time it wouldn't be wise for + // the administrator object permissions to take effect. + // UUID objectOwner = task.OwnerID; - // Land owner can terraform too - if (parcel != null && GenericParcelPermission(user, parcel)) - return true; - return false; + if ((task.RootPart.EveryoneMask & PERM_COPY) != 0) + permission = true; } + return permission; + } - private bool CanViewScript(UUID script, UUID objectID, UUID user, Scene scene) - { - DebugPermissionInformation(MethodInfo.GetCurrentMethod().Name); - if (m_bypassPermissions) return m_bypassPermissionsValue; + private bool CanTerraformLand(UUID user, Vector3 position, Scene requestFromScene) + { + DebugPermissionInformation(MethodInfo.GetCurrentMethod().Name); + if (m_bypassPermissions) return m_bypassPermissionsValue; - if (objectID == UUID.Zero) // User inventory - { - CachedUserInfo userInfo = - scene.CommsManager.UserProfileCacheService.GetUserDetails(user); - - if (userInfo == null) - { - m_log.ErrorFormat("[PERMISSIONS]: Could not find user {0} for administrator check", user); - return false; - } + // Estate override + if (GenericEstatePermission(user)) + return true; - if (userInfo.RootFolder == null) - return false; + float X = position.X; + float Y = position.Y; - InventoryItemBase assetRequestItem = userInfo.RootFolder.FindItem(script); - if (assetRequestItem == null) // Library item - { - assetRequestItem = m_scene.CommsManager.UserProfileCacheService.LibraryRoot.FindItem(script); + if (X > 255) + X = 255; + if (Y > 255) + Y = 255; + if (X < 0) + X = 0; + if (Y < 0) + Y = 0; - if (assetRequestItem != null) // Implicitly readable - return true; - } + ILandObject parcel = m_scene.LandChannel.GetLandObject(X, Y); + if (parcel == null) + return false; - // SL is rather harebrained here. In SL, a script you - // have mod/copy no trans is readable. This subverts - // permissions, but is used in some products, most - // notably Hippo door plugin and HippoRent 5 networked - // prim counter. - // To enable this broken SL-ism, remove Transfer from - // the below expressions. - // Trying to improve on SL perms by making a script - // readable only if it's really full perms - // - if ((assetRequestItem.CurrentPermissions & - ((uint)PermissionMask.Modify | - (uint)PermissionMask.Copy | - (uint)PermissionMask.Transfer)) != - ((uint)PermissionMask.Modify | - (uint)PermissionMask.Copy | - (uint)PermissionMask.Transfer)) - return false; - } - else // Prim inventory - { - SceneObjectPart part = scene.GetSceneObjectPart(objectID); + // Others allowed to terraform? + if ((parcel.landData.Flags & ((int)Parcel.ParcelFlags.AllowTerraform)) != 0) + return true; - if (part == null) - return false; + // Land owner can terraform too + if (parcel != null && GenericParcelPermission(user, parcel)) + return true; - if (part.OwnerID != user) - return false; + return false; + } - if ((part.OwnerMask & (uint)PermissionMask.Modify) == 0) - return false; + private bool CanViewScript(UUID script, UUID objectID, UUID user, Scene scene) + { + DebugPermissionInformation(MethodInfo.GetCurrentMethod().Name); + if (m_bypassPermissions) return m_bypassPermissionsValue; - TaskInventoryItem ti = part.GetInventoryItem(script); + if (objectID == UUID.Zero) // User inventory + { + CachedUserInfo userInfo = + scene.CommsManager.UserProfileCacheService.GetUserDetails(user); + + if (userInfo == null) + { + m_log.ErrorFormat("[PERMISSIONS]: Could not find user {0} for administrator check", user); + return false; + } - if (ti == null) - return false; + if (userInfo.RootFolder == null) + return false; - if (ti.OwnerID != user) - return false; + InventoryItemBase assetRequestItem = userInfo.RootFolder.FindItem(script); + if (assetRequestItem == null) // Library item + { + assetRequestItem = m_scene.CommsManager.UserProfileCacheService.LibraryRoot.FindItem(script); - // Require full perms - if ((ti.CurrentPermissions & - ((uint)PermissionMask.Modify | - (uint)PermissionMask.Copy | - (uint)PermissionMask.Transfer)) != - ((uint)PermissionMask.Modify | - (uint)PermissionMask.Copy | - (uint)PermissionMask.Transfer)) - return false; + if (assetRequestItem != null) // Implicitly readable + return true; } - return true; + // SL is rather harebrained here. In SL, a script you + // have mod/copy no trans is readable. This subverts + // permissions, but is used in some products, most + // notably Hippo door plugin and HippoRent 5 networked + // prim counter. + // To enable this broken SL-ism, remove Transfer from + // the below expressions. + // Trying to improve on SL perms by making a script + // readable only if it's really full perms + // + if ((assetRequestItem.CurrentPermissions & + ((uint)PermissionMask.Modify | + (uint)PermissionMask.Copy | + (uint)PermissionMask.Transfer)) != + ((uint)PermissionMask.Modify | + (uint)PermissionMask.Copy | + (uint)PermissionMask.Transfer)) + return false; } - - private bool CanViewNotecard(UUID notecard, UUID objectID, UUID user, Scene scene) + else // Prim inventory { - DebugPermissionInformation(MethodInfo.GetCurrentMethod().Name); - if (m_bypassPermissions) return m_bypassPermissionsValue; + SceneObjectPart part = scene.GetSceneObjectPart(objectID); - if (objectID == UUID.Zero) // User inventory - { - CachedUserInfo userInfo = - scene.CommsManager.UserProfileCacheService.GetUserDetails(user); - - if (userInfo == null) - { - m_log.ErrorFormat("[PERMISSIONS]: Could not find user {0} for view notecard check", user); - return false; - } + if (part == null) + return false; - if (userInfo.RootFolder == null) - return false; + if (part.OwnerID != user) + return false; - InventoryItemBase assetRequestItem = userInfo.RootFolder.FindItem(notecard); - if (assetRequestItem == null) // Library item - { - assetRequestItem = m_scene.CommsManager.UserProfileCacheService.LibraryRoot.FindItem(notecard); + if ((part.OwnerMask & (uint)PermissionMask.Modify) == 0) + return false; - if (assetRequestItem != null) // Implicitly readable - return true; - } + TaskInventoryItem ti = part.GetInventoryItem(script); - // Notecards are always readable unless no copy - // - if ((assetRequestItem.CurrentPermissions & - (uint)PermissionMask.Copy) != - (uint)PermissionMask.Copy) - return false; - } - else // Prim inventory - { - SceneObjectPart part = scene.GetSceneObjectPart(objectID); + if (ti == null) + return false; + + if (ti.OwnerID != user) + return false; - if (part == null) - return false; + // Require full perms + if ((ti.CurrentPermissions & + ((uint)PermissionMask.Modify | + (uint)PermissionMask.Copy | + (uint)PermissionMask.Transfer)) != + ((uint)PermissionMask.Modify | + (uint)PermissionMask.Copy | + (uint)PermissionMask.Transfer)) + return false; + } - if (part.OwnerID != user) - return false; + return true; + } - if ((part.OwnerMask & (uint)PermissionMask.Modify) == 0) - return false; + private bool CanViewNotecard(UUID notecard, UUID objectID, UUID user, Scene scene) + { + DebugPermissionInformation(MethodInfo.GetCurrentMethod().Name); + if (m_bypassPermissions) return m_bypassPermissionsValue; - TaskInventoryItem ti = part.GetInventoryItem(notecard); + if (objectID == UUID.Zero) // User inventory + { + CachedUserInfo userInfo = + scene.CommsManager.UserProfileCacheService.GetUserDetails(user); + + if (userInfo == null) + { + m_log.ErrorFormat("[PERMISSIONS]: Could not find user {0} for view notecard check", user); + return false; + } - if (ti == null) - return false; + if (userInfo.RootFolder == null) + return false; - if (ti.OwnerID != user) - return false; + InventoryItemBase assetRequestItem = userInfo.RootFolder.FindItem(notecard); + if (assetRequestItem == null) // Library item + { + assetRequestItem = m_scene.CommsManager.UserProfileCacheService.LibraryRoot.FindItem(notecard); - // Notecards are always readable unless no copy - // - if ((ti.CurrentPermissions & - (uint)PermissionMask.Copy) != - (uint)PermissionMask.Copy) - return false; + if (assetRequestItem != null) // Implicitly readable + return true; } - return true; + // Notecards are always readable unless no copy + // + if ((assetRequestItem.CurrentPermissions & + (uint)PermissionMask.Copy) != + (uint)PermissionMask.Copy) + return false; } + else // Prim inventory + { + SceneObjectPart part = scene.GetSceneObjectPart(objectID); - #endregion + if (part == null) + return false; - public bool CanLinkObject(UUID userID, UUID objectID) - { - DebugPermissionInformation(MethodInfo.GetCurrentMethod().Name); - if (m_bypassPermissions) return m_bypassPermissionsValue; + if (part.OwnerID != user) + return false; - return true; - } + if ((part.OwnerMask & (uint)PermissionMask.Modify) == 0) + return false; - public bool CanDelinkObject(UUID userID, UUID objectID) - { - DebugPermissionInformation(MethodInfo.GetCurrentMethod().Name); - if (m_bypassPermissions) return m_bypassPermissionsValue; + TaskInventoryItem ti = part.GetInventoryItem(notecard); - return true; - } + if (ti == null) + return false; - public bool CanBuyLand(UUID userID, ILandObject parcel, Scene scene) - { - DebugPermissionInformation(MethodInfo.GetCurrentMethod().Name); - if (m_bypassPermissions) return m_bypassPermissionsValue; + if (ti.OwnerID != user) + return false; - return true; + // Notecards are always readable unless no copy + // + if ((ti.CurrentPermissions & + (uint)PermissionMask.Copy) != + (uint)PermissionMask.Copy) + return false; } - public bool CanCopyInventory(UUID itemID, UUID objectID, UUID userID) - { - DebugPermissionInformation(MethodInfo.GetCurrentMethod().Name); - if (m_bypassPermissions) return m_bypassPermissionsValue; + return true; + } - return true; - } + #endregion - public bool CanDeleteInventory(UUID itemID, UUID objectID, UUID userID) - { - DebugPermissionInformation(MethodInfo.GetCurrentMethod().Name); - if (m_bypassPermissions) return m_bypassPermissionsValue; + public bool CanLinkObject(UUID userID, UUID objectID) + { + DebugPermissionInformation(MethodInfo.GetCurrentMethod().Name); + if (m_bypassPermissions) return m_bypassPermissionsValue; - return true; - } + return true; + } - public bool CanCreateInventory(uint invType, UUID objectID, UUID userID) - { - DebugPermissionInformation(MethodInfo.GetCurrentMethod().Name); - if (m_bypassPermissions) return m_bypassPermissionsValue; + public bool CanDelinkObject(UUID userID, UUID objectID) + { + DebugPermissionInformation(MethodInfo.GetCurrentMethod().Name); + if (m_bypassPermissions) return m_bypassPermissionsValue; - return true; - } + return true; + } - public bool CanTeleport(UUID userID) - { - DebugPermissionInformation(MethodInfo.GetCurrentMethod().Name); - if (m_bypassPermissions) return m_bypassPermissionsValue; + public bool CanBuyLand(UUID userID, ILandObject parcel, Scene scene) + { + DebugPermissionInformation(MethodInfo.GetCurrentMethod().Name); + if (m_bypassPermissions) return m_bypassPermissionsValue; - return true; - } + return true; + } + + public bool CanCopyInventory(UUID itemID, UUID objectID, UUID userID) + { + DebugPermissionInformation(MethodInfo.GetCurrentMethod().Name); + if (m_bypassPermissions) return m_bypassPermissionsValue; + + return true; + } + + public bool CanDeleteInventory(UUID itemID, UUID objectID, UUID userID) + { + DebugPermissionInformation(MethodInfo.GetCurrentMethod().Name); + if (m_bypassPermissions) return m_bypassPermissionsValue; + + return true; + } + + public bool CanCreateInventory(uint invType, UUID objectID, UUID userID) + { + DebugPermissionInformation(MethodInfo.GetCurrentMethod().Name); + if (m_bypassPermissions) return m_bypassPermissionsValue; + + return true; + } + + public bool CanTeleport(UUID userID) + { + DebugPermissionInformation(MethodInfo.GetCurrentMethod().Name); + if (m_bypassPermissions) return m_bypassPermissionsValue; + + return true; + } } } diff --git a/bin/OpenSim.ini.example b/bin/OpenSim.ini.example index 8f1441f..7c5c995 100644 --- a/bin/OpenSim.ini.example +++ b/bin/OpenSim.ini.example @@ -1,876 +1,892 @@ [Startup] + ; Set this to true if you are connecting your OpenSimulator regions to a grid + ; Set this to false if you are running OpenSimulator in standalone mode + gridmode = false + + startup_console_commands_file = "startup_commands.txt" + shutdown_console_commands_file = "shutdown_commands.txt" + + ; To run a script every few minutes, set the script filename here + ; timer_Script = "filename" + + ; ## + ; ## CLIENTS + ; ## + + ; Enables EventQueueGet Service. + EventQueue = true + + ; Set this to the DLL containig the client stack to use. + clientstack_plugin="OpenSim.Region.ClientStack.LindenUDP.dll" + + ; ## + ; ## REGIONS + ; ## + + ; Determine where OpenSimulator looks for the files which tell it which regions to server + ; Defaults to "filesystem" if this setting isn't present + region_info_source = "filesystem" + ; region_info_source = "web" + + ; Determines where the region XML files are stored if you are loading these from the filesystem. + ; Defaults to bin/Regions in your OpenSimulator installation directory + ; regionload_regionsdir="C:\somewhere\xmlfiles\" + + ; Determines the page from which regions xml is retrieved if you are loading these from the web + ; The XML here has the same format as it does on the filesystem (including the tag), + ; except that everything is also enclosed in a tag. + ; regionload_webserver_url = "http://example.com/regions.xml"; + + ; Draw objects on maptile. This step might take a long time if you've got a huge amount of + ; objects, so you can turn it off here if you'd like. + DrawPrimOnMapTile = true + ; Use terrain texture for maptiles if true, use shaded green if false + TextureOnMapTile = false + + ; Maximum total size, and maximum size where a prim can be physical + NonPhysicalPrimMax = 256 + PhysicalPrimMax = 10 + ClampPrimSize = false + + ; ## + ; ## STORAGE + ; ## + + ; *** Prim Storage - only leave one storage_plugin uncommented *** + ; --- Null stores nothing - effectively disabling persistence: + ;storage_plugin = "OpenSim.Data.Null.dll" + + ; --- To use sqlite as region storage: + storage_plugin = "OpenSim.Data.SQLite.dll" + storage_connection_string="URI=file:OpenSim.db,version=3"; + + ; --- To use MySQL storage, supply your own connectionstring (this is only an example): + ; note that the supplied account needs create privilegies if you want it to auto-create needed tables. + ; storage_plugin="OpenSim.Data.MySQL.dll" + ; storage_connection_string="Data Source=localhost;Database=opensim;User ID=opensim;Password=*****;"; + ; If you want to use a different database/server for estate data, then + ; uncomment and change this connect string. Defaults to the above if not set + ; estate_connection_string="Data Source=localhost;Database=opensim;User ID=opensim;Password=*****;"; + + ; Select whether you want to use local or grid asset storage. + ; + ; If you're running in standalone, you definitely want local, since there is no grid (hence this is redundant, and should + ; really be eliminated). The database itself is defined in asset_plugin below + ; + ; If you're running a region server connecting to a grid, you probably want grid mode, since this will use the + ; grid asset server. If you select local in grid mode, then you will use a database as specified in asset_plugin to store assets + ; locally. This will mean you won't be able to take items using your assets to other people's regions. + asset_database = "local" + ;asset_database = "grid" + + ; Should avatars in neighbor sims see objects in this sim? + see_into_this_sim_from_neighbor = True + + ; ## + ; ## PHYSICS + ; ## + + ; if you would like to allow prims to be physical and move by physics with the physical checkbox in the client set this to true. + physical_prim = true + + ; Select a mesher here. ZeroMesher is save and fast. + ; ZeroMesher also means that the physics engine models the physics of prims + ; sticking to the basic shapes the engine does support. Usually this is only a box. + ; Meshmerizer gives a better handling of complex prims by using triangle meshes. + ; Note, that only ODE physics currently deals with meshed prims in a satisfactoring way + ; + meshing = ZeroMesher + ;meshing = Meshmerizer + + ; Choose one of the physics engines below + physics = basicphysics + ;physics = POS + ;physics = OpenDynamicsEngine + ;physics = modified_BulletX + + ; ## + ; ## PERMISSIONS + ; ## + + ;permissionmodules = "DefaultPermissionsModule" + serverside_object_permissions = false + allow_grid_gods = false + ; This allows somne control over permissions + ; please note that this still doesn't duplicate SL, and is not intended to + ;region_owner_is_god = true + ;parcel_owner_is_god = true + + ; ## + ; ## SCRIPT ENGINE + ; ## + + DefaultScriptEngine = "ScriptEngine.DotNetEngine" + ;DefaultScriptEngine = "XEngine" + + ; ## + ; ## WORLD MAP + ; ## + + ;WorldMapModule = "WorldMap" + ;MapImageModule = "MapImageModule" -; Set this to true if you are connecting your OpenSimulator regions to a grid -; Set this to false if you are running OpenSimulator in standalone mode -gridmode = false - -; Enables EventQueueGet Service. -EventQueue = true - -; Set this to the DLL containig the client stack to use. -clientstack_plugin="OpenSim.Region.ClientStack.LindenUDP.dll" - -; ## -; ## REGIONS -; ## - -; Determine where OpenSimulator looks for the files which tell it which regions to server -; Defaults to "filesystem" if this setting isn't present -region_info_source = "filesystem" -; region_info_source = "web" - -; Determines where the region XML files are stored if you are loading these from the filesystem. -; Defaults to bin/Regions in your OpenSimulator installation directory -; regionload_regionsdir="C:\somewhere\xmlfiles\" - -; Determines the page from which regions xml is retrieved if you are loading these from the web -; The XML here has the same format as it does on the filesystem (including the tag), -; except that everything is also enclosed in a tag. -; regionload_webserver_url = "http://example.com/regions.xml"; - -; Draw objects on maptile. This step might take a long time if you've got a huge amount of -; objects, so you can turn it off here if you'd like. -DrawPrimOnMapTile = true -; Use terrain texture for maptiles if true, use shaded green if false -TextureOnMapTile = false - -; Maximum total size, and maximum size where a prim can be physical -NonPhysicalPrimMax = 256 -PhysicalPrimMax = 10 -ClampPrimSize = false - -; ## -; ## STORAGE -; ## - -; *** Prim Storage - only leave one storage_plugin uncommented *** -; --- Null stores nothing - effectively disabling persistence: -;storage_plugin = "OpenSim.Data.Null.dll" - -; --- To use sqlite as region storage: -storage_plugin = "OpenSim.Data.SQLite.dll" -storage_connection_string="URI=file:OpenSim.db,version=3"; - -; --- To use MySQL storage, supply your own connectionstring (this is only an example): -; note that the supplied account needs create privilegies if you want it to auto-create needed tables. -; storage_plugin="OpenSim.Data.MySQL.dll" -; storage_connection_string="Data Source=localhost;Database=opensim;User ID=opensim;Password=*****;"; -; If you want to use a different database/server for estate data, then -; uncomment and change this connect string. Defaults to the above if not set -; estate_connection_string="Data Source=localhost;Database=opensim;User ID=opensim;Password=*****;"; - -; Select whether you want to use local or grid asset storage. -; -; If you're running in standalone, you definitely want local, since there is no grid (hence this is redundant, and should -; really be eliminated). The database itself is defined in asset_plugin below -; -; If you're running a region server connecting to a grid, you probably want grid mode, since this will use the -; grid asset server. If you select local in grid mode, then you will use a database as specified in asset_plugin to store assets -; locally. This will mean you won't be able to take items using your assets to other people's regions. -asset_database = "local" -;asset_database = "grid" - -; Should avatars in neighbor sims see objects in this sim? -see_into_this_sim_from_neighbor = True - -; ## -; ## PHYSICS -; ## - -; Select a mesher here. ZeroMesher is save and fast. -; ZeroMesher also means that the physics engine models the physics of prims -; sticking to the basic shapes the engine does support. Usually this is only a box. -; Meshmerizer gives a better handling of complex prims by using triangle meshes. -; Note, that only ODE physics currently deals with meshed prims in a satisfactoring way -; -meshing = ZeroMesher -;meshing = Meshmerizer - -; Choose one of the physics engines below -physics = basicphysics -;physics = POS -;physics = OpenDynamicsEngine -;physics = modified_BulletX - - -startup_console_commands_file = "startup_commands.txt" -shutdown_console_commands_file = "shutdown_commands.txt" - -;permissionmodules = "DefaultPermissionsModule" -serverside_object_permissions = false -allow_grid_gods = false -; This allows somne control over permissions -; please note that this still doesn't duplicate SL, and is not intended to -;region_owner_is_god = true -;parcel_owner_is_god = true - -; if you would like to allow prims to be physical and move by physics with the physical checkbox in the client set this to true. -physical_prim = true - -; To run a script every few minutes, set the script filename here -; timer_Script = "filename" - -; ## -; ## ScriptEngine -; ## - -DefaultScriptEngine = "ScriptEngine.DotNetEngine" -;DefaultScriptEngine = "XEngine" - -; ## -; ## World Map -; ## - -;WorldMapModule = "WorldMap" -;MapImageModule = "MapImageModule" [StandAlone] -accounts_authenticate = true -welcome_message = "Welcome to OpenSim" - -; Asset database provider -asset_plugin = "OpenSim.Data.SQLite.dll" -; asset_plugin = "OpenSim.Data.MySQL.dll" ; for mysql -; asset_plugin = "OpenSim.Data.NHibernate.dll" ; for nhibernate - -; the Asset DB source. This only works for sqlite, mysql, and nhibernate for now -; Asset Source SQLite example -; asset_source = "URI=file:Asset.db,version=3" -; Asset Source NHibernate example (DIALECT;DRIVER;CONNECTSTRING) -; asset_source = "SQLiteDialect;SqliteClientDriver;URI=file:Asset.db,version=3" -; Asset Source MySQL example -;asset_source = "Data Source=localhost;Database=opensim;User ID=opensim;Password=****;" - -; Inventory database provider -inventory_plugin = "OpenSim.Data.SQLite.dll" -; inventory_plugin = "OpenSim.Data.MySQL.dll" -; inventory_plugin = "OpenSim.Data.NHibernate.dll" ; for nhibernate - -; Inventory Source NHibernate example (DIALECT;DRIVER;CONNECTSTRING) -; inventory_source = "SQLiteDialect;SqliteClientDriver;URI=file:Inventory.db,version=3" -; Inventory Source MySQL example -;inventory_source = "Data Source=localhost;Database=opensim;User ID=opensim;Password=****;" - - -; User Data Database provider -; -; Multiple providers can be specified by separating them with commas (whitespace is unimportant) -; If multiple providers are specified then if a profile is requested, each is queried until one -; provides a valid profile, or until all providers have been queried. -; Unfortunately the order of querying is currently undefined (it may not be the order in which -; providers are specified here). This needs to be fixed -; -userDatabase_plugin = "OpenSim.Data.SQLite.dll" -; userDatabase_plugin = "OpenSim.Data.MySQL.dll" -; userDatabase_plugin = "OpenSim.Data.NHibernate.dll" ; for nhibernate - -; User Source NHibernate Example (DIALECT;DRIVER;CONNECTSTRING) -; user_source = "SQLiteDialect;SqliteClientDriver;URI=file:User.db,version=3" -; User Source MySQL example -;user_source = "Data Source=localhost;Database=opensim;User ID=opensim;Password=****;" - -dump_assets_to_file = false + accounts_authenticate = true + welcome_message = "Welcome to OpenSim" + + ; Asset database provider + asset_plugin = "OpenSim.Data.SQLite.dll" + ; asset_plugin = "OpenSim.Data.MySQL.dll" ; for mysql + ; asset_plugin = "OpenSim.Data.NHibernate.dll" ; for nhibernate + + ; the Asset DB source. This only works for sqlite, mysql, and nhibernate for now + ; Asset Source SQLite example + ; asset_source = "URI=file:Asset.db,version=3" + ; Asset Source NHibernate example (DIALECT;DRIVER;CONNECTSTRING) + ; asset_source = "SQLiteDialect;SqliteClientDriver;URI=file:Asset.db,version=3" + ; Asset Source MySQL example + ;asset_source = "Data Source=localhost;Database=opensim;User ID=opensim;Password=****;" + + ; Inventory database provider + inventory_plugin = "OpenSim.Data.SQLite.dll" + ; inventory_plugin = "OpenSim.Data.MySQL.dll" + ; inventory_plugin = "OpenSim.Data.NHibernate.dll" ; for nhibernate + + ; Inventory Source NHibernate example (DIALECT;DRIVER;CONNECTSTRING) + ; inventory_source = "SQLiteDialect;SqliteClientDriver;URI=file:Inventory.db,version=3" + ; Inventory Source MySQL example + ;inventory_source = "Data Source=localhost;Database=opensim;User ID=opensim;Password=****;" + + + ; User Data Database provider + ; + ; Multiple providers can be specified by separating them with commas (whitespace is unimportant) + ; If multiple providers are specified then if a profile is requested, each is queried until one + ; provides a valid profile, or until all providers have been queried. + ; Unfortunately the order of querying is currently undefined (it may not be the order in which + ; providers are specified here). This needs to be fixed + ; + userDatabase_plugin = "OpenSim.Data.SQLite.dll" + ; userDatabase_plugin = "OpenSim.Data.MySQL.dll" + ; userDatabase_plugin = "OpenSim.Data.NHibernate.dll" ; for nhibernate + + ; User Source NHibernate Example (DIALECT;DRIVER;CONNECTSTRING) + ; user_source = "SQLiteDialect;SqliteClientDriver;URI=file:User.db,version=3" + ; User Source MySQL example + ;user_source = "Data Source=localhost;Database=opensim;User ID=opensim;Password=****;" + + dump_assets_to_file = false [Network] -http_listener_port = 9000 -remoting_listener_port = 8895 -default_location_x = 1000 -default_location_y = 1000 + http_listener_port = 9000 + remoting_listener_port = 8895 + default_location_x = 1000 + default_location_y = 1000 -; ssl config: Experimental! The auto https config only really works definately on windows XP now -; you need a Cert Request/Signed pair installed in the MY store with the CN specified below -; you can use https on other platforms, but you'll need to configure the httpapi yourself for now -http_listener_ssl = false ; Also create a SSL server -http_listener_cn = "localhost" ; Use the cert with the common name -http_listener_sslport = 9001 ; Use this port for SSL connections -http_listener_ssl_cert = "" ; Currently unused, but will be used for OSHttpServer + ; ssl config: Experimental! The auto https config only really works definately on windows XP now + ; you need a Cert Request/Signed pair installed in the MY store with the CN specified below + ; you can use https on other platforms, but you'll need to configure the httpapi yourself for now + http_listener_ssl = false ; Also create a SSL server + http_listener_cn = "localhost" ; Use the cert with the common name + http_listener_sslport = 9001 ; Use this port for SSL connections + http_listener_ssl_cert = "" ; Currently unused, but will be used for OSHttpServer -; Uncomment below to enable llRemoteData/remote channels -; remoteDataPort = 20800 + ; Uncomment below to enable llRemoteData/remote channels + ; remoteDataPort = 20800 -grid_server_url = "http://127.0.0.1:8001" -grid_send_key = "null" -grid_recv_key = "null" + grid_server_url = "http://127.0.0.1:8001" + grid_send_key = "null" + grid_recv_key = "null" -user_server_url = "http://127.0.0.1:8002" -user_send_key = "null" -user_recv_key = "null" + user_server_url = "http://127.0.0.1:8002" + user_send_key = "null" + user_recv_key = "null" -asset_server_url = "http://127.0.0.1:8003" + asset_server_url = "http://127.0.0.1:8003" -inventory_server_url = "http://127.0.0.1:8004" + inventory_server_url = "http://127.0.0.1:8004" -; The MessagingServer is a companion of the UserServer. It uses -; user_send_key and user_recv_key, too -messaging_server_url = "http://127.0.0.1:8006" + ; The MessagingServer is a companion of the UserServer. It uses + ; user_send_key and user_recv_key, too + messaging_server_url = "http://127.0.0.1:8006" [ClientStack.LindenUDP] -; This is the multiplier applied to all client throttles for outgoing UDP network data -; If it is set to 1, then we obey the throttle settings as given to us by the client. If it is set to 3, for example, then we -; multiply that setting by 3 (e.g. if the client gives us a setting of 250 kilobits per second then we -; will actually push down data at a maximum rate of 750 kilobits per second). -; -; In principle, setting a multiplier greater than 1 will allow data to be pushed down to a client much faster -; than its UI allows the setting to go. This may be okay in some situations, such as standalone OpenSim -; applications on a LAN. However, the greater the multipler, the higher the risk of packet drop, resulting -; in symptoms such as missing terrain or objects. A much better solution is to change the client UI to allow -; higher network bandwidth settings directly, though this isn't always possible. -; -; Currently this setting is 2 by default because we currently send much more texture data than is strictly -; necessary. A setting of 1 could result in slow texture transfer. This will be fixed when the transfer -; of textures at different levels of quality is improved. -; -; Pre r7113, this setting was not exposed but was effectively 8. You may want to try this if you encounter -; unexpected difficulties -client_throttle_multiplier = 2; + ; This is the multiplier applied to all client throttles for outgoing UDP network data + ; If it is set to 1, then we obey the throttle settings as given to us by the client. If it is set to 3, for example, then we + ; multiply that setting by 3 (e.g. if the client gives us a setting of 250 kilobits per second then we + ; will actually push down data at a maximum rate of 750 kilobits per second). + ; + ; In principle, setting a multiplier greater than 1 will allow data to be pushed down to a client much faster + ; than its UI allows the setting to go. This may be okay in some situations, such as standalone OpenSim + ; applications on a LAN. However, the greater the multipler, the higher the risk of packet drop, resulting + ; in symptoms such as missing terrain or objects. A much better solution is to change the client UI to allow + ; higher network bandwidth settings directly, though this isn't always possible. + ; + ; Currently this setting is 2 by default because we currently send much more texture data than is strictly + ; necessary. A setting of 1 could result in slow texture transfer. This will be fixed when the transfer + ; of textures at different levels of quality is improved. + ; + ; Pre r7113, this setting was not exposed but was effectively 8. You may want to try this if you encounter + ; unexpected difficulties + client_throttle_multiplier = 2; + [Chat] -whisper_distance = 10 -say_distance = 30 -shout_distance = 100 + whisper_distance = 10 + say_distance = 30 + shout_distance = 100 [ODEPhysicsSettings] + ;## + ;## World Settings + ;## -;## -;## World Settings -;## - -;Gravity. Feel like falling up? change world_gravityz to 9.8 instead of -9.8. m/s -world_gravityx = 0 -world_gravityy = 0 -world_gravityz = -9.8 + ;Gravity. Feel like falling up? change world_gravityz to 9.8 instead of -9.8. m/s + world_gravityx = 0 + world_gravityy = 0 + world_gravityz = -9.8 -; World Step size. (warning these are dangerous. Changing these will probably cause your scene to explode dramatically) -; reference: fps = (0.09375/ODE_STEPSIZE) * 1000; -world_stepsize = 0.020 -world_internal_steps_without_collisions = 10 + ; World Step size. (warning these are dangerous. Changing these will probably cause your scene to explode dramatically) + ; reference: fps = (0.09375/ODE_STEPSIZE) * 1000; + world_stepsize = 0.020 + world_internal_steps_without_collisions = 10 -;World Space settings. Affects memory consumption vs Collider CPU time for avatar and physical prim -world_hashspace_size_low = -4 -world_hashSpace_size_high = 128 + ;World Space settings. Affects memory consumption vs Collider CPU time for avatar and physical prim + world_hashspace_size_low = -4 + world_hashSpace_size_high = 128 -;Dynamic space settings Affects memory consumption vs Collider CPU time for static prim -meters_in_small_space = 29.9 -small_hashspace_size_low = -4 -small_hashspace_size_high = 66 + ;Dynamic space settings Affects memory consumption vs Collider CPU time for static prim + meters_in_small_space = 29.9 + small_hashspace_size_low = -4 + small_hashspace_size_high = 66 -; ## -; ## Contact properties. (the stuff that happens when things come in contact with each other) -; ## + ; ## + ; ## Contact properties. (the stuff that happens when things come in contact with each other) + ; ## -; surface layer around geometries other geometries can sink into before generating a contact -world_contact_surface_layer = 0.001 + ; surface layer around geometries other geometries can sink into before generating a contact + world_contact_surface_layer = 0.001 -; Filtering Collisions helps keep things stable physics wise, but sometimes -; it can be over zealous. If you notice bouncing, chances are it's being just -; that -filter_collisions = true + ; Filtering Collisions helps keep things stable physics wise, but sometimes + ; it can be over zealous. If you notice bouncing, chances are it's being just + ; that + filter_collisions = true -; Non Moving Terrain Contact (avatar isn't moving) -nm_terraincontact_friction = 255.0 -nm_terraincontact_bounce = 0.1 -nm_terraincontact_erp = 0.1025 + ; Non Moving Terrain Contact (avatar isn't moving) + nm_terraincontact_friction = 255.0 + nm_terraincontact_bounce = 0.1 + nm_terraincontact_erp = 0.1025 -; Moving Terrain Contact (avatar is moving) + ; Moving Terrain Contact (avatar is moving) -m_terraincontact_friction = 75.0 -m_terraincontact_bounce = 0.05 -m_terrainContact_erp = 0.05025 + m_terraincontact_friction = 75.0 + m_terraincontact_bounce = 0.05 + m_terrainContact_erp = 0.05025 -; Moving Avatar to object Contact + ; Moving Avatar to object Contact -m_avatarobjectcontact_friction = 75.0 -m_avatarobjectcontact_bounce = 0.1 + m_avatarobjectcontact_friction = 75.0 + m_avatarobjectcontact_bounce = 0.1 -; Object to Object Contact and Non-Moving Avatar to object + ; Object to Object Contact and Non-Moving Avatar to object -objectcontact_friction = 250.0 -objectcontact_bounce = 0.2 + objectcontact_friction = 250.0 + objectcontact_bounce = 0.2 -; ## -; ## Avatar Control -; ## + ; ## + ; ## Avatar Control + ; ## -; PID Controller Settings. These affect the math that causes the avatar to reach the -; desired velocity -; See http://en.wikipedia.org/wiki/PID_controller + ; PID Controller Settings. These affect the math that causes the avatar to reach the + ; desired velocity + ; See http://en.wikipedia.org/wiki/PID_controller -av_pid_derivative_linux = 2200.0 -av_pid_proportional_linux = 900.0; + av_pid_derivative_linux = 2200.0 + av_pid_proportional_linux = 900.0; -av_pid_derivative_win = 2200.0 -av_pid_proportional_win = 900.0; + av_pid_derivative_win = 2200.0 + av_pid_proportional_win = 900.0; -;girth of the avatar. Adds radius to the height also -av_capsule_radius = 0.37 + ;girth of the avatar. Adds radius to the height also + av_capsule_radius = 0.37 -; Max force permissible to use to keep the avatar standing up straight -av_capsule_standup_tensor_win = 550000 -av_capsule_standup_tensor_linux = 550000 + ; Max force permissible to use to keep the avatar standing up straight + av_capsule_standup_tensor_win = 550000 + av_capsule_standup_tensor_linux = 550000 -; used to calculate mass of avatar. -; float AVvolume = (float) (Math.PI*Math.Pow(CAPSULE_RADIUS, 2)*CAPSULE_LENGTH); -; av_density * AVvolume; + ; used to calculate mass of avatar. + ; float AVvolume = (float) (Math.PI*Math.Pow(CAPSULE_RADIUS, 2)*CAPSULE_LENGTH); + ; av_density * AVvolume; -av_density = 80 + av_density = 80 -; use this value to cut 52% of the height the sim gives us -av_height_fudge_factor = 0.52 + ; use this value to cut 52% of the height the sim gives us + av_height_fudge_factor = 0.52 -; Movement. Smaller is faster. + ; Movement. Smaller is faster. -; speed of movement with Always Run off -av_movement_divisor_walk = 1.3 + ; speed of movement with Always Run off + av_movement_divisor_walk = 1.3 -; speed of movement with Always Run on -av_movement_divisor_run = 0.8 + ; speed of movement with Always Run on + av_movement_divisor_run = 0.8 -; ## -; ## Object options -; ## + ; ## + ; ## Object options + ; ## -; used in the mass calculation. -geometry_default_density = 10.000006836 + ; used in the mass calculation. + geometry_default_density = 10.000006836 -; amount of ODE steps where object is non moving for ODE to automatically put it to sleep -body_frames_auto_disable = 20 + ; amount of ODE steps where object is non moving for ODE to automatically put it to sleep + body_frames_auto_disable = 20 -; used to control llMove2Target -body_pid_derivative = 35 -body_pid_gain = 25 + ; used to control llMove2Target + body_pid_derivative = 35 + body_pid_gain = 25 -; amount of time a geom/body will try to cross a region border before it gets disabled -geom_crossing_faiures_before_outofbounds = 5 + ; amount of time a geom/body will try to cross a region border before it gets disabled + geom_crossing_faiures_before_outofbounds = 5 -; start throttling the object updates if object comes in contact with 3 or more other objects -geom_contactpoints_start_throttling = 3 + ; start throttling the object updates if object comes in contact with 3 or more other objects + geom_contactpoints_start_throttling = 3 -; send 1 update for every x updates below when throttled -geom_updates_before_throttled_update = 15 + ; send 1 update for every x updates below when throttled + geom_updates_before_throttled_update = 15 -; Used for llSetStatus. How rigid the object rotation is held on the axis specified -body_motor_joint_maxforce_tensor_linux = 5 -body_motor_joint_maxforce_tensor_win = 5 + ; Used for llSetStatus. How rigid the object rotation is held on the axis specified + body_motor_joint_maxforce_tensor_linux = 5 + body_motor_joint_maxforce_tensor_win = 5 -; ## -; ## Sculpted Prim settings -; ## + ; ## + ; ## Sculpted Prim settings + ; ## -; Do we want to mesh sculpted prim to collide like they look? -mesh_sculpted_prim = true + ; Do we want to mesh sculpted prim to collide like they look? + mesh_sculpted_prim = true -; number^2 non-physical level of detail of the sculpt texture. 32x32 - 1024 verticies -mesh_lod = 32 + ; number^2 non-physical level of detail of the sculpt texture. 32x32 - 1024 verticies + mesh_lod = 32 -; number^2 physical level of detail of the sculpt texture. 16x16 - 256 verticies -mesh_physical_lod = 16 + ; number^2 physical level of detail of the sculpt texture. 16x16 - 256 verticies + mesh_physical_lod = 16 -; ## -; ## Physics logging settings - logfiles are saved to *.DIF files -; ## + ; ## + ; ## Physics logging settings - logfiles are saved to *.DIF files + ; ## -;physics_logging = true -;; every n simulation iterations, the physics snapshot file is updated -;physics_logging_interval = 50 -;; append to existing physics logfile, or overwrite existing logfiles? -;physics_logging_append_existing_logfile = true + ;physics_logging = true + ;; every n simulation iterations, the physics snapshot file is updated + ;physics_logging_interval = 50 + ;; append to existing physics logfile, or overwrite existing logfiles? + ;physics_logging_append_existing_logfile = true [RemoteAdmin] -enabled = false -access_password = unknown - -; the create_region XmlRpc call uses region_file_template to generate -; the file name of newly create regions (if they are created -; persistent). the parameter available are: -; {0} - X location -; {1} - Y location -; {2} - region UUID -; {3} - region port -; {4} - region name with " ", ":", "/" mapped to "_" - -region_file_template = "{0}x{1}-{2}.xml" - -; we can limit the number of regions that XmlRpcCreateRegion will -;allow by setting this to a positive, non-0 number: as long as the -;number of regions is below region_limits, XmlRpcCreateRegion will -;succeed. setting region_limits to 0 disables the check. -;region_limits = 0 + enabled = false + access_password = unknown + + ; the create_region XmlRpc call uses region_file_template to generate + ; the file name of newly create regions (if they are created + ; persistent). the parameter available are: + ; {0} - X location + ; {1} - Y location + ; {2} - region UUID + ; {3} - region port + ; {4} - region name with " ", ":", "/" mapped to "_" + + region_file_template = "{0}x{1}-{2}.xml" + + ; we can limit the number of regions that XmlRpcCreateRegion will + ;allow by setting this to a positive, non-0 number: as long as the + ;number of regions is below region_limits, XmlRpcCreateRegion will + ;succeed. setting region_limits to 0 disables the check. + ;region_limits = 0 + [RestPlugins] -; Change this to true to enable REST Plugins. This must be true if you wish to use -; REST Region or REST Asset and Inventory Plugins -enabled = false -god_key = SECRET -prefix = /admin + ; Change this to true to enable REST Plugins. This must be true if you wish to use + ; REST Region or REST Asset and Inventory Plugins + enabled = false + god_key = SECRET + prefix = /admin [RestRegionPlugin] -; Change this to true to enable the REST Region Plugin -enabled = false + ; Change this to true to enable the REST Region Plugin + enabled = false + [RestHandler] -; Change this to true to enable the REST Asset and Inventory Plugin -enabled = false -authenticate=true -secured=true -extended-escape=true -realm=OpenSim REST -dump-asset=false -path-fill=true -dump-line-size=32 -flush-on-error=true + ; Change this to true to enable the REST Asset and Inventory Plugin + enabled = false + authenticate=true + secured=true + extended-escape=true + realm=OpenSim REST + dump-asset=false + path-fill=true + dump-line-size=32 + flush-on-error=true ; Uncomment the following for IRC bridge ; experimental, so if it breaks... keep both parts... yada yada ; also, not good error detection when it fails ;[IRC] -;enabled = true ; you need to set this otherwise it won't connect -;server = name.of.irc.server.on.the.net -;nick = OpenSimBotNameProbablyMakeThisShorter -;channel = #the_irc_channel_you_want_to_connect_to -;port = 6667 -;; channel to listen for configuration commands -;commands_enabled = false -;command_channel = 2777 -;report_clients = true -;; relay private chat connections -;; relay_private_channels = true: will relay IRC chat from/to private in-world channels -;; relay_private_channel_out -- channel to send messages out to the IRC bridge -;; relay_private_channel_in -- channel to receive message from the IRC bridge -;; relay_chat = false: IRC bridge will not relay normal chat -;; access_password -- simple security device -;; -;; so, to just relay chat from an IRC channel to in-world region and vice versa: -;; -;; relay_private_channels = false -;; relay_chat = true -;; -;; to relay chat only to/from private in-world channels: -;; -;; relay_chat = false -;; relay_private_channels = true -;; relay_private_channel_in = 2226 -;; relay_private_channel_out = 2225 -;; -;; in this example, all chat coming in from IRC will be send out via -;; in-world channel 2226, and all chat from in-world channel 2225 will -;; be relayed to the IRC channel. -;; -;relay_private_channels = false -;relay_private_channel_in = 2226 -;relay_private_channel_out = 2225 -;relay_chat = true -;access_password = foobar - -;fallback_region = name of "default" region -;MSGformat fields : 0=botnick, 1=user, 2=region, 3=message -; must start with "PRIVMSG {0} : " or irc server will get upset -;for : : -;msgformat = "PRIVMSG {0} :<{1} in {2}>: {3}" -;for : - : -msgformat = "PRIVMSG {0} : {3} - {1} of {2}" -;for : - from : -;msgformat = "PRIVMSG {0} : {3} - from {1}" + ;enabled = true ; you need to set this otherwise it won't connect + ;server = name.of.irc.server.on.the.net + ;nick = OpenSimBotNameProbablyMakeThisShorter + ;channel = #the_irc_channel_you_want_to_connect_to + ;port = 6667 + ;; channel to listen for configuration commands + ;commands_enabled = false + ;command_channel = 2777 + ;report_clients = true + ;; relay private chat connections + ;; relay_private_channels = true: will relay IRC chat from/to private in-world channels + ;; relay_private_channel_out -- channel to send messages out to the IRC bridge + ;; relay_private_channel_in -- channel to receive message from the IRC bridge + ;; relay_chat = false: IRC bridge will not relay normal chat + ;; access_password -- simple security device + ;; + ;; so, to just relay chat from an IRC channel to in-world region and vice versa: + ;; + ;; relay_private_channels = false + ;; relay_chat = true + ;; + ;; to relay chat only to/from private in-world channels: + ;; + ;; relay_chat = false + ;; relay_private_channels = true + ;; relay_private_channel_in = 2226 + ;; relay_private_channel_out = 2225 + ;; + ;; in this example, all chat coming in from IRC will be send out via + ;; in-world channel 2226, and all chat from in-world channel 2225 will + ;; be relayed to the IRC channel. + ;; + ;relay_private_channels = false + ;relay_private_channel_in = 2226 + ;relay_private_channel_out = 2225 + ;relay_chat = true + ;access_password = foobar + + ;fallback_region = name of "default" region + ;MSGformat fields : 0=botnick, 1=user, 2=region, 3=message + ; must start with "PRIVMSG {0} : " or irc server will get upset + ;for : : + ;msgformat = "PRIVMSG {0} :<{1} in {2}>: {3}" + ;for : - : + msgformat = "PRIVMSG {0} : {3} - {1} of {2}" + ;for : - from : + ;msgformat = "PRIVMSG {0} : {3} - from {1}" + ; work-in-progress IRCBridge capabable of supporting multiple IRC channels ; [XIRC] -; enabled = false + ; enabled = false + + ; Uncomment the following for experiment in world versioning + ; support. This is so experimental at this point that I'm not going + ; to explain it further, you'll need to read the source code + -; Uncomment the following for experiment in world versioning -; support. This is so experimental at this point that I'm not going -; to explain it further, you'll need to read the source code ;[CMS] -;enabled = true -;channel = 345 + ;enabled = true + ;channel = 345 + [Voice] -; PLEASE NOTE that we don't have voice support in OpenSim quite yet - these configuration options are stubs -enabled = false -; This is not supported by the SLViewer right now and -; hardcoded within the SL Viewer. Maybe it will be -; changed in future. :-) -account_management_server = https://www.bhr.vivox.com/api2 -; Global SIP Server for conference calls -sip_domain = testserver.com + ; PLEASE NOTE that we don't have voice support in OpenSim quite yet - these configuration options are stubs + enabled = false + ; This is not supported by the SLViewer right now and + ; hardcoded within the SL Viewer. Maybe it will be + ; changed in future. :-) + account_management_server = https://www.bhr.vivox.com/api2 + ; Global SIP Server for conference calls + sip_domain = testserver.com [AsteriskVoice] -; PLEASE NOTE that we don't have voice support in OpenSim quite yet - these configuration options are stubs -enabled = false -; SIP account server domain -sip_domain = testserver.com -; SIP conf server domain -conf_domain = testserver.com -; URL of the asterisk opensim frontend -asterisk_frontend = http://testserver.com:49153/ -; password for the asterisk frontend XmlRpc calls -asterisk_password = bah-humbug -; timeout for XmlRpc calls to asterisk front end (in ms) -asterisk_timeout = 3000 -; salt for asterisk nonces -asterisk_salt = paluempalum + ; PLEASE NOTE that we don't have voice support in OpenSim quite yet - these configuration options are stubs + enabled = false + ; SIP account server domain + sip_domain = testserver.com + ; SIP conf server domain + conf_domain = testserver.com + ; URL of the asterisk opensim frontend + asterisk_frontend = http://testserver.com:49153/ + ; password for the asterisk frontend XmlRpc calls + asterisk_password = bah-humbug + ; timeout for XmlRpc calls to asterisk front end (in ms) + asterisk_timeout = 3000 + ; salt for asterisk nonces + asterisk_salt = paluempalum ; Uncomment the following to control the progression of daytime ; in the Sim. The defaults are what is shown below ;[Sun] -; number of wall clock hours for an opensim day. 24.0 would mean realtime -;day_length = 4 -; Year length in days -;year_length = 60 -; Day to Night Ratio -;day_night_offset = 0.45 -; send a Sun update every update_interval # of frames. A lower number will -; make for smoother sun transition at the cost of network -;update_interval = 100 + ; number of wall clock hours for an opensim day. 24.0 would mean realtime + ;day_length = 4 + ; Year length in days + ;year_length = 60 + ; Day to Night Ratio + ;day_night_offset = 0.45 + ; send a Sun update every update_interval # of frames. A lower number will + ; make for smoother sun transition at the cost of network + ;update_interval = 100 [ScriptEngine.DotNetEngine] -Enabled = true - -ScriptDelayFactor = 1.0 -ScriptDistanceLimitFactor = 1.0 - - -; -; These settings are specific to DotNetEngine script engine -; Other script engines based on OpenSim.Region.ScriptEngine.Common.dll will have almost identical settings, but in another section of this config file. -; - -; When a script receives an event the event is queued. -; Any free thread will start executing this event. One script can only have one event executed simultaneously. -; If you have only one thread, and one script has a loop or does a lot of work, then no other scripts can run at the same time. -; Same if you have 10 threads, then only 10 scripts can be run simultaneously. -; But because most scripts exit after their task, the threads are free to go on to the next script. - -; Refresh ScriptEngine config options (these settings) every xx seconds -; 0 = Do not refresh -; Set it to number of seconds between refresh, for example 30. -; Will allow you to change ScriptEngine settings while server is running just by using "CONFIG SET" on console -; For example to increase or decrease number of threads: CONFIG SET NumberOfScriptThreads 10 -; NOTE! Disabled for now. Feature does not work. -RefreshConfig=0 - -; Number of threads to use for script event execution -; Threads are shared across all regions -NumberOfScriptThreads=2 - -; Script event execution thread priority inside application. -; Valid values: Lowest, BelowNormal, Normal, AboveNormal, Highest -ScriptThreadPriority=BelowNormal - -; How long MAX should a script event be allowed to run (per event execution)? -; Do not set this too low (like 50ms) as there are some time wasted in simply executing a function -; There is also a small speed penalty for every kill that is made -MaxEventExecutionTimeMs=5000 - -; Should we enable the max script event execution thread to look for scripts that exceed their timeslice? -EnforceMaxEventExecutionTime=true - -; Should we stop the script completely when time exceeds? -; This is useful if you have a high and want to deactivate scripts that go wrong -; Note that for example physics engine can slow down the system and make scripts spend more time -DeactivateScriptOnTimeout=false - -; If no scripts have executed in this pass how long should we sleep before checking again -; Impact: -; Too low and you will waste lots of CPU -; Too high and people touching object or similar will have to wait up to this amount of time before script responding -SleepTimeIfNoScriptExecutionMs=50 - -; AppDomains are used for two things: -; * Security: Scripts inside AppDomains are limited in permissions. -; * Script unloading: When a script is deactivated it can not be unloaded. Only whole AppDomains can be unloaded. -; AppDomains are therefore only unloaded once ALL active scripts inside it has been deactivated (removed from prims). -; Each AppDomain has some memory overhead. But leaving dead scripts in memory also has memory overhead. -ScriptsPerAppDomain=1 - -; MaintenanceLoop -; How often to run maintenance loop -; Maintenance loop is doing: script compile/load, script unload, reload config, adjust running config and enforce max execution time -MaintenanceLoopms=50 - -; How many maintenanceloops between each of these. -; (if 2 then function will be executed every MaintenanceLoopms*2 ms) -; Script loading/unloading - -; How long load/unload thread should sleep if there is nothing to do -; Higher value makes it respond slower when scripts are added/removed from prims -; But once active it will process all in queue before sleeping again -MaintenanceLoopTicks_ScriptLoadUnload=1 - -; Other tasks -; check if we need to reload config, adjust running config and enforce max execution time -MaintenanceLoopTicks_Other=10 - -; Allow the use of os* functions (some are dangerous) -AllowOSFunctions = true - -; Threat level to allow, one of None, VeryLow, Low, Moderate, High, VeryHigh, Severe -OSFunctionThreatLevel = Low - -; Maximum number of items in load/unload queue before we start rejecting loads -; Note that we will only be rejecting load. Unloads will still be able to queue. -LoadUnloadMaxQueueSize=100 - -; Maximum number of (LSL) events that can be queued before new events are ignored. -EventExecutionMaxQueueSize=300 - -; Async LL command sleep -; If no async LL commands are waiting, how long should thread sleep before checking again -; Async LL commands are LSL-commands that causes an event to be fired back with result -AsyncLLCommandLoopms=50 - -; When script is converted from LSL to C#, or just plain compiled, a copy of the script source will be put in the ScriptEngine folder -WriteScriptSourceToDebugFile=true - -; Specify default script compiler -; If you do not specify //cs, //vb, //js or //lsl tag as the first characters of your script then the default compiler will be chosen -; Valid languages are: lsl, cs, js and vb -DefaultCompileLanguage=lsl - -; Specify what compilers are allowed to be used -; Note vb only works on Windows for now (Mono lacks VB compile support) -; Valid languages are: lsl, cs, js and vb -; AllowedCompilers=lsl,cs,js,vb. *warning*, non lsl languages have access to static methods such as System.IO.File. Enable at your own risk. -AllowedCompilers=lsl - - -; Compile scripts with debugging -; Probably a thousand times slower, but gives you a line number when something goes wrong. -CompileWithDebugInformation=true - -; Remove old scripts on next startup -CleanUpOldScriptsOnStartup=true + Enabled = true + + ScriptDelayFactor = 1.0 + ScriptDistanceLimitFactor = 1.0 + + + ; + ; These settings are specific to DotNetEngine script engine + ; Other script engines based on OpenSim.Region.ScriptEngine.Common.dll will have almost identical settings, but in another section of this config file. + ; + + ; When a script receives an event the event is queued. + ; Any free thread will start executing this event. One script can only have one event executed simultaneously. + ; If you have only one thread, and one script has a loop or does a lot of work, then no other scripts can run at the same time. + ; Same if you have 10 threads, then only 10 scripts can be run simultaneously. + ; But because most scripts exit after their task, the threads are free to go on to the next script. + + ; Refresh ScriptEngine config options (these settings) every xx seconds + ; 0 = Do not refresh + ; Set it to number of seconds between refresh, for example 30. + ; Will allow you to change ScriptEngine settings while server is running just by using "CONFIG SET" on console + ; For example to increase or decrease number of threads: CONFIG SET NumberOfScriptThreads 10 + ; NOTE! Disabled for now. Feature does not work. + RefreshConfig=0 + + ; Number of threads to use for script event execution + ; Threads are shared across all regions + NumberOfScriptThreads=2 + + ; Script event execution thread priority inside application. + ; Valid values: Lowest, BelowNormal, Normal, AboveNormal, Highest + ScriptThreadPriority=BelowNormal + + ; How long MAX should a script event be allowed to run (per event execution)? + ; Do not set this too low (like 50ms) as there are some time wasted in simply executing a function + ; There is also a small speed penalty for every kill that is made + MaxEventExecutionTimeMs=5000 + + ; Should we enable the max script event execution thread to look for scripts that exceed their timeslice? + EnforceMaxEventExecutionTime=true + + ; Should we stop the script completely when time exceeds? + ; This is useful if you have a high and want to deactivate scripts that go wrong + ; Note that for example physics engine can slow down the system and make scripts spend more time + DeactivateScriptOnTimeout=false + + ; If no scripts have executed in this pass how long should we sleep before checking again + ; Impact: + ; Too low and you will waste lots of CPU + ; Too high and people touching object or similar will have to wait up to this amount of time before script responding + SleepTimeIfNoScriptExecutionMs=50 + + ; AppDomains are used for two things: + ; * Security: Scripts inside AppDomains are limited in permissions. + ; * Script unloading: When a script is deactivated it can not be unloaded. Only whole AppDomains can be unloaded. + ; AppDomains are therefore only unloaded once ALL active scripts inside it has been deactivated (removed from prims). + ; Each AppDomain has some memory overhead. But leaving dead scripts in memory also has memory overhead. + ScriptsPerAppDomain=1 + + ; MaintenanceLoop + ; How often to run maintenance loop + ; Maintenance loop is doing: script compile/load, script unload, reload config, adjust running config and enforce max execution time + MaintenanceLoopms=50 + + ; How many maintenanceloops between each of these. + ; (if 2 then function will be executed every MaintenanceLoopms*2 ms) + ; Script loading/unloading + + ; How long load/unload thread should sleep if there is nothing to do + ; Higher value makes it respond slower when scripts are added/removed from prims + ; But once active it will process all in queue before sleeping again + MaintenanceLoopTicks_ScriptLoadUnload=1 + + ; Other tasks + ; check if we need to reload config, adjust running config and enforce max execution time + MaintenanceLoopTicks_Other=10 + + ; Allow the use of os* functions (some are dangerous) + AllowOSFunctions = true + + ; Threat level to allow, one of None, VeryLow, Low, Moderate, High, VeryHigh, Severe + OSFunctionThreatLevel = Low + + ; Maximum number of items in load/unload queue before we start rejecting loads + ; Note that we will only be rejecting load. Unloads will still be able to queue. + LoadUnloadMaxQueueSize=100 + + ; Maximum number of (LSL) events that can be queued before new events are ignored. + EventExecutionMaxQueueSize=300 + + ; Async LL command sleep + ; If no async LL commands are waiting, how long should thread sleep before checking again + ; Async LL commands are LSL-commands that causes an event to be fired back with result + AsyncLLCommandLoopms=50 + + ; When script is converted from LSL to C#, or just plain compiled, a copy of the script source will be put in the ScriptEngine folder + WriteScriptSourceToDebugFile=true + + ; Specify default script compiler + ; If you do not specify //cs, //vb, //js or //lsl tag as the first characters of your script then the default compiler will be chosen + ; Valid languages are: lsl, cs, js and vb + DefaultCompileLanguage=lsl + + ; Specify what compilers are allowed to be used + ; Note vb only works on Windows for now (Mono lacks VB compile support) + ; Valid languages are: lsl, cs, js and vb + ; AllowedCompilers=lsl,cs,js,vb. *warning*, non lsl languages have access to static methods such as System.IO.File. Enable at your own risk. + AllowedCompilers=lsl + + + ; Compile scripts with debugging + ; Probably a thousand times slower, but gives you a line number when something goes wrong. + CompileWithDebugInformation=true + + ; Remove old scripts on next startup + CleanUpOldScriptsOnStartup=true + [LL-Functions] -; Set the following to true to allow administrator owned scripts to execute console commands -AllowosConsoleCommand=false + ; Set the following to true to allow administrator owned scripts to execute console commands + AllowosConsoleCommand=false -AllowGodFunctions = false + AllowGodFunctions = false + + ; Maximum number of llListen events we allow per script + ; Set this to 0 to have no limit imposed. + max_listens_per_script = 64 -; Maximum number of llListen events we allow per script -; Set this to 0 to have no limit imposed. -max_listens_per_script = 64 [DataSnapshot] -; The following set of configs pertains to search. -; Set index_sims to true to enable search engines to index your searchable data -; If false, no data will be exposed, DataSnapshot module will be off, and you can ignore the rest of these search-related configs -index_sims = false -; The variable data_exposure controls what the regions expose: -; minimum: exposes only things explicitly marked for search -; all: exposes everything -data_exposure = minimum -; If search is on, change this to your grid name; will be ignored for standalones -gridname = "OSGrid" -; Period between data snapshots, in seconds. 20 minutes, for starters, so that you see the initial changes fast. -; Later, you may want to increase this to 3600 (1 hour) or more -default_snapshot_period = 1200 -; This will be created in bin, if it doesn't exist already. It will hold the data snapshots. -snapshot_cache_directory = "DataSnapshot" -; This semicolon-separated string serves to notify specific data services about the existence -; of this sim. Uncomment if you want to index your data with this and/or other search providers. -;data_services="http://metaverseink.com/cgi-bin/register.py" + ; The following set of configs pertains to search. + ; Set index_sims to true to enable search engines to index your searchable data + ; If false, no data will be exposed, DataSnapshot module will be off, and you can ignore the rest of these search-related configs + index_sims = false + ; The variable data_exposure controls what the regions expose: + ; minimum: exposes only things explicitly marked for search + ; all: exposes everything + data_exposure = minimum + ; If search is on, change this to your grid name; will be ignored for standalones + gridname = "OSGrid" + ; Period between data snapshots, in seconds. 20 minutes, for starters, so that you see the initial changes fast. + ; Later, you may want to increase this to 3600 (1 hour) or more + default_snapshot_period = 1200 + ; This will be created in bin, if it doesn't exist already. It will hold the data snapshots. + snapshot_cache_directory = "DataSnapshot" + ; This semicolon-separated string serves to notify specific data services about the existence + ; of this sim. Uncomment if you want to index your data with this and/or other search providers. + ;data_services="http://metaverseink.com/cgi-bin/register.py" [Economy] -; These economy values get used in the BetaGridLikeMoneyModule. - This module is for demonstration only - -; In grid mode, use this currency XMLRPC server. Leave blank for normal functionality -CurrencyServer = "" -; "http://192.168.1.127/currency.php" - -; In grid mode, this is the land XMLRPC server. Leave blank for normal functionality -LandServer = "" -;"http://192.168.1.127/landtool.php" - -; 45000 is the highest value that the sim could possibly report because of protocol constraints -ObjectCapacity = 45000 - -; Money Unit fee to upload textures, animations etc -PriceUpload = 0 - -; Money Unit fee to create groups -PriceGroupCreate = 0 - -; This is the account Money goes to for fees. Remember, economy requires that money circulates somewhere... even if it's an upload fee -EconomyBaseAccount = 00000000-0000-0000-0000-000000000000 - -; This is the type of user that will pay fees. -; Set this to 2 for users, estate managers and Estate Owners -; Set this to 1 for Users and Estate Managers -; Set this to 0 for Users only. -; -1 disables -UserLevelPaysFees = -1 - -; Amount to give to user as a stipend -UserStipend = 1000 - -; When a user gets low on money units and logs off, then logs back on, issue a new stipend if they have less money units then this -; amount. Be aware that the account money isn't stored anywhere so users will get a stipend if you restart the simulator -IssueStipendWhenClientIsBelowAmount = 10 - -; If this is true, the simulator will remember account balances until the simulator is shutdown or restarted. -KeepMoneyAcrossLogins = true - -; We don't really know what the rest of these values do. These get sent to the client -; These taken from Agni at a Public Telehub. Change at your own risk. -ObjectCount = 0 -PriceEnergyUnit = 100 -PriceObjectClaim = 10 -PricePublicObjectDecay = 4 -PricePublicObjectDelete = 4 -PriceParcelClaim = 1 -PriceParcelClaimFactor = 1 - -PriceRentLight = 5 -TeleportMinPrice = 2 -TeleportPriceExponent = 2 -EnergyEfficiency = 1 -PriceObjectRent = 1 -PriceObjectScaleFactor = 10 -PriceParcelRent = 1 + ; These economy values get used in the BetaGridLikeMoneyModule. - This module is for demonstration only - + ; In grid mode, use this currency XMLRPC server. Leave blank for normal functionality + CurrencyServer = "" + ; "http://192.168.1.127/currency.php" + + ; In grid mode, this is the land XMLRPC server. Leave blank for normal functionality + LandServer = "" + ;"http://192.168.1.127/landtool.php" + + ; 45000 is the highest value that the sim could possibly report because of protocol constraints + ObjectCapacity = 45000 + + ; Money Unit fee to upload textures, animations etc + PriceUpload = 0 + + ; Money Unit fee to create groups + PriceGroupCreate = 0 + + ; This is the account Money goes to for fees. Remember, economy requires that money circulates somewhere... even if it's an upload fee + EconomyBaseAccount = 00000000-0000-0000-0000-000000000000 + + ; This is the type of user that will pay fees. + ; Set this to 2 for users, estate managers and Estate Owners + ; Set this to 1 for Users and Estate Managers + ; Set this to 0 for Users only. + ; -1 disables + UserLevelPaysFees = -1 + + ; Amount to give to user as a stipend + UserStipend = 1000 + + ; When a user gets low on money units and logs off, then logs back on, issue a new stipend if they have less money units then this + ; amount. Be aware that the account money isn't stored anywhere so users will get a stipend if you restart the simulator + IssueStipendWhenClientIsBelowAmount = 10 + + ; If this is true, the simulator will remember account balances until the simulator is shutdown or restarted. + KeepMoneyAcrossLogins = true + + ; We don't really know what the rest of these values do. These get sent to the client + ; These taken from Agni at a Public Telehub. Change at your own risk. + ObjectCount = 0 + PriceEnergyUnit = 100 + PriceObjectClaim = 10 + PricePublicObjectDecay = 4 + PricePublicObjectDelete = 4 + PriceParcelClaim = 1 + PriceParcelClaimFactor = 1 + + PriceRentLight = 5 + TeleportMinPrice = 2 + TeleportPriceExponent = 2 + EnergyEfficiency = 1 + PriceObjectRent = 1 + PriceObjectScaleFactor = 10 + PriceParcelRent = 1 [SVN] -Enabled = false -Directory = SVNmodule\repo -URL = "svn://your.repo.here/" -Username = "user" -Password = "password" -ImportOnStartup = false -Autosave = false -AutoSavePeriod = 15 ; Number of minutes between autosave backups + Enabled = false + Directory = SVNmodule\repo + URL = "svn://your.repo.here/" + Username = "user" + Password = "password" + ImportOnStartup = false + Autosave = false + AutoSavePeriod = 15 ; Number of minutes between autosave backups [XEngine] -; Enable this engine in this OpenSim instance -Enabled = true -; How many threads to keep alive even if nothing is happening -MinThreads = 2 -; How many threads to start at maximum load -MaxThreads = 100 -; Time a thread must be idle (in seconds) before it dies -IdleTimeout = 60 -; Thread priority ("Lowest", "BelowNormal", "Normal", "AboveNormal", "Highest") -Priority = "BelowNormal" -; Maximum number of events to queue for a script (excluding timers) -MaxScriptEventQueue = 300 -; Stack size per thread created -ThreadStackSize = 262144 -; Rate to poll for asynchronous command replies (ms) -AsyncLLCommandLoopms = 50 -; Save the source of all compiled scripts -WriteScriptSourceToDebugFile = false -; Default language for scripts -DefaultCompileLanguage = lsl -; List of allowed languages (lsl,vb,js,cs) -; AllowedCompilers=lsl,cs,js,vb. -; *warning*, non lsl languages have access to static methods such as System.IO.File. Enable at your own risk. -AllowedCompilers=lsl - -; Compile debug info (line numbers) into the script assemblies -CompileWithDebugInformation = true -; Allow the use of os* functions (some are dangerous) -AllowOSFunctions = false -; Threat level to allow, one of None, VeryLow, Low, Moderate, High, VeryHigh, Severe -OSFunctionThreatLevel = VeryLow -; Interval (s) between background save of script states -SaveInterval = 120 -; Interval (s) between maintenance runs (0 = disable) -MaintenanceInterval = 10 -; Time a script can spend in an event handler before it is interrupted -EventLimit = 30 -; If a script overruns it's event limit, kill the script? -KillTimedOutScripts = false -; Sets the multiplier for the scripting delays -ScriptDelayFactor = 1.0 -; The factor the 10 m distances llimits are multiplied by -ScriptDistanceLimitFactor = 1.0 - -; OS Functions enable/disable -; For each function, you can add one line, as shown - -; true is the default for all functions, and allows them if below threat level -; Allow_osSetRegionWaterHeight = true - -; false disables the function completely -; Allow_osSetRegionWaterHeight = false - -; Comma separated list of UUIDS allows the function for that list of UUIDS -; Allow_osSetRegionWaterHeight = 888760cb-a3cf-43ac-8ea4-8732fd3ee2bb + ; Enable this engine in this OpenSim instance + Enabled = true + ; How many threads to keep alive even if nothing is happening + MinThreads = 2 + ; How many threads to start at maximum load + MaxThreads = 100 + ; Time a thread must be idle (in seconds) before it dies + IdleTimeout = 60 + ; Thread priority ("Lowest", "BelowNormal", "Normal", "AboveNormal", "Highest") + Priority = "BelowNormal" + ; Maximum number of events to queue for a script (excluding timers) + MaxScriptEventQueue = 300 + ; Stack size per thread created + ThreadStackSize = 262144 + ; Rate to poll for asynchronous command replies (ms) + AsyncLLCommandLoopms = 50 + ; Save the source of all compiled scripts + WriteScriptSourceToDebugFile = false + ; Default language for scripts + DefaultCompileLanguage = lsl + ; List of allowed languages (lsl,vb,js,cs) + ; AllowedCompilers=lsl,cs,js,vb. + ; *warning*, non lsl languages have access to static methods such as System.IO.File. Enable at your own risk. + AllowedCompilers=lsl + + ; Compile debug info (line numbers) into the script assemblies + CompileWithDebugInformation = true + ; Allow the use of os* functions (some are dangerous) + AllowOSFunctions = false + ; Threat level to allow, one of None, VeryLow, Low, Moderate, High, VeryHigh, Severe + OSFunctionThreatLevel = VeryLow + ; Interval (s) between background save of script states + SaveInterval = 120 + ; Interval (s) between maintenance runs (0 = disable) + MaintenanceInterval = 10 + ; Time a script can spend in an event handler before it is interrupted + EventLimit = 30 + ; If a script overruns it's event limit, kill the script? + KillTimedOutScripts = false + ; Sets the multiplier for the scripting delays + ScriptDelayFactor = 1.0 + ; The factor the 10 m distances llimits are multiplied by + ScriptDistanceLimitFactor = 1.0 + + ; OS Functions enable/disable + ; For each function, you can add one line, as shown + + ; true is the default for all functions, and allows them if below threat level + ; Allow_osSetRegionWaterHeight = true + + ; false disables the function completely + ; Allow_osSetRegionWaterHeight = false + + ; Comma separated list of UUIDS allows the function for that list of UUIDS + ; Allow_osSetRegionWaterHeight = 888760cb-a3cf-43ac-8ea4-8732fd3ee2bb + [GridInfo] + ; These settings are used to return information on a get_grid_info call. + ; Client launcher scripts and third-party clients make use of this to + ; autoconfigure the client and to provide a nice user experience. If you + ; want to facilitate that, you should configure the settings here according + ; to your grid or standalone setup. + ; + ; See http://opensimulator.org/wiki/GridInfo -; These settings are used to return information on a get_grid_info call. -; Client launcher scripts and third-party clients make use of this to -; autoconfigure the client and to provide a nice user experience. If you -; want to facilitate that, you should configure the settings here according -; to your grid or standalone setup. -; -; See http://opensimulator.org/wiki/GridInfo + ; login uri: for grid this is the user server URI + login = http://127.0.0.1:9000/ -; login uri: for grid this is the user server URI -login = http://127.0.0.1:9000/ + ; long grid name: the long name of your grid + gridname = "the lost continent of hippo" -; long grid name: the long name of your grid -gridname = "the lost continent of hippo" + ; short grid name: the short name of your grid + gridnick = "hippogrid" -; short grid name: the short name of your grid -gridnick = "hippogrid" + ; login page: optional: if it exists it will be used to tell the client to use + ; this as splash page + welcome = http://127.0.0.1/welcome -; login page: optional: if it exists it will be used to tell the client to use -; this as splash page -welcome = http://127.0.0.1/welcome + ; helper uri: optional: if it exists if will be used to tell the client to use + ; this for all economy related things + economy = http://127.0.0.1:9000/ -; helper uri: optional: if it exists if will be used to tell the client to use -; this for all economy related things -economy = http://127.0.0.1:9000/ + ; web page of grid: optional: page providing further information about your grid + about = http://127.0.0.1/about/ -; web page of grid: optional: page providing further information about your grid -about = http://127.0.0.1/about/ + ; account creation: optional: page providing further information about obtaining + ; a user account on your grid + register = http://127.0.0.1/register -; account creation: optional: page providing further information about obtaining -; a user account on your grid -register = http://127.0.0.1/register + ; help: optional: page providing further assistance for users of your grid + help = http://127.0.0.1/help -; help: optional: page providing further assistance for users of your grid -help = http://127.0.0.1/help + ; password help: optional: page providing password assistance for users of your grid + password = http://127.0.0.1/password -; password help: optional: page providing password assistance for users of your grid -password = http://127.0.0.1/password + ;These are the settings for the Open Grid Protocol.. the Agent Domain, Region Domain, you know.. + [OpenGridProtocol] + ;On/true or Off/false + ogp_enabled=false -;These are the settings for the Open Grid Protocol.. the Agent Domain, Region Domain, you know.. -[OpenGridProtocol] -;On/true or Off/false -ogp_enabled=false + ;Name Prefix/suffix when using OGP + ogp_firstname_prefix="" + ogp_lastname_suffix="_EXTERNAL" -;Name Prefix/suffix when using OGP -ogp_firstname_prefix="" -ogp_lastname_suffix="_EXTERNAL" [Concierge] -; enable = true -enabled = false + ; enable = true + enabled = false -; name of the concierge -whoami = "jeeves" + ; name of the concierge + whoami = "jeeves" -; password for updating the welcome message templates via XmlRpc -password = SECRET + ; password for updating the welcome message templates via XmlRpc + password = SECRET -; regex specifying for which regions concierge service is desired; if -; empty, then for all -regions = "^MeetingSpace-" + ; regex specifying for which regions concierge service is desired; if + ; empty, then for all + regions = "^MeetingSpace-" -; for each region that matches the regions regexp you can provide -; (optionally) a welcome template using format substitution: -; {0} is replaced with the name of the avatar entering the region -; {1} is replaced with the name of the region -; {2} is replaced with the name of the concierge (whoami variable above) + ; for each region that matches the regions regexp you can provide + ; (optionally) a welcome template using format substitution: + ; {0} is replaced with the name of the avatar entering the region + ; {1} is replaced with the name of the region + ; {2} is replaced with the name of the concierge (whoami variable above) -welcomes = /path/to/welcome/template/directory + welcomes = /path/to/welcome/template/directory -- cgit v1.1