From d06efefb48c7fabf6899a85df52f680221f68954 Mon Sep 17 00:00:00 2001 From: UbitUmarov Date: Fri, 18 Mar 2022 16:15:07 +0000 Subject: [PATCH] Emailmodule. Receive mailbox dependis on prim having email event on scripts; send via smpt or to external prims are now options. The ini section name smtp is not wrong" --- .../Scripting/EMailModules/EmailModule.cs | 127 ++++++++++-------- .../Framework/Interfaces/IEmailModule.cs | 2 + OpenSim/Region/Framework/Scenes/Scene.cs | 6 + .../Framework/Scenes/SceneObjectPart.cs | 15 ++- bin/OpenSim.ini.example | 2 +- 5 files changed, 95 insertions(+), 57 deletions(-) diff --git a/OpenSim/Region/CoreModules/Scripting/EMailModules/EmailModule.cs b/OpenSim/Region/CoreModules/Scripting/EMailModules/EmailModule.cs index 665365239d..f4f7c7cbe3 100644 --- a/OpenSim/Region/CoreModules/Scripting/EMailModules/EmailModule.cs +++ b/OpenSim/Region/CoreModules/Scripting/EMailModules/EmailModule.cs @@ -68,6 +68,7 @@ namespace OpenSim.Region.CoreModules.Scripting.EmailModules private Dictionary> m_MailQueues = new Dictionary>(); private Dictionary m_LastGetEmailCall = new Dictionary(); private double m_QueueTimeout = 30 * 60; // 15min; + private double m_nextQueuesExpire; private string m_InterObjectHostname = "lsl.opensim.local"; private int m_MaxEmailSize = 4096; // largest email allowed by default, as per lsl docs. @@ -75,6 +76,8 @@ namespace OpenSim.Region.CoreModules.Scripting.EmailModules private static SslPolicyErrors m_SMTP_SslPolicyErrorsMask; private bool m_checkSpecName; + private object m_queuesLock = new object(); + // Scenes by Region Handle private Dictionary m_Scenes = new Dictionary(); @@ -149,6 +152,7 @@ namespace OpenSim.Region.CoreModules.Scripting.EmailModules return; } + m_nextQueuesExpire = Util.GetTimeStamp() + m_QueueTimeout; m_Enabled = true; } @@ -198,28 +202,49 @@ namespace OpenSim.Region.CoreModules.Scripting.EmailModules #endregion + public void AddPartMailBox(UUID objectID) + { + lock (m_queuesLock) + { + if (!m_MailQueues.TryGetValue(objectID, out List elist)) + { + m_MailQueues[objectID] = null; + //TODO external global + } + } + } + + public void RemovePartMailBox(UUID objectID) + { + lock (m_queuesLock) + { + m_LastGetEmailCall.Remove(objectID); + if (m_MailQueues.Remove(objectID)) + { + //TODO external global + } + } + } + public void InsertEmail(UUID to, Email email) { - lock (m_MailQueues) + lock (m_queuesLock) { if (m_MailQueues.TryGetValue(to, out List elist)) { - if (elist.Count >= m_MaxQueueSize) - return; - lock (elist) + if(elist == null) { + elist = new List(); elist.Add(email); + m_MailQueues[to] = elist; + } + else + { + if (elist.Count >= m_MaxQueueSize) + return; + lock (elist) + elist.Add(email); } - } - else - { - elist = new List(); - elist.Add(email); - m_MailQueues[to] = elist; - } - - lock (m_LastGetEmailCall) - { m_LastGetEmailCall[to] = Util.GetTimeStamp() + m_QueueTimeout; } } @@ -398,63 +423,55 @@ namespace OpenSim.Region.CoreModules.Scripting.EmailModules /// public Email GetNextEmail(UUID objectID, string sender, string subject) { - lock (m_LastGetEmailCall) + lock (m_queuesLock) { double now = Util.GetTimeStamp(); m_LastGetEmailCall[objectID] = now + m_QueueTimeout; - List removal = new List(m_LastGetEmailCall.Count); - foreach (KeyValuePair kpv in m_LastGetEmailCall) + if( now > m_nextQueuesExpire) { - if (kpv.Value < now) - removal.Add(kpv.Key); - } - - foreach (UUID remove in removal) - { - m_LastGetEmailCall.Remove(remove); - lock (m_MailQueues) + List removal = new List(m_LastGetEmailCall.Count); + foreach (KeyValuePair kpv in m_LastGetEmailCall) { - m_MailQueues.Remove(remove); + if (kpv.Value < now) + removal.Add(kpv.Key); } - } - } - List queue = null; - lock (m_MailQueues) - { - m_MailQueues.TryGetValue(objectID, out queue); - } - - if (queue != null) - { - lock (queue) - { - if (queue.Count > 0) + foreach (UUID remove in removal) { - bool emptySender = string.IsNullOrEmpty(sender); - bool emptySubject = string.IsNullOrEmpty(subject); + m_LastGetEmailCall.Remove(remove); + m_MailQueues[remove] = null; + } + m_nextQueuesExpire = now + m_QueueTimeout; + } - int i; - Email ret; - for (i = 0; i < queue.Count; i++) + m_MailQueues.TryGetValue(objectID, out List queue); + if (queue != null) + { + lock (queue) + { + if (queue.Count > 0) { - ret = queue[i]; - if (emptySender || sender.Equals(ret.sender, StringComparison.InvariantCultureIgnoreCase) && - (emptySubject || subject.Equals(ret.subject, StringComparison.InvariantCultureIgnoreCase))) + bool emptySender = string.IsNullOrEmpty(sender); + bool emptySubject = string.IsNullOrEmpty(subject); + + int i; + Email ret; + for (i = 0; i < queue.Count; i++) { - queue.RemoveAt(i); - ret.numLeft = queue.Count; - if (queue.Count == 0) + ret = queue[i]; + if (emptySender || sender.Equals(ret.sender, StringComparison.InvariantCultureIgnoreCase) && + (emptySubject || subject.Equals(ret.subject, StringComparison.InvariantCultureIgnoreCase))) { - lock (m_MailQueues) + queue.RemoveAt(i); + ret.numLeft = queue.Count; + if (queue.Count == 0) { - m_MailQueues.Remove(objectID); - lock (m_LastGetEmailCall) - m_LastGetEmailCall.Remove(objectID); + m_MailQueues[objectID] = null; + m_LastGetEmailCall.Remove(objectID); } + return ret; } - return ret; } } } diff --git a/OpenSim/Region/Framework/Interfaces/IEmailModule.cs b/OpenSim/Region/Framework/Interfaces/IEmailModule.cs index 4f1b91adee..9c47401002 100644 --- a/OpenSim/Region/Framework/Interfaces/IEmailModule.cs +++ b/OpenSim/Region/Framework/Interfaces/IEmailModule.cs @@ -42,5 +42,7 @@ namespace OpenSim.Region.Framework.Interfaces { void SendEmail(UUID objectID, string address, string subject, string body); Email GetNextEmail(UUID objectID, string sender, string subject); + void AddPartMailBox(UUID objectID); + void RemovePartMailBox(UUID objectID); } } diff --git a/OpenSim/Region/Framework/Scenes/Scene.cs b/OpenSim/Region/Framework/Scenes/Scene.cs index 9de6a36fa6..d50fc01d60 100755 --- a/OpenSim/Region/Framework/Scenes/Scene.cs +++ b/OpenSim/Region/Framework/Scenes/Scene.cs @@ -2872,6 +2872,12 @@ namespace OpenSim.Region.Framework.Scenes part.KeyframeMotion = null; } + if ((part.AggregatedScriptEvents & scriptEvents.email) != 0) + { + IEmailModule imm = RequestModuleInterface(); + if (imm != null) + imm.RemovePartMailBox(part.UUID); + } if (part.IsJoint() && ((part.Flags & PrimFlags.Physics) != 0)) { PhysicsScene.RequestJointDeletion(part.Name); // FIXME: what if the name changed? diff --git a/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs b/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs index e9cecfe8e0..7de7f42a57 100644 --- a/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs +++ b/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs @@ -3106,6 +3106,12 @@ namespace OpenSim.Region.Framework.Scenes { if((ev & (scriptEvents.anyTarget)) != 0 && ParentGroup != null) ParentGroup.RemoveScriptTargets(scriptid); + if ((AggregatedScriptEvents & scriptEvents.email) != 0) + { + IEmailModule scriptEmail = ParentGroup.Scene.RequestModuleInterface(); + if (scriptEmail != null) + scriptEmail.RemovePartMailBox(UUID); + } m_scriptEvents.Remove(scriptid); aggregateScriptEvents(); } @@ -5384,7 +5390,14 @@ namespace OpenSim.Region.Framework.Scenes m_localFlags = (PrimFlags)objectflagupdate; - if (ParentGroup != null && ParentGroup.RootPart == this) + if ((AggregatedScriptEvents & scriptEvents.email) != 0) + { + IEmailModule imm = ParentGroup.Scene.RequestModuleInterface(); + if (imm != null) + imm.AddPartMailBox(UUID); + } + + if (ParentGroup.RootPart == this) { ParentGroup.aggregateScriptEvents(); } diff --git a/bin/OpenSim.ini.example b/bin/OpenSim.ini.example index 2f608a27b6..121d666719 100644 --- a/bin/OpenSim.ini.example +++ b/bin/OpenSim.ini.example @@ -504,7 +504,7 @@ ; if not set SMTP_SERVER_FROM below ; host_domain_header_from = "127.0.0.1" - ;# {SMTP_SERVER_FROM} {[Startup]emailmodule:DefaultEmailModule2 enabled:true} {SMTP server from name?} {} + ;# {SMTP_SERVER_FROM} {[Startup]emailmodule:DefaultEmailModule enabled:true} {SMTP server from name?} {} ; some smtp servers require a known From email address or will give Error 500 - Envelope from address is not authorised ; set to a valid email address that smtp will accept (in some cases must be like SMTP_SERVER_LOGIN) ; SMTP_SERVER_FROM = ""