123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823 |
- /*
- * Copyright (c) Contributors, http://opensimulator.org/
- * See CONTRIBUTORS.TXT for a full list of copyright holders.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are met:
- * * Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * * Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * * Neither the name of the OpenSimulator Project nor the
- * names of its contributors may be used to endorse or promote products
- * derived from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY
- * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
- * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
- * DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY
- * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
- * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
- * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
- * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
- * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
- using System;
- using System.Collections;
- using System.IO;
- using System.Net;
- using System.Reflection;
- using System.Text;
- using log4net;
- using Nini.Config;
- using OpenMetaverse;
- using OpenMetaverse.StructuredData;
- using OpenSim.Framework;
- using OpenSim.Framework.Communications;
- using OpenSim.Framework.Communications.Clients;
- using OpenSim.Region.Framework.Interfaces;
- using OpenSim.Region.Framework.Scenes;
- using OpenSim.Region.Framework.Scenes.Hypergrid;
- using OpenSim.Region.Framework.Scenes.Serialization;
- namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Interregion
- {
- public class RESTInterregionComms : ISharedRegionModule, IInterregionCommsOut
- {
- private bool initialized = false;
- private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
- protected bool m_enabled = false;
- protected Scene m_aScene;
- // RESTInterregionComms does not care about local regions; it delegates that to the Local module
- protected LocalInterregionComms m_localBackend;
- protected CommunicationsManager m_commsManager;
- protected RegionToRegionClient m_regionClient;
- protected bool m_safemode;
- protected IPAddress m_thisIP;
- #region IRegionModule
- public virtual void Initialise(IConfigSource config)
- {
- IConfig startupConfig = config.Configs["Communications"];
- if ((startupConfig == null) || ((startupConfig != null)
- && (startupConfig.GetString("InterregionComms", "RESTComms") == "RESTComms")))
- {
- m_log.Info("[REST COMMS]: Enabling InterregionComms RESTComms module");
- m_enabled = true;
- if (config.Configs["Hypergrid"] != null)
- m_safemode = config.Configs["Hypergrid"].GetBoolean("safemode", false);
- }
- }
- public virtual void PostInitialise()
- {
- }
- public virtual void Close()
- {
- }
- public void AddRegion(Scene scene)
- {
- }
- public void RemoveRegion(Scene scene)
- {
- if (m_enabled)
- {
- m_localBackend.RemoveScene(scene);
- scene.UnregisterModuleInterface<IInterregionCommsOut>(this);
- }
- }
- public void RegionLoaded(Scene scene)
- {
- if (m_enabled)
- {
- if (!initialized)
- {
- InitOnce(scene);
- initialized = true;
- AddHTTPHandlers();
- }
- InitEach(scene);
- }
- }
- public Type ReplaceableInterface
- {
- get { return null; }
- }
- public virtual string Name
- {
- get { return "RESTInterregionCommsModule"; }
- }
- protected virtual void InitEach(Scene scene)
- {
- m_localBackend.Init(scene);
- scene.RegisterModuleInterface<IInterregionCommsOut>(this);
- }
- protected virtual void InitOnce(Scene scene)
- {
- m_localBackend = new LocalInterregionComms();
- m_commsManager = scene.CommsManager;
- m_aScene = scene;
- m_regionClient = new RegionToRegionClient(m_aScene);
- m_thisIP = Util.GetHostFromDNS(scene.RegionInfo.ExternalHostName);
- }
- protected virtual void AddHTTPHandlers()
- {
- MainServer.Instance.AddHTTPHandler("/agent/", AgentHandler);
- MainServer.Instance.AddHTTPHandler("/object/", ObjectHandler);
- }
- #endregion /* IRegionModule */
- #region IInterregionComms
- /**
- * Agent-related communications
- */
- public bool SendCreateChildAgent(ulong regionHandle, AgentCircuitData aCircuit, out string reason)
- {
- // Try local first
- if (m_localBackend.SendCreateChildAgent(regionHandle, aCircuit, out reason))
- return true;
- // else do the remote thing
- if (!m_localBackend.IsLocalRegion(regionHandle))
- {
- RegionInfo regInfo = m_commsManager.GridService.RequestNeighbourInfo(regionHandle);
- if (regInfo != null)
- {
- m_regionClient.SendUserInformation(regInfo, aCircuit);
- return m_regionClient.DoCreateChildAgentCall(regInfo, aCircuit, "None", out reason);
- }
- //else
- // m_log.Warn("[REST COMMS]: Region not found " + regionHandle);
- }
- return false;
- }
- public bool SendChildAgentUpdate(ulong regionHandle, AgentData cAgentData)
- {
- // Try local first
- if (m_localBackend.SendChildAgentUpdate(regionHandle, cAgentData))
- return true;
- // else do the remote thing
- if (!m_localBackend.IsLocalRegion(regionHandle))
- {
- RegionInfo regInfo = m_commsManager.GridService.RequestNeighbourInfo(regionHandle);
- if (regInfo != null)
- {
- return m_regionClient.DoChildAgentUpdateCall(regInfo, cAgentData);
- }
- //else
- // m_log.Warn("[REST COMMS]: Region not found " + regionHandle);
- }
- return false;
- }
- public bool SendChildAgentUpdate(ulong regionHandle, AgentPosition cAgentData)
- {
- // Try local first
- if (m_localBackend.SendChildAgentUpdate(regionHandle, cAgentData))
- return true;
- // else do the remote thing
- if (!m_localBackend.IsLocalRegion(regionHandle))
- {
- RegionInfo regInfo = m_commsManager.GridService.RequestNeighbourInfo(regionHandle);
- if (regInfo != null)
- {
- return m_regionClient.DoChildAgentUpdateCall(regInfo, cAgentData);
- }
- //else
- // m_log.Warn("[REST COMMS]: Region not found " + regionHandle);
- }
- return false;
- }
- public bool SendRetrieveRootAgent(ulong regionHandle, UUID id, out IAgentData agent)
- {
- // Try local first
- if (m_localBackend.SendRetrieveRootAgent(regionHandle, id, out agent))
- return true;
- // else do the remote thing
- if (!m_localBackend.IsLocalRegion(regionHandle))
- {
- RegionInfo regInfo = m_commsManager.GridService.RequestNeighbourInfo(regionHandle);
- if (regInfo != null)
- {
- return m_regionClient.DoRetrieveRootAgentCall(regInfo, id, out agent);
- }
- //else
- // m_log.Warn("[REST COMMS]: Region not found " + regionHandle);
- }
- return false;
- }
- public bool SendReleaseAgent(ulong regionHandle, UUID id, string uri)
- {
- // Try local first
- if (m_localBackend.SendReleaseAgent(regionHandle, id, uri))
- return true;
- // else do the remote thing
- return m_regionClient.DoReleaseAgentCall(regionHandle, id, uri);
- }
- public bool SendCloseAgent(ulong regionHandle, UUID id)
- {
- // Try local first
- if (m_localBackend.SendCloseAgent(regionHandle, id))
- return true;
- // else do the remote thing
- if (!m_localBackend.IsLocalRegion(regionHandle))
- {
- RegionInfo regInfo = m_commsManager.GridService.RequestNeighbourInfo(regionHandle);
- if (regInfo != null)
- {
- return m_regionClient.DoCloseAgentCall(regInfo, id);
- }
- //else
- // m_log.Warn("[REST COMMS]: Region not found " + regionHandle);
- }
- return false;
- }
- /**
- * Object-related communications
- */
- public bool SendCreateObject(ulong regionHandle, SceneObjectGroup sog, bool isLocalCall)
- {
- // Try local first
- if (m_localBackend.SendCreateObject(regionHandle, sog, true))
- {
- //m_log.Debug("[REST COMMS]: LocalBackEnd SendCreateObject succeeded");
- return true;
- }
- // else do the remote thing
- if (!m_localBackend.IsLocalRegion(regionHandle))
- {
- RegionInfo regInfo = m_commsManager.GridService.RequestNeighbourInfo(regionHandle);
- if (regInfo != null)
- {
- return m_regionClient.DoCreateObjectCall(
- regInfo, sog, SceneObjectSerializer.ToXml2Format(sog), m_aScene.m_allowScriptCrossings);
- }
- //else
- // m_log.Warn("[REST COMMS]: Region not found " + regionHandle);
- }
- return false;
- }
- public bool SendCreateObject(ulong regionHandle, UUID userID, UUID itemID)
- {
- // Not Implemented
- return false;
- }
- #endregion /* IInterregionComms */
- #region Incoming calls from remote instances
- /**
- * Agent-related incoming calls
- */
- public Hashtable AgentHandler(Hashtable request)
- {
- //m_log.Debug("[CONNECTION DEBUGGING]: AgentHandler Called");
- m_log.Debug("---------------------------");
- m_log.Debug(" >> uri=" + request["uri"]);
- m_log.Debug(" >> content-type=" + request["content-type"]);
- m_log.Debug(" >> http-method=" + request["http-method"]);
- m_log.Debug("---------------------------\n");
- Hashtable responsedata = new Hashtable();
- responsedata["content_type"] = "text/html";
- responsedata["keepalive"] = false;
- UUID agentID;
- string action;
- ulong regionHandle;
- if (!GetParams((string)request["uri"], out agentID, out regionHandle, out action))
- {
- m_log.InfoFormat("[REST COMMS]: Invalid parameters for agent message {0}", request["uri"]);
- responsedata["int_response_code"] = 404;
- responsedata["str_response_string"] = "false";
- return responsedata;
- }
- // Next, let's parse the verb
- string method = (string)request["http-method"];
- if (method.Equals("PUT"))
- {
- DoAgentPut(request, responsedata);
- return responsedata;
- }
- else if (method.Equals("POST"))
- {
- DoAgentPost(request, responsedata, agentID);
- return responsedata;
- }
- else if (method.Equals("GET"))
- {
- DoAgentGet(request, responsedata, agentID, regionHandle);
- return responsedata;
- }
- else if (method.Equals("DELETE"))
- {
- DoAgentDelete(request, responsedata, agentID, action, regionHandle);
- return responsedata;
- }
- else
- {
- m_log.InfoFormat("[REST COMMS]: method {0} not supported in agent message", method);
- responsedata["int_response_code"] = 404;
- responsedata["str_response_string"] = "false";
- return responsedata;
- }
- }
- protected virtual void DoAgentPost(Hashtable request, Hashtable responsedata, UUID id)
- {
- if (m_safemode)
- {
- // Authentication
- string authority = string.Empty;
- string authToken = string.Empty;
- if (!GetAuthentication(request, out authority, out authToken))
- {
- m_log.InfoFormat("[REST COMMS]: Authentication failed for agent message {0}", request["uri"]);
- responsedata["int_response_code"] = 403;
- responsedata["str_response_string"] = "Forbidden";
- return ;
- }
- if (!VerifyKey(id, authority, authToken))
- {
- m_log.InfoFormat("[REST COMMS]: Authentication failed for agent message {0}", request["uri"]);
- responsedata["int_response_code"] = 403;
- responsedata["str_response_string"] = "Forbidden";
- return ;
- }
- m_log.DebugFormat("[REST COMMS]: Authentication succeeded for {0}", id);
- }
- OSDMap args = RegionClient.GetOSDMap((string)request["body"]);
- if (args == null)
- {
- responsedata["int_response_code"] = 400;
- responsedata["str_response_string"] = "false";
- return;
- }
- // retrieve the regionhandle
- ulong regionhandle = 0;
- if (args["destination_handle"] != null)
- UInt64.TryParse(args["destination_handle"].AsString(), out regionhandle);
- AgentCircuitData aCircuit = new AgentCircuitData();
- try
- {
- aCircuit.UnpackAgentCircuitData(args);
- }
- catch (Exception ex)
- {
- m_log.InfoFormat("[REST COMMS]: exception on unpacking ChildCreate message {0}", ex.Message);
- return;
- }
- OSDMap resp = new OSDMap(2);
- string reason = String.Empty;
- // This is the meaning of POST agent
- m_regionClient.AdjustUserInformation(aCircuit);
- bool result = m_localBackend.SendCreateChildAgent(regionhandle, aCircuit, out reason);
- resp["reason"] = OSD.FromString(reason);
- resp["success"] = OSD.FromBoolean(result);
- // TODO: add reason if not String.Empty?
- responsedata["int_response_code"] = 200;
- responsedata["str_response_string"] = OSDParser.SerializeJsonString(resp);
- }
- protected virtual void DoAgentPut(Hashtable request, Hashtable responsedata)
- {
- OSDMap args = RegionClient.GetOSDMap((string)request["body"]);
- if (args == null)
- {
- responsedata["int_response_code"] = 400;
- responsedata["str_response_string"] = "false";
- return;
- }
- // retrieve the regionhandle
- ulong regionhandle = 0;
- if (args["destination_handle"] != null)
- UInt64.TryParse(args["destination_handle"].AsString(), out regionhandle);
- string messageType;
- if (args["message_type"] != null)
- messageType = args["message_type"].AsString();
- else
- {
- m_log.Warn("[REST COMMS]: Agent Put Message Type not found. ");
- messageType = "AgentData";
- }
- bool result = true;
- if ("AgentData".Equals(messageType))
- {
- AgentData agent = new AgentData();
- try
- {
- agent.Unpack(args);
- }
- catch (Exception ex)
- {
- m_log.InfoFormat("[REST COMMS]: exception on unpacking ChildAgentUpdate message {0}", ex.Message);
- return;
- }
- //agent.Dump();
- // This is one of the meanings of PUT agent
- result = m_localBackend.SendChildAgentUpdate(regionhandle, agent);
- }
- else if ("AgentPosition".Equals(messageType))
- {
- AgentPosition agent = new AgentPosition();
- try
- {
- agent.Unpack(args);
- }
- catch (Exception ex)
- {
- m_log.InfoFormat("[REST COMMS]: exception on unpacking ChildAgentUpdate message {0}", ex.Message);
- return;
- }
- //agent.Dump();
- // This is one of the meanings of PUT agent
- result = m_localBackend.SendChildAgentUpdate(regionhandle, agent);
- }
- responsedata["int_response_code"] = 200;
- responsedata["str_response_string"] = result.ToString();
- }
- protected virtual void DoAgentGet(Hashtable request, Hashtable responsedata, UUID id, ulong regionHandle)
- {
- IAgentData agent = null;
- bool result = m_localBackend.SendRetrieveRootAgent(regionHandle, id, out agent);
- OSDMap map = null;
- if (result)
- {
- if (agent != null) // just to make sure
- {
- map = agent.Pack();
- string strBuffer = "";
- try
- {
- strBuffer = OSDParser.SerializeJsonString(map);
- }
- catch (Exception e)
- {
- m_log.WarnFormat("[REST COMMS]: Exception thrown on serialization of CreateObject: {0}", e.Message);
- // ignore. buffer will be empty, caller should check.
- }
- responsedata["content_type"] = "application/json";
- responsedata["int_response_code"] = 200;
- responsedata["str_response_string"] = strBuffer;
- }
- else
- {
- responsedata["int_response_code"] = 500;
- responsedata["str_response_string"] = "Internal error";
- }
- }
- else
- {
- responsedata["int_response_code"] = 404;
- responsedata["str_response_string"] = "Not Found";
- }
- }
- protected virtual void DoAgentDelete(Hashtable request, Hashtable responsedata, UUID id, string action, ulong regionHandle)
- {
- //m_log.Debug(" >>> DoDelete action:" + action + "; regionHandle:" + regionHandle);
- if (action.Equals("release"))
- m_localBackend.SendReleaseAgent(regionHandle, id, "");
- else
- m_localBackend.SendCloseAgent(regionHandle, id);
- responsedata["int_response_code"] = 200;
- responsedata["str_response_string"] = "OpenSim agent " + id.ToString();
- m_log.Debug("[REST COMMS]: Agent Deleted.");
- }
- /**
- * Object-related incoming calls
- */
- public Hashtable ObjectHandler(Hashtable request)
- {
- m_log.Debug("[CONNECTION DEBUGGING]: ObjectHandler Called");
- m_log.Debug("---------------------------");
- m_log.Debug(" >> uri=" + request["uri"]);
- m_log.Debug(" >> content-type=" + request["content-type"]);
- m_log.Debug(" >> http-method=" + request["http-method"]);
- m_log.Debug("---------------------------\n");
- Hashtable responsedata = new Hashtable();
- responsedata["content_type"] = "text/html";
- UUID objectID;
- string action;
- ulong regionHandle;
- if (!GetParams((string)request["uri"], out objectID, out regionHandle, out action))
- {
- m_log.InfoFormat("[REST COMMS]: Invalid parameters for object message {0}", request["uri"]);
- responsedata["int_response_code"] = 404;
- responsedata["str_response_string"] = "false";
- return responsedata;
- }
- // Next, let's parse the verb
- string method = (string)request["http-method"];
- if (method.Equals("POST"))
- {
- DoObjectPost(request, responsedata, regionHandle);
- return responsedata;
- }
- else if (method.Equals("PUT"))
- {
- DoObjectPut(request, responsedata, regionHandle);
- return responsedata;
- }
- //else if (method.Equals("DELETE"))
- //{
- // DoObjectDelete(request, responsedata, agentID, action, regionHandle);
- // return responsedata;
- //}
- else
- {
- m_log.InfoFormat("[REST COMMS]: method {0} not supported in object message", method);
- responsedata["int_response_code"] = 404;
- responsedata["str_response_string"] = "false";
- return responsedata;
- }
- }
- protected virtual void DoObjectPost(Hashtable request, Hashtable responsedata, ulong regionhandle)
- {
- OSDMap args = RegionClient.GetOSDMap((string)request["body"]);
- if (args == null)
- {
- responsedata["int_response_code"] = 400;
- responsedata["str_response_string"] = "false";
- return;
- }
- string sogXmlStr = "", extraStr = "", stateXmlStr = "";
- if (args["sog"] != null)
- sogXmlStr = args["sog"].AsString();
- if (args["extra"] != null)
- extraStr = args["extra"].AsString();
- UUID regionID = m_localBackend.GetRegionID(regionhandle);
- SceneObjectGroup sog = null;
- try
- {
- sog = SceneObjectSerializer.FromXml2Format(sogXmlStr);
- sog.ExtraFromXmlString(extraStr);
- }
- catch (Exception ex)
- {
- m_log.InfoFormat("[REST COMMS]: exception on deserializing scene object {0}", ex.Message);
- responsedata["int_response_code"] = 400;
- responsedata["str_response_string"] = "false";
- return;
- }
- if ((args["state"] != null) && m_aScene.m_allowScriptCrossings)
- {
- stateXmlStr = args["state"].AsString();
- if (stateXmlStr != "")
- {
- try
- {
- sog.SetState(stateXmlStr, regionID);
- }
- catch (Exception ex)
- {
- m_log.InfoFormat("[REST COMMS]: exception on setting state for scene object {0}", ex.Message);
- }
- }
- }
- // This is the meaning of POST object
- bool result = m_localBackend.SendCreateObject(regionhandle, sog, false);
- responsedata["int_response_code"] = 200;
- responsedata["str_response_string"] = result.ToString();
- }
- protected virtual void DoObjectPut(Hashtable request, Hashtable responsedata, ulong regionhandle)
- {
- OSDMap args = RegionClient.GetOSDMap((string)request["body"]);
- if (args == null)
- {
- responsedata["int_response_code"] = 400;
- responsedata["str_response_string"] = "false";
- return;
- }
- UUID userID = UUID.Zero, itemID = UUID.Zero;
- if (args["userid"] != null)
- userID = args["userid"].AsUUID();
- if (args["itemid"] != null)
- itemID = args["itemid"].AsUUID();
- //UUID regionID = m_localBackend.GetRegionID(regionhandle);
- // This is the meaning of PUT object
- bool result = m_localBackend.SendCreateObject(regionhandle, userID, itemID);
- responsedata["int_response_code"] = 200;
- responsedata["str_response_string"] = result.ToString();
- }
- #endregion
- #region Misc
- /// <summary>
- /// Extract the param from an uri.
- /// </summary>
- /// <param name="uri">Something like this: /agent/uuid/ or /agent/uuid/handle/release</param>
- /// <param name="uri">uuid on uuid field</param>
- /// <param name="action">optional action</param>
- public static bool GetParams(string uri, out UUID uuid, out ulong regionHandle, out string action)
- {
- uuid = UUID.Zero;
- action = "";
- regionHandle = 0;
- uri = uri.Trim(new char[] { '/' });
- string[] parts = uri.Split('/');
- if (parts.Length <= 1)
- {
- return false;
- }
- else
- {
- if (!UUID.TryParse(parts[1], out uuid))
- return false;
- if (parts.Length >= 3)
- UInt64.TryParse(parts[2], out regionHandle);
- if (parts.Length >= 4)
- action = parts[3];
- return true;
- }
- }
- public static bool GetAuthentication(Hashtable request, out string authority, out string authKey)
- {
- authority = string.Empty;
- authKey = string.Empty;
- Uri authUri;
- Hashtable headers = (Hashtable)request["headers"];
- // Authorization keys look like this:
- // http://orgrid.org:8002/<uuid>
- if (headers.ContainsKey("authorization") && (string)headers["authorization"] != "None")
- {
- if (Uri.TryCreate((string)headers["authorization"], UriKind.Absolute, out authUri))
- {
- authority = authUri.Authority;
- authKey = authUri.PathAndQuery.Trim('/');
- m_log.DebugFormat("[REST COMMS]: Got authority {0} and key {1}", authority, authKey);
- return true;
- }
- else
- m_log.Debug("[REST COMMS]: Wrong format for Authorization header: " + (string)headers["authorization"]);
- }
- else
- m_log.Debug("[REST COMMS]: Authorization header not found");
- return false;
- }
- bool VerifyKey(UUID userID, string authority, string key)
- {
- string[] parts = authority.Split(':');
- IPAddress ipaddr = IPAddress.None;
- uint port = 0;
- if (parts.Length <= 2)
- ipaddr = Util.GetHostFromDNS(parts[0]);
- if (parts.Length == 2)
- UInt32.TryParse(parts[1], out port);
- // local authority (standalone), local call
- if (m_thisIP.Equals(ipaddr) && (m_aScene.RegionInfo.HttpPort == port))
- return ((IAuthentication)m_aScene.CommsManager.UserAdminService).VerifyKey(userID, key);
- // remote call
- else
- return AuthClient.VerifyKey("http://" + authority, userID, key);
- }
- #endregion Misc
- protected class RegionToRegionClient : RegionClient
- {
- Scene m_aScene = null;
- public RegionToRegionClient(Scene s)
- {
- m_aScene = s;
- }
- public override ulong GetRegionHandle(ulong handle)
- {
- if (m_aScene.SceneGridService is HGSceneCommunicationService)
- return ((HGSceneCommunicationService)(m_aScene.SceneGridService)).m_hg.FindRegionHandle(handle);
- return handle;
- }
- public override bool IsHyperlink(ulong handle)
- {
- if (m_aScene.SceneGridService is HGSceneCommunicationService)
- return ((HGSceneCommunicationService)(m_aScene.SceneGridService)).m_hg.IsHyperlinkRegion(handle);
- return false;
- }
- public override void SendUserInformation(RegionInfo regInfo, AgentCircuitData aCircuit)
- {
- try
- {
- if (m_aScene.SceneGridService is HGSceneCommunicationService)
- {
- ((HGSceneCommunicationService)(m_aScene.SceneGridService)).m_hg.SendUserInformation(regInfo, aCircuit);
- }
- }
- catch // Bad cast
- { }
- }
- public override void AdjustUserInformation(AgentCircuitData aCircuit)
- {
- if (m_aScene.SceneGridService is HGSceneCommunicationService)
- ((HGSceneCommunicationService)(m_aScene.SceneGridService)).m_hg.AdjustUserInformation(aCircuit);
- }
- }
- }
- }
|