aboutsummaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
-rw-r--r--OpenSim/Region/Environment/Modules/World/Permissions/PermissionsModule.cs1012
-rw-r--r--bin/OpenSim.ini.example1506
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
5gridmode = false
6
7; Enables EventQueueGet Service.
8EventQueue = true
9
10; Set this to the DLL containig the client stack to use.
11clientstack_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
19region_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.
33DrawPrimOnMapTile = true
34; Use terrain texture for maptiles if true, use shaded green if false
35TextureOnMapTile = false
36
37; Maximum total size, and maximum size where a prim can be physical
38NonPhysicalPrimMax = 256
39PhysicalPrimMax = 10
40ClampPrimSize = 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:
51storage_plugin = "OpenSim.Data.SQLite.dll"
52storage_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.
70asset_database = "local"
71;asset_database = "grid"
72
73; Should avatars in neighbor sims see objects in this sim?
74see_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;
86meshing = ZeroMesher
87;meshing = Meshmerizer
88
89; Choose one of the physics engines below
90physics = basicphysics
91;physics = POS
92;physics = OpenDynamicsEngine
93;physics = modified_BulletX
94
95
96startup_console_commands_file = "startup_commands.txt"
97shutdown_console_commands_file = "shutdown_commands.txt"
98
99;permissionmodules = "DefaultPermissionsModule"
100serverside_object_permissions = false
101allow_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.
108physical_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
117DefaultScriptEngine = "ScriptEngine.DotNetEngine"
118;DefaultScriptEngine = "XEngine"
119
120; ##
121; ## World Map
122; ##
123
124;WorldMapModule = "WorldMap"
125;MapImageModule = "MapImageModule"
126 133
127[StandAlone] 134[StandAlone]
128accounts_authenticate = true 135 accounts_authenticate = true
129welcome_message = "Welcome to OpenSim" 136 welcome_message = "Welcome to OpenSim"
130 137
131; Asset database provider 138 ; Asset database provider
132asset_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
145inventory_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 ;
163userDatabase_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
172dump_assets_to_file = false 179 dump_assets_to_file = false
173 180
174 181
175[Network] 182[Network]
176http_listener_port = 9000 183 http_listener_port = 9000
177remoting_listener_port = 8895 184 remoting_listener_port = 8895
178default_location_x = 1000 185 default_location_x = 1000
179default_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
184http_listener_ssl = false ; Also create a SSL server 191 http_listener_ssl = false ; Also create a SSL server
185http_listener_cn = "localhost" ; Use the cert with the common name 192 http_listener_cn = "localhost" ; Use the cert with the common name
186http_listener_sslport = 9001 ; Use this port for SSL connections 193 http_listener_sslport = 9001 ; Use this port for SSL connections
187http_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
192grid_server_url = "http://127.0.0.1:8001" 199 grid_server_url = "http://127.0.0.1:8001"
193grid_send_key = "null" 200 grid_send_key = "null"
194grid_recv_key = "null" 201 grid_recv_key = "null"
195 202
196user_server_url = "http://127.0.0.1:8002" 203 user_server_url = "http://127.0.0.1:8002"
197user_send_key = "null" 204 user_send_key = "null"
198user_recv_key = "null" 205 user_recv_key = "null"
199 206
200asset_server_url = "http://127.0.0.1:8003" 207 asset_server_url = "http://127.0.0.1:8003"
201 208
202inventory_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
206messaging_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
226client_throttle_multiplier = 2; 233 client_throttle_multiplier = 2;
234
227 235
228[Chat] 236[Chat]
229whisper_distance = 10 237 whisper_distance = 10
230say_distance = 30 238 say_distance = 30
231shout_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
241world_gravityx = 0
242world_gravityy = 0
243world_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;
247world_stepsize = 0.020 254 world_stepsize = 0.020
248world_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
251world_hashspace_size_low = -4 258 world_hashspace_size_low = -4
252world_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
255meters_in_small_space = 29.9 262 meters_in_small_space = 29.9
256small_hashspace_size_low = -4 263 small_hashspace_size_low = -4
257small_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
264world_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
269filter_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)
272nm_terraincontact_friction = 255.0 279 nm_terraincontact_friction = 255.0
273nm_terraincontact_bounce = 0.1 280 nm_terraincontact_bounce = 0.1
274nm_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
278m_terraincontact_friction = 75.0 285 m_terraincontact_friction = 75.0
279m_terraincontact_bounce = 0.05 286 m_terraincontact_bounce = 0.05
280m_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
284m_avatarobjectcontact_friction = 75.0 291 m_avatarobjectcontact_friction = 75.0
285m_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
289objectcontact_friction = 250.0 296 objectcontact_friction = 250.0
290objectcontact_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
300av_pid_derivative_linux = 2200.0 307 av_pid_derivative_linux = 2200.0
301av_pid_proportional_linux = 900.0; 308 av_pid_proportional_linux = 900.0;
302 309
303av_pid_derivative_win = 2200.0 310 av_pid_derivative_win = 2200.0
304av_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
307av_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
310av_capsule_standup_tensor_win = 550000 317 av_capsule_standup_tensor_win = 550000
311av_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
317av_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
320av_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
325av_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
328av_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.
335geometry_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
338body_frames_auto_disable = 20 345 body_frames_auto_disable = 20
339 346
340; used to control llMove2Target 347 ; used to control llMove2Target
341body_pid_derivative = 35 348 body_pid_derivative = 35
342body_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
345geom_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
348geom_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
351geom_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
354body_motor_joint_maxforce_tensor_linux = 5 361 body_motor_joint_maxforce_tensor_linux = 5
355body_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?
362mesh_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
365mesh_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
368mesh_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]
382enabled = false 389 enabled = false
383access_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
394region_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
405enabled = false 413 enabled = false
406god_key = SECRET 414 god_key = SECRET
407prefix = /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
412enabled = 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
416enabled = false 425 enabled = false
417authenticate=true 426 authenticate=true
418secured=true 427 secured=true
419extended-escape=true 428 extended-escape=true
420realm=OpenSim REST 429 realm=OpenSim REST
421dump-asset=false 430 dump-asset=false
422path-fill=true 431 path-fill=true
423dump-line-size=32 432 dump-line-size=32
424flush-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> :
474msgformat = "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
491enabled = 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. :-)
495account_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
497sip_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
502enabled = false 515 enabled = false
503; SIP account server domain 516 ; SIP account server domain
504sip_domain = testserver.com 517 sip_domain = testserver.com
505; SIP conf server domain 518 ; SIP conf server domain
506conf_domain = testserver.com 519 conf_domain = testserver.com
507; URL of the asterisk opensim frontend 520 ; URL of the asterisk opensim frontend
508asterisk_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
510asterisk_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)
512asterisk_timeout = 3000 525 asterisk_timeout = 3000
513; salt for asterisk nonces 526 ; salt for asterisk nonces
514asterisk_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]
532Enabled = true 545 Enabled = true
533 546
534ScriptDelayFactor = 1.0 547 ScriptDelayFactor = 1.0
535ScriptDistanceLimitFactor = 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.
555RefreshConfig=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
559NumberOfScriptThreads=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
563ScriptThreadPriority=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
568MaxEventExecutionTimeMs=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?
571EnforceMaxEventExecutionTime=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
576DeactivateScriptOnTimeout=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
582SleepTimeIfNoScriptExecutionMs=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.
589ScriptsPerAppDomain=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
594MaintenanceLoopms=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
603MaintenanceLoopTicks_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
607MaintenanceLoopTicks_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)
610AllowOSFunctions = 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
613OSFunctionThreatLevel = 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.
617LoadUnloadMaxQueueSize=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.
620EventExecutionMaxQueueSize=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
625AsyncLLCommandLoopms=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
628WriteScriptSourceToDebugFile=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
633DefaultCompileLanguage=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.
639AllowedCompilers=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.
644CompileWithDebugInformation=true 657 CompileWithDebugInformation=true
645 658
646; Remove old scripts on next startup 659 ; Remove old scripts on next startup
647CleanUpOldScriptsOnStartup=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
651AllowosConsoleCommand=false 665 AllowosConsoleCommand=false
652 666
653AllowGodFunctions = 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.
657max_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
663index_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
667data_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
669gridname = "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
672default_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.
674snapshot_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
683CurrencyServer = "" 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
687LandServer = "" 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
691ObjectCapacity = 45000 706 ObjectCapacity = 45000
692 707
693; Money Unit fee to upload textures, animations etc 708 ; Money Unit fee to upload textures, animations etc
694PriceUpload = 0 709 PriceUpload = 0
695 710
696; Money Unit fee to create groups 711 ; Money Unit fee to create groups
697PriceGroupCreate = 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
700EconomyBaseAccount = 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
707UserLevelPaysFees = -1 722 UserLevelPaysFees = -1
708 723
709; Amount to give to user as a stipend 724 ; Amount to give to user as a stipend
710UserStipend = 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
714IssueStipendWhenClientIsBelowAmount = 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.
717KeepMoneyAcrossLogins = 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.
721ObjectCount = 0 736 ObjectCount = 0
722PriceEnergyUnit = 100 737 PriceEnergyUnit = 100
723PriceObjectClaim = 10 738 PriceObjectClaim = 10
724PricePublicObjectDecay = 4 739 PricePublicObjectDecay = 4
725PricePublicObjectDelete = 4 740 PricePublicObjectDelete = 4
726PriceParcelClaim = 1 741 PriceParcelClaim = 1
727PriceParcelClaimFactor = 1 742 PriceParcelClaimFactor = 1
728 743
729PriceRentLight = 5 744 PriceRentLight = 5
730TeleportMinPrice = 2 745 TeleportMinPrice = 2
731TeleportPriceExponent = 2 746 TeleportPriceExponent = 2
732EnergyEfficiency = 1 747 EnergyEfficiency = 1
733PriceObjectRent = 1 748 PriceObjectRent = 1
734PriceObjectScaleFactor = 10 749 PriceObjectScaleFactor = 10
735PriceParcelRent = 1 750 PriceParcelRent = 1
736 751
737 752
738[SVN] 753[SVN]
739Enabled = false 754 Enabled = false
740Directory = SVNmodule\repo 755 Directory = SVNmodule\repo
741URL = "svn://your.repo.here/" 756 URL = "svn://your.repo.here/"
742Username = "user" 757 Username = "user"
743Password = "password" 758 Password = "password"
744ImportOnStartup = false 759 ImportOnStartup = false
745Autosave = false 760 Autosave = false
746AutoSavePeriod = 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
751Enabled = 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
753MinThreads = 2 768 MinThreads = 2
754; How many threads to start at maximum load 769 ; How many threads to start at maximum load
755MaxThreads = 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
757IdleTimeout = 60 772 IdleTimeout = 60
758; Thread priority ("Lowest", "BelowNormal", "Normal", "AboveNormal", "Highest") 773 ; Thread priority ("Lowest", "BelowNormal", "Normal", "AboveNormal", "Highest")
759Priority = "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)
761MaxScriptEventQueue = 300 776 MaxScriptEventQueue = 300
762; Stack size per thread created 777 ; Stack size per thread created
763ThreadStackSize = 262144 778 ThreadStackSize = 262144
764; Rate to poll for asynchronous command replies (ms) 779 ; Rate to poll for asynchronous command replies (ms)
765AsyncLLCommandLoopms = 50 780 AsyncLLCommandLoopms = 50
766; Save the source of all compiled scripts 781 ; Save the source of all compiled scripts
767WriteScriptSourceToDebugFile = false 782 WriteScriptSourceToDebugFile = false
768; Default language for scripts 783 ; Default language for scripts
769DefaultCompileLanguage = 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.
773AllowedCompilers=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
776CompileWithDebugInformation = true 791 CompileWithDebugInformation = true
777; Allow the use of os* functions (some are dangerous) 792 ; Allow the use of os* functions (some are dangerous)
778AllowOSFunctions = 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
780OSFunctionThreatLevel = VeryLow 795 OSFunctionThreatLevel = VeryLow
781; Interval (s) between background save of script states 796 ; Interval (s) between background save of script states
782SaveInterval = 120 797 SaveInterval = 120
783; Interval (s) between maintenance runs (0 = disable) 798 ; Interval (s) between maintenance runs (0 = disable)
784MaintenanceInterval = 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
786EventLimit = 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?
788KillTimedOutScripts = false 803 KillTimedOutScripts = false
789; Sets the multiplier for the scripting delays 804 ; Sets the multiplier for the scripting delays
790ScriptDelayFactor = 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
792ScriptDistanceLimitFactor = 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
817login = 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
820gridname = "the lost continent of hippo" 838 gridnick = "hippogrid"
821 839
822; short grid name: the short name of your grid
823gridnick = "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
828welcome = 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/
832economy = 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
835about = 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
839register = 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
842help = 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..
845password = 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"
850ogp_enabled=false
851 870
852;Name Prefix/suffix when using OGP
853ogp_firstname_prefix=""
854ogp_lastname_suffix="_EXTERNAL"
855 871
856[Concierge] 872[Concierge]
857; enable = true 873 ; enable = true
858enabled = false 874 enabled = false
859 875
860; name of the concierge 876 ; name of the concierge
861whoami = "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
864password = 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
868regions = "^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
876welcomes = /path/to/welcome/template/directory 892 welcomes = /path/to/welcome/template/directory