diff options
-rw-r--r-- | OpenSim/Region/Environment/Modules/World/Permissions/PermissionsModule.cs | 1012 | ||||
-rw-r--r-- | 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 | |||
552 | #endregion | 552 | #endregion |
553 | 553 | ||
554 | #region Permission Checks | 554 | #region Permission Checks |
555 | private bool CanAbandonParcel(UUID user, ILandObject parcel, Scene scene) | 555 | private bool CanAbandonParcel(UUID user, ILandObject parcel, Scene scene) |
556 | { | 556 | { |
557 | DebugPermissionInformation(MethodInfo.GetCurrentMethod().Name); | 557 | DebugPermissionInformation(MethodInfo.GetCurrentMethod().Name); |
558 | if (m_bypassPermissions) return m_bypassPermissionsValue; | 558 | if (m_bypassPermissions) return m_bypassPermissionsValue; |
559 | |||
560 | return GenericParcelPermission(user, parcel); | ||
561 | } | ||
562 | 559 | ||
563 | private bool CanReclaimParcel(UUID user, ILandObject parcel, Scene scene) | 560 | return GenericParcelPermission(user, parcel); |
564 | { | 561 | } |
565 | DebugPermissionInformation(MethodInfo.GetCurrentMethod().Name); | ||
566 | if (m_bypassPermissions) return m_bypassPermissionsValue; | ||
567 | 562 | ||
568 | return GenericParcelPermission(user, parcel); | 563 | private bool CanReclaimParcel(UUID user, ILandObject parcel, Scene scene) |
569 | } | 564 | { |
565 | DebugPermissionInformation(MethodInfo.GetCurrentMethod().Name); | ||
566 | if (m_bypassPermissions) return m_bypassPermissionsValue; | ||
570 | 567 | ||
571 | private bool CanBeGodLike(UUID user, Scene scene) | 568 | return GenericParcelPermission(user, parcel); |
572 | { | 569 | } |
573 | DebugPermissionInformation(MethodInfo.GetCurrentMethod().Name); | ||
574 | if (m_bypassPermissions) return m_bypassPermissionsValue; | ||
575 | 570 | ||
576 | return IsAdministrator(user); | 571 | private bool CanBeGodLike(UUID user, Scene scene) |
577 | } | 572 | { |
573 | DebugPermissionInformation(MethodInfo.GetCurrentMethod().Name); | ||
574 | if (m_bypassPermissions) return m_bypassPermissionsValue; | ||
578 | 575 | ||
579 | private bool CanDuplicateObject(int objectCount, UUID objectID, UUID owner, Scene scene, Vector3 objectPosition) | 576 | return IsAdministrator(user); |
580 | { | 577 | } |
581 | DebugPermissionInformation(MethodInfo.GetCurrentMethod().Name); | ||
582 | if (m_bypassPermissions) return m_bypassPermissionsValue; | ||
583 | 578 | ||
584 | if (!GenericObjectPermission(owner, objectID, true)) | 579 | private bool CanDuplicateObject(int objectCount, UUID objectID, UUID owner, Scene scene, Vector3 objectPosition) |
585 | { | 580 | { |
586 | //They can't even edit the object | 581 | DebugPermissionInformation(MethodInfo.GetCurrentMethod().Name); |
587 | return false; | 582 | if (m_bypassPermissions) return m_bypassPermissionsValue; |
588 | } | ||
589 | //If they can rez, they can duplicate | ||
590 | return CanRezObject(objectCount, owner, objectPosition, scene); | ||
591 | } | ||
592 | 583 | ||
593 | private bool CanDeleteObject(UUID objectID, UUID deleter, Scene scene) | 584 | if (!GenericObjectPermission(owner, objectID, true)) |
594 | { | 585 | { |
595 | DebugPermissionInformation(MethodInfo.GetCurrentMethod().Name); | 586 | //They can't even edit the object |
596 | if (m_bypassPermissions) return m_bypassPermissionsValue; | 587 | return false; |
597 | |||
598 | return GenericObjectPermission(deleter, objectID, false); | ||
599 | } | 588 | } |
589 | //If they can rez, they can duplicate | ||
590 | return CanRezObject(objectCount, owner, objectPosition, scene); | ||
591 | } | ||
600 | 592 | ||
601 | private bool CanEditObject(UUID objectID, UUID editorID, Scene scene) | 593 | private bool CanDeleteObject(UUID objectID, UUID deleter, Scene scene) |
602 | { | 594 | { |
603 | DebugPermissionInformation(MethodInfo.GetCurrentMethod().Name); | 595 | DebugPermissionInformation(MethodInfo.GetCurrentMethod().Name); |
604 | if (m_bypassPermissions) return m_bypassPermissionsValue; | 596 | if (m_bypassPermissions) return m_bypassPermissionsValue; |
605 | |||
606 | 597 | ||
607 | return GenericObjectPermission(editorID, objectID, false); | 598 | return GenericObjectPermission(deleter, objectID, false); |
608 | } | 599 | } |
609 | 600 | ||
610 | private bool CanEditObjectInventory(UUID objectID, UUID editorID, Scene scene) | 601 | private bool CanEditObject(UUID objectID, UUID editorID, Scene scene) |
611 | { | 602 | { |
612 | DebugPermissionInformation(MethodInfo.GetCurrentMethod().Name); | 603 | DebugPermissionInformation(MethodInfo.GetCurrentMethod().Name); |
613 | if (m_bypassPermissions) return m_bypassPermissionsValue; | 604 | if (m_bypassPermissions) return m_bypassPermissionsValue; |
614 | 605 | ||
615 | SceneObjectPart part = m_scene.GetSceneObjectPart(objectID); | ||
616 | 606 | ||
617 | // TODO: add group support! | 607 | return GenericObjectPermission(editorID, objectID, false); |
618 | // | 608 | } |
619 | if (part.OwnerID != editorID) | ||
620 | return false; | ||
621 | |||
622 | return GenericObjectPermission(editorID, objectID, false); | ||
623 | } | ||
624 | 609 | ||
625 | private bool CanEditParcel(UUID user, ILandObject parcel, Scene scene) | 610 | private bool CanEditObjectInventory(UUID objectID, UUID editorID, Scene scene) |
626 | { | 611 | { |
627 | DebugPermissionInformation(MethodInfo.GetCurrentMethod().Name); | 612 | DebugPermissionInformation(MethodInfo.GetCurrentMethod().Name); |
628 | if (m_bypassPermissions) return m_bypassPermissionsValue; | 613 | if (m_bypassPermissions) return m_bypassPermissionsValue; |
629 | 614 | ||
630 | return GenericParcelPermission(user, parcel); | 615 | SceneObjectPart part = m_scene.GetSceneObjectPart(objectID); |
631 | } | ||
632 | 616 | ||
633 | private bool CanEditScript(UUID script, UUID objectID, UUID user, Scene scene) | 617 | // TODO: add group support! |
634 | { | 618 | // |
635 | DebugPermissionInformation(MethodInfo.GetCurrentMethod().Name); | 619 | if (part.OwnerID != editorID) |
636 | if (m_bypassPermissions) return m_bypassPermissionsValue; | 620 | return false; |
637 | 621 | ||
638 | // If you can view it, you can edit it | 622 | return GenericObjectPermission(editorID, objectID, false); |
639 | // There is no viewing a no mod script | 623 | } |
640 | // | ||
641 | return CanViewScript(script, objectID, user, scene); | ||
642 | } | ||
643 | 624 | ||
644 | private bool CanEditNotecard(UUID notecard, UUID objectID, UUID user, Scene scene) | 625 | private bool CanEditParcel(UUID user, ILandObject parcel, Scene scene) |
645 | { | 626 | { |
646 | DebugPermissionInformation(MethodInfo.GetCurrentMethod().Name); | 627 | DebugPermissionInformation(MethodInfo.GetCurrentMethod().Name); |
647 | if (m_bypassPermissions) return m_bypassPermissionsValue; | 628 | if (m_bypassPermissions) return m_bypassPermissionsValue; |
648 | 629 | ||
649 | if (objectID == UUID.Zero) // User inventory | 630 | return GenericParcelPermission(user, parcel); |
650 | { | 631 | } |
651 | CachedUserInfo userInfo = | ||
652 | scene.CommsManager.UserProfileCacheService.GetUserDetails(user); | ||
653 | |||
654 | if (userInfo == null) | ||
655 | { | ||
656 | m_log.ErrorFormat("[PERMISSIONS]: Could not find user {0} for edit notecard check", user); | ||
657 | return false; | ||
658 | } | ||
659 | |||
660 | 632 | ||
661 | if (userInfo.RootFolder == null) | 633 | private bool CanEditScript(UUID script, UUID objectID, UUID user, Scene scene) |
662 | return false; | 634 | { |
635 | DebugPermissionInformation(MethodInfo.GetCurrentMethod().Name); | ||
636 | if (m_bypassPermissions) return m_bypassPermissionsValue; | ||
663 | 637 | ||
664 | InventoryItemBase assetRequestItem = userInfo.RootFolder.FindItem(notecard); | 638 | // If you can view it, you can edit it |
665 | if (assetRequestItem == null) // Library item | 639 | // There is no viewing a no mod script |
666 | { | 640 | // |
667 | assetRequestItem = scene.CommsManager.UserProfileCacheService.LibraryRoot.FindItem(notecard); | 641 | return CanViewScript(script, objectID, user, scene); |
642 | } | ||
668 | 643 | ||
669 | if (assetRequestItem != null) // Implicitly readable | 644 | private bool CanEditNotecard(UUID notecard, UUID objectID, UUID user, Scene scene) |
670 | return true; | 645 | { |
671 | } | 646 | DebugPermissionInformation(MethodInfo.GetCurrentMethod().Name); |
647 | if (m_bypassPermissions) return m_bypassPermissionsValue; | ||
672 | 648 | ||
673 | // Notecards must be both mod and copy to be saveable | 649 | if (objectID == UUID.Zero) // User inventory |
674 | // This is because of they're not copy, you can't read | 650 | { |
675 | // them, and if they're not mod, well, then they're | 651 | CachedUserInfo userInfo = |
676 | // not mod. Duh. | 652 | scene.CommsManager.UserProfileCacheService.GetUserDetails(user); |
677 | // | 653 | |
678 | if ((assetRequestItem.CurrentPermissions & | 654 | if (userInfo == null) |
679 | ((uint)PermissionMask.Modify | | ||
680 | (uint)PermissionMask.Copy)) != | ||
681 | ((uint)PermissionMask.Modify | | ||
682 | (uint)PermissionMask.Copy)) | ||
683 | return false; | ||
684 | } | ||
685 | else // Prim inventory | ||
686 | { | 655 | { |
687 | SceneObjectPart part = scene.GetSceneObjectPart(objectID); | 656 | m_log.ErrorFormat("[PERMISSIONS]: Could not find user {0} for edit notecard check", user); |
688 | 657 | return false; | |
689 | if (part == null) | 658 | } |
690 | return false; | 659 | |
691 | |||
692 | if (part.OwnerID != user) | ||
693 | return false; | ||
694 | |||
695 | if ((part.OwnerMask & (uint)PermissionMask.Modify) == 0) | ||
696 | return false; | ||
697 | |||
698 | TaskInventoryItem ti = part.GetInventoryItem(notecard); | ||
699 | 660 | ||
700 | if (ti == null) | 661 | if (userInfo.RootFolder == null) |
701 | return false; | 662 | return false; |
702 | 663 | ||
703 | if (ti.OwnerID != user) | 664 | InventoryItemBase assetRequestItem = userInfo.RootFolder.FindItem(notecard); |
704 | return false; | 665 | if (assetRequestItem == null) // Library item |
666 | { | ||
667 | assetRequestItem = scene.CommsManager.UserProfileCacheService.LibraryRoot.FindItem(notecard); | ||
705 | 668 | ||
706 | // Require full perms | 669 | if (assetRequestItem != null) // Implicitly readable |
707 | if ((ti.CurrentPermissions & | 670 | return true; |
708 | ((uint)PermissionMask.Modify | | ||
709 | (uint)PermissionMask.Copy)) != | ||
710 | ((uint)PermissionMask.Modify | | ||
711 | (uint)PermissionMask.Copy)) | ||
712 | return false; | ||
713 | } | 671 | } |
714 | 672 | ||
715 | return true; | 673 | // Notecards must be both mod and copy to be saveable |
674 | // This is because of they're not copy, you can't read | ||
675 | // them, and if they're not mod, well, then they're | ||
676 | // not mod. Duh. | ||
677 | // | ||
678 | if ((assetRequestItem.CurrentPermissions & | ||
679 | ((uint)PermissionMask.Modify | | ||
680 | (uint)PermissionMask.Copy)) != | ||
681 | ((uint)PermissionMask.Modify | | ||
682 | (uint)PermissionMask.Copy)) | ||
683 | return false; | ||
716 | } | 684 | } |
717 | 685 | else // Prim inventory | |
718 | private bool CanInstantMessage(UUID user, UUID target, Scene startScene) | ||
719 | { | 686 | { |
720 | DebugPermissionInformation(MethodInfo.GetCurrentMethod().Name); | 687 | SceneObjectPart part = scene.GetSceneObjectPart(objectID); |
721 | if (m_bypassPermissions) return m_bypassPermissionsValue; | ||
722 | |||
723 | 688 | ||
724 | return GenericCommunicationPermission(user, target); | 689 | if (part == null) |
725 | } | 690 | return false; |
726 | |||
727 | private bool CanInventoryTransfer(UUID user, UUID target, Scene startScene) | ||
728 | { | ||
729 | DebugPermissionInformation(MethodInfo.GetCurrentMethod().Name); | ||
730 | if (m_bypassPermissions) return m_bypassPermissionsValue; | ||
731 | 691 | ||
732 | return GenericCommunicationPermission(user, target); | 692 | if (part.OwnerID != user) |
733 | } | 693 | return false; |
734 | 694 | ||
735 | private bool CanIssueEstateCommand(UUID user, Scene requestFromScene, bool ownerCommand) | 695 | if ((part.OwnerMask & (uint)PermissionMask.Modify) == 0) |
736 | { | 696 | return false; |
737 | DebugPermissionInformation(MethodInfo.GetCurrentMethod().Name); | ||
738 | if (m_bypassPermissions) return m_bypassPermissionsValue; | ||
739 | 697 | ||
740 | if (IsAdministrator(user)) | 698 | TaskInventoryItem ti = part.GetInventoryItem(notecard); |
741 | return true; | ||
742 | 699 | ||
743 | if (m_scene.RegionInfo.EstateSettings.IsEstateOwner(user)) | 700 | if (ti == null) |
744 | return true; | 701 | return false; |
745 | 702 | ||
746 | if (ownerCommand) | 703 | if (ti.OwnerID != user) |
747 | return false; | 704 | return false; |
748 | 705 | ||
749 | return GenericEstatePermission(user); | 706 | // Require full perms |
707 | if ((ti.CurrentPermissions & | ||
708 | ((uint)PermissionMask.Modify | | ||
709 | (uint)PermissionMask.Copy)) != | ||
710 | ((uint)PermissionMask.Modify | | ||
711 | (uint)PermissionMask.Copy)) | ||
712 | return false; | ||
750 | } | 713 | } |
751 | 714 | ||
752 | private bool CanMoveObject(UUID objectID, UUID moverID, Scene scene) | 715 | return true; |
753 | { | 716 | } |
754 | DebugPermissionInformation(MethodInfo.GetCurrentMethod().Name); | ||
755 | if (m_bypassPermissions) | ||
756 | { | ||
757 | SceneObjectPart part = scene.GetSceneObjectPart(objectID); | ||
758 | if (part.OwnerID != moverID) | ||
759 | { | ||
760 | if (part.ParentGroup != null && !part.ParentGroup.IsDeleted) | ||
761 | { | ||
762 | if (part.ParentGroup.IsAttachment) | ||
763 | return false; | ||
764 | } | ||
765 | } | ||
766 | return m_bypassPermissionsValue; | ||
767 | } | ||
768 | 717 | ||
769 | bool permission = GenericObjectPermission(moverID, objectID, true); | 718 | private bool CanInstantMessage(UUID user, UUID target, Scene startScene) |
770 | if (!permission) | 719 | { |
771 | { | 720 | DebugPermissionInformation(MethodInfo.GetCurrentMethod().Name); |
772 | if (!m_scene.Entities.ContainsKey(objectID)) | 721 | if (m_bypassPermissions) return m_bypassPermissionsValue; |
773 | { | ||
774 | return false; | ||
775 | } | ||
776 | 722 | ||
777 | // The client | ||
778 | // may request to edit linked parts, and therefore, it needs | ||
779 | // to also check for SceneObjectPart | ||
780 | 723 | ||
781 | // If it's not an object, we cant edit it. | 724 | return GenericCommunicationPermission(user, target); |
782 | if ((!(m_scene.Entities[objectID] is SceneObjectGroup))) | 725 | } |
783 | { | ||
784 | return false; | ||
785 | } | ||
786 | 726 | ||
727 | private bool CanInventoryTransfer(UUID user, UUID target, Scene startScene) | ||
728 | { | ||
729 | DebugPermissionInformation(MethodInfo.GetCurrentMethod().Name); | ||
730 | if (m_bypassPermissions) return m_bypassPermissionsValue; | ||
787 | 731 | ||
788 | SceneObjectGroup task = (SceneObjectGroup)m_scene.Entities[objectID]; | 732 | return GenericCommunicationPermission(user, target); |
733 | } | ||
789 | 734 | ||
735 | private bool CanIssueEstateCommand(UUID user, Scene requestFromScene, bool ownerCommand) | ||
736 | { | ||
737 | DebugPermissionInformation(MethodInfo.GetCurrentMethod().Name); | ||
738 | if (m_bypassPermissions) return m_bypassPermissionsValue; | ||
790 | 739 | ||
791 | // UUID taskOwner = null; | 740 | if (IsAdministrator(user)) |
792 | // Added this because at this point in time it wouldn't be wise for | 741 | return true; |
793 | // the administrator object permissions to take effect. | ||
794 | // UUID objectOwner = task.OwnerID; | ||
795 | 742 | ||
796 | // Anyone can move | 743 | if (m_scene.RegionInfo.EstateSettings.IsEstateOwner(user)) |
797 | if ((task.RootPart.EveryoneMask & PERM_MOVE) != 0) | 744 | return true; |
798 | permission = true; | ||
799 | 745 | ||
800 | // Locked | 746 | if (ownerCommand) |
801 | if ((task.RootPart.OwnerMask & PERM_LOCKED) == 0) | 747 | return false; |
802 | permission = false; | ||
803 | 748 | ||
804 | } | 749 | return GenericEstatePermission(user); |
805 | else | 750 | } |
806 | { | ||
807 | bool locked = false; | ||
808 | if (!m_scene.Entities.ContainsKey(objectID)) | ||
809 | { | ||
810 | return false; | ||
811 | } | ||
812 | 751 | ||
813 | // If it's not an object, we cant edit it. | 752 | private bool CanMoveObject(UUID objectID, UUID moverID, Scene scene) |
814 | if ((!(m_scene.Entities[objectID] is SceneObjectGroup))) | 753 | { |
754 | DebugPermissionInformation(MethodInfo.GetCurrentMethod().Name); | ||
755 | if (m_bypassPermissions) | ||
756 | { | ||
757 | SceneObjectPart part = scene.GetSceneObjectPart(objectID); | ||
758 | if (part.OwnerID != moverID) | ||
759 | { | ||
760 | if (part.ParentGroup != null && !part.ParentGroup.IsDeleted) | ||
815 | { | 761 | { |
816 | return false; | 762 | if (part.ParentGroup.IsAttachment) |
763 | return false; | ||
817 | } | 764 | } |
818 | |||
819 | |||
820 | SceneObjectGroup group = (SceneObjectGroup)m_scene.Entities[objectID]; | ||
821 | |||
822 | UUID objectOwner = group.OwnerID; | ||
823 | locked = ((group.RootPart.OwnerMask & PERM_LOCKED) == 0); | ||
824 | |||
825 | |||
826 | // This is an exception to the generic object permission. | ||
827 | // Administrators who lock their objects should not be able to move them, | ||
828 | // however generic object permission should return true. | ||
829 | // This keeps locked objects from being affected by random click + drag actions by accident | ||
830 | // and allows the administrator to grab or delete a locked object. | ||
831 | |||
832 | // Administrators and estate managers are still able to click+grab locked objects not | ||
833 | // owned by them in the scene | ||
834 | // This is by design. | ||
835 | |||
836 | if (locked && (moverID == objectOwner)) | ||
837 | return false; | ||
838 | } | 765 | } |
839 | return permission; | 766 | return m_bypassPermissionsValue; |
840 | } | 767 | } |
841 | 768 | ||
842 | private bool CanObjectEntry(UUID objectID, Vector3 newPoint, Scene scene) | 769 | bool permission = GenericObjectPermission(moverID, objectID, true); |
770 | if (!permission) | ||
843 | { | 771 | { |
844 | DebugPermissionInformation(MethodInfo.GetCurrentMethod().Name); | 772 | if (!m_scene.Entities.ContainsKey(objectID)) |
845 | if (m_bypassPermissions) return m_bypassPermissionsValue; | ||
846 | |||
847 | if ((newPoint.X > 257f || newPoint.X < -1f || newPoint.Y > 257f || newPoint.Y < -1f)) | ||
848 | { | 773 | { |
849 | return true; | 774 | return false; |
850 | } | 775 | } |
851 | 776 | ||
852 | ILandObject land = m_scene.LandChannel.GetLandObject(newPoint.X, newPoint.Y); | 777 | // The client |
778 | // may request to edit linked parts, and therefore, it needs | ||
779 | // to also check for SceneObjectPart | ||
853 | 780 | ||
854 | if (land == null) | 781 | // If it's not an object, we cant edit it. |
782 | if ((!(m_scene.Entities[objectID] is SceneObjectGroup))) | ||
855 | { | 783 | { |
856 | return false; | 784 | return false; |
857 | } | 785 | } |
858 | 786 | ||
859 | if ((land.landData.Flags & ((int)Parcel.ParcelFlags.AllowAPrimitiveEntry)) != 0) | ||
860 | { | ||
861 | return true; | ||
862 | } | ||
863 | 787 | ||
864 | //TODO: check for group rights | 788 | SceneObjectGroup task = (SceneObjectGroup)m_scene.Entities[objectID]; |
789 | |||
790 | |||
791 | // UUID taskOwner = null; | ||
792 | // Added this because at this point in time it wouldn't be wise for | ||
793 | // the administrator object permissions to take effect. | ||
794 | // UUID objectOwner = task.OwnerID; | ||
865 | 795 | ||
796 | // Anyone can move | ||
797 | if ((task.RootPart.EveryoneMask & PERM_MOVE) != 0) | ||
798 | permission = true; | ||
799 | |||
800 | // Locked | ||
801 | if ((task.RootPart.OwnerMask & PERM_LOCKED) == 0) | ||
802 | permission = false; | ||
803 | |||
804 | } | ||
805 | else | ||
806 | { | ||
807 | bool locked = false; | ||
866 | if (!m_scene.Entities.ContainsKey(objectID)) | 808 | if (!m_scene.Entities.ContainsKey(objectID)) |
867 | { | 809 | { |
868 | return false; | 810 | return false; |
869 | } | 811 | } |
870 | 812 | ||
871 | // If it's not an object, we cant edit it. | 813 | // If it's not an object, we cant edit it. |
872 | if (!(m_scene.Entities[objectID] is SceneObjectGroup)) | 814 | if ((!(m_scene.Entities[objectID] is SceneObjectGroup))) |
873 | { | 815 | { |
874 | return false; | 816 | return false; |
875 | } | 817 | } |
876 | 818 | ||
877 | SceneObjectGroup task = (SceneObjectGroup)m_scene.Entities[objectID]; | ||
878 | 819 | ||
879 | if (GenericParcelPermission(task.OwnerID, newPoint)) | 820 | SceneObjectGroup group = (SceneObjectGroup)m_scene.Entities[objectID]; |
880 | { | 821 | |
881 | return true; | 822 | UUID objectOwner = group.OwnerID; |
882 | } | 823 | locked = ((group.RootPart.OwnerMask & PERM_LOCKED) == 0); |
824 | |||
825 | |||
826 | // This is an exception to the generic object permission. | ||
827 | // Administrators who lock their objects should not be able to move them, | ||
828 | // however generic object permission should return true. | ||
829 | // This keeps locked objects from being affected by random click + drag actions by accident | ||
830 | // and allows the administrator to grab or delete a locked object. | ||
831 | |||
832 | // Administrators and estate managers are still able to click+grab locked objects not | ||
833 | // owned by them in the scene | ||
834 | // This is by design. | ||
883 | 835 | ||
884 | //Otherwise, false! | 836 | if (locked && (moverID == objectOwner)) |
837 | return false; | ||
838 | } | ||
839 | return permission; | ||
840 | } | ||
841 | |||
842 | private bool CanObjectEntry(UUID objectID, Vector3 newPoint, Scene scene) | ||
843 | { | ||
844 | DebugPermissionInformation(MethodInfo.GetCurrentMethod().Name); | ||
845 | if (m_bypassPermissions) return m_bypassPermissionsValue; | ||
846 | |||
847 | if ((newPoint.X > 257f || newPoint.X < -1f || newPoint.Y > 257f || newPoint.Y < -1f)) | ||
848 | { | ||
849 | return true; | ||
850 | } | ||
851 | |||
852 | ILandObject land = m_scene.LandChannel.GetLandObject(newPoint.X, newPoint.Y); | ||
853 | |||
854 | if (land == null) | ||
855 | { | ||
885 | return false; | 856 | return false; |
886 | } | 857 | } |
887 | 858 | ||
888 | private bool CanReturnObject(UUID objectID, UUID returnerID, Scene scene) | 859 | if ((land.landData.Flags & ((int)Parcel.ParcelFlags.AllowAPrimitiveEntry)) != 0) |
889 | { | 860 | { |
890 | DebugPermissionInformation(MethodInfo.GetCurrentMethod().Name); | 861 | return true; |
891 | if (m_bypassPermissions) return m_bypassPermissionsValue; | 862 | } |
863 | |||
864 | //TODO: check for group rights | ||
892 | 865 | ||
893 | return GenericObjectPermission(returnerID, objectID, false); | 866 | if (!m_scene.Entities.ContainsKey(objectID)) |
867 | { | ||
868 | return false; | ||
894 | } | 869 | } |
895 | 870 | ||
896 | private bool CanRezObject(int objectCount, UUID owner, Vector3 objectPosition, Scene scene) | 871 | // If it's not an object, we cant edit it. |
872 | if (!(m_scene.Entities[objectID] is SceneObjectGroup)) | ||
897 | { | 873 | { |
898 | DebugPermissionInformation(MethodInfo.GetCurrentMethod().Name); | 874 | return false; |
899 | if (m_bypassPermissions) return m_bypassPermissionsValue; | 875 | } |
900 | 876 | ||
901 | bool permission = false; | 877 | SceneObjectGroup task = (SceneObjectGroup)m_scene.Entities[objectID]; |
902 | 878 | ||
903 | ILandObject land = m_scene.LandChannel.GetLandObject(objectPosition.X, objectPosition.Y); | 879 | if (GenericParcelPermission(task.OwnerID, newPoint)) |
904 | if (land == null) return false; | 880 | { |
881 | return true; | ||
882 | } | ||
905 | 883 | ||
906 | if ((land.landData.Flags & ((int)Parcel.ParcelFlags.CreateObjects)) == | 884 | //Otherwise, false! |
907 | (int)Parcel.ParcelFlags.CreateObjects) | 885 | return false; |
908 | permission = true; | 886 | } |
909 | 887 | ||
910 | //TODO: check for group rights | 888 | private bool CanReturnObject(UUID objectID, UUID returnerID, Scene scene) |
889 | { | ||
890 | DebugPermissionInformation(MethodInfo.GetCurrentMethod().Name); | ||
891 | if (m_bypassPermissions) return m_bypassPermissionsValue; | ||
911 | 892 | ||
912 | if (IsAdministrator(owner)) | 893 | return GenericObjectPermission(returnerID, objectID, false); |
913 | { | 894 | } |
914 | permission = true; | ||
915 | } | ||
916 | 895 | ||
917 | if (GenericParcelPermission(owner, objectPosition)) | 896 | private bool CanRezObject(int objectCount, UUID owner, Vector3 objectPosition, Scene scene) |
918 | { | 897 | { |
919 | permission = true; | 898 | DebugPermissionInformation(MethodInfo.GetCurrentMethod().Name); |
920 | } | 899 | if (m_bypassPermissions) return m_bypassPermissionsValue; |
921 | 900 | ||
922 | return permission; | 901 | bool permission = false; |
923 | } | ||
924 | 902 | ||
925 | private bool CanRunConsoleCommand(UUID user, Scene requestFromScene) | 903 | ILandObject land = m_scene.LandChannel.GetLandObject(objectPosition.X, objectPosition.Y); |
926 | { | 904 | if (land == null) return false; |
927 | DebugPermissionInformation(MethodInfo.GetCurrentMethod().Name); | ||
928 | if (m_bypassPermissions) return m_bypassPermissionsValue; | ||
929 | 905 | ||
906 | if ((land.landData.Flags & ((int)Parcel.ParcelFlags.CreateObjects)) == | ||
907 | (int)Parcel.ParcelFlags.CreateObjects) | ||
908 | permission = true; | ||
930 | 909 | ||
931 | return IsAdministrator(user); | 910 | //TODO: check for group rights |
932 | } | ||
933 | 911 | ||
934 | private bool CanRunScript(UUID script, UUID objectID, UUID user, Scene scene) | 912 | if (IsAdministrator(owner)) |
935 | { | 913 | { |
936 | DebugPermissionInformation(MethodInfo.GetCurrentMethod().Name); | 914 | permission = true; |
937 | if (m_bypassPermissions) return m_bypassPermissionsValue; | ||
938 | |||
939 | return true; | ||
940 | } | 915 | } |
941 | 916 | ||
942 | private bool CanSellParcel(UUID user, ILandObject parcel, Scene scene) | 917 | if (GenericParcelPermission(owner, objectPosition)) |
943 | { | 918 | { |
944 | DebugPermissionInformation(MethodInfo.GetCurrentMethod().Name); | 919 | permission = true; |
945 | if (m_bypassPermissions) return m_bypassPermissionsValue; | ||
946 | |||
947 | return GenericParcelPermission(user, parcel); | ||
948 | } | 920 | } |
949 | 921 | ||
950 | private bool CanTakeObject(UUID objectID, UUID stealer, Scene scene) | 922 | return permission; |
951 | { | 923 | } |
952 | DebugPermissionInformation(MethodInfo.GetCurrentMethod().Name); | ||
953 | if (m_bypassPermissions) return m_bypassPermissionsValue; | ||
954 | 924 | ||
955 | return GenericObjectPermission(stealer,objectID, false); | 925 | private bool CanRunConsoleCommand(UUID user, Scene requestFromScene) |
956 | } | 926 | { |
927 | DebugPermissionInformation(MethodInfo.GetCurrentMethod().Name); | ||
928 | if (m_bypassPermissions) return m_bypassPermissionsValue; | ||
957 | 929 | ||
958 | private bool CanTakeCopyObject(UUID objectID, UUID userID, Scene inScene) | ||
959 | { | ||
960 | DebugPermissionInformation(MethodInfo.GetCurrentMethod().Name); | ||
961 | if (m_bypassPermissions) return m_bypassPermissionsValue; | ||
962 | 930 | ||
963 | bool permission = GenericObjectPermission(userID, objectID,false); | 931 | return IsAdministrator(user); |
964 | if (!permission) | 932 | } |
965 | { | ||
966 | if (!m_scene.Entities.ContainsKey(objectID)) | ||
967 | { | ||
968 | return false; | ||
969 | } | ||
970 | 933 | ||
971 | // If it's not an object, we cant edit it. | 934 | private bool CanRunScript(UUID script, UUID objectID, UUID user, Scene scene) |
972 | if (!(m_scene.Entities[objectID] is SceneObjectGroup)) | 935 | { |
973 | { | 936 | DebugPermissionInformation(MethodInfo.GetCurrentMethod().Name); |
974 | return false; | 937 | if (m_bypassPermissions) return m_bypassPermissionsValue; |
975 | } | ||
976 | 938 | ||
977 | SceneObjectGroup task = (SceneObjectGroup)m_scene.Entities[objectID]; | 939 | return true; |
978 | // UUID taskOwner = null; | 940 | } |
979 | // Added this because at this point in time it wouldn't be wise for | ||
980 | // the administrator object permissions to take effect. | ||
981 | // UUID objectOwner = task.OwnerID; | ||
982 | 941 | ||
942 | private bool CanSellParcel(UUID user, ILandObject parcel, Scene scene) | ||
943 | { | ||
944 | DebugPermissionInformation(MethodInfo.GetCurrentMethod().Name); | ||
945 | if (m_bypassPermissions) return m_bypassPermissionsValue; | ||
983 | 946 | ||
984 | if ((task.RootPart.EveryoneMask & PERM_COPY) != 0) | 947 | return GenericParcelPermission(user, parcel); |
985 | permission = true; | 948 | } |
986 | } | ||
987 | return permission; | ||
988 | } | ||
989 | 949 | ||
990 | private bool CanTerraformLand(UUID user, Vector3 position, Scene requestFromScene) | 950 | private bool CanTakeObject(UUID objectID, UUID stealer, Scene scene) |
991 | { | 951 | { |
992 | DebugPermissionInformation(MethodInfo.GetCurrentMethod().Name); | 952 | DebugPermissionInformation(MethodInfo.GetCurrentMethod().Name); |
993 | if (m_bypassPermissions) return m_bypassPermissionsValue; | 953 | if (m_bypassPermissions) return m_bypassPermissionsValue; |
994 | 954 | ||
995 | // Estate override | 955 | return GenericObjectPermission(stealer,objectID, false); |
996 | if (GenericEstatePermission(user)) | 956 | } |
997 | return true; | ||
998 | 957 | ||
999 | float X = position.X; | 958 | private bool CanTakeCopyObject(UUID objectID, UUID userID, Scene inScene) |
1000 | float Y = position.Y; | 959 | { |
960 | DebugPermissionInformation(MethodInfo.GetCurrentMethod().Name); | ||
961 | if (m_bypassPermissions) return m_bypassPermissionsValue; | ||
1001 | 962 | ||
1002 | if (X > 255) | 963 | bool permission = GenericObjectPermission(userID, objectID,false); |
1003 | X = 255; | 964 | if (!permission) |
1004 | if (Y > 255) | 965 | { |
1005 | Y = 255; | 966 | if (!m_scene.Entities.ContainsKey(objectID)) |
1006 | if (X < 0) | 967 | { |
1007 | X = 0; | 968 | return false; |
1008 | if (Y < 0) | 969 | } |
1009 | Y = 0; | ||
1010 | 970 | ||
1011 | ILandObject parcel = m_scene.LandChannel.GetLandObject(X, Y); | 971 | // If it's not an object, we cant edit it. |
1012 | if (parcel == null) | 972 | if (!(m_scene.Entities[objectID] is SceneObjectGroup)) |
973 | { | ||
1013 | return false; | 974 | return false; |
975 | } | ||
1014 | 976 | ||
1015 | // Others allowed to terraform? | 977 | SceneObjectGroup task = (SceneObjectGroup)m_scene.Entities[objectID]; |
1016 | if ((parcel.landData.Flags & ((int)Parcel.ParcelFlags.AllowTerraform)) != 0) | 978 | // UUID taskOwner = null; |
1017 | return true; | 979 | // Added this because at this point in time it wouldn't be wise for |
980 | // the administrator object permissions to take effect. | ||
981 | // UUID objectOwner = task.OwnerID; | ||
1018 | 982 | ||
1019 | // Land owner can terraform too | ||
1020 | if (parcel != null && GenericParcelPermission(user, parcel)) | ||
1021 | return true; | ||
1022 | 983 | ||
1023 | return false; | 984 | if ((task.RootPart.EveryoneMask & PERM_COPY) != 0) |
985 | permission = true; | ||
1024 | } | 986 | } |
987 | return permission; | ||
988 | } | ||
1025 | 989 | ||
1026 | private bool CanViewScript(UUID script, UUID objectID, UUID user, Scene scene) | 990 | private bool CanTerraformLand(UUID user, Vector3 position, Scene requestFromScene) |
1027 | { | 991 | { |
1028 | DebugPermissionInformation(MethodInfo.GetCurrentMethod().Name); | 992 | DebugPermissionInformation(MethodInfo.GetCurrentMethod().Name); |
1029 | if (m_bypassPermissions) return m_bypassPermissionsValue; | 993 | if (m_bypassPermissions) return m_bypassPermissionsValue; |
1030 | 994 | ||
1031 | if (objectID == UUID.Zero) // User inventory | 995 | // Estate override |
1032 | { | 996 | if (GenericEstatePermission(user)) |
1033 | CachedUserInfo userInfo = | 997 | return true; |
1034 | scene.CommsManager.UserProfileCacheService.GetUserDetails(user); | ||
1035 | |||
1036 | if (userInfo == null) | ||
1037 | { | ||
1038 | m_log.ErrorFormat("[PERMISSIONS]: Could not find user {0} for administrator check", user); | ||
1039 | return false; | ||
1040 | } | ||
1041 | 998 | ||
1042 | if (userInfo.RootFolder == null) | 999 | float X = position.X; |
1043 | return false; | 1000 | float Y = position.Y; |
1044 | 1001 | ||
1045 | InventoryItemBase assetRequestItem = userInfo.RootFolder.FindItem(script); | 1002 | if (X > 255) |
1046 | if (assetRequestItem == null) // Library item | 1003 | X = 255; |
1047 | { | 1004 | if (Y > 255) |
1048 | assetRequestItem = m_scene.CommsManager.UserProfileCacheService.LibraryRoot.FindItem(script); | 1005 | Y = 255; |
1006 | if (X < 0) | ||
1007 | X = 0; | ||
1008 | if (Y < 0) | ||
1009 | Y = 0; | ||
1049 | 1010 | ||
1050 | if (assetRequestItem != null) // Implicitly readable | 1011 | ILandObject parcel = m_scene.LandChannel.GetLandObject(X, Y); |
1051 | return true; | 1012 | if (parcel == null) |
1052 | } | 1013 | return false; |
1053 | 1014 | ||
1054 | // SL is rather harebrained here. In SL, a script you | 1015 | // Others allowed to terraform? |
1055 | // have mod/copy no trans is readable. This subverts | 1016 | if ((parcel.landData.Flags & ((int)Parcel.ParcelFlags.AllowTerraform)) != 0) |
1056 | // permissions, but is used in some products, most | 1017 | return true; |
1057 | // notably Hippo door plugin and HippoRent 5 networked | ||
1058 | // prim counter. | ||
1059 | // To enable this broken SL-ism, remove Transfer from | ||
1060 | // the below expressions. | ||
1061 | // Trying to improve on SL perms by making a script | ||
1062 | // readable only if it's really full perms | ||
1063 | // | ||
1064 | if ((assetRequestItem.CurrentPermissions & | ||
1065 | ((uint)PermissionMask.Modify | | ||
1066 | (uint)PermissionMask.Copy | | ||
1067 | (uint)PermissionMask.Transfer)) != | ||
1068 | ((uint)PermissionMask.Modify | | ||
1069 | (uint)PermissionMask.Copy | | ||
1070 | (uint)PermissionMask.Transfer)) | ||
1071 | return false; | ||
1072 | } | ||
1073 | else // Prim inventory | ||
1074 | { | ||
1075 | SceneObjectPart part = scene.GetSceneObjectPart(objectID); | ||
1076 | 1018 | ||
1077 | if (part == null) | 1019 | // Land owner can terraform too |
1078 | return false; | 1020 | if (parcel != null && GenericParcelPermission(user, parcel)) |
1021 | return true; | ||
1079 | 1022 | ||
1080 | if (part.OwnerID != user) | 1023 | return false; |
1081 | return false; | 1024 | } |
1082 | 1025 | ||
1083 | if ((part.OwnerMask & (uint)PermissionMask.Modify) == 0) | 1026 | private bool CanViewScript(UUID script, UUID objectID, UUID user, Scene scene) |
1084 | return false; | 1027 | { |
1028 | DebugPermissionInformation(MethodInfo.GetCurrentMethod().Name); | ||
1029 | if (m_bypassPermissions) return m_bypassPermissionsValue; | ||
1085 | 1030 | ||
1086 | TaskInventoryItem ti = part.GetInventoryItem(script); | 1031 | if (objectID == UUID.Zero) // User inventory |
1032 | { | ||
1033 | CachedUserInfo userInfo = | ||
1034 | scene.CommsManager.UserProfileCacheService.GetUserDetails(user); | ||
1035 | |||
1036 | if (userInfo == null) | ||
1037 | { | ||
1038 | m_log.ErrorFormat("[PERMISSIONS]: Could not find user {0} for administrator check", user); | ||
1039 | return false; | ||
1040 | } | ||
1087 | 1041 | ||
1088 | if (ti == null) | 1042 | if (userInfo.RootFolder == null) |
1089 | return false; | 1043 | return false; |
1090 | 1044 | ||
1091 | if (ti.OwnerID != user) | 1045 | InventoryItemBase assetRequestItem = userInfo.RootFolder.FindItem(script); |
1092 | return false; | 1046 | if (assetRequestItem == null) // Library item |
1047 | { | ||
1048 | assetRequestItem = m_scene.CommsManager.UserProfileCacheService.LibraryRoot.FindItem(script); | ||
1093 | 1049 | ||
1094 | // Require full perms | 1050 | if (assetRequestItem != null) // Implicitly readable |
1095 | if ((ti.CurrentPermissions & | 1051 | return true; |
1096 | ((uint)PermissionMask.Modify | | ||
1097 | (uint)PermissionMask.Copy | | ||
1098 | (uint)PermissionMask.Transfer)) != | ||
1099 | ((uint)PermissionMask.Modify | | ||
1100 | (uint)PermissionMask.Copy | | ||
1101 | (uint)PermissionMask.Transfer)) | ||
1102 | return false; | ||
1103 | } | 1052 | } |
1104 | 1053 | ||
1105 | return true; | 1054 | // SL is rather harebrained here. In SL, a script you |
1055 | // have mod/copy no trans is readable. This subverts | ||
1056 | // permissions, but is used in some products, most | ||
1057 | // notably Hippo door plugin and HippoRent 5 networked | ||
1058 | // prim counter. | ||
1059 | // To enable this broken SL-ism, remove Transfer from | ||
1060 | // the below expressions. | ||
1061 | // Trying to improve on SL perms by making a script | ||
1062 | // readable only if it's really full perms | ||
1063 | // | ||
1064 | if ((assetRequestItem.CurrentPermissions & | ||
1065 | ((uint)PermissionMask.Modify | | ||
1066 | (uint)PermissionMask.Copy | | ||
1067 | (uint)PermissionMask.Transfer)) != | ||
1068 | ((uint)PermissionMask.Modify | | ||
1069 | (uint)PermissionMask.Copy | | ||
1070 | (uint)PermissionMask.Transfer)) | ||
1071 | return false; | ||
1106 | } | 1072 | } |
1107 | 1073 | else // Prim inventory | |
1108 | private bool CanViewNotecard(UUID notecard, UUID objectID, UUID user, Scene scene) | ||
1109 | { | 1074 | { |
1110 | DebugPermissionInformation(MethodInfo.GetCurrentMethod().Name); | 1075 | SceneObjectPart part = scene.GetSceneObjectPart(objectID); |
1111 | if (m_bypassPermissions) return m_bypassPermissionsValue; | ||
1112 | 1076 | ||
1113 | if (objectID == UUID.Zero) // User inventory | 1077 | if (part == null) |
1114 | { | 1078 | return false; |
1115 | CachedUserInfo userInfo = | ||
1116 | scene.CommsManager.UserProfileCacheService.GetUserDetails(user); | ||
1117 | |||
1118 | if (userInfo == null) | ||
1119 | { | ||
1120 | m_log.ErrorFormat("[PERMISSIONS]: Could not find user {0} for view notecard check", user); | ||
1121 | return false; | ||
1122 | } | ||
1123 | 1079 | ||
1124 | if (userInfo.RootFolder == null) | 1080 | if (part.OwnerID != user) |
1125 | return false; | 1081 | return false; |
1126 | 1082 | ||
1127 | InventoryItemBase assetRequestItem = userInfo.RootFolder.FindItem(notecard); | 1083 | if ((part.OwnerMask & (uint)PermissionMask.Modify) == 0) |
1128 | if (assetRequestItem == null) // Library item | 1084 | return false; |
1129 | { | ||
1130 | assetRequestItem = m_scene.CommsManager.UserProfileCacheService.LibraryRoot.FindItem(notecard); | ||
1131 | 1085 | ||
1132 | if (assetRequestItem != null) // Implicitly readable | 1086 | TaskInventoryItem ti = part.GetInventoryItem(script); |
1133 | return true; | ||
1134 | } | ||
1135 | 1087 | ||
1136 | // Notecards are always readable unless no copy | 1088 | if (ti == null) |
1137 | // | 1089 | return false; |
1138 | if ((assetRequestItem.CurrentPermissions & | 1090 | |
1139 | (uint)PermissionMask.Copy) != | 1091 | if (ti.OwnerID != user) |
1140 | (uint)PermissionMask.Copy) | 1092 | return false; |
1141 | return false; | ||
1142 | } | ||
1143 | else // Prim inventory | ||
1144 | { | ||
1145 | SceneObjectPart part = scene.GetSceneObjectPart(objectID); | ||
1146 | 1093 | ||
1147 | if (part == null) | 1094 | // Require full perms |
1148 | return false; | 1095 | if ((ti.CurrentPermissions & |
1096 | ((uint)PermissionMask.Modify | | ||
1097 | (uint)PermissionMask.Copy | | ||
1098 | (uint)PermissionMask.Transfer)) != | ||
1099 | ((uint)PermissionMask.Modify | | ||
1100 | (uint)PermissionMask.Copy | | ||
1101 | (uint)PermissionMask.Transfer)) | ||
1102 | return false; | ||
1103 | } | ||
1149 | 1104 | ||
1150 | if (part.OwnerID != user) | 1105 | return true; |
1151 | return false; | 1106 | } |
1152 | 1107 | ||
1153 | if ((part.OwnerMask & (uint)PermissionMask.Modify) == 0) | 1108 | private bool CanViewNotecard(UUID notecard, UUID objectID, UUID user, Scene scene) |
1154 | return false; | 1109 | { |
1110 | DebugPermissionInformation(MethodInfo.GetCurrentMethod().Name); | ||
1111 | if (m_bypassPermissions) return m_bypassPermissionsValue; | ||
1155 | 1112 | ||
1156 | TaskInventoryItem ti = part.GetInventoryItem(notecard); | 1113 | if (objectID == UUID.Zero) // User inventory |
1114 | { | ||
1115 | CachedUserInfo userInfo = | ||
1116 | scene.CommsManager.UserProfileCacheService.GetUserDetails(user); | ||
1117 | |||
1118 | if (userInfo == null) | ||
1119 | { | ||
1120 | m_log.ErrorFormat("[PERMISSIONS]: Could not find user {0} for view notecard check", user); | ||
1121 | return false; | ||
1122 | } | ||
1157 | 1123 | ||
1158 | if (ti == null) | 1124 | if (userInfo.RootFolder == null) |
1159 | return false; | 1125 | return false; |
1160 | 1126 | ||
1161 | if (ti.OwnerID != user) | 1127 | InventoryItemBase assetRequestItem = userInfo.RootFolder.FindItem(notecard); |
1162 | return false; | 1128 | if (assetRequestItem == null) // Library item |
1129 | { | ||
1130 | assetRequestItem = m_scene.CommsManager.UserProfileCacheService.LibraryRoot.FindItem(notecard); | ||
1163 | 1131 | ||
1164 | // Notecards are always readable unless no copy | 1132 | if (assetRequestItem != null) // Implicitly readable |
1165 | // | 1133 | return true; |
1166 | if ((ti.CurrentPermissions & | ||
1167 | (uint)PermissionMask.Copy) != | ||
1168 | (uint)PermissionMask.Copy) | ||
1169 | return false; | ||
1170 | } | 1134 | } |
1171 | 1135 | ||
1172 | return true; | 1136 | // Notecards are always readable unless no copy |
1137 | // | ||
1138 | if ((assetRequestItem.CurrentPermissions & | ||
1139 | (uint)PermissionMask.Copy) != | ||
1140 | (uint)PermissionMask.Copy) | ||
1141 | return false; | ||
1173 | } | 1142 | } |
1143 | else // Prim inventory | ||
1144 | { | ||
1145 | SceneObjectPart part = scene.GetSceneObjectPart(objectID); | ||
1174 | 1146 | ||
1175 | #endregion | 1147 | if (part == null) |
1148 | return false; | ||
1176 | 1149 | ||
1177 | public bool CanLinkObject(UUID userID, UUID objectID) | 1150 | if (part.OwnerID != user) |
1178 | { | 1151 | return false; |
1179 | DebugPermissionInformation(MethodInfo.GetCurrentMethod().Name); | ||
1180 | if (m_bypassPermissions) return m_bypassPermissionsValue; | ||
1181 | 1152 | ||
1182 | return true; | 1153 | if ((part.OwnerMask & (uint)PermissionMask.Modify) == 0) |
1183 | } | 1154 | return false; |
1184 | 1155 | ||
1185 | public bool CanDelinkObject(UUID userID, UUID objectID) | 1156 | TaskInventoryItem ti = part.GetInventoryItem(notecard); |
1186 | { | ||
1187 | DebugPermissionInformation(MethodInfo.GetCurrentMethod().Name); | ||
1188 | if (m_bypassPermissions) return m_bypassPermissionsValue; | ||
1189 | 1157 | ||
1190 | return true; | 1158 | if (ti == null) |
1191 | } | 1159 | return false; |
1192 | 1160 | ||
1193 | public bool CanBuyLand(UUID userID, ILandObject parcel, Scene scene) | 1161 | if (ti.OwnerID != user) |
1194 | { | 1162 | return false; |
1195 | DebugPermissionInformation(MethodInfo.GetCurrentMethod().Name); | ||
1196 | if (m_bypassPermissions) return m_bypassPermissionsValue; | ||
1197 | 1163 | ||
1198 | return true; | 1164 | // Notecards are always readable unless no copy |
1165 | // | ||
1166 | if ((ti.CurrentPermissions & | ||
1167 | (uint)PermissionMask.Copy) != | ||
1168 | (uint)PermissionMask.Copy) | ||
1169 | return false; | ||
1199 | } | 1170 | } |
1200 | 1171 | ||
1201 | public bool CanCopyInventory(UUID itemID, UUID objectID, UUID userID) | 1172 | return true; |
1202 | { | 1173 | } |
1203 | DebugPermissionInformation(MethodInfo.GetCurrentMethod().Name); | ||
1204 | if (m_bypassPermissions) return m_bypassPermissionsValue; | ||
1205 | 1174 | ||
1206 | return true; | 1175 | #endregion |
1207 | } | ||
1208 | 1176 | ||
1209 | public bool CanDeleteInventory(UUID itemID, UUID objectID, UUID userID) | 1177 | public bool CanLinkObject(UUID userID, UUID objectID) |
1210 | { | 1178 | { |
1211 | DebugPermissionInformation(MethodInfo.GetCurrentMethod().Name); | 1179 | DebugPermissionInformation(MethodInfo.GetCurrentMethod().Name); |
1212 | if (m_bypassPermissions) return m_bypassPermissionsValue; | 1180 | if (m_bypassPermissions) return m_bypassPermissionsValue; |
1213 | 1181 | ||
1214 | return true; | 1182 | return true; |
1215 | } | 1183 | } |
1216 | 1184 | ||
1217 | public bool CanCreateInventory(uint invType, UUID objectID, UUID userID) | 1185 | public bool CanDelinkObject(UUID userID, UUID objectID) |
1218 | { | 1186 | { |
1219 | DebugPermissionInformation(MethodInfo.GetCurrentMethod().Name); | 1187 | DebugPermissionInformation(MethodInfo.GetCurrentMethod().Name); |
1220 | if (m_bypassPermissions) return m_bypassPermissionsValue; | 1188 | if (m_bypassPermissions) return m_bypassPermissionsValue; |
1221 | 1189 | ||
1222 | return true; | 1190 | return true; |
1223 | } | 1191 | } |
1224 | 1192 | ||
1225 | public bool CanTeleport(UUID userID) | 1193 | public bool CanBuyLand(UUID userID, ILandObject parcel, Scene scene) |
1226 | { | 1194 | { |
1227 | DebugPermissionInformation(MethodInfo.GetCurrentMethod().Name); | 1195 | DebugPermissionInformation(MethodInfo.GetCurrentMethod().Name); |
1228 | if (m_bypassPermissions) return m_bypassPermissionsValue; | 1196 | if (m_bypassPermissions) return m_bypassPermissionsValue; |
1229 | 1197 | ||
1230 | return true; | 1198 | return true; |
1231 | } | 1199 | } |
1200 | |||
1201 | public bool CanCopyInventory(UUID itemID, UUID objectID, UUID userID) | ||
1202 | { | ||
1203 | DebugPermissionInformation(MethodInfo.GetCurrentMethod().Name); | ||
1204 | if (m_bypassPermissions) return m_bypassPermissionsValue; | ||
1205 | |||
1206 | return true; | ||
1207 | } | ||
1208 | |||
1209 | public bool CanDeleteInventory(UUID itemID, UUID objectID, UUID userID) | ||
1210 | { | ||
1211 | DebugPermissionInformation(MethodInfo.GetCurrentMethod().Name); | ||
1212 | if (m_bypassPermissions) return m_bypassPermissionsValue; | ||
1213 | |||
1214 | return true; | ||
1215 | } | ||
1216 | |||
1217 | public bool CanCreateInventory(uint invType, UUID objectID, UUID userID) | ||
1218 | { | ||
1219 | DebugPermissionInformation(MethodInfo.GetCurrentMethod().Name); | ||
1220 | if (m_bypassPermissions) return m_bypassPermissionsValue; | ||
1221 | |||
1222 | return true; | ||
1223 | } | ||
1224 | |||
1225 | public bool CanTeleport(UUID userID) | ||
1226 | { | ||
1227 | DebugPermissionInformation(MethodInfo.GetCurrentMethod().Name); | ||
1228 | if (m_bypassPermissions) return m_bypassPermissionsValue; | ||
1229 | |||
1230 | return true; | ||
1231 | } | ||
1232 | } | 1232 | } |
1233 | 1233 | ||
1234 | } | 1234 | } |
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 @@ | |||
1 | [Startup] | 1 | [Startup] |
2 | ; Set this to true if you are connecting your OpenSimulator regions to a grid | ||
3 | ; Set this to false if you are running OpenSimulator in standalone mode | ||
4 | gridmode = false | ||
5 | |||
6 | startup_console_commands_file = "startup_commands.txt" | ||
7 | shutdown_console_commands_file = "shutdown_commands.txt" | ||
8 | |||
9 | ; To run a script every few minutes, set the script filename here | ||
10 | ; timer_Script = "filename" | ||
11 | |||
12 | ; ## | ||
13 | ; ## CLIENTS | ||
14 | ; ## | ||
15 | |||
16 | ; Enables EventQueueGet Service. | ||
17 | EventQueue = true | ||
18 | |||
19 | ; Set this to the DLL containig the client stack to use. | ||
20 | clientstack_plugin="OpenSim.Region.ClientStack.LindenUDP.dll" | ||
21 | |||
22 | ; ## | ||
23 | ; ## REGIONS | ||
24 | ; ## | ||
25 | |||
26 | ; Determine where OpenSimulator looks for the files which tell it which regions to server | ||
27 | ; Defaults to "filesystem" if this setting isn't present | ||
28 | region_info_source = "filesystem" | ||
29 | ; region_info_source = "web" | ||
30 | |||
31 | ; Determines where the region XML files are stored if you are loading these from the filesystem. | ||
32 | ; Defaults to bin/Regions in your OpenSimulator installation directory | ||
33 | ; regionload_regionsdir="C:\somewhere\xmlfiles\" | ||
34 | |||
35 | ; Determines the page from which regions xml is retrieved if you are loading these from the web | ||
36 | ; The XML here has the same format as it does on the filesystem (including the <Root> tag), | ||
37 | ; except that everything is also enclosed in a <Regions> tag. | ||
38 | ; regionload_webserver_url = "http://example.com/regions.xml"; | ||
39 | |||
40 | ; Draw objects on maptile. This step might take a long time if you've got a huge amount of | ||
41 | ; objects, so you can turn it off here if you'd like. | ||
42 | DrawPrimOnMapTile = true | ||
43 | ; Use terrain texture for maptiles if true, use shaded green if false | ||
44 | TextureOnMapTile = false | ||
45 | |||
46 | ; Maximum total size, and maximum size where a prim can be physical | ||
47 | NonPhysicalPrimMax = 256 | ||
48 | PhysicalPrimMax = 10 | ||
49 | ClampPrimSize = false | ||
50 | |||
51 | ; ## | ||
52 | ; ## STORAGE | ||
53 | ; ## | ||
54 | |||
55 | ; *** Prim Storage - only leave one storage_plugin uncommented *** | ||
56 | ; --- Null stores nothing - effectively disabling persistence: | ||
57 | ;storage_plugin = "OpenSim.Data.Null.dll" | ||
58 | |||
59 | ; --- To use sqlite as region storage: | ||
60 | storage_plugin = "OpenSim.Data.SQLite.dll" | ||
61 | storage_connection_string="URI=file:OpenSim.db,version=3"; | ||
62 | |||
63 | ; --- To use MySQL storage, supply your own connectionstring (this is only an example): | ||
64 | ; note that the supplied account needs create privilegies if you want it to auto-create needed tables. | ||
65 | ; storage_plugin="OpenSim.Data.MySQL.dll" | ||
66 | ; storage_connection_string="Data Source=localhost;Database=opensim;User ID=opensim;Password=*****;"; | ||
67 | ; If you want to use a different database/server for estate data, then | ||
68 | ; uncomment and change this connect string. Defaults to the above if not set | ||
69 | ; estate_connection_string="Data Source=localhost;Database=opensim;User ID=opensim;Password=*****;"; | ||
70 | |||
71 | ; Select whether you want to use local or grid asset storage. | ||
72 | ; | ||
73 | ; If you're running in standalone, you definitely want local, since there is no grid (hence this is redundant, and should | ||
74 | ; really be eliminated). The database itself is defined in asset_plugin below | ||
75 | ; | ||
76 | ; If you're running a region server connecting to a grid, you probably want grid mode, since this will use the | ||
77 | ; grid asset server. If you select local in grid mode, then you will use a database as specified in asset_plugin to store assets | ||
78 | ; locally. This will mean you won't be able to take items using your assets to other people's regions. | ||
79 | asset_database = "local" | ||
80 | ;asset_database = "grid" | ||
81 | |||
82 | ; Should avatars in neighbor sims see objects in this sim? | ||
83 | see_into_this_sim_from_neighbor = True | ||
84 | |||
85 | ; ## | ||
86 | ; ## PHYSICS | ||
87 | ; ## | ||
88 | |||
89 | ; 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. | ||
90 | physical_prim = true | ||
91 | |||
92 | ; Select a mesher here. ZeroMesher is save and fast. | ||
93 | ; ZeroMesher also means that the physics engine models the physics of prims | ||
94 | ; sticking to the basic shapes the engine does support. Usually this is only a box. | ||
95 | ; Meshmerizer gives a better handling of complex prims by using triangle meshes. | ||
96 | ; Note, that only ODE physics currently deals with meshed prims in a satisfactoring way | ||
97 | ; | ||
98 | meshing = ZeroMesher | ||
99 | ;meshing = Meshmerizer | ||
100 | |||
101 | ; Choose one of the physics engines below | ||
102 | physics = basicphysics | ||
103 | ;physics = POS | ||
104 | ;physics = OpenDynamicsEngine | ||
105 | ;physics = modified_BulletX | ||
106 | |||
107 | ; ## | ||
108 | ; ## PERMISSIONS | ||
109 | ; ## | ||
110 | |||
111 | ;permissionmodules = "DefaultPermissionsModule" | ||
112 | serverside_object_permissions = false | ||
113 | allow_grid_gods = false | ||
114 | ; This allows somne control over permissions | ||
115 | ; please note that this still doesn't duplicate SL, and is not intended to | ||
116 | ;region_owner_is_god = true | ||
117 | ;parcel_owner_is_god = true | ||
118 | |||
119 | ; ## | ||
120 | ; ## SCRIPT ENGINE | ||
121 | ; ## | ||
122 | |||
123 | DefaultScriptEngine = "ScriptEngine.DotNetEngine" | ||
124 | ;DefaultScriptEngine = "XEngine" | ||
125 | |||
126 | ; ## | ||
127 | ; ## WORLD MAP | ||
128 | ; ## | ||
129 | |||
130 | ;WorldMapModule = "WorldMap" | ||
131 | ;MapImageModule = "MapImageModule" | ||
2 | 132 | ||
3 | ; Set this to true if you are connecting your OpenSimulator regions to a grid | ||
4 | ; Set this to false if you are running OpenSimulator in standalone mode | ||
5 | gridmode = false | ||
6 | |||
7 | ; Enables EventQueueGet Service. | ||
8 | EventQueue = true | ||
9 | |||
10 | ; Set this to the DLL containig the client stack to use. | ||
11 | clientstack_plugin="OpenSim.Region.ClientStack.LindenUDP.dll" | ||
12 | |||
13 | ; ## | ||
14 | ; ## REGIONS | ||
15 | ; ## | ||
16 | |||
17 | ; Determine where OpenSimulator looks for the files which tell it which regions to server | ||
18 | ; Defaults to "filesystem" if this setting isn't present | ||
19 | region_info_source = "filesystem" | ||
20 | ; region_info_source = "web" | ||
21 | |||
22 | ; Determines where the region XML files are stored if you are loading these from the filesystem. | ||
23 | ; Defaults to bin/Regions in your OpenSimulator installation directory | ||
24 | ; regionload_regionsdir="C:\somewhere\xmlfiles\" | ||
25 | |||
26 | ; Determines the page from which regions xml is retrieved if you are loading these from the web | ||
27 | ; The XML here has the same format as it does on the filesystem (including the <Root> tag), | ||
28 | ; except that everything is also enclosed in a <Regions> tag. | ||
29 | ; regionload_webserver_url = "http://example.com/regions.xml"; | ||
30 | |||
31 | ; Draw objects on maptile. This step might take a long time if you've got a huge amount of | ||
32 | ; objects, so you can turn it off here if you'd like. | ||
33 | DrawPrimOnMapTile = true | ||
34 | ; Use terrain texture for maptiles if true, use shaded green if false | ||
35 | TextureOnMapTile = false | ||
36 | |||
37 | ; Maximum total size, and maximum size where a prim can be physical | ||
38 | NonPhysicalPrimMax = 256 | ||
39 | PhysicalPrimMax = 10 | ||
40 | ClampPrimSize = false | ||
41 | |||
42 | ; ## | ||
43 | ; ## STORAGE | ||
44 | ; ## | ||
45 | |||
46 | ; *** Prim Storage - only leave one storage_plugin uncommented *** | ||
47 | ; --- Null stores nothing - effectively disabling persistence: | ||
48 | ;storage_plugin = "OpenSim.Data.Null.dll" | ||
49 | |||
50 | ; --- To use sqlite as region storage: | ||
51 | storage_plugin = "OpenSim.Data.SQLite.dll" | ||
52 | storage_connection_string="URI=file:OpenSim.db,version=3"; | ||
53 | |||
54 | ; --- To use MySQL storage, supply your own connectionstring (this is only an example): | ||
55 | ; note that the supplied account needs create privilegies if you want it to auto-create needed tables. | ||
56 | ; storage_plugin="OpenSim.Data.MySQL.dll" | ||
57 | ; storage_connection_string="Data Source=localhost;Database=opensim;User ID=opensim;Password=*****;"; | ||
58 | ; If you want to use a different database/server for estate data, then | ||
59 | ; uncomment and change this connect string. Defaults to the above if not set | ||
60 | ; estate_connection_string="Data Source=localhost;Database=opensim;User ID=opensim;Password=*****;"; | ||
61 | |||
62 | ; Select whether you want to use local or grid asset storage. | ||
63 | ; | ||
64 | ; If you're running in standalone, you definitely want local, since there is no grid (hence this is redundant, and should | ||
65 | ; really be eliminated). The database itself is defined in asset_plugin below | ||
66 | ; | ||
67 | ; If you're running a region server connecting to a grid, you probably want grid mode, since this will use the | ||
68 | ; grid asset server. If you select local in grid mode, then you will use a database as specified in asset_plugin to store assets | ||
69 | ; locally. This will mean you won't be able to take items using your assets to other people's regions. | ||
70 | asset_database = "local" | ||
71 | ;asset_database = "grid" | ||
72 | |||
73 | ; Should avatars in neighbor sims see objects in this sim? | ||
74 | see_into_this_sim_from_neighbor = True | ||
75 | |||
76 | ; ## | ||
77 | ; ## PHYSICS | ||
78 | ; ## | ||
79 | |||
80 | ; Select a mesher here. ZeroMesher is save and fast. | ||
81 | ; ZeroMesher also means that the physics engine models the physics of prims | ||
82 | ; sticking to the basic shapes the engine does support. Usually this is only a box. | ||
83 | ; Meshmerizer gives a better handling of complex prims by using triangle meshes. | ||
84 | ; Note, that only ODE physics currently deals with meshed prims in a satisfactoring way | ||
85 | ; | ||
86 | meshing = ZeroMesher | ||
87 | ;meshing = Meshmerizer | ||
88 | |||
89 | ; Choose one of the physics engines below | ||
90 | physics = basicphysics | ||
91 | ;physics = POS | ||
92 | ;physics = OpenDynamicsEngine | ||
93 | ;physics = modified_BulletX | ||
94 | |||
95 | |||
96 | startup_console_commands_file = "startup_commands.txt" | ||
97 | shutdown_console_commands_file = "shutdown_commands.txt" | ||
98 | |||
99 | ;permissionmodules = "DefaultPermissionsModule" | ||
100 | serverside_object_permissions = false | ||
101 | allow_grid_gods = false | ||
102 | ; This allows somne control over permissions | ||
103 | ; please note that this still doesn't duplicate SL, and is not intended to | ||
104 | ;region_owner_is_god = true | ||
105 | ;parcel_owner_is_god = true | ||
106 | |||
107 | ; 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. | ||
108 | physical_prim = true | ||
109 | |||
110 | ; To run a script every few minutes, set the script filename here | ||
111 | ; timer_Script = "filename" | ||
112 | |||
113 | ; ## | ||
114 | ; ## ScriptEngine | ||
115 | ; ## | ||
116 | |||
117 | DefaultScriptEngine = "ScriptEngine.DotNetEngine" | ||
118 | ;DefaultScriptEngine = "XEngine" | ||
119 | |||
120 | ; ## | ||
121 | ; ## World Map | ||
122 | ; ## | ||
123 | |||
124 | ;WorldMapModule = "WorldMap" | ||
125 | ;MapImageModule = "MapImageModule" | ||
126 | 133 | ||
127 | [StandAlone] | 134 | [StandAlone] |
128 | accounts_authenticate = true | 135 | accounts_authenticate = true |
129 | welcome_message = "Welcome to OpenSim" | 136 | welcome_message = "Welcome to OpenSim" |
130 | 137 | ||
131 | ; Asset database provider | 138 | ; Asset database provider |
132 | asset_plugin = "OpenSim.Data.SQLite.dll" | 139 | asset_plugin = "OpenSim.Data.SQLite.dll" |
133 | ; asset_plugin = "OpenSim.Data.MySQL.dll" ; for mysql | 140 | ; asset_plugin = "OpenSim.Data.MySQL.dll" ; for mysql |
134 | ; asset_plugin = "OpenSim.Data.NHibernate.dll" ; for nhibernate | 141 | ; asset_plugin = "OpenSim.Data.NHibernate.dll" ; for nhibernate |
135 | 142 | ||
136 | ; the Asset DB source. This only works for sqlite, mysql, and nhibernate for now | 143 | ; the Asset DB source. This only works for sqlite, mysql, and nhibernate for now |
137 | ; Asset Source SQLite example | 144 | ; Asset Source SQLite example |
138 | ; asset_source = "URI=file:Asset.db,version=3" | 145 | ; asset_source = "URI=file:Asset.db,version=3" |
139 | ; Asset Source NHibernate example (DIALECT;DRIVER;CONNECTSTRING) | 146 | ; Asset Source NHibernate example (DIALECT;DRIVER;CONNECTSTRING) |
140 | ; asset_source = "SQLiteDialect;SqliteClientDriver;URI=file:Asset.db,version=3" | 147 | ; asset_source = "SQLiteDialect;SqliteClientDriver;URI=file:Asset.db,version=3" |
141 | ; Asset Source MySQL example | 148 | ; Asset Source MySQL example |
142 | ;asset_source = "Data Source=localhost;Database=opensim;User ID=opensim;Password=****;" | 149 | ;asset_source = "Data Source=localhost;Database=opensim;User ID=opensim;Password=****;" |
143 | 150 | ||
144 | ; Inventory database provider | 151 | ; Inventory database provider |
145 | inventory_plugin = "OpenSim.Data.SQLite.dll" | 152 | inventory_plugin = "OpenSim.Data.SQLite.dll" |
146 | ; inventory_plugin = "OpenSim.Data.MySQL.dll" | 153 | ; inventory_plugin = "OpenSim.Data.MySQL.dll" |
147 | ; inventory_plugin = "OpenSim.Data.NHibernate.dll" ; for nhibernate | 154 | ; inventory_plugin = "OpenSim.Data.NHibernate.dll" ; for nhibernate |
148 | 155 | ||
149 | ; Inventory Source NHibernate example (DIALECT;DRIVER;CONNECTSTRING) | 156 | ; Inventory Source NHibernate example (DIALECT;DRIVER;CONNECTSTRING) |
150 | ; inventory_source = "SQLiteDialect;SqliteClientDriver;URI=file:Inventory.db,version=3" | 157 | ; inventory_source = "SQLiteDialect;SqliteClientDriver;URI=file:Inventory.db,version=3" |
151 | ; Inventory Source MySQL example | 158 | ; Inventory Source MySQL example |
152 | ;inventory_source = "Data Source=localhost;Database=opensim;User ID=opensim;Password=****;" | 159 | ;inventory_source = "Data Source=localhost;Database=opensim;User ID=opensim;Password=****;" |
153 | 160 | ||
154 | 161 | ||
155 | ; User Data Database provider | 162 | ; User Data Database provider |
156 | ; | 163 | ; |
157 | ; Multiple providers can be specified by separating them with commas (whitespace is unimportant) | 164 | ; Multiple providers can be specified by separating them with commas (whitespace is unimportant) |
158 | ; If multiple providers are specified then if a profile is requested, each is queried until one | 165 | ; If multiple providers are specified then if a profile is requested, each is queried until one |
159 | ; provides a valid profile, or until all providers have been queried. | 166 | ; provides a valid profile, or until all providers have been queried. |
160 | ; Unfortunately the order of querying is currently undefined (it may not be the order in which | 167 | ; Unfortunately the order of querying is currently undefined (it may not be the order in which |
161 | ; providers are specified here). This needs to be fixed | 168 | ; providers are specified here). This needs to be fixed |
162 | ; | 169 | ; |
163 | userDatabase_plugin = "OpenSim.Data.SQLite.dll" | 170 | userDatabase_plugin = "OpenSim.Data.SQLite.dll" |
164 | ; userDatabase_plugin = "OpenSim.Data.MySQL.dll" | 171 | ; userDatabase_plugin = "OpenSim.Data.MySQL.dll" |
165 | ; userDatabase_plugin = "OpenSim.Data.NHibernate.dll" ; for nhibernate | 172 | ; userDatabase_plugin = "OpenSim.Data.NHibernate.dll" ; for nhibernate |
166 | 173 | ||
167 | ; User Source NHibernate Example (DIALECT;DRIVER;CONNECTSTRING) | 174 | ; User Source NHibernate Example (DIALECT;DRIVER;CONNECTSTRING) |
168 | ; user_source = "SQLiteDialect;SqliteClientDriver;URI=file:User.db,version=3" | 175 | ; user_source = "SQLiteDialect;SqliteClientDriver;URI=file:User.db,version=3" |
169 | ; User Source MySQL example | 176 | ; User Source MySQL example |
170 | ;user_source = "Data Source=localhost;Database=opensim;User ID=opensim;Password=****;" | 177 | ;user_source = "Data Source=localhost;Database=opensim;User ID=opensim;Password=****;" |
171 | 178 | ||
172 | dump_assets_to_file = false | 179 | dump_assets_to_file = false |
173 | 180 | ||
174 | 181 | ||
175 | [Network] | 182 | [Network] |
176 | http_listener_port = 9000 | 183 | http_listener_port = 9000 |
177 | remoting_listener_port = 8895 | 184 | remoting_listener_port = 8895 |
178 | default_location_x = 1000 | 185 | default_location_x = 1000 |
179 | default_location_y = 1000 | 186 | default_location_y = 1000 |
180 | 187 | ||
181 | ; ssl config: Experimental! The auto https config only really works definately on windows XP now | 188 | ; ssl config: Experimental! The auto https config only really works definately on windows XP now |
182 | ; you need a Cert Request/Signed pair installed in the MY store with the CN specified below | 189 | ; you need a Cert Request/Signed pair installed in the MY store with the CN specified below |
183 | ; you can use https on other platforms, but you'll need to configure the httpapi yourself for now | 190 | ; you can use https on other platforms, but you'll need to configure the httpapi yourself for now |
184 | http_listener_ssl = false ; Also create a SSL server | 191 | http_listener_ssl = false ; Also create a SSL server |
185 | http_listener_cn = "localhost" ; Use the cert with the common name | 192 | http_listener_cn = "localhost" ; Use the cert with the common name |
186 | http_listener_sslport = 9001 ; Use this port for SSL connections | 193 | http_listener_sslport = 9001 ; Use this port for SSL connections |
187 | http_listener_ssl_cert = "" ; Currently unused, but will be used for OSHttpServer | 194 | http_listener_ssl_cert = "" ; Currently unused, but will be used for OSHttpServer |
188 | 195 | ||
189 | ; Uncomment below to enable llRemoteData/remote channels | 196 | ; Uncomment below to enable llRemoteData/remote channels |
190 | ; remoteDataPort = 20800 | 197 | ; remoteDataPort = 20800 |
191 | 198 | ||
192 | grid_server_url = "http://127.0.0.1:8001" | 199 | grid_server_url = "http://127.0.0.1:8001" |
193 | grid_send_key = "null" | 200 | grid_send_key = "null" |
194 | grid_recv_key = "null" | 201 | grid_recv_key = "null" |
195 | 202 | ||
196 | user_server_url = "http://127.0.0.1:8002" | 203 | user_server_url = "http://127.0.0.1:8002" |
197 | user_send_key = "null" | 204 | user_send_key = "null" |
198 | user_recv_key = "null" | 205 | user_recv_key = "null" |
199 | 206 | ||
200 | asset_server_url = "http://127.0.0.1:8003" | 207 | asset_server_url = "http://127.0.0.1:8003" |
201 | 208 | ||
202 | inventory_server_url = "http://127.0.0.1:8004" | 209 | inventory_server_url = "http://127.0.0.1:8004" |
203 | 210 | ||
204 | ; The MessagingServer is a companion of the UserServer. It uses | 211 | ; The MessagingServer is a companion of the UserServer. It uses |
205 | ; user_send_key and user_recv_key, too | 212 | ; user_send_key and user_recv_key, too |
206 | messaging_server_url = "http://127.0.0.1:8006" | 213 | messaging_server_url = "http://127.0.0.1:8006" |
207 | 214 | ||
208 | [ClientStack.LindenUDP] | 215 | [ClientStack.LindenUDP] |
209 | ; This is the multiplier applied to all client throttles for outgoing UDP network data | 216 | ; This is the multiplier applied to all client throttles for outgoing UDP network data |
210 | ; 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 | 217 | ; 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 |
211 | ; multiply that setting by 3 (e.g. if the client gives us a setting of 250 kilobits per second then we | 218 | ; multiply that setting by 3 (e.g. if the client gives us a setting of 250 kilobits per second then we |
212 | ; will actually push down data at a maximum rate of 750 kilobits per second). | 219 | ; will actually push down data at a maximum rate of 750 kilobits per second). |
213 | ; | 220 | ; |
214 | ; In principle, setting a multiplier greater than 1 will allow data to be pushed down to a client much faster | 221 | ; In principle, setting a multiplier greater than 1 will allow data to be pushed down to a client much faster |
215 | ; than its UI allows the setting to go. This may be okay in some situations, such as standalone OpenSim | 222 | ; than its UI allows the setting to go. This may be okay in some situations, such as standalone OpenSim |
216 | ; applications on a LAN. However, the greater the multipler, the higher the risk of packet drop, resulting | 223 | ; applications on a LAN. However, the greater the multipler, the higher the risk of packet drop, resulting |
217 | ; in symptoms such as missing terrain or objects. A much better solution is to change the client UI to allow | 224 | ; in symptoms such as missing terrain or objects. A much better solution is to change the client UI to allow |
218 | ; higher network bandwidth settings directly, though this isn't always possible. | 225 | ; higher network bandwidth settings directly, though this isn't always possible. |
219 | ; | 226 | ; |
220 | ; Currently this setting is 2 by default because we currently send much more texture data than is strictly | 227 | ; Currently this setting is 2 by default because we currently send much more texture data than is strictly |
221 | ; necessary. A setting of 1 could result in slow texture transfer. This will be fixed when the transfer | 228 | ; necessary. A setting of 1 could result in slow texture transfer. This will be fixed when the transfer |
222 | ; of textures at different levels of quality is improved. | 229 | ; of textures at different levels of quality is improved. |
223 | ; | 230 | ; |
224 | ; Pre r7113, this setting was not exposed but was effectively 8. You may want to try this if you encounter | 231 | ; Pre r7113, this setting was not exposed but was effectively 8. You may want to try this if you encounter |
225 | ; unexpected difficulties | 232 | ; unexpected difficulties |
226 | client_throttle_multiplier = 2; | 233 | client_throttle_multiplier = 2; |
234 | |||
227 | 235 | ||
228 | [Chat] | 236 | [Chat] |
229 | whisper_distance = 10 | 237 | whisper_distance = 10 |
230 | say_distance = 30 | 238 | say_distance = 30 |
231 | shout_distance = 100 | 239 | shout_distance = 100 |
232 | 240 | ||
233 | 241 | ||
234 | [ODEPhysicsSettings] | 242 | [ODEPhysicsSettings] |
243 | ;## | ||
244 | ;## World Settings | ||
245 | ;## | ||
235 | 246 | ||
236 | ;## | 247 | ;Gravity. Feel like falling up? change world_gravityz to 9.8 instead of -9.8. m/s |
237 | ;## World Settings | 248 | world_gravityx = 0 |
238 | ;## | 249 | world_gravityy = 0 |
239 | 250 | world_gravityz = -9.8 | |
240 | ;Gravity. Feel like falling up? change world_gravityz to 9.8 instead of -9.8. m/s | ||
241 | world_gravityx = 0 | ||
242 | world_gravityy = 0 | ||
243 | world_gravityz = -9.8 | ||
244 | 251 | ||
245 | ; World Step size. (warning these are dangerous. Changing these will probably cause your scene to explode dramatically) | 252 | ; World Step size. (warning these are dangerous. Changing these will probably cause your scene to explode dramatically) |
246 | ; reference: fps = (0.09375/ODE_STEPSIZE) * 1000; | 253 | ; reference: fps = (0.09375/ODE_STEPSIZE) * 1000; |
247 | world_stepsize = 0.020 | 254 | world_stepsize = 0.020 |
248 | world_internal_steps_without_collisions = 10 | 255 | world_internal_steps_without_collisions = 10 |
249 | 256 | ||
250 | ;World Space settings. Affects memory consumption vs Collider CPU time for avatar and physical prim | 257 | ;World Space settings. Affects memory consumption vs Collider CPU time for avatar and physical prim |
251 | world_hashspace_size_low = -4 | 258 | world_hashspace_size_low = -4 |
252 | world_hashSpace_size_high = 128 | 259 | world_hashSpace_size_high = 128 |
253 | 260 | ||
254 | ;Dynamic space settings Affects memory consumption vs Collider CPU time for static prim | 261 | ;Dynamic space settings Affects memory consumption vs Collider CPU time for static prim |
255 | meters_in_small_space = 29.9 | 262 | meters_in_small_space = 29.9 |
256 | small_hashspace_size_low = -4 | 263 | small_hashspace_size_low = -4 |
257 | small_hashspace_size_high = 66 | 264 | small_hashspace_size_high = 66 |
258 | 265 | ||
259 | ; ## | 266 | ; ## |
260 | ; ## Contact properties. (the stuff that happens when things come in contact with each other) | 267 | ; ## Contact properties. (the stuff that happens when things come in contact with each other) |
261 | ; ## | 268 | ; ## |
262 | 269 | ||
263 | ; surface layer around geometries other geometries can sink into before generating a contact | 270 | ; surface layer around geometries other geometries can sink into before generating a contact |
264 | world_contact_surface_layer = 0.001 | 271 | world_contact_surface_layer = 0.001 |
265 | 272 | ||
266 | ; Filtering Collisions helps keep things stable physics wise, but sometimes | 273 | ; Filtering Collisions helps keep things stable physics wise, but sometimes |
267 | ; it can be over zealous. If you notice bouncing, chances are it's being just | 274 | ; it can be over zealous. If you notice bouncing, chances are it's being just |
268 | ; that | 275 | ; that |
269 | filter_collisions = true | 276 | filter_collisions = true |
270 | 277 | ||
271 | ; Non Moving Terrain Contact (avatar isn't moving) | 278 | ; Non Moving Terrain Contact (avatar isn't moving) |
272 | nm_terraincontact_friction = 255.0 | 279 | nm_terraincontact_friction = 255.0 |
273 | nm_terraincontact_bounce = 0.1 | 280 | nm_terraincontact_bounce = 0.1 |
274 | nm_terraincontact_erp = 0.1025 | 281 | nm_terraincontact_erp = 0.1025 |
275 | 282 | ||
276 | ; Moving Terrain Contact (avatar is moving) | 283 | ; Moving Terrain Contact (avatar is moving) |
277 | 284 | ||
278 | m_terraincontact_friction = 75.0 | 285 | m_terraincontact_friction = 75.0 |
279 | m_terraincontact_bounce = 0.05 | 286 | m_terraincontact_bounce = 0.05 |
280 | m_terrainContact_erp = 0.05025 | 287 | m_terrainContact_erp = 0.05025 |
281 | 288 | ||
282 | ; Moving Avatar to object Contact | 289 | ; Moving Avatar to object Contact |
283 | 290 | ||
284 | m_avatarobjectcontact_friction = 75.0 | 291 | m_avatarobjectcontact_friction = 75.0 |
285 | m_avatarobjectcontact_bounce = 0.1 | 292 | m_avatarobjectcontact_bounce = 0.1 |
286 | 293 | ||
287 | ; Object to Object Contact and Non-Moving Avatar to object | 294 | ; Object to Object Contact and Non-Moving Avatar to object |
288 | 295 | ||
289 | objectcontact_friction = 250.0 | 296 | objectcontact_friction = 250.0 |
290 | objectcontact_bounce = 0.2 | 297 | objectcontact_bounce = 0.2 |
291 | 298 | ||
292 | ; ## | 299 | ; ## |
293 | ; ## Avatar Control | 300 | ; ## Avatar Control |
294 | ; ## | 301 | ; ## |
295 | 302 | ||
296 | ; PID Controller Settings. These affect the math that causes the avatar to reach the | 303 | ; PID Controller Settings. These affect the math that causes the avatar to reach the |
297 | ; desired velocity | 304 | ; desired velocity |
298 | ; See http://en.wikipedia.org/wiki/PID_controller | 305 | ; See http://en.wikipedia.org/wiki/PID_controller |
299 | 306 | ||
300 | av_pid_derivative_linux = 2200.0 | 307 | av_pid_derivative_linux = 2200.0 |
301 | av_pid_proportional_linux = 900.0; | 308 | av_pid_proportional_linux = 900.0; |
302 | 309 | ||
303 | av_pid_derivative_win = 2200.0 | 310 | av_pid_derivative_win = 2200.0 |
304 | av_pid_proportional_win = 900.0; | 311 | av_pid_proportional_win = 900.0; |
305 | 312 | ||
306 | ;girth of the avatar. Adds radius to the height also | 313 | ;girth of the avatar. Adds radius to the height also |
307 | av_capsule_radius = 0.37 | 314 | av_capsule_radius = 0.37 |
308 | 315 | ||
309 | ; Max force permissible to use to keep the avatar standing up straight | 316 | ; Max force permissible to use to keep the avatar standing up straight |
310 | av_capsule_standup_tensor_win = 550000 | 317 | av_capsule_standup_tensor_win = 550000 |
311 | av_capsule_standup_tensor_linux = 550000 | 318 | av_capsule_standup_tensor_linux = 550000 |
312 | 319 | ||
313 | ; used to calculate mass of avatar. | 320 | ; used to calculate mass of avatar. |
314 | ; float AVvolume = (float) (Math.PI*Math.Pow(CAPSULE_RADIUS, 2)*CAPSULE_LENGTH); | 321 | ; float AVvolume = (float) (Math.PI*Math.Pow(CAPSULE_RADIUS, 2)*CAPSULE_LENGTH); |
315 | ; av_density * AVvolume; | 322 | ; av_density * AVvolume; |
316 | 323 | ||
317 | av_density = 80 | 324 | av_density = 80 |
318 | 325 | ||
319 | ; use this value to cut 52% of the height the sim gives us | 326 | ; use this value to cut 52% of the height the sim gives us |
320 | av_height_fudge_factor = 0.52 | 327 | av_height_fudge_factor = 0.52 |
321 | 328 | ||
322 | ; Movement. Smaller is faster. | 329 | ; Movement. Smaller is faster. |
323 | 330 | ||
324 | ; speed of movement with Always Run off | 331 | ; speed of movement with Always Run off |
325 | av_movement_divisor_walk = 1.3 | 332 | av_movement_divisor_walk = 1.3 |
326 | 333 | ||
327 | ; speed of movement with Always Run on | 334 | ; speed of movement with Always Run on |
328 | av_movement_divisor_run = 0.8 | 335 | av_movement_divisor_run = 0.8 |
329 | 336 | ||
330 | ; ## | 337 | ; ## |
331 | ; ## Object options | 338 | ; ## Object options |
332 | ; ## | 339 | ; ## |
333 | 340 | ||
334 | ; used in the mass calculation. | 341 | ; used in the mass calculation. |
335 | geometry_default_density = 10.000006836 | 342 | geometry_default_density = 10.000006836 |
336 | 343 | ||
337 | ; amount of ODE steps where object is non moving for ODE to automatically put it to sleep | 344 | ; amount of ODE steps where object is non moving for ODE to automatically put it to sleep |
338 | body_frames_auto_disable = 20 | 345 | body_frames_auto_disable = 20 |
339 | 346 | ||
340 | ; used to control llMove2Target | 347 | ; used to control llMove2Target |
341 | body_pid_derivative = 35 | 348 | body_pid_derivative = 35 |
342 | body_pid_gain = 25 | 349 | body_pid_gain = 25 |
343 | 350 | ||
344 | ; amount of time a geom/body will try to cross a region border before it gets disabled | 351 | ; amount of time a geom/body will try to cross a region border before it gets disabled |
345 | geom_crossing_faiures_before_outofbounds = 5 | 352 | geom_crossing_faiures_before_outofbounds = 5 |
346 | 353 | ||
347 | ; start throttling the object updates if object comes in contact with 3 or more other objects | 354 | ; start throttling the object updates if object comes in contact with 3 or more other objects |
348 | geom_contactpoints_start_throttling = 3 | 355 | geom_contactpoints_start_throttling = 3 |
349 | 356 | ||
350 | ; send 1 update for every x updates below when throttled | 357 | ; send 1 update for every x updates below when throttled |
351 | geom_updates_before_throttled_update = 15 | 358 | geom_updates_before_throttled_update = 15 |
352 | 359 | ||
353 | ; Used for llSetStatus. How rigid the object rotation is held on the axis specified | 360 | ; Used for llSetStatus. How rigid the object rotation is held on the axis specified |
354 | body_motor_joint_maxforce_tensor_linux = 5 | 361 | body_motor_joint_maxforce_tensor_linux = 5 |
355 | body_motor_joint_maxforce_tensor_win = 5 | 362 | body_motor_joint_maxforce_tensor_win = 5 |
356 | 363 | ||
357 | ; ## | 364 | ; ## |
358 | ; ## Sculpted Prim settings | 365 | ; ## Sculpted Prim settings |
359 | ; ## | 366 | ; ## |
360 | 367 | ||
361 | ; Do we want to mesh sculpted prim to collide like they look? | 368 | ; Do we want to mesh sculpted prim to collide like they look? |
362 | mesh_sculpted_prim = true | 369 | mesh_sculpted_prim = true |
363 | 370 | ||
364 | ; number^2 non-physical level of detail of the sculpt texture. 32x32 - 1024 verticies | 371 | ; number^2 non-physical level of detail of the sculpt texture. 32x32 - 1024 verticies |
365 | mesh_lod = 32 | 372 | mesh_lod = 32 |
366 | 373 | ||
367 | ; number^2 physical level of detail of the sculpt texture. 16x16 - 256 verticies | 374 | ; number^2 physical level of detail of the sculpt texture. 16x16 - 256 verticies |
368 | mesh_physical_lod = 16 | 375 | mesh_physical_lod = 16 |
369 | 376 | ||
370 | ; ## | 377 | ; ## |
371 | ; ## Physics logging settings - logfiles are saved to *.DIF files | 378 | ; ## Physics logging settings - logfiles are saved to *.DIF files |
372 | ; ## | 379 | ; ## |
373 | 380 | ||
374 | ;physics_logging = true | 381 | ;physics_logging = true |
375 | ;; every n simulation iterations, the physics snapshot file is updated | 382 | ;; every n simulation iterations, the physics snapshot file is updated |
376 | ;physics_logging_interval = 50 | 383 | ;physics_logging_interval = 50 |
377 | ;; append to existing physics logfile, or overwrite existing logfiles? | 384 | ;; append to existing physics logfile, or overwrite existing logfiles? |
378 | ;physics_logging_append_existing_logfile = true | 385 | ;physics_logging_append_existing_logfile = true |
379 | 386 | ||
380 | 387 | ||
381 | [RemoteAdmin] | 388 | [RemoteAdmin] |
382 | enabled = false | 389 | enabled = false |
383 | access_password = unknown | 390 | access_password = unknown |
384 | 391 | ||
385 | ; the create_region XmlRpc call uses region_file_template to generate | 392 | ; the create_region XmlRpc call uses region_file_template to generate |
386 | ; the file name of newly create regions (if they are created | 393 | ; the file name of newly create regions (if they are created |
387 | ; persistent). the parameter available are: | 394 | ; persistent). the parameter available are: |
388 | ; {0} - X location | 395 | ; {0} - X location |
389 | ; {1} - Y location | 396 | ; {1} - Y location |
390 | ; {2} - region UUID | 397 | ; {2} - region UUID |
391 | ; {3} - region port | 398 | ; {3} - region port |
392 | ; {4} - region name with " ", ":", "/" mapped to "_" | 399 | ; {4} - region name with " ", ":", "/" mapped to "_" |
393 | 400 | ||
394 | region_file_template = "{0}x{1}-{2}.xml" | 401 | region_file_template = "{0}x{1}-{2}.xml" |
395 | 402 | ||
396 | ; we can limit the number of regions that XmlRpcCreateRegion will | 403 | ; we can limit the number of regions that XmlRpcCreateRegion will |
397 | ;allow by setting this to a positive, non-0 number: as long as the | 404 | ;allow by setting this to a positive, non-0 number: as long as the |
398 | ;number of regions is below region_limits, XmlRpcCreateRegion will | 405 | ;number of regions is below region_limits, XmlRpcCreateRegion will |
399 | ;succeed. setting region_limits to 0 disables the check. | 406 | ;succeed. setting region_limits to 0 disables the check. |
400 | ;region_limits = 0 | 407 | ;region_limits = 0 |
408 | |||
401 | 409 | ||
402 | [RestPlugins] | 410 | [RestPlugins] |
403 | ; Change this to true to enable REST Plugins. This must be true if you wish to use | 411 | ; Change this to true to enable REST Plugins. This must be true if you wish to use |
404 | ; REST Region or REST Asset and Inventory Plugins | 412 | ; REST Region or REST Asset and Inventory Plugins |
405 | enabled = false | 413 | enabled = false |
406 | god_key = SECRET | 414 | god_key = SECRET |
407 | prefix = /admin | 415 | prefix = /admin |
408 | 416 | ||
409 | 417 | ||
410 | [RestRegionPlugin] | 418 | [RestRegionPlugin] |
411 | ; Change this to true to enable the REST Region Plugin | 419 | ; Change this to true to enable the REST Region Plugin |
412 | enabled = false | 420 | enabled = false |
421 | |||
413 | 422 | ||
414 | [RestHandler] | 423 | [RestHandler] |
415 | ; Change this to true to enable the REST Asset and Inventory Plugin | 424 | ; Change this to true to enable the REST Asset and Inventory Plugin |
416 | enabled = false | 425 | enabled = false |
417 | authenticate=true | 426 | authenticate=true |
418 | secured=true | 427 | secured=true |
419 | extended-escape=true | 428 | extended-escape=true |
420 | realm=OpenSim REST | 429 | realm=OpenSim REST |
421 | dump-asset=false | 430 | dump-asset=false |
422 | path-fill=true | 431 | path-fill=true |
423 | dump-line-size=32 | 432 | dump-line-size=32 |
424 | flush-on-error=true | 433 | flush-on-error=true |
425 | 434 | ||
426 | ; Uncomment the following for IRC bridge | 435 | ; Uncomment the following for IRC bridge |
427 | ; experimental, so if it breaks... keep both parts... yada yada | 436 | ; experimental, so if it breaks... keep both parts... yada yada |
428 | ; also, not good error detection when it fails | 437 | ; also, not good error detection when it fails |
429 | ;[IRC] | 438 | ;[IRC] |
430 | ;enabled = true ; you need to set this otherwise it won't connect | 439 | ;enabled = true ; you need to set this otherwise it won't connect |
431 | ;server = name.of.irc.server.on.the.net | 440 | ;server = name.of.irc.server.on.the.net |
432 | ;nick = OpenSimBotNameProbablyMakeThisShorter | 441 | ;nick = OpenSimBotNameProbablyMakeThisShorter |
433 | ;channel = #the_irc_channel_you_want_to_connect_to | 442 | ;channel = #the_irc_channel_you_want_to_connect_to |
434 | ;port = 6667 | 443 | ;port = 6667 |
435 | ;; channel to listen for configuration commands | 444 | ;; channel to listen for configuration commands |
436 | ;commands_enabled = false | 445 | ;commands_enabled = false |
437 | ;command_channel = 2777 | 446 | ;command_channel = 2777 |
438 | ;report_clients = true | 447 | ;report_clients = true |
439 | ;; relay private chat connections | 448 | ;; relay private chat connections |
440 | ;; relay_private_channels = true: will relay IRC chat from/to private in-world channels | 449 | ;; relay_private_channels = true: will relay IRC chat from/to private in-world channels |
441 | ;; relay_private_channel_out -- channel to send messages out to the IRC bridge | 450 | ;; relay_private_channel_out -- channel to send messages out to the IRC bridge |
442 | ;; relay_private_channel_in -- channel to receive message from the IRC bridge | 451 | ;; relay_private_channel_in -- channel to receive message from the IRC bridge |
443 | ;; relay_chat = false: IRC bridge will not relay normal chat | 452 | ;; relay_chat = false: IRC bridge will not relay normal chat |
444 | ;; access_password -- simple security device | 453 | ;; access_password -- simple security device |
445 | ;; | 454 | ;; |
446 | ;; so, to just relay chat from an IRC channel to in-world region and vice versa: | 455 | ;; so, to just relay chat from an IRC channel to in-world region and vice versa: |
447 | ;; | 456 | ;; |
448 | ;; relay_private_channels = false | 457 | ;; relay_private_channels = false |
449 | ;; relay_chat = true | 458 | ;; relay_chat = true |
450 | ;; | 459 | ;; |
451 | ;; to relay chat only to/from private in-world channels: | 460 | ;; to relay chat only to/from private in-world channels: |
452 | ;; | 461 | ;; |
453 | ;; relay_chat = false | 462 | ;; relay_chat = false |
454 | ;; relay_private_channels = true | 463 | ;; relay_private_channels = true |
455 | ;; relay_private_channel_in = 2226 | 464 | ;; relay_private_channel_in = 2226 |
456 | ;; relay_private_channel_out = 2225 | 465 | ;; relay_private_channel_out = 2225 |
457 | ;; | 466 | ;; |
458 | ;; in this example, all chat coming in from IRC will be send out via | 467 | ;; in this example, all chat coming in from IRC will be send out via |
459 | ;; in-world channel 2226, and all chat from in-world channel 2225 will | 468 | ;; in-world channel 2226, and all chat from in-world channel 2225 will |
460 | ;; be relayed to the IRC channel. | 469 | ;; be relayed to the IRC channel. |
461 | ;; | 470 | ;; |
462 | ;relay_private_channels = false | 471 | ;relay_private_channels = false |
463 | ;relay_private_channel_in = 2226 | 472 | ;relay_private_channel_in = 2226 |
464 | ;relay_private_channel_out = 2225 | 473 | ;relay_private_channel_out = 2225 |
465 | ;relay_chat = true | 474 | ;relay_chat = true |
466 | ;access_password = foobar | 475 | ;access_password = foobar |
467 | 476 | ||
468 | ;fallback_region = name of "default" region | 477 | ;fallback_region = name of "default" region |
469 | ;MSGformat fields : 0=botnick, 1=user, 2=region, 3=message | 478 | ;MSGformat fields : 0=botnick, 1=user, 2=region, 3=message |
470 | ; must start with "PRIVMSG {0} : " or irc server will get upset | 479 | ; must start with "PRIVMSG {0} : " or irc server will get upset |
471 | ;for <bot>:<user in region> :<message> | 480 | ;for <bot>:<user in region> :<message> |
472 | ;msgformat = "PRIVMSG {0} :<{1} in {2}>: {3}" | 481 | ;msgformat = "PRIVMSG {0} :<{1} in {2}>: {3}" |
473 | ;for <bot>:<message> - <user of region> : | 482 | ;for <bot>:<message> - <user of region> : |
474 | msgformat = "PRIVMSG {0} : {3} - {1} of {2}" | 483 | msgformat = "PRIVMSG {0} : {3} - {1} of {2}" |
475 | ;for <bot>:<message> - from <user> : | 484 | ;for <bot>:<message> - from <user> : |
476 | ;msgformat = "PRIVMSG {0} : {3} - from {1}" | 485 | ;msgformat = "PRIVMSG {0} : {3} - from {1}" |
486 | |||
477 | 487 | ||
478 | ; work-in-progress IRCBridge capabable of supporting multiple IRC channels | 488 | ; work-in-progress IRCBridge capabable of supporting multiple IRC channels |
479 | ; [XIRC] | 489 | ; [XIRC] |
480 | ; enabled = false | 490 | ; enabled = false |
491 | |||
492 | ; Uncomment the following for experiment in world versioning | ||
493 | ; support. This is so experimental at this point that I'm not going | ||
494 | ; to explain it further, you'll need to read the source code | ||
495 | |||
481 | 496 | ||
482 | ; Uncomment the following for experiment in world versioning | ||
483 | ; support. This is so experimental at this point that I'm not going | ||
484 | ; to explain it further, you'll need to read the source code | ||
485 | ;[CMS] | 497 | ;[CMS] |
486 | ;enabled = true | 498 | ;enabled = true |
487 | ;channel = 345 | 499 | ;channel = 345 |
500 | |||
488 | 501 | ||
489 | [Voice] | 502 | [Voice] |
490 | ; PLEASE NOTE that we don't have voice support in OpenSim quite yet - these configuration options are stubs | 503 | ; PLEASE NOTE that we don't have voice support in OpenSim quite yet - these configuration options are stubs |
491 | enabled = false | 504 | enabled = false |
492 | ; This is not supported by the SLViewer right now and | 505 | ; This is not supported by the SLViewer right now and |
493 | ; hardcoded within the SL Viewer. Maybe it will be | 506 | ; hardcoded within the SL Viewer. Maybe it will be |
494 | ; changed in future. :-) | 507 | ; changed in future. :-) |
495 | account_management_server = https://www.bhr.vivox.com/api2 | 508 | account_management_server = https://www.bhr.vivox.com/api2 |
496 | ; Global SIP Server for conference calls | 509 | ; Global SIP Server for conference calls |
497 | sip_domain = testserver.com | 510 | sip_domain = testserver.com |
498 | 511 | ||
499 | 512 | ||
500 | [AsteriskVoice] | 513 | [AsteriskVoice] |
501 | ; PLEASE NOTE that we don't have voice support in OpenSim quite yet - these configuration options are stubs | 514 | ; PLEASE NOTE that we don't have voice support in OpenSim quite yet - these configuration options are stubs |
502 | enabled = false | 515 | enabled = false |
503 | ; SIP account server domain | 516 | ; SIP account server domain |
504 | sip_domain = testserver.com | 517 | sip_domain = testserver.com |
505 | ; SIP conf server domain | 518 | ; SIP conf server domain |
506 | conf_domain = testserver.com | 519 | conf_domain = testserver.com |
507 | ; URL of the asterisk opensim frontend | 520 | ; URL of the asterisk opensim frontend |
508 | asterisk_frontend = http://testserver.com:49153/ | 521 | asterisk_frontend = http://testserver.com:49153/ |
509 | ; password for the asterisk frontend XmlRpc calls | 522 | ; password for the asterisk frontend XmlRpc calls |
510 | asterisk_password = bah-humbug | 523 | asterisk_password = bah-humbug |
511 | ; timeout for XmlRpc calls to asterisk front end (in ms) | 524 | ; timeout for XmlRpc calls to asterisk front end (in ms) |
512 | asterisk_timeout = 3000 | 525 | asterisk_timeout = 3000 |
513 | ; salt for asterisk nonces | 526 | ; salt for asterisk nonces |
514 | asterisk_salt = paluempalum | 527 | asterisk_salt = paluempalum |
515 | 528 | ||
516 | 529 | ||
517 | ; Uncomment the following to control the progression of daytime | 530 | ; Uncomment the following to control the progression of daytime |
518 | ; in the Sim. The defaults are what is shown below | 531 | ; in the Sim. The defaults are what is shown below |
519 | ;[Sun] | 532 | ;[Sun] |
520 | ; number of wall clock hours for an opensim day. 24.0 would mean realtime | 533 | ; number of wall clock hours for an opensim day. 24.0 would mean realtime |
521 | ;day_length = 4 | 534 | ;day_length = 4 |
522 | ; Year length in days | 535 | ; Year length in days |
523 | ;year_length = 60 | 536 | ;year_length = 60 |
524 | ; Day to Night Ratio | 537 | ; Day to Night Ratio |
525 | ;day_night_offset = 0.45 | 538 | ;day_night_offset = 0.45 |
526 | ; send a Sun update every update_interval # of frames. A lower number will | 539 | ; send a Sun update every update_interval # of frames. A lower number will |
527 | ; make for smoother sun transition at the cost of network | 540 | ; make for smoother sun transition at the cost of network |
528 | ;update_interval = 100 | 541 | ;update_interval = 100 |
529 | 542 | ||
530 | 543 | ||
531 | [ScriptEngine.DotNetEngine] | 544 | [ScriptEngine.DotNetEngine] |
532 | Enabled = true | 545 | Enabled = true |
533 | 546 | ||
534 | ScriptDelayFactor = 1.0 | 547 | ScriptDelayFactor = 1.0 |
535 | ScriptDistanceLimitFactor = 1.0 | 548 | ScriptDistanceLimitFactor = 1.0 |
536 | 549 | ||
537 | 550 | ||
538 | ; | 551 | ; |
539 | ; These settings are specific to DotNetEngine script engine | 552 | ; These settings are specific to DotNetEngine script engine |
540 | ; Other script engines based on OpenSim.Region.ScriptEngine.Common.dll will have almost identical settings, but in another section of this config file. | 553 | ; Other script engines based on OpenSim.Region.ScriptEngine.Common.dll will have almost identical settings, but in another section of this config file. |
541 | ; | 554 | ; |
542 | 555 | ||
543 | ; When a script receives an event the event is queued. | 556 | ; When a script receives an event the event is queued. |
544 | ; Any free thread will start executing this event. One script can only have one event executed simultaneously. | 557 | ; Any free thread will start executing this event. One script can only have one event executed simultaneously. |
545 | ; 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. | 558 | ; 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. |
546 | ; Same if you have 10 threads, then only 10 scripts can be run simultaneously. | 559 | ; Same if you have 10 threads, then only 10 scripts can be run simultaneously. |
547 | ; But because most scripts exit after their task, the threads are free to go on to the next script. | 560 | ; But because most scripts exit after their task, the threads are free to go on to the next script. |
548 | 561 | ||
549 | ; Refresh ScriptEngine config options (these settings) every xx seconds | 562 | ; Refresh ScriptEngine config options (these settings) every xx seconds |
550 | ; 0 = Do not refresh | 563 | ; 0 = Do not refresh |
551 | ; Set it to number of seconds between refresh, for example 30. | 564 | ; Set it to number of seconds between refresh, for example 30. |
552 | ; Will allow you to change ScriptEngine settings while server is running just by using "CONFIG SET" on console | 565 | ; Will allow you to change ScriptEngine settings while server is running just by using "CONFIG SET" on console |
553 | ; For example to increase or decrease number of threads: CONFIG SET NumberOfScriptThreads 10 | 566 | ; For example to increase or decrease number of threads: CONFIG SET NumberOfScriptThreads 10 |
554 | ; NOTE! Disabled for now. Feature does not work. | 567 | ; NOTE! Disabled for now. Feature does not work. |
555 | RefreshConfig=0 | 568 | RefreshConfig=0 |
556 | 569 | ||
557 | ; Number of threads to use for script event execution | 570 | ; Number of threads to use for script event execution |
558 | ; Threads are shared across all regions | 571 | ; Threads are shared across all regions |
559 | NumberOfScriptThreads=2 | 572 | NumberOfScriptThreads=2 |
560 | 573 | ||
561 | ; Script event execution thread priority inside application. | 574 | ; Script event execution thread priority inside application. |
562 | ; Valid values: Lowest, BelowNormal, Normal, AboveNormal, Highest | 575 | ; Valid values: Lowest, BelowNormal, Normal, AboveNormal, Highest |
563 | ScriptThreadPriority=BelowNormal | 576 | ScriptThreadPriority=BelowNormal |
564 | 577 | ||
565 | ; How long MAX should a script event be allowed to run (per event execution)? | 578 | ; How long MAX should a script event be allowed to run (per event execution)? |
566 | ; Do not set this too low (like 50ms) as there are some time wasted in simply executing a function | 579 | ; Do not set this too low (like 50ms) as there are some time wasted in simply executing a function |
567 | ; There is also a small speed penalty for every kill that is made | 580 | ; There is also a small speed penalty for every kill that is made |
568 | MaxEventExecutionTimeMs=5000 | 581 | MaxEventExecutionTimeMs=5000 |
569 | 582 | ||
570 | ; Should we enable the max script event execution thread to look for scripts that exceed their timeslice? | 583 | ; Should we enable the max script event execution thread to look for scripts that exceed their timeslice? |
571 | EnforceMaxEventExecutionTime=true | 584 | EnforceMaxEventExecutionTime=true |
572 | 585 | ||
573 | ; Should we stop the script completely when time exceeds? | 586 | ; Should we stop the script completely when time exceeds? |
574 | ; This is useful if you have a high <MaxEventExecutionTimeMs> and want to deactivate scripts that go wrong | 587 | ; This is useful if you have a high <MaxEventExecutionTimeMs> and want to deactivate scripts that go wrong |
575 | ; Note that for example physics engine can slow down the system and make scripts spend more time | 588 | ; Note that for example physics engine can slow down the system and make scripts spend more time |
576 | DeactivateScriptOnTimeout=false | 589 | DeactivateScriptOnTimeout=false |
577 | 590 | ||
578 | ; If no scripts have executed in this pass how long should we sleep before checking again | 591 | ; If no scripts have executed in this pass how long should we sleep before checking again |
579 | ; Impact: | 592 | ; Impact: |
580 | ; Too low and you will waste lots of CPU | 593 | ; Too low and you will waste lots of CPU |
581 | ; Too high and people touching object or similar will have to wait up to this amount of time before script responding | 594 | ; Too high and people touching object or similar will have to wait up to this amount of time before script responding |
582 | SleepTimeIfNoScriptExecutionMs=50 | 595 | SleepTimeIfNoScriptExecutionMs=50 |
583 | 596 | ||
584 | ; AppDomains are used for two things: | 597 | ; AppDomains are used for two things: |
585 | ; * Security: Scripts inside AppDomains are limited in permissions. | 598 | ; * Security: Scripts inside AppDomains are limited in permissions. |
586 | ; * Script unloading: When a script is deactivated it can not be unloaded. Only whole AppDomains can be unloaded. | 599 | ; * Script unloading: When a script is deactivated it can not be unloaded. Only whole AppDomains can be unloaded. |
587 | ; AppDomains are therefore only unloaded once ALL active scripts inside it has been deactivated (removed from prims). | 600 | ; AppDomains are therefore only unloaded once ALL active scripts inside it has been deactivated (removed from prims). |
588 | ; Each AppDomain has some memory overhead. But leaving dead scripts in memory also has memory overhead. | 601 | ; Each AppDomain has some memory overhead. But leaving dead scripts in memory also has memory overhead. |
589 | ScriptsPerAppDomain=1 | 602 | ScriptsPerAppDomain=1 |
590 | 603 | ||
591 | ; MaintenanceLoop | 604 | ; MaintenanceLoop |
592 | ; How often to run maintenance loop | 605 | ; How often to run maintenance loop |
593 | ; Maintenance loop is doing: script compile/load, script unload, reload config, adjust running config and enforce max execution time | 606 | ; Maintenance loop is doing: script compile/load, script unload, reload config, adjust running config and enforce max execution time |
594 | MaintenanceLoopms=50 | 607 | MaintenanceLoopms=50 |
595 | 608 | ||
596 | ; How many maintenanceloops between each of these. | 609 | ; How many maintenanceloops between each of these. |
597 | ; (if 2 then function will be executed every MaintenanceLoopms*2 ms) | 610 | ; (if 2 then function will be executed every MaintenanceLoopms*2 ms) |
598 | ; Script loading/unloading | 611 | ; Script loading/unloading |
599 | 612 | ||
600 | ; How long load/unload thread should sleep if there is nothing to do | 613 | ; How long load/unload thread should sleep if there is nothing to do |
601 | ; Higher value makes it respond slower when scripts are added/removed from prims | 614 | ; Higher value makes it respond slower when scripts are added/removed from prims |
602 | ; But once active it will process all in queue before sleeping again | 615 | ; But once active it will process all in queue before sleeping again |
603 | MaintenanceLoopTicks_ScriptLoadUnload=1 | 616 | MaintenanceLoopTicks_ScriptLoadUnload=1 |
604 | 617 | ||
605 | ; Other tasks | 618 | ; Other tasks |
606 | ; check if we need to reload config, adjust running config and enforce max execution time | 619 | ; check if we need to reload config, adjust running config and enforce max execution time |
607 | MaintenanceLoopTicks_Other=10 | 620 | MaintenanceLoopTicks_Other=10 |
608 | 621 | ||
609 | ; Allow the use of os* functions (some are dangerous) | 622 | ; Allow the use of os* functions (some are dangerous) |
610 | AllowOSFunctions = true | 623 | AllowOSFunctions = true |
611 | 624 | ||
612 | ; Threat level to allow, one of None, VeryLow, Low, Moderate, High, VeryHigh, Severe | 625 | ; Threat level to allow, one of None, VeryLow, Low, Moderate, High, VeryHigh, Severe |
613 | OSFunctionThreatLevel = Low | 626 | OSFunctionThreatLevel = Low |
614 | 627 | ||
615 | ; Maximum number of items in load/unload queue before we start rejecting loads | 628 | ; Maximum number of items in load/unload queue before we start rejecting loads |
616 | ; Note that we will only be rejecting load. Unloads will still be able to queue. | 629 | ; Note that we will only be rejecting load. Unloads will still be able to queue. |
617 | LoadUnloadMaxQueueSize=100 | 630 | LoadUnloadMaxQueueSize=100 |
618 | 631 | ||
619 | ; Maximum number of (LSL) events that can be queued before new events are ignored. | 632 | ; Maximum number of (LSL) events that can be queued before new events are ignored. |
620 | EventExecutionMaxQueueSize=300 | 633 | EventExecutionMaxQueueSize=300 |
621 | 634 | ||
622 | ; Async LL command sleep | 635 | ; Async LL command sleep |
623 | ; If no async LL commands are waiting, how long should thread sleep before checking again | 636 | ; If no async LL commands are waiting, how long should thread sleep before checking again |
624 | ; Async LL commands are LSL-commands that causes an event to be fired back with result | 637 | ; Async LL commands are LSL-commands that causes an event to be fired back with result |
625 | AsyncLLCommandLoopms=50 | 638 | AsyncLLCommandLoopms=50 |
626 | 639 | ||
627 | ; 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 | 640 | ; 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 |
628 | WriteScriptSourceToDebugFile=true | 641 | WriteScriptSourceToDebugFile=true |
629 | 642 | ||
630 | ; Specify default script compiler | 643 | ; Specify default script compiler |
631 | ; 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 | 644 | ; 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 |
632 | ; Valid languages are: lsl, cs, js and vb | 645 | ; Valid languages are: lsl, cs, js and vb |
633 | DefaultCompileLanguage=lsl | 646 | DefaultCompileLanguage=lsl |
634 | 647 | ||
635 | ; Specify what compilers are allowed to be used | 648 | ; Specify what compilers are allowed to be used |
636 | ; Note vb only works on Windows for now (Mono lacks VB compile support) | 649 | ; Note vb only works on Windows for now (Mono lacks VB compile support) |
637 | ; Valid languages are: lsl, cs, js and vb | 650 | ; Valid languages are: lsl, cs, js and vb |
638 | ; AllowedCompilers=lsl,cs,js,vb. *warning*, non lsl languages have access to static methods such as System.IO.File. Enable at your own risk. | 651 | ; AllowedCompilers=lsl,cs,js,vb. *warning*, non lsl languages have access to static methods such as System.IO.File. Enable at your own risk. |
639 | AllowedCompilers=lsl | 652 | AllowedCompilers=lsl |
640 | 653 | ||
641 | 654 | ||
642 | ; Compile scripts with debugging | 655 | ; Compile scripts with debugging |
643 | ; Probably a thousand times slower, but gives you a line number when something goes wrong. | 656 | ; Probably a thousand times slower, but gives you a line number when something goes wrong. |
644 | CompileWithDebugInformation=true | 657 | CompileWithDebugInformation=true |
645 | 658 | ||
646 | ; Remove old scripts on next startup | 659 | ; Remove old scripts on next startup |
647 | CleanUpOldScriptsOnStartup=true | 660 | CleanUpOldScriptsOnStartup=true |
661 | |||
648 | 662 | ||
649 | [LL-Functions] | 663 | [LL-Functions] |
650 | ; Set the following to true to allow administrator owned scripts to execute console commands | 664 | ; Set the following to true to allow administrator owned scripts to execute console commands |
651 | AllowosConsoleCommand=false | 665 | AllowosConsoleCommand=false |
652 | 666 | ||
653 | AllowGodFunctions = false | 667 | AllowGodFunctions = false |
668 | |||
669 | ; Maximum number of llListen events we allow per script | ||
670 | ; Set this to 0 to have no limit imposed. | ||
671 | max_listens_per_script = 64 | ||
654 | 672 | ||
655 | ; Maximum number of llListen events we allow per script | ||
656 | ; Set this to 0 to have no limit imposed. | ||
657 | max_listens_per_script = 64 | ||
658 | 673 | ||
659 | [DataSnapshot] | 674 | [DataSnapshot] |
660 | ; The following set of configs pertains to search. | 675 | ; The following set of configs pertains to search. |
661 | ; Set index_sims to true to enable search engines to index your searchable data | 676 | ; Set index_sims to true to enable search engines to index your searchable data |
662 | ; If false, no data will be exposed, DataSnapshot module will be off, and you can ignore the rest of these search-related configs | 677 | ; If false, no data will be exposed, DataSnapshot module will be off, and you can ignore the rest of these search-related configs |
663 | index_sims = false | 678 | index_sims = false |
664 | ; The variable data_exposure controls what the regions expose: | 679 | ; The variable data_exposure controls what the regions expose: |
665 | ; minimum: exposes only things explicitly marked for search | 680 | ; minimum: exposes only things explicitly marked for search |
666 | ; all: exposes everything | 681 | ; all: exposes everything |
667 | data_exposure = minimum | 682 | data_exposure = minimum |
668 | ; If search is on, change this to your grid name; will be ignored for standalones | 683 | ; If search is on, change this to your grid name; will be ignored for standalones |
669 | gridname = "OSGrid" | 684 | gridname = "OSGrid" |
670 | ; Period between data snapshots, in seconds. 20 minutes, for starters, so that you see the initial changes fast. | 685 | ; Period between data snapshots, in seconds. 20 minutes, for starters, so that you see the initial changes fast. |
671 | ; Later, you may want to increase this to 3600 (1 hour) or more | 686 | ; Later, you may want to increase this to 3600 (1 hour) or more |
672 | default_snapshot_period = 1200 | 687 | default_snapshot_period = 1200 |
673 | ; This will be created in bin, if it doesn't exist already. It will hold the data snapshots. | 688 | ; This will be created in bin, if it doesn't exist already. It will hold the data snapshots. |
674 | snapshot_cache_directory = "DataSnapshot" | 689 | snapshot_cache_directory = "DataSnapshot" |
675 | ; This semicolon-separated string serves to notify specific data services about the existence | 690 | ; This semicolon-separated string serves to notify specific data services about the existence |
676 | ; of this sim. Uncomment if you want to index your data with this and/or other search providers. | 691 | ; of this sim. Uncomment if you want to index your data with this and/or other search providers. |
677 | ;data_services="http://metaverseink.com/cgi-bin/register.py" | 692 | ;data_services="http://metaverseink.com/cgi-bin/register.py" |
678 | 693 | ||
679 | 694 | ||
680 | [Economy] | 695 | [Economy] |
681 | ; These economy values get used in the BetaGridLikeMoneyModule. - This module is for demonstration only - | 696 | ; These economy values get used in the BetaGridLikeMoneyModule. - This module is for demonstration only - |
682 | ; In grid mode, use this currency XMLRPC server. Leave blank for normal functionality | 697 | ; In grid mode, use this currency XMLRPC server. Leave blank for normal functionality |
683 | CurrencyServer = "" | 698 | CurrencyServer = "" |
684 | ; "http://192.168.1.127/currency.php" | 699 | ; "http://192.168.1.127/currency.php" |
685 | 700 | ||
686 | ; In grid mode, this is the land XMLRPC server. Leave blank for normal functionality | 701 | ; In grid mode, this is the land XMLRPC server. Leave blank for normal functionality |
687 | LandServer = "" | 702 | LandServer = "" |
688 | ;"http://192.168.1.127/landtool.php" | 703 | ;"http://192.168.1.127/landtool.php" |
689 | 704 | ||
690 | ; 45000 is the highest value that the sim could possibly report because of protocol constraints | 705 | ; 45000 is the highest value that the sim could possibly report because of protocol constraints |
691 | ObjectCapacity = 45000 | 706 | ObjectCapacity = 45000 |
692 | 707 | ||
693 | ; Money Unit fee to upload textures, animations etc | 708 | ; Money Unit fee to upload textures, animations etc |
694 | PriceUpload = 0 | 709 | PriceUpload = 0 |
695 | 710 | ||
696 | ; Money Unit fee to create groups | 711 | ; Money Unit fee to create groups |
697 | PriceGroupCreate = 0 | 712 | PriceGroupCreate = 0 |
698 | 713 | ||
699 | ; This is the account Money goes to for fees. Remember, economy requires that money circulates somewhere... even if it's an upload fee | 714 | ; This is the account Money goes to for fees. Remember, economy requires that money circulates somewhere... even if it's an upload fee |
700 | EconomyBaseAccount = 00000000-0000-0000-0000-000000000000 | 715 | EconomyBaseAccount = 00000000-0000-0000-0000-000000000000 |
701 | 716 | ||
702 | ; This is the type of user that will pay fees. | 717 | ; This is the type of user that will pay fees. |
703 | ; Set this to 2 for users, estate managers and Estate Owners | 718 | ; Set this to 2 for users, estate managers and Estate Owners |
704 | ; Set this to 1 for Users and Estate Managers | 719 | ; Set this to 1 for Users and Estate Managers |
705 | ; Set this to 0 for Users only. | 720 | ; Set this to 0 for Users only. |
706 | ; -1 disables | 721 | ; -1 disables |
707 | UserLevelPaysFees = -1 | 722 | UserLevelPaysFees = -1 |
708 | 723 | ||
709 | ; Amount to give to user as a stipend | 724 | ; Amount to give to user as a stipend |
710 | UserStipend = 1000 | 725 | UserStipend = 1000 |
711 | 726 | ||
712 | ; 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 | 727 | ; 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 |
713 | ; amount. Be aware that the account money isn't stored anywhere so users will get a stipend if you restart the simulator | 728 | ; amount. Be aware that the account money isn't stored anywhere so users will get a stipend if you restart the simulator |
714 | IssueStipendWhenClientIsBelowAmount = 10 | 729 | IssueStipendWhenClientIsBelowAmount = 10 |
715 | 730 | ||
716 | ; If this is true, the simulator will remember account balances until the simulator is shutdown or restarted. | 731 | ; If this is true, the simulator will remember account balances until the simulator is shutdown or restarted. |
717 | KeepMoneyAcrossLogins = true | 732 | KeepMoneyAcrossLogins = true |
718 | 733 | ||
719 | ; We don't really know what the rest of these values do. These get sent to the client | 734 | ; We don't really know what the rest of these values do. These get sent to the client |
720 | ; These taken from Agni at a Public Telehub. Change at your own risk. | 735 | ; These taken from Agni at a Public Telehub. Change at your own risk. |
721 | ObjectCount = 0 | 736 | ObjectCount = 0 |
722 | PriceEnergyUnit = 100 | 737 | PriceEnergyUnit = 100 |
723 | PriceObjectClaim = 10 | 738 | PriceObjectClaim = 10 |
724 | PricePublicObjectDecay = 4 | 739 | PricePublicObjectDecay = 4 |
725 | PricePublicObjectDelete = 4 | 740 | PricePublicObjectDelete = 4 |
726 | PriceParcelClaim = 1 | 741 | PriceParcelClaim = 1 |
727 | PriceParcelClaimFactor = 1 | 742 | PriceParcelClaimFactor = 1 |
728 | 743 | ||
729 | PriceRentLight = 5 | 744 | PriceRentLight = 5 |
730 | TeleportMinPrice = 2 | 745 | TeleportMinPrice = 2 |
731 | TeleportPriceExponent = 2 | 746 | TeleportPriceExponent = 2 |
732 | EnergyEfficiency = 1 | 747 | EnergyEfficiency = 1 |
733 | PriceObjectRent = 1 | 748 | PriceObjectRent = 1 |
734 | PriceObjectScaleFactor = 10 | 749 | PriceObjectScaleFactor = 10 |
735 | PriceParcelRent = 1 | 750 | PriceParcelRent = 1 |
736 | 751 | ||
737 | 752 | ||
738 | [SVN] | 753 | [SVN] |
739 | Enabled = false | 754 | Enabled = false |
740 | Directory = SVNmodule\repo | 755 | Directory = SVNmodule\repo |
741 | URL = "svn://your.repo.here/" | 756 | URL = "svn://your.repo.here/" |
742 | Username = "user" | 757 | Username = "user" |
743 | Password = "password" | 758 | Password = "password" |
744 | ImportOnStartup = false | 759 | ImportOnStartup = false |
745 | Autosave = false | 760 | Autosave = false |
746 | AutoSavePeriod = 15 ; Number of minutes between autosave backups | 761 | AutoSavePeriod = 15 ; Number of minutes between autosave backups |
747 | 762 | ||
748 | 763 | ||
749 | [XEngine] | 764 | [XEngine] |
750 | ; Enable this engine in this OpenSim instance | 765 | ; Enable this engine in this OpenSim instance |
751 | Enabled = true | 766 | Enabled = true |
752 | ; How many threads to keep alive even if nothing is happening | 767 | ; How many threads to keep alive even if nothing is happening |
753 | MinThreads = 2 | 768 | MinThreads = 2 |
754 | ; How many threads to start at maximum load | 769 | ; How many threads to start at maximum load |
755 | MaxThreads = 100 | 770 | MaxThreads = 100 |
756 | ; Time a thread must be idle (in seconds) before it dies | 771 | ; Time a thread must be idle (in seconds) before it dies |
757 | IdleTimeout = 60 | 772 | IdleTimeout = 60 |
758 | ; Thread priority ("Lowest", "BelowNormal", "Normal", "AboveNormal", "Highest") | 773 | ; Thread priority ("Lowest", "BelowNormal", "Normal", "AboveNormal", "Highest") |
759 | Priority = "BelowNormal" | 774 | Priority = "BelowNormal" |
760 | ; Maximum number of events to queue for a script (excluding timers) | 775 | ; Maximum number of events to queue for a script (excluding timers) |
761 | MaxScriptEventQueue = 300 | 776 | MaxScriptEventQueue = 300 |
762 | ; Stack size per thread created | 777 | ; Stack size per thread created |
763 | ThreadStackSize = 262144 | 778 | ThreadStackSize = 262144 |
764 | ; Rate to poll for asynchronous command replies (ms) | 779 | ; Rate to poll for asynchronous command replies (ms) |
765 | AsyncLLCommandLoopms = 50 | 780 | AsyncLLCommandLoopms = 50 |
766 | ; Save the source of all compiled scripts | 781 | ; Save the source of all compiled scripts |
767 | WriteScriptSourceToDebugFile = false | 782 | WriteScriptSourceToDebugFile = false |
768 | ; Default language for scripts | 783 | ; Default language for scripts |
769 | DefaultCompileLanguage = lsl | 784 | DefaultCompileLanguage = lsl |
770 | ; List of allowed languages (lsl,vb,js,cs) | 785 | ; List of allowed languages (lsl,vb,js,cs) |
771 | ; AllowedCompilers=lsl,cs,js,vb. | 786 | ; AllowedCompilers=lsl,cs,js,vb. |
772 | ; *warning*, non lsl languages have access to static methods such as System.IO.File. Enable at your own risk. | 787 | ; *warning*, non lsl languages have access to static methods such as System.IO.File. Enable at your own risk. |
773 | AllowedCompilers=lsl | 788 | AllowedCompilers=lsl |
774 | 789 | ||
775 | ; Compile debug info (line numbers) into the script assemblies | 790 | ; Compile debug info (line numbers) into the script assemblies |
776 | CompileWithDebugInformation = true | 791 | CompileWithDebugInformation = true |
777 | ; Allow the use of os* functions (some are dangerous) | 792 | ; Allow the use of os* functions (some are dangerous) |
778 | AllowOSFunctions = false | 793 | AllowOSFunctions = false |
779 | ; Threat level to allow, one of None, VeryLow, Low, Moderate, High, VeryHigh, Severe | 794 | ; Threat level to allow, one of None, VeryLow, Low, Moderate, High, VeryHigh, Severe |
780 | OSFunctionThreatLevel = VeryLow | 795 | OSFunctionThreatLevel = VeryLow |
781 | ; Interval (s) between background save of script states | 796 | ; Interval (s) between background save of script states |
782 | SaveInterval = 120 | 797 | SaveInterval = 120 |
783 | ; Interval (s) between maintenance runs (0 = disable) | 798 | ; Interval (s) between maintenance runs (0 = disable) |
784 | MaintenanceInterval = 10 | 799 | MaintenanceInterval = 10 |
785 | ; Time a script can spend in an event handler before it is interrupted | 800 | ; Time a script can spend in an event handler before it is interrupted |
786 | EventLimit = 30 | 801 | EventLimit = 30 |
787 | ; If a script overruns it's event limit, kill the script? | 802 | ; If a script overruns it's event limit, kill the script? |
788 | KillTimedOutScripts = false | 803 | KillTimedOutScripts = false |
789 | ; Sets the multiplier for the scripting delays | 804 | ; Sets the multiplier for the scripting delays |
790 | ScriptDelayFactor = 1.0 | 805 | ScriptDelayFactor = 1.0 |
791 | ; The factor the 10 m distances llimits are multiplied by | 806 | ; The factor the 10 m distances llimits are multiplied by |
792 | ScriptDistanceLimitFactor = 1.0 | 807 | ScriptDistanceLimitFactor = 1.0 |
793 | 808 | ||
794 | ; OS Functions enable/disable | 809 | ; OS Functions enable/disable |
795 | ; For each function, you can add one line, as shown | 810 | ; For each function, you can add one line, as shown |
796 | 811 | ||
797 | ; true is the default for all functions, and allows them if below threat level | 812 | ; true is the default for all functions, and allows them if below threat level |
798 | ; Allow_osSetRegionWaterHeight = true | 813 | ; Allow_osSetRegionWaterHeight = true |
799 | 814 | ||
800 | ; false disables the function completely | 815 | ; false disables the function completely |
801 | ; Allow_osSetRegionWaterHeight = false | 816 | ; Allow_osSetRegionWaterHeight = false |
802 | 817 | ||
803 | ; Comma separated list of UUIDS allows the function for that list of UUIDS | 818 | ; Comma separated list of UUIDS allows the function for that list of UUIDS |
804 | ; Allow_osSetRegionWaterHeight = 888760cb-a3cf-43ac-8ea4-8732fd3ee2bb | 819 | ; Allow_osSetRegionWaterHeight = 888760cb-a3cf-43ac-8ea4-8732fd3ee2bb |
820 | |||
805 | 821 | ||
806 | [GridInfo] | 822 | [GridInfo] |
823 | ; These settings are used to return information on a get_grid_info call. | ||
824 | ; Client launcher scripts and third-party clients make use of this to | ||
825 | ; autoconfigure the client and to provide a nice user experience. If you | ||
826 | ; want to facilitate that, you should configure the settings here according | ||
827 | ; to your grid or standalone setup. | ||
828 | ; | ||
829 | ; See http://opensimulator.org/wiki/GridInfo | ||
807 | 830 | ||
808 | ; These settings are used to return information on a get_grid_info call. | 831 | ; login uri: for grid this is the user server URI |
809 | ; Client launcher scripts and third-party clients make use of this to | 832 | login = http://127.0.0.1:9000/ |
810 | ; autoconfigure the client and to provide a nice user experience. If you | ||
811 | ; want to facilitate that, you should configure the settings here according | ||
812 | ; to your grid or standalone setup. | ||
813 | ; | ||
814 | ; See http://opensimulator.org/wiki/GridInfo | ||
815 | 833 | ||
816 | ; login uri: for grid this is the user server URI | 834 | ; long grid name: the long name of your grid |
817 | login = http://127.0.0.1:9000/ | 835 | gridname = "the lost continent of hippo" |
818 | 836 | ||
819 | ; long grid name: the long name of your grid | 837 | ; short grid name: the short name of your grid |
820 | gridname = "the lost continent of hippo" | 838 | gridnick = "hippogrid" |
821 | 839 | ||
822 | ; short grid name: the short name of your grid | ||
823 | gridnick = "hippogrid" | ||
824 | 840 | ||
841 | ; login page: optional: if it exists it will be used to tell the client to use | ||
842 | ; this as splash page | ||
843 | welcome = http://127.0.0.1/welcome | ||
825 | 844 | ||
826 | ; login page: optional: if it exists it will be used to tell the client to use | 845 | ; helper uri: optional: if it exists if will be used to tell the client to use |
827 | ; this as splash page | 846 | ; this for all economy related things |
828 | welcome = http://127.0.0.1/welcome | 847 | economy = http://127.0.0.1:9000/ |
829 | 848 | ||
830 | ; helper uri: optional: if it exists if will be used to tell the client to use | 849 | ; web page of grid: optional: page providing further information about your grid |
831 | ; this for all economy related things | 850 | about = http://127.0.0.1/about/ |
832 | economy = http://127.0.0.1:9000/ | ||
833 | 851 | ||
834 | ; web page of grid: optional: page providing further information about your grid | 852 | ; account creation: optional: page providing further information about obtaining |
835 | about = http://127.0.0.1/about/ | 853 | ; a user account on your grid |
854 | register = http://127.0.0.1/register | ||
836 | 855 | ||
837 | ; account creation: optional: page providing further information about obtaining | 856 | ; help: optional: page providing further assistance for users of your grid |
838 | ; a user account on your grid | 857 | help = http://127.0.0.1/help |
839 | register = http://127.0.0.1/register | ||
840 | 858 | ||
841 | ; help: optional: page providing further assistance for users of your grid | 859 | ; password help: optional: page providing password assistance for users of your grid |
842 | help = http://127.0.0.1/help | 860 | password = http://127.0.0.1/password |
843 | 861 | ||
844 | ; password help: optional: page providing password assistance for users of your grid | 862 | ;These are the settings for the Open Grid Protocol.. the Agent Domain, Region Domain, you know.. |
845 | password = http://127.0.0.1/password | 863 | [OpenGridProtocol] |
864 | ;On/true or Off/false | ||
865 | ogp_enabled=false | ||
846 | 866 | ||
847 | ;These are the settings for the Open Grid Protocol.. the Agent Domain, Region Domain, you know.. | 867 | ;Name Prefix/suffix when using OGP |
848 | [OpenGridProtocol] | 868 | ogp_firstname_prefix="" |
849 | ;On/true or Off/false | 869 | ogp_lastname_suffix="_EXTERNAL" |
850 | ogp_enabled=false | ||
851 | 870 | ||
852 | ;Name Prefix/suffix when using OGP | ||
853 | ogp_firstname_prefix="" | ||
854 | ogp_lastname_suffix="_EXTERNAL" | ||
855 | 871 | ||
856 | [Concierge] | 872 | [Concierge] |
857 | ; enable = true | 873 | ; enable = true |
858 | enabled = false | 874 | enabled = false |
859 | 875 | ||
860 | ; name of the concierge | 876 | ; name of the concierge |
861 | whoami = "jeeves" | 877 | whoami = "jeeves" |
862 | 878 | ||
863 | ; password for updating the welcome message templates via XmlRpc | 879 | ; password for updating the welcome message templates via XmlRpc |
864 | password = SECRET | 880 | password = SECRET |
865 | 881 | ||
866 | ; regex specifying for which regions concierge service is desired; if | 882 | ; regex specifying for which regions concierge service is desired; if |
867 | ; empty, then for all | 883 | ; empty, then for all |
868 | regions = "^MeetingSpace-" | 884 | regions = "^MeetingSpace-" |
869 | 885 | ||
870 | ; for each region that matches the regions regexp you can provide | 886 | ; for each region that matches the regions regexp you can provide |
871 | ; (optionally) a welcome template using format substitution: | 887 | ; (optionally) a welcome template using format substitution: |
872 | ; {0} is replaced with the name of the avatar entering the region | 888 | ; {0} is replaced with the name of the avatar entering the region |
873 | ; {1} is replaced with the name of the region | 889 | ; {1} is replaced with the name of the region |
874 | ; {2} is replaced with the name of the concierge (whoami variable above) | 890 | ; {2} is replaced with the name of the concierge (whoami variable above) |
875 | 891 | ||
876 | welcomes = /path/to/welcome/template/directory | 892 | welcomes = /path/to/welcome/template/directory |