diff --git a/OpenSim/Capabilities/Caps.cs b/OpenSim/Capabilities/Caps.cs index f91f7d2a9d..1ebc6b44c5 100644 --- a/OpenSim/Capabilities/Caps.cs +++ b/OpenSim/Capabilities/Caps.cs @@ -33,6 +33,7 @@ using System.Reflection; using System.Threading; using log4net; using OpenMetaverse; +using OpenMetaverse.StructuredData; using OpenSim.Framework.Servers; using OpenSim.Framework.Servers.HttpServer; @@ -68,6 +69,7 @@ namespace OpenSim.Framework.Capabilities private readonly UUID m_agentID; private readonly string m_regionName; private ManualResetEvent m_capsActive = new(false); + private readonly string m_baseCapsURL; public UUID AgentID { @@ -123,7 +125,8 @@ namespace OpenSim.Framework.Capabilities ObjectAnim = 0x100, WLEnv = 0x200, AdvEnv = 0x400, - PBR = 0x800 + PBR = 0x800, + ViewerBenefits = 0x1000 } public CapsFlags Flags { get; set;} @@ -149,6 +152,15 @@ namespace OpenSim.Framework.Capabilities m_regionName = regionName; Flags = CapsFlags.None; m_capsActive.Reset(); + if (MainServer.Instance.UseSSL) + m_baseCapsURL = $"https://{MainServer.Instance.SSLCommonName}:{MainServer.Instance.SSLPort}"; + else + { + if (MainServer.Instance is null) + m_baseCapsURL = $"http://{m_httpListenerHostName}:0"; + else + m_baseCapsURL = $"http://{m_httpListenerHostName}:{MainServer.Instance.Port}"; + } } ~Caps() @@ -311,16 +323,7 @@ namespace OpenSim.Framework.Capabilities { if (!requestedCaps.Contains(kvp.Key)) continue; - - if (MainServer.Instance.UseSSL) - caps[kvp.Key] = $"https://{MainServer.Instance.SSLCommonName}:{MainServer.Instance.SSLPort}{kvp.Value.Url}"; - else - { - if(MainServer.Instance is null) - caps[kvp.Key] = $"http://{m_httpListenerHostName}:0{kvp.Value.Url}"; - else - caps[kvp.Key] = $"http://{m_httpListenerHostName}:{MainServer.Instance.Port}{kvp.Value.Url}"; - } + caps[kvp.Key] = m_baseCapsURL + kvp.Value.Url; } } @@ -334,6 +337,28 @@ namespace OpenSim.Framework.Capabilities return caps; } + public void GetCapsDetailsLLSDxml(HashSet requestedCaps, osUTF8 sb) + { + + CapsHandlers.GetCapsDetailsLLSDxml(requestedCaps, sb); + + lock (m_pollServiceHandlers) + { + foreach (KeyValuePair kvp in m_pollServiceHandlers) + { + if (requestedCaps.Contains(kvp.Key)) + LLSDxmlEncode2.AddElem(kvp.Key, m_baseCapsURL + kvp.Value.Url, sb); + } + } + + // Add the external too + foreach (KeyValuePair kvp in ExternalCapsHandlers) + { + if (requestedCaps.Contains(kvp.Key)) + LLSDxmlEncode2.AddElem(kvp.Key, kvp.Value, sb); + } + } + public void Activate() { m_capsActive.Set(); diff --git a/OpenSim/Capabilities/CapsHandlers.cs b/OpenSim/Capabilities/CapsHandlers.cs index 13ac2b7e43..6008db471d 100644 --- a/OpenSim/Capabilities/CapsHandlers.cs +++ b/OpenSim/Capabilities/CapsHandlers.cs @@ -30,6 +30,8 @@ using System.Collections.Generic; using System.Collections.Concurrent; using OpenSim.Framework.Servers; using OpenSim.Framework.Servers.HttpServer; +using OpenMetaverse; +using OpenMetaverse.StructuredData; namespace OpenSim.Framework.Capabilities { @@ -46,6 +48,7 @@ namespace OpenSim.Framework.Capabilities private string m_httpListenerHostName; private uint m_httpListenerPort; private bool m_useSSL = false; + private readonly string m_baseURL; /// /// CapsHandlers is a cap handler container but also takes @@ -61,9 +64,15 @@ namespace OpenSim.Framework.Capabilities m_httpListenerHostName = httpListenerHostname; m_httpListenerPort = httpListenerPort; if (httpListener != null && httpListener.UseSSL) + { m_useSSL = true; + m_baseURL = $"https://{m_httpListenerHostName}:{m_httpListenerPort}"; + } else + { m_useSSL = false; + m_baseURL = $"http://{m_httpListenerHostName}:{m_httpListenerPort}"; + } } /// @@ -171,17 +180,14 @@ namespace OpenSim.Framework.Capabilities { Hashtable caps = new Hashtable(); - string protocol = m_useSSL ? "https://" : "http://"; - string baseUrl = protocol + m_httpListenerHostName + ":" + m_httpListenerPort.ToString(); - if (requestedCaps == null) { lock (m_capsHandlers) { foreach (KeyValuePair kvp in m_capsSimpleHandlers) - caps[kvp.Key] = baseUrl + kvp.Value.Path; + caps[kvp.Key] = m_baseURL + kvp.Value.Path; foreach (KeyValuePair kvp in m_capsHandlers) - caps[kvp.Key] = baseUrl + kvp.Value.Path; + caps[kvp.Key] = m_baseURL + kvp.Value.Path; } return caps; } @@ -196,12 +202,12 @@ namespace OpenSim.Framework.Capabilities if (m_capsSimpleHandlers.TryGetValue(capsName, out ISimpleStreamHandler shdr)) { - caps[capsName] = baseUrl + shdr.Path; + caps[capsName] = m_baseURL + shdr.Path; continue; } if (m_capsHandlers.TryGetValue(capsName, out IRequestHandler chdr)) { - caps[capsName] = baseUrl + chdr.Path; + caps[capsName] = m_baseURL + chdr.Path; } } } @@ -212,18 +218,14 @@ namespace OpenSim.Framework.Capabilities public Hashtable GetCapsDetails2(bool excludeSeed, HashSet requestedCaps) { Hashtable caps = new Hashtable(); - - string protocol = m_useSSL ? "https://" : "http://"; - string baseUrl = protocol + m_httpListenerHostName + ":" + m_httpListenerPort.ToString(); - if (requestedCaps is null) { lock (m_capsHandlers) { foreach (KeyValuePair kvp in m_capsSimpleHandlers) - caps[kvp.Key] = baseUrl + kvp.Value.Path; + caps[kvp.Key] = m_baseURL + kvp.Value.Path; foreach (KeyValuePair kvp in m_capsHandlers) - caps[kvp.Key] = baseUrl + kvp.Value.Path; + caps[kvp.Key] = m_baseURL + kvp.Value.Path; } return caps; } @@ -236,20 +238,32 @@ namespace OpenSim.Framework.Capabilities continue; if (m_capsSimpleHandlers.TryGetValue(capsName, out ISimpleStreamHandler shdr)) - { - caps[capsName] = baseUrl + shdr.Path; - continue; - } - if (m_capsHandlers.TryGetValue(capsName, out IRequestHandler chdr)) - { - caps[capsName] = baseUrl + chdr.Path; - } + caps[capsName] = m_baseURL + shdr.Path; + else if (m_capsHandlers.TryGetValue(capsName, out IRequestHandler chdr)) + caps[capsName] = m_baseURL + chdr.Path; } } return caps; } + public void GetCapsDetailsLLSDxml(HashSet requestedCaps, osUTF8 sb) + { + lock (m_capsHandlers) + { + if (requestedCaps is null) + return; + + foreach (string capsName in requestedCaps) + { + if (m_capsSimpleHandlers.TryGetValue(capsName, out ISimpleStreamHandler shdr)) + LLSDxmlEncode2.AddElem(capsName, m_baseURL + shdr.Path, sb); + else if (m_capsHandlers.TryGetValue(capsName, out IRequestHandler chdr)) + LLSDxmlEncode2.AddElem(capsName, m_baseURL + chdr.Path, sb); + } + } + } + /// /// Returns a copy of the dictionary of all the HTTP cap handlers /// diff --git a/OpenSim/Region/ClientStack/Linden/Caps/BunchOfCaps/BunchOfCaps.cs b/OpenSim/Region/ClientStack/Linden/Caps/BunchOfCaps/BunchOfCaps.cs index 1447d87686..516ea00ae3 100644 --- a/OpenSim/Region/ClientStack/Linden/Caps/BunchOfCaps/BunchOfCaps.cs +++ b/OpenSim/Region/ClientStack/Linden/Caps/BunchOfCaps/BunchOfCaps.cs @@ -304,9 +304,8 @@ namespace OpenSim.Region.ClientStack.Linden /// public void SeedCapRequest(IOSHttpRequest httpRequest, IOSHttpResponse httpResponse) { - UUID agentID = m_HostCapsObj.AgentID; m_log.Debug( - $"[CAPS]: Received SEED caps request in {m_regionName} for agent {agentID}"); + $"[CAPS]: Received SEED caps request in {m_regionName} for agent {m_HostCapsObj.AgentID}"); if(httpRequest.HttpMethod != "POST" || httpRequest.ContentType != "application/llsd+xml") { @@ -321,11 +320,10 @@ namespace OpenSim.Region.ClientStack.Linden return; } - if (!m_Scene.CheckClient(agentID, httpRequest.RemoteIPEndPoint)) + if (!m_Scene.CheckClient(m_HostCapsObj.AgentID, httpRequest.RemoteIPEndPoint)) { m_log.WarnFormat( - "[CAPS]: Unauthorized CAPS client {0} from {1}", - agentID, httpRequest.RemoteIPEndPoint); + $"[CAPS]: Unauthorized CAPS client {m_HostCapsObj.AgentID} from {httpRequest.RemoteIPEndPoint}"); httpResponse.StatusCode = (int)HttpStatusCode.Forbidden; return; } @@ -346,19 +344,39 @@ namespace OpenSim.Region.ClientStack.Linden foreach (OSD c in capsRequested) { string cstr = c.AsString(); - if (cstr.Equals("ObjectAnimation")) - m_HostCapsObj.Flags |= Caps.CapsFlags.ObjectAnim; - else if (cstr.Equals("EnvironmentSettings")) - m_HostCapsObj.Flags |= Caps.CapsFlags.WLEnv; - else if (cstr.Equals("ExtEnvironment")) - m_HostCapsObj.Flags |= Caps.CapsFlags.AdvEnv; - else if(cstr.Equals("ModifyMaterialParams")) // will not work if a viewer has no edit features - m_HostCapsObj.Flags |= Caps.CapsFlags.PBR; + if (string.IsNullOrEmpty(cstr)) + continue; + switch (cstr) + { + case "SEED": + continue; + case "ViewerBenefits": // this may need a proper cap but not currently + m_HostCapsObj.Flags |= Caps.CapsFlags.ViewerBenefits; + continue; + case "ObjectAnimation": + m_HostCapsObj.Flags |= Caps.CapsFlags.ObjectAnim; + break; + case "EnvironmentSettings": + m_HostCapsObj.Flags |= Caps.CapsFlags.WLEnv; + break; + case "ExtEnvironment": + m_HostCapsObj.Flags |= Caps.CapsFlags.AdvEnv; + break; + case "ModifyMaterialParams": // will not work if a viewer has no edit features + m_HostCapsObj.Flags |= Caps.CapsFlags.PBR; + break; + default: + break; + } validCaps.Add(cstr); } + + osUTF8 sb = LLSDxmlEncode2.Start(); + LLSDxmlEncode2.AddMap(sb); + m_HostCapsObj.GetCapsDetailsLLSDxml(validCaps, sb); + LLSDxmlEncode2.AddEndMap(sb); - string result = LLSDHelpers.SerialiseLLSDReply(m_HostCapsObj.GetCapsDetails2(true, validCaps)); - httpResponse.RawBuffer = Util.UTF8NBGetbytes(result); + httpResponse.RawBuffer = LLSDxmlEncode2.EndToBytes(sb); httpResponse.StatusCode = (int)HttpStatusCode.OK; m_HostCapsObj.Flags |= Caps.CapsFlags.SentSeeds; diff --git a/OpenSim/Region/CoreModules/Avatar/Friends/HGFriendsModule.cs b/OpenSim/Region/CoreModules/Avatar/Friends/HGFriendsModule.cs index 4e95a456ab..758b0377c5 100644 --- a/OpenSim/Region/CoreModules/Avatar/Friends/HGFriendsModule.cs +++ b/OpenSim/Region/CoreModules/Avatar/Friends/HGFriendsModule.cs @@ -346,7 +346,7 @@ namespace OpenSim.Region.CoreModules.Avatar.Friends if (UUID.TryParse(friendID, out UUID _)) return base.FriendshipMessage(friendID); - return "Please confirm this friendship you made while you where on another HG grid"; + return "Please confirm this friendship you made while you were on another HG grid"; } protected override FriendInfo GetFriend(FriendInfo[] friends, UUID friendID) diff --git a/prebuild.xml b/prebuild.xml index 0e1d64a786..7061d85557 100644 --- a/prebuild.xml +++ b/prebuild.xml @@ -298,6 +298,7 @@ +