mirror of
https://github.com/opensim/opensim.git
synced 2026-08-06 09:16:28 +08:00
Merge branch 'master' into varregion
This commit is contained in:
@@ -33,6 +33,7 @@ using OpenSim.Framework;
|
||||
|
||||
using OpenSim.Region.Framework.Scenes;
|
||||
using OpenSim.Services.Interfaces;
|
||||
using OpenSim.Region.Framework.Interfaces;
|
||||
|
||||
namespace OpenSim.Region.CoreModules.Agent.AssetTransaction
|
||||
{
|
||||
@@ -119,6 +120,14 @@ namespace OpenSim.Region.CoreModules.Agent.AssetTransaction
|
||||
}
|
||||
else
|
||||
{
|
||||
// Check if the xfer is a terrain xfer
|
||||
IEstateModule estateModule = m_Scene.RequestModuleInterface<IEstateModule>();
|
||||
if (estateModule != null)
|
||||
{
|
||||
if (estateModule.IsTerrainXfer(xferID))
|
||||
return;
|
||||
}
|
||||
|
||||
m_log.ErrorFormat(
|
||||
"[AGENT ASSET TRANSACTIONS]: Could not find uploader for xfer id {0}, packet id {1}, data length {2}",
|
||||
xferID, packetID, data.Length);
|
||||
|
||||
@@ -42,14 +42,22 @@ using log4net;
|
||||
|
||||
namespace OpenSim.Region.CoreModules.Avatar.Friends
|
||||
{
|
||||
public class FriendsRequestHandler : BaseStreamHandler
|
||||
public class FriendsRequestHandler : BaseStreamHandlerBasicDOSProtector
|
||||
{
|
||||
private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
|
||||
|
||||
private FriendsModule m_FriendsModule;
|
||||
|
||||
public FriendsRequestHandler(FriendsModule fmodule)
|
||||
: base("POST", "/friends")
|
||||
: base("POST", "/friends", new BasicDosProtectorOptions()
|
||||
{
|
||||
AllowXForwardedFor = true,
|
||||
ForgetTimeSpan = TimeSpan.FromMinutes(2),
|
||||
MaxRequestsInTimeframe = 20,
|
||||
ReportingName = "FRIENDSDOSPROTECTOR",
|
||||
RequestTimeSpan = TimeSpan.FromSeconds(5),
|
||||
ThrottledAction = BasicDOSProtector.ThrottleAction.DoThrottledMethod
|
||||
})
|
||||
{
|
||||
m_FriendsModule = fmodule;
|
||||
}
|
||||
|
||||
@@ -757,64 +757,29 @@ namespace OpenSim.Region.CoreModules.Framework.InventoryAccess
|
||||
|
||||
SceneObjectGroup group = null;
|
||||
|
||||
string xmlData = Utils.BytesToString(rezAsset.Data);
|
||||
List<SceneObjectGroup> objlist = new List<SceneObjectGroup>();
|
||||
List<Vector3> veclist = new List<Vector3>();
|
||||
List<SceneObjectGroup> objlist;
|
||||
List<Vector3> veclist;
|
||||
Vector3 bbox;
|
||||
float offsetHeight;
|
||||
byte bRayEndIsIntersection = (byte)(RayEndIsIntersection ? 1 : 0);
|
||||
Vector3 pos;
|
||||
|
||||
XmlDocument doc = new XmlDocument();
|
||||
doc.LoadXml(xmlData);
|
||||
XmlElement e = (XmlElement)doc.SelectSingleNode("/CoalescedObject");
|
||||
if (e == null || attachment) // Single
|
||||
bool single = m_Scene.GetObjectsToRez(rezAsset.Data, attachment, out objlist, out veclist, out bbox, out offsetHeight);
|
||||
|
||||
if (single)
|
||||
{
|
||||
SceneObjectGroup g = SceneObjectSerializer.FromOriginalXmlFormat(xmlData);
|
||||
|
||||
objlist.Add(g);
|
||||
veclist.Add(Vector3.Zero);
|
||||
|
||||
float offsetHeight = 0;
|
||||
pos = m_Scene.GetNewRezLocation(
|
||||
RayStart, RayEnd, RayTargetID, Quaternion.Identity,
|
||||
BypassRayCast, bRayEndIsIntersection, true, g.GetAxisAlignedBoundingBox(out offsetHeight), false);
|
||||
BypassRayCast, bRayEndIsIntersection, true, bbox, false);
|
||||
pos.Z += offsetHeight;
|
||||
}
|
||||
else
|
||||
{
|
||||
XmlElement coll = (XmlElement)e;
|
||||
float bx = Convert.ToSingle(coll.GetAttribute("x"));
|
||||
float by = Convert.ToSingle(coll.GetAttribute("y"));
|
||||
float bz = Convert.ToSingle(coll.GetAttribute("z"));
|
||||
Vector3 bbox = new Vector3(bx, by, bz);
|
||||
|
||||
pos = m_Scene.GetNewRezLocation(RayStart, RayEnd,
|
||||
RayTargetID, Quaternion.Identity,
|
||||
BypassRayCast, bRayEndIsIntersection, true,
|
||||
bbox, false);
|
||||
|
||||
pos -= bbox / 2;
|
||||
|
||||
XmlNodeList groups = e.SelectNodes("SceneObjectGroup");
|
||||
foreach (XmlNode n in groups)
|
||||
{
|
||||
SceneObjectGroup g = SceneObjectSerializer.FromOriginalXmlFormat(n.OuterXml);
|
||||
|
||||
objlist.Add(g);
|
||||
XmlElement el = (XmlElement)n;
|
||||
|
||||
string rawX = el.GetAttribute("offsetx");
|
||||
string rawY = el.GetAttribute("offsety");
|
||||
string rawZ = el.GetAttribute("offsetz");
|
||||
//
|
||||
// m_log.DebugFormat(
|
||||
// "[INVENTORY ACCESS MODULE]: Converting coalesced object {0} offset <{1}, {2}, {3}>",
|
||||
// g.Name, rawX, rawY, rawZ);
|
||||
|
||||
float x = Convert.ToSingle(rawX);
|
||||
float y = Convert.ToSingle(rawY);
|
||||
float z = Convert.ToSingle(rawZ);
|
||||
veclist.Add(new Vector3(x, y, z));
|
||||
}
|
||||
}
|
||||
|
||||
if (item != null && !DoPreRezWhenFromItem(remoteClient, item, objlist, pos, veclist, attachment))
|
||||
|
||||
@@ -829,26 +829,23 @@ namespace OpenSim.Region.CoreModules.World.Estate
|
||||
|
||||
private void AbortTerrainXferHandler(IClientAPI remoteClient, ulong XferID)
|
||||
{
|
||||
if (TerrainUploader != null)
|
||||
lock (this)
|
||||
{
|
||||
lock (TerrainUploader)
|
||||
if ((TerrainUploader != null) && (XferID == TerrainUploader.XferID))
|
||||
{
|
||||
if (XferID == TerrainUploader.XferID)
|
||||
{
|
||||
remoteClient.OnXferReceive -= TerrainUploader.XferReceive;
|
||||
remoteClient.OnAbortXfer -= AbortTerrainXferHandler;
|
||||
TerrainUploader.TerrainUploadDone -= HandleTerrainApplication;
|
||||
remoteClient.OnXferReceive -= TerrainUploader.XferReceive;
|
||||
remoteClient.OnAbortXfer -= AbortTerrainXferHandler;
|
||||
TerrainUploader.TerrainUploadDone -= HandleTerrainApplication;
|
||||
|
||||
TerrainUploader = null;
|
||||
remoteClient.SendAlertMessage("Terrain Upload aborted by the client");
|
||||
}
|
||||
TerrainUploader = null;
|
||||
remoteClient.SendAlertMessage("Terrain Upload aborted by the client");
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
private void HandleTerrainApplication(string filename, byte[] terrainData, IClientAPI remoteClient)
|
||||
{
|
||||
lock (TerrainUploader)
|
||||
lock (this)
|
||||
{
|
||||
remoteClient.OnXferReceive -= TerrainUploader.XferReceive;
|
||||
remoteClient.OnAbortXfer -= AbortTerrainXferHandler;
|
||||
@@ -907,22 +904,32 @@ namespace OpenSim.Region.CoreModules.World.Estate
|
||||
|
||||
private void handleUploadTerrain(IClientAPI remote_client, string clientFileName)
|
||||
{
|
||||
if (TerrainUploader == null)
|
||||
lock (this)
|
||||
{
|
||||
|
||||
TerrainUploader = new EstateTerrainXferHandler(remote_client, clientFileName);
|
||||
lock (TerrainUploader)
|
||||
if (TerrainUploader == null)
|
||||
{
|
||||
m_log.DebugFormat("Starting to receive uploaded terrain");
|
||||
TerrainUploader = new EstateTerrainXferHandler(remote_client, clientFileName);
|
||||
remote_client.OnXferReceive += TerrainUploader.XferReceive;
|
||||
remote_client.OnAbortXfer += AbortTerrainXferHandler;
|
||||
TerrainUploader.TerrainUploadDone += HandleTerrainApplication;
|
||||
TerrainUploader.RequestStartXfer(remote_client);
|
||||
}
|
||||
else
|
||||
{
|
||||
remote_client.SendAlertMessage("Another Terrain Upload is in progress. Please wait your turn!");
|
||||
}
|
||||
TerrainUploader.RequestStartXfer(remote_client);
|
||||
|
||||
}
|
||||
else
|
||||
}
|
||||
|
||||
public bool IsTerrainXfer(ulong xferID)
|
||||
{
|
||||
lock (this)
|
||||
{
|
||||
remote_client.SendAlertMessage("Another Terrain Upload is in progress. Please wait your turn!");
|
||||
if (TerrainUploader == null)
|
||||
return false;
|
||||
else
|
||||
return TerrainUploader.XferID == xferID;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -78,7 +78,10 @@ namespace OpenSim.Region.CoreModules.World.Estate
|
||||
/// <param name="data"></param>
|
||||
public void XferReceive(IClientAPI remoteClient, ulong xferID, uint packetID, byte[] data)
|
||||
{
|
||||
if (mXferID == xferID)
|
||||
if (mXferID != xferID)
|
||||
return;
|
||||
|
||||
lock (this)
|
||||
{
|
||||
if (m_asset.Data.Length > 1)
|
||||
{
|
||||
@@ -99,7 +102,6 @@ namespace OpenSim.Region.CoreModules.World.Estate
|
||||
if ((packetID & 0x80000000) != 0)
|
||||
{
|
||||
SendCompleteMessage(remoteClient);
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -165,7 +165,16 @@ namespace OpenSim.Region.CoreModules.World.WorldMap
|
||||
regionimage = regionimage.Replace("-", "");
|
||||
m_log.Info("[WORLD MAP]: JPEG Map location: " + m_scene.RegionInfo.ServerURI + "index.php?method=" + regionimage);
|
||||
|
||||
MainServer.Instance.AddHTTPHandler(regionimage, OnHTTPGetMapImage);
|
||||
MainServer.Instance.AddHTTPHandler(regionimage,
|
||||
new GenericHTTPDOSProtector(OnHTTPGetMapImage, OnHTTPThrottled, new BasicDosProtectorOptions()
|
||||
{
|
||||
AllowXForwardedFor = false,
|
||||
ForgetTimeSpan = TimeSpan.FromMinutes(2),
|
||||
MaxRequestsInTimeframe = 4,
|
||||
ReportingName = "MAPDOSPROTECTOR",
|
||||
RequestTimeSpan = TimeSpan.FromSeconds(10),
|
||||
ThrottledAction = BasicDOSProtector.ThrottleAction.DoThrottledMethod
|
||||
}).Process);
|
||||
MainServer.Instance.AddLLSDHandler(
|
||||
"/MAP/MapItems/" + m_scene.RegionInfo.RegionHandle.ToString(), HandleRemoteMapItemRequest);
|
||||
|
||||
@@ -1081,6 +1090,16 @@ namespace OpenSim.Region.CoreModules.World.WorldMap
|
||||
block.Y = (ushort)(r.RegionLocY / Constants.RegionSize);
|
||||
}
|
||||
|
||||
public Hashtable OnHTTPThrottled(Hashtable keysvals)
|
||||
{
|
||||
Hashtable reply = new Hashtable();
|
||||
int statuscode = 500;
|
||||
reply["str_response_string"] = "";
|
||||
reply["int_response_code"] = statuscode;
|
||||
reply["content_type"] = "text/plain";
|
||||
return reply;
|
||||
}
|
||||
|
||||
public Hashtable OnHTTPGetMapImage(Hashtable keysvals)
|
||||
{
|
||||
m_log.Debug("[WORLD MAP]: Sending map image jpeg");
|
||||
|
||||
Reference in New Issue
Block a user