diff options
Diffstat (limited to 'OpenSim/Region/CoreModules')
6 files changed, 80 insertions, 89 deletions
diff --git a/OpenSim/Region/CoreModules/Agent/AssetTransaction/AgentAssetsTransactions.cs b/OpenSim/Region/CoreModules/Agent/AssetTransaction/AgentAssetsTransactions.cs index da1ff2e..1e14f45 100644 --- a/OpenSim/Region/CoreModules/Agent/AssetTransaction/AgentAssetsTransactions.cs +++ b/OpenSim/Region/CoreModules/Agent/AssetTransaction/AgentAssetsTransactions.cs | |||
@@ -33,6 +33,7 @@ using OpenSim.Framework; | |||
33 | 33 | ||
34 | using OpenSim.Region.Framework.Scenes; | 34 | using OpenSim.Region.Framework.Scenes; |
35 | using OpenSim.Services.Interfaces; | 35 | using OpenSim.Services.Interfaces; |
36 | using OpenSim.Region.Framework.Interfaces; | ||
36 | 37 | ||
37 | namespace OpenSim.Region.CoreModules.Agent.AssetTransaction | 38 | namespace OpenSim.Region.CoreModules.Agent.AssetTransaction |
38 | { | 39 | { |
@@ -119,6 +120,14 @@ namespace OpenSim.Region.CoreModules.Agent.AssetTransaction | |||
119 | } | 120 | } |
120 | else | 121 | else |
121 | { | 122 | { |
123 | // Check if the xfer is a terrain xfer | ||
124 | IEstateModule estateModule = m_Scene.RequestModuleInterface<IEstateModule>(); | ||
125 | if (estateModule != null) | ||
126 | { | ||
127 | if (estateModule.IsTerrainXfer(xferID)) | ||
128 | return; | ||
129 | } | ||
130 | |||
122 | m_log.ErrorFormat( | 131 | m_log.ErrorFormat( |
123 | "[AGENT ASSET TRANSACTIONS]: Could not find uploader for xfer id {0}, packet id {1}, data length {2}", | 132 | "[AGENT ASSET TRANSACTIONS]: Could not find uploader for xfer id {0}, packet id {1}, data length {2}", |
124 | xferID, packetID, data.Length); | 133 | xferID, packetID, data.Length); |
diff --git a/OpenSim/Region/CoreModules/Avatar/Friends/FriendsRequestHandler.cs b/OpenSim/Region/CoreModules/Avatar/Friends/FriendsRequestHandler.cs index 2116605..ff87ece 100644 --- a/OpenSim/Region/CoreModules/Avatar/Friends/FriendsRequestHandler.cs +++ b/OpenSim/Region/CoreModules/Avatar/Friends/FriendsRequestHandler.cs | |||
@@ -42,14 +42,22 @@ using log4net; | |||
42 | 42 | ||
43 | namespace OpenSim.Region.CoreModules.Avatar.Friends | 43 | namespace OpenSim.Region.CoreModules.Avatar.Friends |
44 | { | 44 | { |
45 | public class FriendsRequestHandler : BaseStreamHandler | 45 | public class FriendsRequestHandler : BaseStreamHandlerBasicDOSProtector |
46 | { | 46 | { |
47 | private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); | 47 | private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); |
48 | 48 | ||
49 | private FriendsModule m_FriendsModule; | 49 | private FriendsModule m_FriendsModule; |
50 | 50 | ||
51 | public FriendsRequestHandler(FriendsModule fmodule) | 51 | public FriendsRequestHandler(FriendsModule fmodule) |
52 | : base("POST", "/friends") | 52 | : base("POST", "/friends", new BasicDosProtectorOptions() |
53 | { | ||
54 | AllowXForwardedFor = true, | ||
55 | ForgetTimeSpan = TimeSpan.FromMinutes(2), | ||
56 | MaxRequestsInTimeframe = 20, | ||
57 | ReportingName = "FRIENDSDOSPROTECTOR", | ||
58 | RequestTimeSpan = TimeSpan.FromSeconds(5), | ||
59 | ThrottledAction = BasicDOSProtector.ThrottleAction.DoThrottledMethod | ||
60 | }) | ||
53 | { | 61 | { |
54 | m_FriendsModule = fmodule; | 62 | m_FriendsModule = fmodule; |
55 | } | 63 | } |
diff --git a/OpenSim/Region/CoreModules/Framework/InventoryAccess/InventoryAccessModule.cs b/OpenSim/Region/CoreModules/Framework/InventoryAccess/InventoryAccessModule.cs index ac4203f..6251266 100644 --- a/OpenSim/Region/CoreModules/Framework/InventoryAccess/InventoryAccessModule.cs +++ b/OpenSim/Region/CoreModules/Framework/InventoryAccess/InventoryAccessModule.cs | |||
@@ -789,83 +789,29 @@ namespace OpenSim.Region.CoreModules.Framework.InventoryAccess | |||
789 | 789 | ||
790 | SceneObjectGroup group = null; | 790 | SceneObjectGroup group = null; |
791 | 791 | ||
792 | string xmlData = Utils.BytesToString(rezAsset.Data); | 792 | List<SceneObjectGroup> objlist; |
793 | List<SceneObjectGroup> objlist = new List<SceneObjectGroup>(); | 793 | List<Vector3> veclist; |
794 | List<Vector3> veclist = new List<Vector3>(); | 794 | Vector3 bbox; |
795 | float offsetHeight; | ||
795 | byte bRayEndIsIntersection = (byte)(RayEndIsIntersection ? 1 : 0); | 796 | byte bRayEndIsIntersection = (byte)(RayEndIsIntersection ? 1 : 0); |
796 | Vector3 pos; | 797 | Vector3 pos; |
797 | 798 | ||
798 | XmlDocument doc = new XmlDocument(); | 799 | bool single = m_Scene.GetObjectsToRez(rezAsset.Data, attachment, out objlist, out veclist, out bbox, out offsetHeight); |
799 | doc.LoadXml(xmlData); | ||
800 | XmlElement e = (XmlElement)doc.SelectSingleNode("/CoalescedObject"); | ||
801 | Vector3 rez_pos; | ||
802 | if (e == null || attachment) // Single | ||
803 | { | ||
804 | SceneObjectGroup g = SceneObjectSerializer.FromOriginalXmlFormat(xmlData); | ||
805 | if (!attachment) | ||
806 | { | ||
807 | g.RootPart.AttachPoint = g.RootPart.Shape.State; | ||
808 | g.RootPart.AttachOffset = g.AbsolutePosition; | ||
809 | g.RootPart.AttachRotation = g.GroupRotation; | ||
810 | if (g.RootPart.Shape.PCode != (byte)PCode.NewTree && | ||
811 | g.RootPart.Shape.PCode != (byte)PCode.Tree) | ||
812 | g.RootPart.Shape.State = 0; | ||
813 | } | ||
814 | |||
815 | objlist.Add(g); | ||
816 | veclist.Add(Vector3.Zero); | ||
817 | 800 | ||
818 | float offsetHeight = 0; | 801 | if (single) |
802 | { | ||
819 | pos = m_Scene.GetNewRezLocation( | 803 | pos = m_Scene.GetNewRezLocation( |
820 | RayStart, RayEnd, RayTargetID, Quaternion.Identity, | 804 | RayStart, RayEnd, RayTargetID, Quaternion.Identity, |
821 | BypassRayCast, bRayEndIsIntersection, true, g.GetAxisAlignedBoundingBox(out offsetHeight), false); | 805 | BypassRayCast, bRayEndIsIntersection, true, bbox, false); |
822 | pos.Z += offsetHeight; | 806 | pos.Z += offsetHeight; |
823 | rez_pos = pos; | ||
824 | } | 807 | } |
825 | else | 808 | else |
826 | { | 809 | { |
827 | XmlElement coll = (XmlElement)e; | ||
828 | float bx = Convert.ToSingle(coll.GetAttribute("x")); | ||
829 | float by = Convert.ToSingle(coll.GetAttribute("y")); | ||
830 | float bz = Convert.ToSingle(coll.GetAttribute("z")); | ||
831 | Vector3 bbox = new Vector3(bx, by, bz); | ||
832 | |||
833 | pos = m_Scene.GetNewRezLocation(RayStart, RayEnd, | 810 | pos = m_Scene.GetNewRezLocation(RayStart, RayEnd, |
834 | RayTargetID, Quaternion.Identity, | 811 | RayTargetID, Quaternion.Identity, |
835 | BypassRayCast, bRayEndIsIntersection, true, | 812 | BypassRayCast, bRayEndIsIntersection, true, |
836 | bbox, false); | 813 | bbox, false); |
837 | |||
838 | rez_pos = pos; | ||
839 | |||
840 | pos -= bbox / 2; | 814 | pos -= bbox / 2; |
841 | |||
842 | XmlNodeList groups = e.SelectNodes("SceneObjectGroup"); | ||
843 | foreach (XmlNode n in groups) | ||
844 | { | ||
845 | SceneObjectGroup g = SceneObjectSerializer.FromOriginalXmlFormat(n.OuterXml); | ||
846 | g.RootPart.AttachPoint = g.RootPart.Shape.State; | ||
847 | g.RootPart.AttachOffset = g.AbsolutePosition; | ||
848 | g.RootPart.AttachRotation = g.GroupRotation; | ||
849 | if (g.RootPart.Shape.PCode != (byte)PCode.NewTree && | ||
850 | g.RootPart.Shape.PCode != (byte)PCode.Tree) | ||
851 | g.RootPart.Shape.State = 0; | ||
852 | |||
853 | objlist.Add(g); | ||
854 | XmlElement el = (XmlElement)n; | ||
855 | |||
856 | string rawX = el.GetAttribute("offsetx"); | ||
857 | string rawY = el.GetAttribute("offsety"); | ||
858 | string rawZ = el.GetAttribute("offsetz"); | ||
859 | // | ||
860 | // m_log.DebugFormat( | ||
861 | // "[INVENTORY ACCESS MODULE]: Converting coalesced object {0} offset <{1}, {2}, {3}>", | ||
862 | // g.Name, rawX, rawY, rawZ); | ||
863 | |||
864 | float x = Convert.ToSingle(rawX); | ||
865 | float y = Convert.ToSingle(rawY); | ||
866 | float z = Convert.ToSingle(rawZ); | ||
867 | veclist.Add(new Vector3(x, y, z)); | ||
868 | } | ||
869 | } | 815 | } |
870 | 816 | ||
871 | int primcount = 0; | 817 | int primcount = 0; |
@@ -873,7 +819,7 @@ namespace OpenSim.Region.CoreModules.Framework.InventoryAccess | |||
873 | primcount += g.PrimCount; | 819 | primcount += g.PrimCount; |
874 | 820 | ||
875 | if (!m_Scene.Permissions.CanRezObject( | 821 | if (!m_Scene.Permissions.CanRezObject( |
876 | primcount, remoteClient.AgentId, rez_pos) | 822 | primcount, remoteClient.AgentId, pos) |
877 | && !attachment) | 823 | && !attachment) |
878 | { | 824 | { |
879 | // The client operates in no fail mode. It will | 825 | // The client operates in no fail mode. It will |
@@ -890,7 +836,7 @@ namespace OpenSim.Region.CoreModules.Framework.InventoryAccess | |||
890 | return null; | 836 | return null; |
891 | } | 837 | } |
892 | 838 | ||
893 | if (item != null && !DoPreRezWhenFromItem(remoteClient, item, objlist, rez_pos, veclist, attachment)) | 839 | if (item != null && !DoPreRezWhenFromItem(remoteClient, item, objlist, pos, veclist, attachment)) |
894 | return null; | 840 | return null; |
895 | 841 | ||
896 | for (int i = 0; i < objlist.Count; i++) | 842 | for (int i = 0; i < objlist.Count; i++) |
diff --git a/OpenSim/Region/CoreModules/World/Estate/EstateManagementModule.cs b/OpenSim/Region/CoreModules/World/Estate/EstateManagementModule.cs index 487aa09..4750b46 100644 --- a/OpenSim/Region/CoreModules/World/Estate/EstateManagementModule.cs +++ b/OpenSim/Region/CoreModules/World/Estate/EstateManagementModule.cs | |||
@@ -839,26 +839,23 @@ namespace OpenSim.Region.CoreModules.World.Estate | |||
839 | 839 | ||
840 | private void AbortTerrainXferHandler(IClientAPI remoteClient, ulong XferID) | 840 | private void AbortTerrainXferHandler(IClientAPI remoteClient, ulong XferID) |
841 | { | 841 | { |
842 | if (TerrainUploader != null) | 842 | lock (this) |
843 | { | 843 | { |
844 | lock (TerrainUploader) | 844 | if ((TerrainUploader != null) && (XferID == TerrainUploader.XferID)) |
845 | { | 845 | { |
846 | if (XferID == TerrainUploader.XferID) | 846 | remoteClient.OnXferReceive -= TerrainUploader.XferReceive; |
847 | { | 847 | remoteClient.OnAbortXfer -= AbortTerrainXferHandler; |
848 | remoteClient.OnXferReceive -= TerrainUploader.XferReceive; | 848 | TerrainUploader.TerrainUploadDone -= HandleTerrainApplication; |
849 | remoteClient.OnAbortXfer -= AbortTerrainXferHandler; | ||
850 | TerrainUploader.TerrainUploadDone -= HandleTerrainApplication; | ||
851 | 849 | ||
852 | TerrainUploader = null; | 850 | TerrainUploader = null; |
853 | remoteClient.SendAlertMessage("Terrain Upload aborted by the client"); | 851 | remoteClient.SendAlertMessage("Terrain Upload aborted by the client"); |
854 | } | ||
855 | } | 852 | } |
856 | } | 853 | } |
857 | |||
858 | } | 854 | } |
855 | |||
859 | private void HandleTerrainApplication(string filename, byte[] terrainData, IClientAPI remoteClient) | 856 | private void HandleTerrainApplication(string filename, byte[] terrainData, IClientAPI remoteClient) |
860 | { | 857 | { |
861 | lock (TerrainUploader) | 858 | lock (this) |
862 | { | 859 | { |
863 | remoteClient.OnXferReceive -= TerrainUploader.XferReceive; | 860 | remoteClient.OnXferReceive -= TerrainUploader.XferReceive; |
864 | remoteClient.OnAbortXfer -= AbortTerrainXferHandler; | 861 | remoteClient.OnAbortXfer -= AbortTerrainXferHandler; |
@@ -917,22 +914,32 @@ namespace OpenSim.Region.CoreModules.World.Estate | |||
917 | 914 | ||
918 | private void handleUploadTerrain(IClientAPI remote_client, string clientFileName) | 915 | private void handleUploadTerrain(IClientAPI remote_client, string clientFileName) |
919 | { | 916 | { |
920 | if (TerrainUploader == null) | 917 | lock (this) |
921 | { | 918 | { |
922 | 919 | if (TerrainUploader == null) | |
923 | TerrainUploader = new EstateTerrainXferHandler(remote_client, clientFileName); | ||
924 | lock (TerrainUploader) | ||
925 | { | 920 | { |
921 | m_log.DebugFormat("Starting to receive uploaded terrain"); | ||
922 | TerrainUploader = new EstateTerrainXferHandler(remote_client, clientFileName); | ||
926 | remote_client.OnXferReceive += TerrainUploader.XferReceive; | 923 | remote_client.OnXferReceive += TerrainUploader.XferReceive; |
927 | remote_client.OnAbortXfer += AbortTerrainXferHandler; | 924 | remote_client.OnAbortXfer += AbortTerrainXferHandler; |
928 | TerrainUploader.TerrainUploadDone += HandleTerrainApplication; | 925 | TerrainUploader.TerrainUploadDone += HandleTerrainApplication; |
926 | TerrainUploader.RequestStartXfer(remote_client); | ||
927 | } | ||
928 | else | ||
929 | { | ||
930 | remote_client.SendAlertMessage("Another Terrain Upload is in progress. Please wait your turn!"); | ||
929 | } | 931 | } |
930 | TerrainUploader.RequestStartXfer(remote_client); | ||
931 | |||
932 | } | 932 | } |
933 | else | 933 | } |
934 | |||
935 | public bool IsTerrainXfer(ulong xferID) | ||
936 | { | ||
937 | lock (this) | ||
934 | { | 938 | { |
935 | remote_client.SendAlertMessage("Another Terrain Upload is in progress. Please wait your turn!"); | 939 | if (TerrainUploader == null) |
940 | return false; | ||
941 | else | ||
942 | return TerrainUploader.XferID == xferID; | ||
936 | } | 943 | } |
937 | } | 944 | } |
938 | 945 | ||
diff --git a/OpenSim/Region/CoreModules/World/Estate/EstateTerrainXferHandler.cs b/OpenSim/Region/CoreModules/World/Estate/EstateTerrainXferHandler.cs index b8d8b10..2d74eaf 100644 --- a/OpenSim/Region/CoreModules/World/Estate/EstateTerrainXferHandler.cs +++ b/OpenSim/Region/CoreModules/World/Estate/EstateTerrainXferHandler.cs | |||
@@ -78,7 +78,10 @@ namespace OpenSim.Region.CoreModules.World.Estate | |||
78 | /// <param name="data"></param> | 78 | /// <param name="data"></param> |
79 | public void XferReceive(IClientAPI remoteClient, ulong xferID, uint packetID, byte[] data) | 79 | public void XferReceive(IClientAPI remoteClient, ulong xferID, uint packetID, byte[] data) |
80 | { | 80 | { |
81 | if (mXferID == xferID) | 81 | if (mXferID != xferID) |
82 | return; | ||
83 | |||
84 | lock (this) | ||
82 | { | 85 | { |
83 | if (m_asset.Data.Length > 1) | 86 | if (m_asset.Data.Length > 1) |
84 | { | 87 | { |
@@ -99,7 +102,6 @@ namespace OpenSim.Region.CoreModules.World.Estate | |||
99 | if ((packetID & 0x80000000) != 0) | 102 | if ((packetID & 0x80000000) != 0) |
100 | { | 103 | { |
101 | SendCompleteMessage(remoteClient); | 104 | SendCompleteMessage(remoteClient); |
102 | |||
103 | } | 105 | } |
104 | } | 106 | } |
105 | } | 107 | } |
diff --git a/OpenSim/Region/CoreModules/World/WorldMap/WorldMapModule.cs b/OpenSim/Region/CoreModules/World/WorldMap/WorldMapModule.cs index bf18616..98fa763 100644 --- a/OpenSim/Region/CoreModules/World/WorldMap/WorldMapModule.cs +++ b/OpenSim/Region/CoreModules/World/WorldMap/WorldMapModule.cs | |||
@@ -162,7 +162,16 @@ namespace OpenSim.Region.CoreModules.World.WorldMap | |||
162 | regionimage = regionimage.Replace("-", ""); | 162 | regionimage = regionimage.Replace("-", ""); |
163 | m_log.Info("[WORLD MAP]: JPEG Map location: " + m_scene.RegionInfo.ServerURI + "index.php?method=" + regionimage); | 163 | m_log.Info("[WORLD MAP]: JPEG Map location: " + m_scene.RegionInfo.ServerURI + "index.php?method=" + regionimage); |
164 | 164 | ||
165 | MainServer.Instance.AddHTTPHandler(regionimage, OnHTTPGetMapImage); | 165 | MainServer.Instance.AddHTTPHandler(regionimage, |
166 | new GenericHTTPDOSProtector(OnHTTPGetMapImage, OnHTTPThrottled, new BasicDosProtectorOptions() | ||
167 | { | ||
168 | AllowXForwardedFor = false, | ||
169 | ForgetTimeSpan = TimeSpan.FromMinutes(2), | ||
170 | MaxRequestsInTimeframe = 4, | ||
171 | ReportingName = "MAPDOSPROTECTOR", | ||
172 | RequestTimeSpan = TimeSpan.FromSeconds(10), | ||
173 | ThrottledAction = BasicDOSProtector.ThrottleAction.DoThrottledMethod | ||
174 | }).Process); | ||
166 | MainServer.Instance.AddLLSDHandler( | 175 | MainServer.Instance.AddLLSDHandler( |
167 | "/MAP/MapItems/" + m_scene.RegionInfo.RegionHandle.ToString(), HandleRemoteMapItemRequest); | 176 | "/MAP/MapItems/" + m_scene.RegionInfo.RegionHandle.ToString(), HandleRemoteMapItemRequest); |
168 | 177 | ||
@@ -1131,6 +1140,16 @@ namespace OpenSim.Region.CoreModules.World.WorldMap | |||
1131 | block.Y = (ushort)(r.RegionLocY / Constants.RegionSize); | 1140 | block.Y = (ushort)(r.RegionLocY / Constants.RegionSize); |
1132 | } | 1141 | } |
1133 | 1142 | ||
1143 | public Hashtable OnHTTPThrottled(Hashtable keysvals) | ||
1144 | { | ||
1145 | Hashtable reply = new Hashtable(); | ||
1146 | int statuscode = 500; | ||
1147 | reply["str_response_string"] = ""; | ||
1148 | reply["int_response_code"] = statuscode; | ||
1149 | reply["content_type"] = "text/plain"; | ||
1150 | return reply; | ||
1151 | } | ||
1152 | |||
1134 | public Hashtable OnHTTPGetMapImage(Hashtable keysvals) | 1153 | public Hashtable OnHTTPGetMapImage(Hashtable keysvals) |
1135 | { | 1154 | { |
1136 | m_log.Debug("[WORLD MAP]: Sending map image jpeg"); | 1155 | m_log.Debug("[WORLD MAP]: Sending map image jpeg"); |