protected object OnGenericEvent(string FunctionName, object parameters) { if (FunctionName == "NewUserConnection") { ICapsService service = m_scene.RequestModuleInterface <ICapsService>(); if (service != null) { object[] obj = (object[])parameters; OSDMap param = (OSDMap)obj[0]; AgentCircuitData circuit = (AgentCircuitData)obj[1]; circuit.child = false; //ONLY USE ROOT AGENTS service.CreateCAPS(circuit.AgentID, CapsUtil.GetCapsSeedPath(circuit.CapsPath), m_scene.RegionInfo.RegionHandle, true, circuit); //We ONLY use root agents because of OpenSim's inability to send the correct data 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); }
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); }
public void LogoutAgent(IRegionClientCapsService regionCaps) { //Close all neighbor agents as well, the root is closing itself, so don't call them ISimulationService SimulationService = m_registry.RequestModuleInterface <ISimulationService>(); if (SimulationService != null) { IGridService GridService = m_registry.RequestModuleInterface <IGridService>(); if (GridService != null) { foreach (IRegionClientCapsService regionClient in regionCaps.ClientCaps.GetCapsServices()) { if (regionClient.RegionHandle != regionCaps.RegionHandle) { SimulationService.CloseAgent(regionClient.Region, regionCaps.AgentID); } } } } //Close all caps regionCaps.ClientCaps.Close(); IAgentInfoService agentInfoService = m_registry.RequestModuleInterface <IAgentInfoService>(); if (agentInfoService != null) { agentInfoService.SetLoggedIn(regionCaps.AgentID.ToString(), false, true); } ICapsService capsService = m_registry.RequestModuleInterface <ICapsService>(); if (capsService != null) { capsService.RemoveCAPS(regionCaps.AgentID); } }
protected object OnGenericEvent(string FunctionName, object parameters) { if (FunctionName == "NewUserConnection") { ICapsService service = m_scene.RequestModuleInterface <ICapsService>(); if (service != null) { object[] obj = (object[])parameters; OSDMap param = (OSDMap)obj[0]; AgentCircuitData circuit = (AgentCircuitData)obj[1]; if (circuit.reallyischild)//If Aurora is sending this, it'll show that it really is a child agent { return(null); } AvatarAppearance appearance = m_scene.AvatarService.GetAppearance(circuit.AgentID); if (appearance != null) { circuit.Appearance = appearance; } else { m_scene.AvatarService.SetAppearance(circuit.AgentID, circuit.Appearance); } //circuit.Appearance.Texture = new Primitive.TextureEntry(UUID.Zero); circuit.child = false;//ONLY USE ROOT AGENTS, SINCE OPENSIM SENDS CHILD == TRUE ALL THE TIME if (circuit.ServiceURLs != null && circuit.ServiceURLs.ContainsKey("IncomingCAPSHandler")) { AddCapsHandler(circuit); } else { IClientCapsService clientService = service.GetOrCreateClientCapsService(circuit.AgentID); clientService.RemoveCAPS(m_scene.RegionInfo.RegionHandle); string caps = service.CreateCAPS(circuit.AgentID, CapsUtil.GetCapsSeedPath(circuit.CapsPath), m_scene.RegionInfo.RegionHandle, true, circuit, MainServer.Instance.Port); //We ONLY use root agents because of OpenSim's inability to send the correct data MainConsole.Instance.Output("setting up on " + clientService.HostUri + CapsUtil.GetCapsSeedPath(circuit.CapsPath)); 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") { object[] info = (object[])parameters; if (!bool.Parse(info[1].ToString())) //Logging out { ICapsService service = m_scene.RequestModuleInterface <ICapsService>(); if (service != null) { service.RemoveCAPS(UUID.Parse(info[0].ToString())); } } } return(null); }
public bool LoginAgent(AgentCircuitData aCircuit, GridRegion destination, out string reason) { reason = string.Empty; string authURL = string.Empty; if (aCircuit.ServiceURLs.ContainsKey("HomeURI")) { authURL = aCircuit.ServiceURLs["HomeURI"].ToString(); } MainConsole.Instance.InfoFormat("[GATEKEEPER SERVICE]: Login request for {0} {1} @ {2}", authURL, aCircuit.AgentID, destination.RegionName); // // Authenticate the user // if (!Authenticate(aCircuit)) { reason = "Unable to verify identity"; MainConsole.Instance.InfoFormat("[GATEKEEPER SERVICE]: Unable to verify identity of agent {0}. Refusing service.", aCircuit.AgentID); return(false); } MainConsole.Instance.DebugFormat("[GATEKEEPER SERVICE]: Identity verified for {0} @ {1}", aCircuit.AgentID, authURL); // // Check for impersonations // UserAccount account = null; if (m_UserAccountService != null) { // Check to see if we have a local user with that UUID account = m_UserAccountService.GetUserAccount(null, aCircuit.AgentID); if (account != null && m_userFinder.IsLocalGridUser(account.PrincipalID)) { // Make sure this is the user coming home, and not a foreign user with same UUID as a local user if (m_UserAgentService != null) { if (!m_UserAgentService.AgentIsComingHome(aCircuit.SessionID, m_ExternalName)) { // Can't do, sorry reason = "Unauthorized"; MainConsole.Instance.InfoFormat("[GATEKEEPER SERVICE]: Foreign agent {0} has same ID as local user. Refusing service.", aCircuit.AgentID); return(false); } } } } MainConsole.Instance.InfoFormat("[GATEKEEPER SERVICE]: User is ok"); // May want to authorize //bool isFirstLogin = false; // // Login the presence, if it's not there yet (by the login service) // UserInfo presence = m_PresenceService.GetUserInfo(aCircuit.AgentID.ToString()); if (m_userFinder.IsLocalGridUser(aCircuit.AgentID) && presence != null && presence.IsOnline) // it has been placed there by the login service { // isFirstLogin = true; } else { IUserAgentService userAgentService = new UserAgentServiceConnector(aCircuit.ServiceURLs["HomeURI"].ToString()); Vector3 position = Vector3.UnitY, lookAt = Vector3.UnitY; GridRegion finalDestination = userAgentService.GetHomeRegion(aCircuit.AgentID, out position, out lookAt); if (finalDestination == null) { reason = "You do not have a home position set."; return(false); } m_PresenceService.SetHomePosition(aCircuit.AgentID.ToString(), finalDestination.RegionID, position, lookAt); m_PresenceService.SetLoggedIn(aCircuit.AgentID.ToString(), true, true, destination.RegionID); } MainConsole.Instance.DebugFormat("[GATEKEEPER SERVICE]: Login presence ok"); // // Get the region // destination = m_GridService.GetRegionByUUID(null, destination.RegionID); if (destination == null) { reason = "Destination region not found"; return(false); } // // Adjust the visible name // if (account != null) { aCircuit.firstname = account.FirstName; aCircuit.lastname = account.LastName; } if (account == null && !aCircuit.lastname.StartsWith("@")) { aCircuit.firstname = aCircuit.firstname + "." + aCircuit.lastname; try { Uri uri = new Uri(aCircuit.ServiceURLs["HomeURI"].ToString()); aCircuit.lastname = "@" + uri.Host; // + ":" + uri.Port; } catch { MainConsole.Instance.WarnFormat("[GATEKEEPER SERVICE]: Malformed HomeURI (this should never happen): {0}", aCircuit.ServiceURLs["HomeURI"]); aCircuit.lastname = "@" + aCircuit.ServiceURLs["HomeURI"].ToString(); } m_userFinder.AddUser(aCircuit.AgentID, aCircuit.firstname, aCircuit.lastname, aCircuit.ServiceURLs); m_UserAccountService.CacheAccount(new UserAccount(UUID.Zero, aCircuit.AgentID, aCircuit.firstname + aCircuit.lastname, "") { UserFlags = 1024 }); } retry: // // Finally launch the agent at the destination // TeleportFlags loginFlag = /*isFirstLogin ? */ TeleportFlags.ViaLogin /* : TeleportFlags.ViaHGLogin*/; IRegionClientCapsService regionClientCaps = null; if (m_CapsService != null) { //Remove any previous users string ServerCapsBase = Aurora.Framework.Capabilities.CapsUtil.GetRandomCapsObjectPath(); m_CapsService.CreateCAPS(aCircuit.AgentID, Aurora.Framework.Capabilities.CapsUtil.GetCapsSeedPath(ServerCapsBase), destination.RegionHandle, true, aCircuit, 0); regionClientCaps = m_CapsService.GetClientCapsService(aCircuit.AgentID).GetCapsService(destination.RegionHandle); if (aCircuit.ServiceURLs == null) { aCircuit.ServiceURLs = new Dictionary <string, object>(); } aCircuit.ServiceURLs["IncomingCAPSHandler"] = regionClientCaps.CapsUrl; } aCircuit.child = false;//FIX THIS, OPENSIM ALWAYS SENDS CHILD! int requestedUDPPort = 0; bool success = m_SimulationService.CreateAgent(destination, aCircuit, (uint)loginFlag, null, out requestedUDPPort, out reason); if (success) { if (regionClientCaps != null) { if (requestedUDPPort == 0) { requestedUDPPort = destination.ExternalEndPoint.Port; } IPAddress ipAddress = destination.ExternalEndPoint.Address; aCircuit.RegionUDPPort = requestedUDPPort; regionClientCaps.LoopbackRegionIP = ipAddress; regionClientCaps.CircuitData.RegionUDPPort = requestedUDPPort; OSDMap responseMap = (OSDMap)OSDParser.DeserializeJson(reason); OSDMap SimSeedCaps = (OSDMap)responseMap["CapsUrls"]; regionClientCaps.AddCAPS(SimSeedCaps); } } else { if (m_CapsService != null) { m_CapsService.RemoveCAPS(aCircuit.AgentID); } m_GridService.SetRegionUnsafe(destination.RegionID); if (!m_foundDefaultRegion) { m_DefaultGatewayRegion = FindDefaultRegion(); } if (destination != m_DefaultGatewayRegion) { destination = m_DefaultGatewayRegion; goto retry; } else { m_DefaultGatewayRegion = FindDefaultRegion(); if (m_DefaultGatewayRegion == destination) { return(false);//It failed to find a new one } destination = m_DefaultGatewayRegion; goto retry;//It found a new default region } } return(success); }
protected object OnGenericEvent(string FunctionName, object parameters) { if (FunctionName == "UserStatusChange") { //A user has logged in or out... we need to update friends lists across the grid IAsyncMessagePostService asyncPoster = m_registry.RequestModuleInterface <IAsyncMessagePostService>(); IFriendsService friendsService = m_registry.RequestModuleInterface <IFriendsService>(); ICapsService capsService = m_registry.RequestModuleInterface <ICapsService>(); IGridService gridService = m_registry.RequestModuleInterface <IGridService>(); if (asyncPoster != null && friendsService != null && capsService != null && gridService != null) { //Get all friends object[] info = (object[])parameters; UUID us = UUID.Parse(info[0].ToString()); bool isOnline = bool.Parse(info[1].ToString()); List <FriendInfo> friends = friendsService.GetFriends(us); List <UUID> OnlineFriends = new List <UUID>(); List <string> previouslyContactedURLs = new List <string>(); foreach (FriendInfo friend in friends) { if (friend.TheirFlags == -1 || friend.MyFlags == -1) { continue; //Not validiated yet! } UUID FriendToInform = UUID.Zero; string url, first, last, secret; if (!UUID.TryParse(friend.Friend, out FriendToInform)) { HGUtil.ParseUniversalUserIdentifier(friend.Friend, out FriendToInform, out url, out first, out last, out secret); } //Now find their caps service so that we can find where they are root (and if they are logged in) IClientCapsService clientCaps = capsService.GetClientCapsService(FriendToInform); if (clientCaps != null) { //Find the root agent IRegionClientCapsService regionClientCaps = clientCaps.GetRootCapsService(); if (regionClientCaps != null) { OnlineFriends.Add(FriendToInform); //Post! asyncPoster.Post(regionClientCaps.RegionHandle, SyncMessageHelper.AgentStatusChange(us, FriendToInform, isOnline)); } else { //If they don't have a root agent, wtf happened? capsService.RemoveCAPS(clientCaps.AgentID); } } else { IAgentInfoService agentInfoService = m_registry.RequestModuleInterface <IAgentInfoService>(); if (agentInfoService != null) { UserInfo friendinfo = agentInfoService.GetUserInfo(FriendToInform.ToString()); if (friendinfo != null && friendinfo.IsOnline) { OnlineFriends.Add(FriendToInform); //Post! GridRegion r = gridService.GetRegionByUUID(UUID.Zero, friendinfo.CurrentRegionID); if (r != null) { asyncPoster.Post(r.RegionHandle, SyncMessageHelper.AgentStatusChange(us, FriendToInform, isOnline)); } } else { IUserAgentService uas = m_registry.RequestModuleInterface <IUserAgentService>(); if (uas != null) { bool online = uas.RemoteStatusNotification(friend, us, isOnline); if (online) { OnlineFriends.Add(FriendToInform); } } } } } } //If the user is coming online, send all their friends online statuses to them if (isOnline) { GridRegion ourRegion = gridService.GetRegionByUUID(UUID.Zero, UUID.Parse(info[2].ToString())); if (ourRegion != null) { foreach (UUID onlineFriend in OnlineFriends) { asyncPoster.Post(ourRegion.RegionHandle, SyncMessageHelper.AgentStatusChange(onlineFriend, us, isOnline)); } } } } } return(null); }