public virtual bool CreateAgent(GridRegion destination, ref AgentCircuitData aCircuit, uint teleportFlags, AgentData data, out string reason) { reason = String.Empty; // Try local first if (m_localBackend.CreateAgent(destination, ref aCircuit, teleportFlags, data, out reason)) return true; reason = String.Empty; string uri = MakeUri(destination, true) + aCircuit.AgentID + "/"; try { OSDMap args = aCircuit.PackAgentCircuitData(); args["destination_x"] = OSD.FromString(destination.RegionLocX.ToString()); args["destination_y"] = OSD.FromString(destination.RegionLocY.ToString()); args["destination_name"] = OSD.FromString(destination.RegionName); args["destination_uuid"] = OSD.FromString(destination.RegionID.ToString()); args["teleport_flags"] = OSD.FromString(teleportFlags.ToString()); if(data != null) args["agent_data"] = data.Pack(); OSDMap result = WebUtils.PostToService (uri, args, true, false); OSDMap results = WebUtils.GetOSDMap(result["_RawResult"].AsString()); //Pull out the result and set it as the reason if (results == null) return false; reason = results["reason"] != null ? results["reason"].AsString() : ""; if (result["Success"].AsBoolean()) { //Not right... don't return true except for opensim combatibility :/ if (reason == "") return true; try { OSDMap responseMap = (OSDMap)OSDParser.DeserializeJson(reason); if (responseMap.ContainsKey("Reason")) reason = responseMap["Reason"].AsString(); return responseMap["Success"].AsBoolean(); } catch { //Not right... don't return true except for opensim combatibility :/ return true; } } reason = result["Message"] != null ? result["Message"].AsString() : "error"; return false; } catch (Exception e) { m_log.Warn("[REMOTE SIMULATION CONNECTOR]: CreateAgent failed with exception: " + e.ToString()); reason = e.Message; } return false; }
protected virtual void PackData(OSDMap args, AgentCircuitData aCircuit, GridRegion destination, uint flags) { args["destination_x"] = OSD.FromString(destination.RegionLocX.ToString()); args["destination_y"] = OSD.FromString(destination.RegionLocY.ToString()); args["destination_name"] = OSD.FromString(destination.RegionName); args["destination_uuid"] = OSD.FromString(destination.RegionID.ToString()); args["teleport_flags"] = OSD.FromString(flags.ToString()); }
public RexLoginResponse(UserAccount account, AgentCircuitData aCircuit, GridUserInfo pinfo, GridRegion destination, List<InventoryFolderBase> invSkel, FriendInfo[] friendsList, ILibraryService libService, string where, string startlocation, Vector3 position, Vector3 lookAt, List<InventoryItemBase> gestures, string message, GridRegion home, IPEndPoint clientIP, string mapTileURL, string searchURL) : base(account, aCircuit, pinfo, destination, invSkel, friendsList, libService, where, startlocation, position, lookAt, gestures, message, home, clientIP, mapTileURL, searchURL) { }
public bool CreateAgent(GridRegion destination, AgentCircuitData aCircuit, uint flags, out string reason) { HttpWebRequest AgentCreateRequest = null; reason = String.Empty; if (SendRequest(destination, aCircuit, flags, out reason, out AgentCreateRequest)) { string response = GetResponse(AgentCreateRequest, out reason); bool success = true; UnpackResponse(response, out success, out reason); return success; } return false; }
protected virtual bool CreateAgent(ScenePresence sp, GridRegion reg, GridRegion finalDestination, AgentCircuitData agentCircuit, uint teleportFlags, out string reason, out bool logout) { logout = false; return m_aScene.SimulationService.CreateAgent(finalDestination, agentCircuit, teleportFlags, out reason); }
public bool IsAuthorizedForRegion(GridRegion region, AgentCircuitData agent, bool isRootAgent, out string reason) { SceneManager manager = m_registry.RequestModuleInterface<SceneManager>(); if (manager != null) { #if (!ISWIN) foreach (IScene scene in manager.Scenes) { if (scene.RegionInfo.RegionID == region.RegionID) { //Found the region, check permissions return scene.Permissions.AllowedIncomingAgent(agent, isRootAgent, out reason); } } #else foreach (IScene scene in manager.Scenes.Where(scene => scene.RegionInfo.RegionID == region.RegionID)) { //Found the region, check permissions return scene.Permissions.AllowedIncomingAgent(agent, isRootAgent, out reason); } #endif } reason = "Not Authorized as region does not exist."; return false; }
/// <summary> /// Add information about a new circuit so that later on we can authenticate a new client session. /// </summary> /// <param name="circuitCode"></param> /// <param name="agentData"></param> public virtual void AddNewCircuit(uint circuitCode, AgentCircuitData agentData) { lock (AgentCircuits) { AgentCircuits[circuitCode] = agentData; } }
/// <summary> /// More a placeholder, really /// </summary> public void InPacketTest() { TestHelper.InMethod(); AgentCircuitData agent = new AgentCircuitData(); agent.AgentID = UUID.Random(); agent.firstname = "testfirstname"; agent.lastname = "testlastname"; agent.SessionID = UUID.Zero; agent.SecureSessionID = UUID.Zero; agent.circuitcode = 123; agent.BaseFolder = UUID.Zero; agent.InventoryFolder = UUID.Zero; agent.startpos = Vector3.Zero; agent.CapsPath = "http://wibble.com"; TestLLUDPServer testLLUDPServer; TestLLPacketServer testLLPacketServer; AgentCircuitManager acm; IScene scene = new MockScene(); SetupStack(scene, out testLLUDPServer, out testLLPacketServer, out acm); TestClient testClient = new TestClient(agent, scene); ILLPacketHandler packetHandler = new LLPacketHandler(testClient, testLLPacketServer, new ClientStackUserSettings()); packetHandler.InPacket(new AgentAnimationPacket()); LLQueItem receivedPacket = packetHandler.PacketQueue.Dequeue(); Assert.That(receivedPacket, Is.Not.Null); Assert.That(receivedPacket.Incoming, Is.True); Assert.That(receivedPacket.Packet, Is.TypeOf(typeof(AgentAnimationPacket))); }
/// <summary> /// /// </summary> /// <param name="agent"></param> /// <returns></returns> public virtual bool TriggerExpectUser(AgentCircuitData agent) { handlerExpectUser = OnExpectUser; if (handlerExpectUser != null) { handlerExpectUser(agent); return true; } return false; }
public static OSDMap ArrivedAtDestination(UUID AgentID, int DrawDistance, AgentCircuitData circuit, ulong requestingRegion) { OSDMap llsdBody = new OSDMap(); llsdBody.Add("AgentID", AgentID); llsdBody.Add("DrawDistance", DrawDistance); llsdBody.Add("Circuit", circuit.PackAgentCircuitData()); return buildEvent("ArrivedAtDestination", llsdBody, AgentID, requestingRegion); }
public static OSDMap CrossAgent(GridRegion crossingRegion, Vector3 pos, Vector3 velocity, AgentCircuitData circuit, AgentData cAgent, ulong RequestingRegion) { OSDMap llsdBody = new OSDMap(); llsdBody.Add("Pos", pos); llsdBody.Add("Vel", velocity); llsdBody.Add("Region", crossingRegion.ToOSD()); llsdBody.Add("Circuit", circuit.PackAgentCircuitData()); llsdBody.Add("AgentData", cAgent.Pack()); return buildEvent("CrossAgent", llsdBody, circuit.AgentID, RequestingRegion); }
/// <summary> /// Add information about a new circuit so that later on we can authenticate a new client session. /// </summary> /// <param name="circuitCode"></param> /// <param name="agentData"></param> public virtual void AddNewCircuit(uint circuitCode, AgentCircuitData agentData) { lock (AgentCircuits) { if (AgentCircuits.ContainsKey(circuitCode)) { AgentCircuits[circuitCode] = agentData; } else { AgentCircuits.Add(circuitCode, agentData); } } }
public UUID CreateNPC(string firstname, string lastname, Vector3 position, Scene scene, UUID cloneAppearanceFrom) { NPCAvatar npcAvatar = new NPCAvatar(firstname, lastname, position, scene); npcAvatar.CircuitCode = (uint)Util.RandomClass.Next(0, int.MaxValue); m_log.DebugFormat( "[NPC MODULE]: Creating NPC {0} {1} {2} at {3} in {4}", firstname, lastname, npcAvatar.AgentId, position, scene.RegionInfo.RegionName); AgentCircuitData acd = new AgentCircuitData(); acd.AgentID = npcAvatar.AgentId; acd.firstname = firstname; acd.lastname = lastname; acd.ServiceURLs = new Dictionary<string, object>(); AvatarAppearance originalAppearance = GetAppearance(cloneAppearanceFrom, scene); AvatarAppearance npcAppearance = new AvatarAppearance(originalAppearance, true); acd.Appearance = npcAppearance; scene.AuthenticateHandler.AddNewCircuit(npcAvatar.CircuitCode, acd); scene.AddNewClient(npcAvatar); ScenePresence sp; if (scene.TryGetScenePresence(npcAvatar.AgentId, out sp)) { m_log.DebugFormat( "[NPC MODULE]: Successfully retrieved scene presence for NPC {0} {1}", sp.Name, sp.UUID); // Shouldn't call this - temporary. sp.CompleteMovement(npcAvatar); // sp.SendAppearanceToAllOtherAgents(); // // // Send animations back to the avatar as well // sp.Animator.SendAnimPack(); } else { m_log.WarnFormat("[NPC MODULE]: Could not find scene presence for NPC {0} {1}", sp.Name, sp.UUID); } lock (m_avatars) m_avatars.Add(npcAvatar.AgentId, npcAvatar); m_log.DebugFormat("[NPC MODULE]: Created NPC with id {0}", npcAvatar.AgentId); return npcAvatar.AgentId; }
protected virtual void PackData(OSDMap args, GridRegion source, AgentCircuitData aCircuit, GridRegion destination, uint flags) { if (source != null) { args["source_x"] = OSD.FromString(source.RegionLocX.ToString()); args["source_y"] = OSD.FromString(source.RegionLocY.ToString()); args["source_name"] = OSD.FromString(source.RegionName); args["source_uuid"] = OSD.FromString(source.RegionID.ToString()); if (!String.IsNullOrEmpty(source.RawServerURI)) args["source_server_uri"] = OSD.FromString(source.RawServerURI); } args["destination_x"] = OSD.FromString(destination.RegionLocX.ToString()); args["destination_y"] = OSD.FromString(destination.RegionLocY.ToString()); args["destination_name"] = OSD.FromString(destination.RegionName); args["destination_uuid"] = OSD.FromString(destination.RegionID.ToString()); args["teleport_flags"] = OSD.FromString(flags.ToString()); }
public bool CreateAgent(GridRegion destination, AgentCircuitData aCircuit, uint flags, out string reason) { // m_log.DebugFormat("[REMOTE SIMULATION CONNECTOR]: CreateAgent start"); reason = String.Empty; if (destination == null) { m_log.Debug("[REMOTE SIMULATION CONNECTOR]: Given destination is null"); return false; } string uri = destination.ServerURI + AgentPath() + aCircuit.AgentID + "/"; try { OSDMap args = aCircuit.PackAgentCircuitData(); args["destination_x"] = OSD.FromString(destination.RegionLocX.ToString()); args["destination_y"] = OSD.FromString(destination.RegionLocY.ToString()); args["destination_name"] = OSD.FromString(destination.RegionName); args["destination_uuid"] = OSD.FromString(destination.RegionID.ToString()); args["teleport_flags"] = OSD.FromString(flags.ToString()); OSDMap result = WebUtil.PostToService(uri, args, 20000); if (result["Success"].AsBoolean()) return true; m_log.WarnFormat( "[REMOTE SIMULATION CONNECTOR]: Failed to create agent {0} {1} at remote simulator {1}", aCircuit.firstname, aCircuit.lastname, destination.RegionName); reason = result["Message"] != null ? result["Message"].AsString() : "error"; return false; } catch (Exception e) { m_log.Warn("[REMOTE SIMULATION CONNECTOR]: CreateAgent failed with exception: " + e.ToString()); reason = e.Message; } return false; }
public void SetUp() { m_iam = new BasicInventoryAccessModule(); IConfigSource config = new IniConfigSource(); config.AddConfig("Modules"); config.Configs["Modules"].Set("InventoryAccessModule", "BasicInventoryAccessModule"); m_scene = SceneHelpers.SetupScene(); SceneHelpers.SetupSceneModules(m_scene, config, m_iam); // Create user string userFirstName = "Jock"; string userLastName = "Stirrup"; string userPassword = "******"; UserAccountHelpers.CreateUserWithInventory(m_scene, userFirstName, userLastName, m_userId, userPassword); AgentCircuitData acd = new AgentCircuitData(); acd.AgentID = m_userId; m_tc = new TestClient(acd, m_scene); }
/// <summary> /// /// </summary> /// <param name="acircuit"></param> /// <returns>uuid[;endpoint[;name]]</returns> public static string ProduceUserUniversalIdentifier(AgentCircuitData acircuit) { if (acircuit.ServiceURLs.ContainsKey ("HomeURI")) { string agentsURI = acircuit.ServiceURLs["HomeURI"].ToString (); if (!agentsURI.EndsWith ("/")) agentsURI += "/"; // This is ugly, but there's no other way, given that the name is changed // in the agent circuit data for foreigners if (acircuit.lastname.Contains ("@")) { string[] parts = acircuit.firstname.Split (new char[] { '.' }); if (parts.Length == 2) return acircuit.AgentID.ToString () + ";" + agentsURI + ";" + parts[0] + " " + parts[1]; } return acircuit.AgentID.ToString () + ";" + agentsURI + ";" + acircuit.firstname + " " + acircuit.lastname; } else return acircuit.AgentID.ToString (); }
protected object OnGenericEvent(string FunctionName, object parameters) { if (FunctionName == "NewUserConnection") { ICapsService service = m_scene.RequestModuleInterface<ICapsService>(); if (service != null) { OSDMap param = (OSDMap)parameters; AgentCircuitData circuit = new AgentCircuitData(); circuit.UnpackAgentCircuitData((OSDMap)param["Agent"]); service.CreateCAPS(circuit.AgentID, CapsUtil.GetCapsSeedPath(circuit.CapsPath), m_scene.RegionInfo.RegionHandle, !circuit.child, circuit); IClientCapsService clientCaps = service.GetClientCapsService(circuit.AgentID); if (clientCaps != null) { IRegionClientCapsService regionCaps = clientCaps.GetCapsService(m_scene.RegionInfo.RegionHandle); if (regionCaps != null) { regionCaps.AddCAPS((OSDMap)param["CapsUrls"]); } } } } else if (FunctionName == "UserStatusChange") { UserInfo info = (UserInfo)parameters; if (!info.IsOnline) //Logging out { ICapsService service = m_scene.RequestModuleInterface<ICapsService>(); if (service != null) { service.RemoveCAPS(UUID.Parse(info.UserID)); } } } return null; }
/// <summary> /// Async component for informing client of which neighbours exist /// </summary> /// <remarks> /// This needs to run asynchronously, as a network timeout may block the thread for a long while /// </remarks> /// <param name="remoteClient"></param> /// <param name="a"></param> /// <param name="regionHandle"></param> /// <param name="endPoint"></param> private void InformClientOfNeighbourAsync(ScenePresence sp, AgentCircuitData a, GridRegion reg, IPEndPoint endPoint, bool newAgent) { // Let's wait just a little to give time to originating regions to catch up with closing child agents // after a cross here Thread.Sleep(500); Scene m_scene = sp.Scene; uint x, y; Utils.LongToUInts(reg.RegionHandle, out x, out y); x = x / Constants.RegionSize; y = y / Constants.RegionSize; m_log.Debug("[ENTITY TRANSFER MODULE]: Starting to inform client about neighbour " + x + ", " + y + "(" + endPoint + ")"); string capsPath = reg.ServerURI + CapsUtil.GetCapsSeedPath(a.CapsPath); string reason = String.Empty; bool regionAccepted = m_scene.SimulationService.CreateAgent(reg, a, (uint)TeleportFlags.Default, out reason); if (regionAccepted && newAgent) { IEventQueue eq = sp.Scene.RequestModuleInterface<IEventQueue>(); if (eq != null) { #region IP Translation for NAT IClientIPEndpoint ipepClient; if (sp.ClientView.TryGet(out ipepClient)) { endPoint.Address = NetworkUtil.GetIPFor(ipepClient.EndPoint, endPoint.Address); } #endregion m_log.DebugFormat("[ENTITY TRANSFER MODULE]: {0} is sending {1} EnableSimulator for neighbour region {2} @ {3} " + "and EstablishAgentCommunication with seed cap {4}", m_scene.RegionInfo.RegionName, sp.Name, reg.RegionName, reg.RegionHandle, capsPath); eq.EnableSimulator(reg.RegionHandle, endPoint, sp.UUID); eq.EstablishAgentCommunication(sp.UUID, endPoint, capsPath); } else { sp.ControllingClient.InformClientOfNeighbour(reg.RegionHandle, endPoint); // TODO: make Event Queue disablable! } m_log.Debug("[ENTITY TRANSFER MODULE]: Completed inform client about neighbour " + endPoint.ToString()); } if (!regionAccepted) m_log.DebugFormat("[ENTITY TRANSFER MODULE]: Region {0} did not accept agent: {1}", reg.RegionName, reason); }
private GridRegion MakeRegion(AgentCircuitData aCircuit) { GridRegion region = new GridRegion(); Uri uri = null; if (!aCircuit.ServiceURLs.ContainsKey("HomeURI") || (aCircuit.ServiceURLs.ContainsKey("HomeURI") && !Uri.TryCreate(aCircuit.ServiceURLs["HomeURI"].ToString(), UriKind.Absolute, out uri))) return null; region.ExternalHostName = uri.Host; region.HttpPort = (uint)uri.Port; region.ServerURI = aCircuit.ServiceURLs["HomeURI"].ToString(); region.RegionName = string.Empty; region.InternalEndPoint = new System.Net.IPEndPoint(System.Net.IPAddress.Parse("0.0.0.0"), (int)0); return region; }
public bool VerifyClient(AgentCircuitData aCircuit, string token) { if (aCircuit.ServiceURLs.ContainsKey("HomeURI")) { string url = aCircuit.ServiceURLs["HomeURI"].ToString(); IUserAgentService security = new UserAgentServiceConnector(url); return security.VerifyClient(aCircuit.SessionID, token); } else { m_log.DebugFormat( "[HG ENTITY TRANSFER MODULE]: Agent {0} {1} does not have a HomeURI OH NO!", aCircuit.firstname, aCircuit.lastname); } return false; }
protected override bool CreateAgent(ScenePresence sp, GridRegion reg, GridRegion finalDestination, AgentCircuitData agentCircuit, uint teleportFlags, out string reason, out bool logout) { m_log.DebugFormat("[HG ENTITY TRANSFER MODULE]: CreateAgent {0} {1}", reg.ServerURI, finalDestination.ServerURI); reason = string.Empty; logout = false; int flags = Scene.GridService.GetRegionFlags(Scene.RegionInfo.ScopeID, reg.RegionID); if (flags == -1 /* no region in DB */ || (flags & (int)OpenSim.Framework.RegionFlags.Hyperlink) != 0) { // this user is going to another grid // for local users, check if HyperGrid teleport is allowed, based on user level if (Scene.UserManagementModule.IsLocalGridUser(sp.UUID) && sp.UserLevel < m_levelHGTeleport) { m_log.WarnFormat("[HG ENTITY TRANSFER MODULE]: Unable to HG teleport agent due to insufficient UserLevel."); reason = "Hypergrid teleport not allowed"; return false; } if (agentCircuit.ServiceURLs.ContainsKey("HomeURI")) { string userAgentDriver = agentCircuit.ServiceURLs["HomeURI"].ToString(); IUserAgentService connector; if (userAgentDriver.Equals(m_ThisHomeURI) && m_UAS != null) connector = m_UAS; else connector = new UserAgentServiceConnector(userAgentDriver); bool success = connector.LoginAgentToGrid(agentCircuit, reg, finalDestination, false, out reason); logout = success; // flag for later logout from this grid; this is an HG TP if (success) sp.Scene.EventManager.TriggerTeleportStart(sp.ControllingClient, reg, finalDestination, teleportFlags, logout); return success; } else { m_log.DebugFormat("[HG ENTITY TRANSFER MODULE]: Agent does not have a HomeURI address"); return false; } } return base.CreateAgent(sp, reg, finalDestination, agentCircuit, teleportFlags, out reason, out logout); }
private bool LaunchAgentIndirectly(GridRegion gatekeeper, GridRegion destination, AgentCircuitData aCircuit, IPEndPoint clientIP, out string reason) { m_log.Debug("[LLOGIN SERVICE] Launching agent at " + destination.RegionName); if (m_UserAgentService.LoginAgentToGrid(null, aCircuit, gatekeeper, destination, true, out reason)) return true; return false; }
public void AfterAttachedToConnection(OpenSim.Framework.AgentCircuitData c) { }
private void SetServiceURLs(AgentCircuitData aCircuit, UserAccount account) { aCircuit.ServiceURLs = new Dictionary<string, object>(); if (account.ServiceURLs == null) return; // Old style: get the service keys from the DB foreach (KeyValuePair<string, object> kvp in account.ServiceURLs) { if (kvp.Value != null) { aCircuit.ServiceURLs[kvp.Key] = kvp.Value; if (!aCircuit.ServiceURLs[kvp.Key].ToString().EndsWith("/")) aCircuit.ServiceURLs[kvp.Key] = aCircuit.ServiceURLs[kvp.Key] + "/"; } } // New style: service keys start with SRV_; override the previous string[] keys = m_LoginServerConfig.GetKeys(); if (keys.Length > 0) { bool newUrls = false; IEnumerable<string> serviceKeys = keys.Where(value => value.StartsWith("SRV_")); foreach (string serviceKey in serviceKeys) { string keyName = serviceKey.Replace("SRV_", ""); string keyValue = m_LoginServerConfig.GetString(serviceKey, string.Empty); if (!keyValue.EndsWith("/")) keyValue = keyValue + "/"; if (!account.ServiceURLs.ContainsKey(keyName) || (account.ServiceURLs.ContainsKey(keyName) && (string)account.ServiceURLs[keyName] != keyValue)) { account.ServiceURLs[keyName] = keyValue; newUrls = true; } aCircuit.ServiceURLs[keyName] = keyValue; m_log.DebugFormat("[LLLOGIN SERVICE]: found new key {0} {1}", keyName, aCircuit.ServiceURLs[keyName]); } // The grid operator decided to override the defaults in the // [LoginService] configuration. Let's store the correct ones. if (newUrls) m_UserAccountService.StoreUserAccount(account); } }
public async Task<Tuple<bool, string>> SendCreateRemoteChildAgentAsync(SimpleRegionInfo regionInfo, AgentCircuitData aCircuit) { if (regionInfo == null) throw new ArgumentNullException("regionInfo cannot be null"); return await m_regionClient.DoCreateChildAgentCallAsync(regionInfo, aCircuit); }
public virtual AgentCircuitData Copy () { AgentCircuitData Copy = new AgentCircuitData(); Copy.AgentID = AgentID; Copy.Appearance = Appearance; Copy.CapsPath = CapsPath; Copy.child = child; Copy.reallyischild = reallyischild; Copy.circuitcode = circuitcode; Copy.IPAddress = IPAddress; Copy.SecureSessionID = SecureSessionID; Copy.SessionID = SessionID; Copy.startpos = startpos; Copy.teleportFlags = teleportFlags; Copy.OtherInformation = OtherInformation; Copy.ServiceURLs = ServiceURLs; Copy.firstname = firstname; Copy.lastname = lastname; return Copy; }
/** * Agent-related communications */ public bool SendCreateChildAgent(ulong regionHandle, AgentCircuitData aCircuit, bool authorize, out string reason) { int createChildStart = Environment.TickCount; // authorize is always false from here. Anyone calling the REST version (not local version) directly is doing it for a child agent. authorize = false; try { // Try local first if (m_localBackend.SendCreateChildAgent(regionHandle, aCircuit, authorize, out reason)) 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.DoCreateChildAgentCall(regInfo, aCircuit, "None", out reason); } else { reason = "Region not found"; m_log.Warn("[REST COMMS]: Region not found " + regionHandle.ToString()); } } return false; } finally { m_log.DebugFormat("[REST COMM] SendCreateChildAgent: {0} ms", Environment.TickCount - createChildStart); } }
private bool LaunchAgentDirectly(ISimulationService simConnector, GridRegion region, AgentCircuitData aCircuit, TeleportFlags flags, out string reason) { return simConnector.CreateAgent(null, region, aCircuit, (uint)flags, out reason); }
protected virtual void DoAgentPost(Hashtable request, Hashtable responsedata, UUID 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; bool authorize = false; if (args.ContainsKey("destination_handle")) UInt64.TryParse(args["destination_handle"].AsString(), out regionhandle); if (args.ContainsKey("authorize_user")) // not implemented on the sending side yet bool.TryParse(args["authorize_user"].AsString(), out authorize); 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 bool result = m_localBackend.SendCreateChildAgent(regionhandle, aCircuit, authorize, 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); }
/// <summary> /// Add information about a new circuit so that later on we can authenticate a new client session. /// </summary> /// <param name="circuitCode"></param> /// <param name="agentData"></param> public virtual void AddNewCircuit(uint circuitCode, AgentCircuitData agentData) { RemoveCircuit(agentData.AgentID); // no duplications m_agentCircuits[circuitCode] = agentData; m_agentCircuitsByUUID[agentData.AgentID] = agentData; }