From 91fc8bbd80773deeb36de83088833f4eda7b36fd Mon Sep 17 00:00:00 2001 From: UbitUmarov Date: Wed, 26 Aug 2020 14:15:35 +0100 Subject: [PATCH] change handling of temporary caps services --- .../Linden/Caps/BunchOfCaps/BunchOfCaps.cs | 91 +++-- .../Caps/BunchOfCaps/UpdateItemAsset.cs | 341 ++++++++---------- 2 files changed, 197 insertions(+), 235 deletions(-) diff --git a/OpenSim/Region/ClientStack/Linden/Caps/BunchOfCaps/BunchOfCaps.cs b/OpenSim/Region/ClientStack/Linden/Caps/BunchOfCaps/BunchOfCaps.cs index 91fed4de68..6552cb826c 100644 --- a/OpenSim/Region/ClientStack/Linden/Caps/BunchOfCaps/BunchOfCaps.cs +++ b/OpenSim/Region/ClientStack/Linden/Caps/BunchOfCaps/BunchOfCaps.cs @@ -32,6 +32,7 @@ using System.Collections.Generic; using System.Collections.Specialized; using System.IO; using System.Net; +using System.Threading; using System.Reflection; using System.Security.Cryptography; using System.Text; @@ -56,6 +57,7 @@ using Caps = OpenSim.Framework.Capabilities.Caps; using OSDArray = OpenMetaverse.StructuredData.OSDArray; using OSDMap = OpenMetaverse.StructuredData.OSDMap; using PermissionMask = OpenSim.Framework.PermissionMask; +using Timer = System.Threading.Timer; namespace OpenSim.Region.ClientStack.Linden { @@ -2359,7 +2361,7 @@ namespace OpenSim.Region.ClientStack.Linden private int m_cost; private string m_error = String.Empty; - private Timer m_timeoutTimer = new Timer(); + private System.Timers.Timer m_timeoutTimer; private UUID m_texturesFolder; private int m_nreqtextures; private int m_nreqmeshs; @@ -2395,6 +2397,8 @@ namespace OpenSim.Region.ClientStack.Linden m_nreqinstances = nreqinstances; m_IsAtestUpload = IsAtestUpload; + m_address = address; + m_timeoutTimer = new System.Timers.Timer(); m_timeoutTimer.Elapsed += TimedOut; m_timeoutTimer.Interval = 120000; m_timeoutTimer.AutoReset = false; @@ -2503,35 +2507,57 @@ namespace OpenSim.Region.ClientStack.Linden } } - public class ScriptResourceSummary + public class ExpiringCapBase + { + protected IHttpServer m_httpListener; + protected string m_mypath; + protected Timer m_timeoutTimer; + + public ExpiringCapBase(IHttpServer httpServer, string path) + { + m_httpListener = httpServer; + m_mypath = path; + } + + public virtual void Start(int timeout) + { + m_timeoutTimer = new Timer(Timedout, null, timeout, Timeout.Infinite); + } + + public virtual void Stop() + { + m_httpListener.RemoveSimpleStreamHandler(m_mypath); + m_timeoutTimer.Dispose(); + m_timeoutTimer = null; + } + + public virtual void Timedout(object state) + { + Stop(); + m_log.InfoFormat("[CAPS]: Removing URL and handler for timed out service"); + } + } + + public class ScriptResourceSummary : ExpiringCapBase { private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); - private IHttpServer m_httpListener; - private string m_mypath; private Scene m_scene; - private Timer m_timeoutTimer; private UUID m_agentID; private int m_memory; private int m_urls; private IPAddress m_address; public ScriptResourceSummary(Scene scene, UUID agentID, IHttpServer httpServer, string path, IPAddress address, - int memory, int urls) + int memory, int urls) : base(httpServer, path) { - m_httpListener = httpServer; m_address = address; - m_mypath = path; m_scene = scene; m_agentID = agentID; m_memory = memory; m_urls = urls; - m_timeoutTimer = new Timer(); - m_timeoutTimer.Elapsed += TimedOut; - m_timeoutTimer.Interval = 30000; - m_timeoutTimer.AutoReset = false; - m_timeoutTimer.Start(); + Start(30000); } /// @@ -2543,9 +2569,7 @@ namespace OpenSim.Region.ClientStack.Linden /// public void ScriptResourceSummaryCap(IOSHttpRequest request, IOSHttpResponse response) { - m_timeoutTimer.Stop(); - m_httpListener.RemoveSimpleStreamHandler(m_mypath); - m_timeoutTimer.Dispose(); + Stop(); if (!request.RemoteIPEndPoint.Address.Equals(m_address)) { @@ -2597,43 +2621,26 @@ namespace OpenSim.Region.ClientStack.Linden response.RawBuffer = LLSDxmlEncode.EndToNBBytes(sb); response.StatusCode = (int)HttpStatusCode.OK; } - - private void TimedOut(object sender, ElapsedEventArgs args) - { - m_httpListener.RemoveSimpleStreamHandler(m_mypath); - m_log.InfoFormat("[CAPS]: Removing URL and handler for timed out ScriptResourceSummary"); - m_timeoutTimer.Dispose(); - } } - public class ScriptResourceDetails + public class ScriptResourceDetails : ExpiringCapBase { private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); - private IHttpServer m_httpListener; - private string m_mypath; private Scene m_scene; - private Timer m_timeoutTimer; private UUID m_agentID; private List m_parcelsInfo; - private IPAddress m_address; public ScriptResourceDetails(Scene scene, UUID agentID, IHttpServer httpServer, string path, IPAddress address, - List parcelsInfo) + List parcelsInfo) :base(httpServer, path) { - m_httpListener = httpServer; m_address = address; - m_mypath = path; m_scene = scene; m_agentID = agentID; m_parcelsInfo = parcelsInfo; - m_timeoutTimer = new Timer(); - m_timeoutTimer.Elapsed += TimedOut; - m_timeoutTimer.Interval = 30000; - m_timeoutTimer.AutoReset = false; - m_timeoutTimer.Start(); + Start(30000); } /// @@ -2645,9 +2652,7 @@ namespace OpenSim.Region.ClientStack.Linden /// public void ScriptResourceDetailsCap(IOSHttpRequest request, IOSHttpResponse response) { - m_timeoutTimer.Stop(); - m_httpListener.RemoveSimpleStreamHandler(m_mypath); - m_timeoutTimer.Dispose(); + Stop(); if (!request.RemoteIPEndPoint.Address.Equals(m_address)) { @@ -2705,18 +2710,10 @@ namespace OpenSim.Region.ClientStack.Linden else LLSDxmlEncode.AddEmptyArray("parcels", sb); - LLSDxmlEncode.AddEndMap(sb); response.RawBuffer = LLSDxmlEncode.EndToNBBytes(sb); response.StatusCode = (int)HttpStatusCode.OK; } - - private void TimedOut(object sender, ElapsedEventArgs args) - { - m_httpListener.RemoveSimpleStreamHandler(m_mypath); - m_log.InfoFormat("[CAPS]: Removing URL and handler for timed out ScriptResourceSummary"); - m_timeoutTimer.Dispose(); - } } } } \ No newline at end of file diff --git a/OpenSim/Region/ClientStack/Linden/Caps/BunchOfCaps/UpdateItemAsset.cs b/OpenSim/Region/ClientStack/Linden/Caps/BunchOfCaps/UpdateItemAsset.cs index 40272d78f2..54882440fd 100644 --- a/OpenSim/Region/ClientStack/Linden/Caps/BunchOfCaps/UpdateItemAsset.cs +++ b/OpenSim/Region/ClientStack/Linden/Caps/BunchOfCaps/UpdateItemAsset.cs @@ -4,7 +4,7 @@ using System.Collections; using System.IO; using System.Net; using System.Text; -using System.Timers; +using System.Threading; using OpenMetaverse; using OpenMetaverse.StructuredData; @@ -231,7 +231,6 @@ namespace OpenSim.Region.ClientStack.Linden m_log.Error("[UpdateScriptTaskInventory]: " + e.ToString()); } } - /// /// Called when new asset data for an agent inventory item update has been uploaded. /// @@ -253,215 +252,181 @@ namespace OpenSim.Region.ClientStack.Linden { return true; } - } - - - /// - /// This class is a callback invoked when a client sends asset data to - /// an agent inventory notecard update url - /// - public class ItemUpdater - { - public event UpdateItem OnUpLoad = null; - private string m_uploaderPath = String.Empty; - private UUID m_inventoryItemID; - private UUID m_objectID; - private IHttpServer m_httpListener; - private bool m_dumpAssetToFile; - public IPAddress m_remoteAdress; - private byte m_assetType; - private Timer m_timeout; - - public ItemUpdater(UUID inventoryItem, UUID objectid,byte aType, string path, IHttpServer httpServer, bool dumpAssetToFile) - { - m_dumpAssetToFile = dumpAssetToFile; - - m_inventoryItemID = inventoryItem; - m_objectID = objectid; - m_uploaderPath = path; - m_httpListener = httpServer; - m_assetType = aType; - - m_timeout = new Timer(); - m_timeout.Elapsed += Timeout; - m_timeout.AutoReset = false; - m_timeout.Interval = 30000; - m_timeout.Start(); - } - - private void Timeout(Object source, ElapsedEventArgs e) - { - m_httpListener.RemoveSimpleStreamHandler(m_uploaderPath); - m_timeout.Dispose(); - } /// - /// Handle raw uploaded asset data. + /// This class is a callback invoked when a client sends asset data to + /// an agent inventory notecard update url /// - /// - /// - /// - /// - public void process(IOSHttpRequest request, IOSHttpResponse response, byte[] data) + public class ItemUpdater : ExpiringCapBase { - m_timeout.Stop(); - m_httpListener.RemoveSimpleStreamHandler(m_uploaderPath); - m_timeout.Dispose(); + public event UpdateItem OnUpLoad = null; + private UUID m_inventoryItemID; + private UUID m_objectID; + private bool m_dumpAssetToFile; + public IPAddress m_remoteAdress; + private byte m_assetType; - if (!request.RemoteIPEndPoint.Address.Equals(m_remoteAdress)) + public ItemUpdater(UUID inventoryItem, UUID objectid, byte aType, string path, IHttpServer httpServer, bool dumpAssetToFile): + base(httpServer, path) { - response.StatusCode = (int)HttpStatusCode.Unauthorized; - return; + m_dumpAssetToFile = dumpAssetToFile; + + m_inventoryItemID = inventoryItem; + m_objectID = objectid; + m_httpListener = httpServer; + m_assetType = aType; + + Start(30000); } - string res = String.Empty; - - if (OnUpLoad == null) + /// + /// Handle raw uploaded asset data. + /// + /// + /// + /// + /// + public void process(IOSHttpRequest request, IOSHttpResponse response, byte[] data) { - response.StatusCode = (int)HttpStatusCode.Gone; - return; - } + Stop(); - if (!BunchOfCaps.ValidateAssetData(m_assetType, data)) - { - response.StatusCode = (int)HttpStatusCode.BadRequest; - return; - } + if (!request.RemoteIPEndPoint.Address.Equals(m_remoteAdress)) + { + response.StatusCode = (int)HttpStatusCode.Unauthorized; + return; + } - UUID assetID = OnUpLoad(m_inventoryItemID, m_objectID, data); - - if (assetID == UUID.Zero) - { - LLSDAssetUploadError uperror = new LLSDAssetUploadError(); - uperror.message = "Failed to update inventory item asset"; - uperror.identifier = m_inventoryItemID; - res = LLSDHelpers.SerialiseLLSDReply(uperror); - } - else - { - LLSDAssetUploadComplete uploadComplete = new LLSDAssetUploadComplete(); - uploadComplete.new_asset = assetID.ToString(); - uploadComplete.new_inventory_item = m_inventoryItemID; - uploadComplete.state = "complete"; - res = LLSDHelpers.SerialiseLLSDReply(uploadComplete); - } - - if (m_dumpAssetToFile) - { - Util.SaveAssetToFile("updateditem" + Util.RandomClass.Next(1, 1000) + ".dat", data); - } - - response.StatusCode = (int)HttpStatusCode.OK; - response.RawBuffer = Util.UTF8NBGetbytes(res); - } - } - - /// - /// This class is a callback invoked when a client sends asset data to - /// a task inventory script update url - /// - public class TaskInventoryScriptUpdater - { - public event UpdateTaskScript OnUpLoad; - private string m_uploaderPath = String.Empty; - private UUID m_inventoryItemID; - private UUID m_primID; - private bool m_isScriptRunning; - private IHttpServer m_httpListener; - private bool m_dumpAssetToFile; - public IPAddress m_remoteAddress; - private Timer m_timeout; - - public TaskInventoryScriptUpdater(UUID inventoryItemID, UUID primID, bool isScriptRunning, - string path, IHttpServer httpServer, IPAddress address, bool dumpAssetToFile) - { - m_dumpAssetToFile = dumpAssetToFile; - - m_inventoryItemID = inventoryItemID; - m_primID = primID; - - m_isScriptRunning = isScriptRunning; - - m_uploaderPath = path; - m_httpListener = httpServer; - m_remoteAddress = address; - m_timeout = new Timer(); - m_timeout.Elapsed += Timeout; - m_timeout.AutoReset = false; - m_timeout.Interval = 30000; - m_timeout.Start(); - } - - private void Timeout(Object source, ElapsedEventArgs e) - { - m_httpListener.RemoveSimpleStreamHandler(m_uploaderPath); - m_timeout.Dispose(); - } - - /// - /// - /// - /// - /// - /// - /// - public void process(IOSHttpRequest request, IOSHttpResponse response, byte[] data) - { - m_timeout.Stop(); - m_httpListener.RemoveSimpleStreamHandler(m_uploaderPath); - m_timeout.Dispose(); - - if (!request.RemoteIPEndPoint.Address.Equals(m_remoteAddress)) - { - response.StatusCode = (int)HttpStatusCode.Unauthorized; - return; - } - - if (OnUpLoad == null) - { - response.StatusCode = (int)HttpStatusCode.Gone; - return; - } - - if (!BunchOfCaps.ValidateAssetData((byte)AssetType.LSLText, data)) - { - response.StatusCode = (int)HttpStatusCode.BadRequest; - return; - } - - response.StatusCode = (int)HttpStatusCode.OK; - - try - { string res = String.Empty; - LLSDTaskScriptUploadComplete uploadComplete = new LLSDTaskScriptUploadComplete(); - ArrayList errors = new ArrayList(); - OnUpLoad?.Invoke(m_inventoryItemID, m_primID, m_isScriptRunning, data, ref errors); + if (OnUpLoad == null) + { + response.StatusCode = (int)HttpStatusCode.Gone; + return; + } - uploadComplete.new_asset = m_inventoryItemID; - uploadComplete.compiled = errors.Count > 0 ? false : true; - uploadComplete.state = "complete"; - uploadComplete.errors = new OpenSim.Framework.Capabilities.OSDArray(); - uploadComplete.errors.Array = errors; + if (!BunchOfCaps.ValidateAssetData(m_assetType, data)) + { + response.StatusCode = (int)HttpStatusCode.BadRequest; + return; + } - res = LLSDHelpers.SerialiseLLSDReply(uploadComplete); + UUID assetID = OnUpLoad(m_inventoryItemID, m_objectID, data); + + if (assetID == UUID.Zero) + { + LLSDAssetUploadError uperror = new LLSDAssetUploadError(); + uperror.message = "Failed to update inventory item asset"; + uperror.identifier = m_inventoryItemID; + res = LLSDHelpers.SerialiseLLSDReply(uperror); + } + else + { + LLSDAssetUploadComplete uploadComplete = new LLSDAssetUploadComplete(); + uploadComplete.new_asset = assetID.ToString(); + uploadComplete.new_inventory_item = m_inventoryItemID; + uploadComplete.state = "complete"; + res = LLSDHelpers.SerialiseLLSDReply(uploadComplete); + } if (m_dumpAssetToFile) { - Util.SaveAssetToFile("updatedtaskscript" + Util.RandomClass.Next(1, 1000) + ".dat", data); + Util.SaveAssetToFile("updateditem" + Util.RandomClass.Next(1, 1000) + ".dat", data); } - // m_log.InfoFormat("[CAPS]: TaskInventoryScriptUpdater.uploaderCaps res: {0}", res); + response.StatusCode = (int)HttpStatusCode.OK; response.RawBuffer = Util.UTF8NBGetbytes(res); } - catch + } + + /// + /// This class is a callback invoked when a client sends asset data to + /// a task inventory script update url + /// + public class TaskInventoryScriptUpdater : ExpiringCapBase + { + public event UpdateTaskScript OnUpLoad; + private UUID m_inventoryItemID; + private UUID m_primID; + private bool m_isScriptRunning; + private bool m_dumpAssetToFile; + public IPAddress m_remoteAddress; + private Timer m_timeout; + + public TaskInventoryScriptUpdater(UUID inventoryItemID, UUID primID, bool isScriptRunning, + string path, IHttpServer httpServer, IPAddress address, + bool dumpAssetToFile) : base(httpServer, path) { - LLSDAssetUploadError error = new LLSDAssetUploadError(); - error.message = "could not compile script"; - error.identifier = UUID.Zero; - response.RawBuffer = Util.UTF8NBGetbytes(LLSDHelpers.SerialiseLLSDReply(error)); - return; + m_dumpAssetToFile = dumpAssetToFile; + m_inventoryItemID = inventoryItemID; + m_primID = primID; + m_isScriptRunning = isScriptRunning; + m_remoteAddress = address; + Start(30000); + } + + /// + /// + /// + /// + /// + /// + /// + public void process(IOSHttpRequest request, IOSHttpResponse response, byte[] data) + { + Stop(); + + if (!request.RemoteIPEndPoint.Address.Equals(m_remoteAddress)) + { + response.StatusCode = (int)HttpStatusCode.Unauthorized; + return; + } + + if (OnUpLoad == null) + { + response.StatusCode = (int)HttpStatusCode.Gone; + return; + } + + if (!BunchOfCaps.ValidateAssetData((byte)AssetType.LSLText, data)) + { + response.StatusCode = (int)HttpStatusCode.BadRequest; + return; + } + + response.StatusCode = (int)HttpStatusCode.OK; + + try + { + string res = String.Empty; + LLSDTaskScriptUploadComplete uploadComplete = new LLSDTaskScriptUploadComplete(); + + ArrayList errors = new ArrayList(); + OnUpLoad?.Invoke(m_inventoryItemID, m_primID, m_isScriptRunning, data, ref errors); + + uploadComplete.new_asset = m_inventoryItemID; + uploadComplete.compiled = errors.Count > 0 ? false : true; + uploadComplete.state = "complete"; + uploadComplete.errors = new OpenSim.Framework.Capabilities.OSDArray(); + uploadComplete.errors.Array = errors; + + res = LLSDHelpers.SerialiseLLSDReply(uploadComplete); + + if (m_dumpAssetToFile) + { + Util.SaveAssetToFile("updatedtaskscript" + Util.RandomClass.Next(1, 1000) + ".dat", data); + } + + // m_log.InfoFormat("[CAPS]: TaskInventoryScriptUpdater.uploaderCaps res: {0}", res); + response.RawBuffer = Util.UTF8NBGetbytes(res); + } + catch + { + LLSDAssetUploadError error = new LLSDAssetUploadError(); + error.message = "could not compile script"; + error.identifier = UUID.Zero; + response.RawBuffer = Util.UTF8NBGetbytes(LLSDHelpers.SerialiseLLSDReply(error)); + return; + } } } }