public void OnTeleportLureRequest(UUID lureID, uint teleportFlags, IClientAPI client) { if (!(client.Scene is Scene)) { return; } Scene scene = (Scene)(client.Scene); ulong handle = 0; uint x = 128; uint y = 128; uint z = 70; Util.ParseFakeParcelID(lureID, out handle, out x, out y, out z); Vector3 position = new Vector3(); position.X = (float)x; position.Y = (float)y; position.Z = (float)z; TeleportFlags flags = (TeleportFlags)teleportFlags; scene.RequestTeleportLocation(client, handle, position, Vector3.Zero, flags); }
/// <summary> /// Introduce an agent into the scene by adding a new client. /// </summary> /// <returns>The scene presence added</returns> /// <param name='sceneManager'> /// Scene manager. Can be null if there is only one region in the test or multiple regions that are not /// neighbours and where no teleporting takes place. /// </param> /// <param name='scene'></param> /// <param name='sceneManager></param> /// <param name='agentData'></param> /// <param name='tf'></param> private static ScenePresence IntroduceClientToScene( Scene scene, SceneManager sceneManager, AgentCircuitData agentData, TeleportFlags tf) { string reason; // Stage 1: tell the scene to expect a new user connection if (!scene.NewUserConnection(agentData, (uint)tf, out reason)) Console.WriteLine("NewUserConnection failed: " + reason); // Stage 2: add the new client as a child agent to the scene TestClient client = new TestClient(agentData, scene, sceneManager); scene.AddNewClient(client, PresenceType.User); return scene.GetScenePresence(agentData.AgentID); }
/// <summary> /// Introduce an agent into the scene by adding a new client. /// </summary> /// <returns>The scene presence added</returns> /// <param name='scene'></param> /// <param name='testClient'></param> /// <param name='agentData'></param> /// <param name='tf'></param> private static ScenePresence IntroduceClientToScene( Scene scene, IClientAPI client, AgentCircuitData agentData, TeleportFlags tf) { string reason; // Stage 1: tell the scene to expect a new user connection if (!scene.NewUserConnection(agentData, (uint)tf, null, out reason)) { Console.WriteLine("NewUserConnection failed: " + reason); } // Stage 2: add the new client as a child agent to the scene scene.AddNewAgent(client, PresenceType.User); return(scene.GetScenePresence(client.AgentId)); }
public static OSDMap TeleportFinish(UUID agentID, int locationID, ulong regionHandle, Uri seedCap, SimAccess simAccess, IPAddress simIP, int simPort, TeleportFlags teleportFlags) { OSDMap info = new OSDMap(8); info.Add("AgentID", OSD.FromUUID(agentID)); info.Add("LocationID", OSD.FromInteger(locationID)); // Unused by the client info.Add("RegionHandle", OSD.FromULong(regionHandle)); info.Add("SeedCapability", OSD.FromUri(seedCap)); info.Add("SimAccess", OSD.FromInteger((byte)simAccess)); info.Add("SimIP", OSD.FromBinary(simIP.GetAddressBytes())); info.Add("SimPort", OSD.FromInteger(simPort)); info.Add("TeleportFlags", OSD.FromUInteger((uint)teleportFlags)); OSDArray infoArray = new OSDArray(1); infoArray.Add(info); OSDMap teleport = new OSDMap(1); teleport.Add("Info", infoArray); return teleport; }
public TeleportEventArgs(string message, TeleportStatus status, TeleportFlags flags) { this.m_Message = message; this.m_Status = status; this.m_Flags = flags; }
protected GridRegion FindDestination( UserAccount account, UUID scopeID, GridUserInfo pinfo, UUID sessionID, string startLocation, GridRegion home, out GridRegion gatekeeper, out string where, out Vector3 position, out Vector3 lookAt, out TeleportFlags flags) { flags = TeleportFlags.ViaLogin; m_log.DebugFormat( "[LLOGIN SERVICE]: Finding destination matching start location {0} for {1}", startLocation, account.Name); gatekeeper = null; where = "home"; position = new Vector3(128, 128, 0); lookAt = new Vector3(0, 1, 0); if (m_GridService == null) { return(null); } if (startLocation.Equals("home")) { // logging into home region if (pinfo == null) { return(null); } GridRegion region = null; bool tryDefaults = false; if (home == null) { tryDefaults = true; } else { region = home; position = pinfo.HomePosition; lookAt = pinfo.HomeLookAt; flags |= TeleportFlags.ViaHome; } if (tryDefaults) { List <GridRegion> defaults = m_GridService.GetDefaultRegions(scopeID); if (defaults != null && defaults.Count > 0) { region = defaults[0]; where = "safe"; } else { m_log.WarnFormat("[LLOGIN SERVICE]: User {0} {1} does not have a valid home and this grid does not have default locations. Attempting to find random region", account.FirstName, account.LastName); region = FindAlternativeRegion(scopeID); if (region != null) { where = "safe"; } } } return(region); } else if (startLocation.Equals("last")) { // logging into last visited region where = "last"; if (pinfo == null) { return(null); } GridRegion region = null; if (pinfo.LastRegionID.Equals(UUID.Zero) || (region = m_GridService.GetRegionByUUID(scopeID, pinfo.LastRegionID)) == null) { List <GridRegion> defaults = m_GridService.GetDefaultRegions(scopeID); if (defaults != null && defaults.Count > 0) { region = defaults[0]; where = "safe"; } else { m_log.Info("[LLOGIN SERVICE]: Last Region Not Found Attempting to find random region"); region = FindAlternativeRegion(scopeID); if (region != null) { where = "safe"; } } } else { position = pinfo.LastPosition; lookAt = pinfo.LastLookAt; } return(region); } else { flags |= TeleportFlags.ViaRegionID; // free uri form // e.g. New Moon&135&46 New [email protected]:8002&153&34 where = "url"; GridRegion region = null; Regex reURI = new Regex(@"^uri:(?<region>[^&]+)&(?<x>\d+)&(?<y>\d+)&(?<z>\d+)$"); Match uriMatch = reURI.Match(startLocation); if (uriMatch == null) { m_log.InfoFormat("[LLLOGIN SERVICE]: Got Custom Login URI {0}, but can't process it", startLocation); return(null); } else { position = new Vector3(float.Parse(uriMatch.Groups["x"].Value, Culture.NumberFormatInfo), float.Parse(uriMatch.Groups["y"].Value, Culture.NumberFormatInfo), float.Parse(uriMatch.Groups["z"].Value, Culture.NumberFormatInfo)); string regionName = uriMatch.Groups["region"].ToString(); if (regionName != null) { if (!regionName.Contains("@")) { List <GridRegion> regions = m_GridService.GetRegionsByName(scopeID, regionName, 1); if ((regions == null) || (regions != null && regions.Count == 0)) { m_log.InfoFormat("[LLLOGIN SERVICE]: Got Custom Login URI {0}, can't locate region {1}. Trying defaults.", startLocation, regionName); regions = m_GridService.GetDefaultRegions(scopeID); if (regions != null && regions.Count > 0) { where = "safe"; return(regions[0]); } else { m_log.Info("[LLOGIN SERVICE]: Last Region Not Found Attempting to find random region"); region = FindAlternativeRegion(scopeID); if (region != null) { where = "safe"; return(region); } else { m_log.InfoFormat("[LLLOGIN SERVICE]: Got Custom Login URI {0}, Grid does not provide default regions and no alternative found.", startLocation); return(null); } } } return(regions[0]); } else { if (m_UserAgentService == null) { m_log.WarnFormat("[LLLOGIN SERVICE]: This llogin service is not running a user agent service, as such it can't lauch agents at foreign grids"); return(null); } string[] parts = regionName.Split(new char[] { '@' }); if (parts.Length < 2) { m_log.InfoFormat("[LLLOGIN SERVICE]: Got Custom Login URI {0}, can't locate region {1}", startLocation, regionName); return(null); } // Valid specification of a remote grid regionName = parts[0]; string domainLocator = parts[1]; parts = domainLocator.Split(new char[] { ':' }); string domainName = parts[0]; uint port = 0; if (parts.Length > 1) { UInt32.TryParse(parts[1], out port); } region = FindForeignRegion(domainName, port, regionName, account, out gatekeeper); return(region); } } else { List <GridRegion> defaults = m_GridService.GetDefaultRegions(scopeID); if (defaults != null && defaults.Count > 0) { where = "safe"; return(defaults[0]); } else { return(null); } } } //response.LookAt = "[r0,r1,r0]"; //// can be: last, home, safe, url //response.StartLocation = "url"; } }
protected GridRegion FindDestination(UserAccount account, UserInfo pinfo, UUID sessionID, string startLocation, GridRegion home, out TeleportFlags tpFlags, out string where, out Vector3 position, out Vector3 lookAt) { where = "home"; position = new Vector3(128, 128, 25); lookAt = new Vector3(0, 1, 0); tpFlags = TeleportFlags.ViaLogin; if (m_GridService == null) return null; if (startLocation.Equals("home")) { tpFlags |= TeleportFlags.ViaLandmark; // logging into home region if (pinfo == null) return null; GridRegion region = null; bool tryDefaults = false; if (home == null) { MainConsole.Instance.WarnFormat( "[LLOGIN SERVICE]: User {0} {1} tried to login to a 'home' start location but they have none set", account.FirstName, account.LastName); tryDefaults = true; } else { region = home; position = pinfo.HomePosition; lookAt = pinfo.HomeLookAt; } if (tryDefaults) { tpFlags &= ~TeleportFlags.ViaLandmark; List<GridRegion> defaults = m_GridService.GetDefaultRegions(account.AllScopeIDs); if (defaults != null && defaults.Count > 0) { region = defaults[0]; where = "safe"; } else { List<GridRegion> fallbacks = m_GridService.GetFallbackRegions(account.AllScopeIDs, 0, 0); if (fallbacks != null && fallbacks.Count > 0) { region = fallbacks[0]; where = "safe"; } else { //Try to find any safe region List<GridRegion> safeRegions = m_GridService.GetSafeRegions(account.AllScopeIDs, 0, 0); if (safeRegions != null && safeRegions.Count > 0) { region = safeRegions[0]; where = "safe"; } else { MainConsole.Instance.WarnFormat( "[LLOGIN SERVICE]: User {0} {1} does not have a valid home and this grid does not have default locations. Attempting to find random region", account.FirstName, account.LastName); defaults = m_GridService.GetRegionsByName(account.AllScopeIDs, "", 0, 1); if (defaults != null && defaults.Count > 0) { region = defaults[0]; where = "safe"; } } } } } return region; } if (startLocation.Equals("last")) { tpFlags |= TeleportFlags.ViaLandmark; // logging into last visited region where = "last"; if (pinfo == null) return null; GridRegion region = null; if (pinfo.CurrentRegionID.Equals(UUID.Zero) || (region = m_GridService.GetRegionByUUID(account.AllScopeIDs, pinfo.CurrentRegionID)) == null) { tpFlags &= ~TeleportFlags.ViaLandmark; List<GridRegion> defaults = m_GridService.GetDefaultRegions(account.AllScopeIDs); if (defaults != null && defaults.Count > 0) { region = defaults[0]; where = "safe"; } else { defaults = m_GridService.GetFallbackRegions(account.AllScopeIDs, 0, 0); if (defaults != null && defaults.Count > 0) { region = defaults[0]; where = "safe"; } else { defaults = m_GridService.GetSafeRegions(account.AllScopeIDs, 0, 0); if (defaults != null && defaults.Count > 0) { region = defaults[0]; where = "safe"; } } } } else { position = pinfo.CurrentPosition; if (position.X < 0) position.X = 0; if (position.Y < 0) position.Y = 0; if (position.Z < 0) position.Z = 0; if (position.X > region.RegionSizeX) position.X = region.RegionSizeX; if (position.Y > region.RegionSizeY) position.Y = region.RegionSizeY; lookAt = pinfo.CurrentLookAt; } return region; } else { // free uri form // e.g. New Moon&135&46 New [email protected]:8002&153&34 where = "url"; Regex reURI = new Regex(@"^uri:(?<region>[^&]+)&(?<x>\d+)&(?<y>\d+)&(?<z>\d+)$"); Match uriMatch = reURI.Match(startLocation); position = new Vector3(float.Parse(uriMatch.Groups["x"].Value, Culture.NumberFormatInfo), float.Parse(uriMatch.Groups["y"].Value, Culture.NumberFormatInfo), float.Parse(uriMatch.Groups["z"].Value, Culture.NumberFormatInfo)); string regionName = uriMatch.Groups["region"].ToString(); if (!regionName.Contains("@")) { List<GridRegion> regions = m_GridService.GetRegionsByName(account.AllScopeIDs, regionName, 0, 1); if ((regions == null) || (regions.Count == 0)) { MainConsole.Instance.InfoFormat( "[LLLOGIN SERVICE]: Got Custom Login URI {0}, can't locate region {1}. Trying defaults.", startLocation, regionName); regions = m_GridService.GetDefaultRegions(account.AllScopeIDs); if (regions != null && regions.Count > 0) { where = "safe"; return regions[0]; } List<GridRegion> fallbacks = m_GridService.GetFallbackRegions(account.AllScopeIDs, 0, 0); if (fallbacks != null && fallbacks.Count > 0) { where = "safe"; return fallbacks[0]; } //Try to find any safe region List<GridRegion> safeRegions = m_GridService.GetSafeRegions(account.AllScopeIDs, 0, 0); if (safeRegions != null && safeRegions.Count > 0) { where = "safe"; return safeRegions[0]; } MainConsole.Instance.InfoFormat( "[LLLOGIN SERVICE]: Got Custom Login URI {0}, Grid does not have any available regions.", startLocation); return null; } return regions[0]; } //This is so that you can login to other grids via IWC (or HG), example"[email protected]:8002". All this really needs to do is inform the other grid that we have a user who wants to connect. IWC allows users to login by default to other regions (without the host names), but if one is provided and we don't have a link, we need to create one here. string[] parts = regionName.Split(new char[] {'@'}); if (parts.Length < 2) { MainConsole.Instance.InfoFormat( "[LLLOGIN SERVICE]: Got Custom Login URI {0}, can't locate region {1}", startLocation, regionName); return null; } // Valid specification of a remote grid regionName = parts[0]; //Try now that we removed the domain locator GridRegion region = m_GridService.GetRegionByName(account.AllScopeIDs, regionName); if (region != null && region.RegionName == regionName) //Make sure the region name is right too... it could just be a similar name return region; List<GridRegion> defaults = m_GridService.GetDefaultRegions(account.AllScopeIDs); if (defaults != null && defaults.Count > 0) { where = "safe"; return defaults[0]; } else { List<GridRegion> fallbacks = m_GridService.GetFallbackRegions(account.AllScopeIDs, 0, 0); if (fallbacks != null && fallbacks.Count > 0) { where = "safe"; return fallbacks[0]; } else { //Try to find any safe region List<GridRegion> safeRegions = m_GridService.GetSafeRegions(account.AllScopeIDs, 0, 0); if (safeRegions != null && safeRegions.Count > 0) { where = "safe"; return safeRegions[0]; } MainConsole.Instance.InfoFormat( "[LLLOGIN SERVICE]: Got Custom Login URI {0}, Grid does not have any available regions.", startLocation); return null; } } } }
public abstract bool TeleportTo(SceneInterface sceneInterface, string gatekeeperURI, UUID regionID, Vector3 position, Vector3 lookAt, TeleportFlags flags);
public abstract bool TeleportTo(SceneInterface sceneInterface, string regionName, Vector3 position, Vector3 lookAt, TeleportFlags flags);
private bool LaunchAgentDirectly(ISimulationService simConnector, GridRegion region, AgentCircuitData aCircuit, TeleportFlags flags, out string reason) { string version; if ( !simConnector.QueryAccess( region, aCircuit.AgentID, null, true, aCircuit.startpos, "SIMULATION/0.3", out version, out reason)) return false; return simConnector.CreateAgent(null, region, aCircuit, (uint)flags, out reason); }
public virtual bool TeleportTo(SceneInterface sceneInterface, GridVector location, Vector3 position, Vector3 lookAt, TeleportFlags flags) => TeleportTo(sceneInterface, sceneInterface.GatekeeperURI, location, position, lookAt, flags);
/// <summary> /// Deserialize the message /// </summary> /// <param name="map">An <see cref="OSDMap"/> containing the data</param> public void Deserialize(OSDMap map) { OSDArray array = (OSDArray)map["Info"]; OSDMap blockMap = (OSDMap)array[0]; AgentID = blockMap["AgentID"].AsUUID(); LocationID = blockMap["LocationID"].AsInteger(); RegionHandle = blockMap["RegionHandle"].AsULong(); SeedCapability = blockMap["SeedCapability"].AsUri(); SimAccess = (SimAccess)blockMap["SimAccess"].AsInteger(); IP = MessageUtils.ToIP(blockMap["SimIP"]); Port = blockMap["SimPort"].AsInteger(); Flags = (TeleportFlags)blockMap["TeleportFlags"].AsUInteger(); }
private bool LaunchAgentDirectly(ISimulationService simConnector, GridRegion region, AgentCircuitData aCircuit, TeleportFlags flags, out string reason) { string myversion = String.Format("SIMULATION/{0}", VersionInfo.SimulationServiceVersion); string version; if (!simConnector.QueryAccess( region, aCircuit.AgentID, null, true, aCircuit.startpos, myversion, new List<UUID>(), out version, out reason)) return false; return simConnector.CreateAgent(null, region, aCircuit, (uint)flags, out reason); }
protected AgentCircuitData LaunchAgentAtGrid(GridRegion gatekeeper, GridRegion destination, UserAccount account, AvatarAppearance avatar, UUID session, UUID secureSession, Vector3 position, string currentWhere, string viewer, string channel, string mac, string id0, IPEndPoint clientIP, TeleportFlags flags, out string where, out string reason, out GridRegion dest) { where = currentWhere; ISimulationService simConnector = null; reason = string.Empty; uint circuitCode = 0; AgentCircuitData aCircuit = null; if (m_UserAgentService == null) { // HG standalones have both a localSimulatonDll and a remoteSimulationDll // non-HG standalones have just a localSimulationDll // independent login servers have just a remoteSimulationDll if (m_LocalSimulationService != null) simConnector = m_LocalSimulationService; else if (m_RemoteSimulationService != null) simConnector = m_RemoteSimulationService; } else // User Agent Service is on { if (gatekeeper == null) // login to local grid { if (hostName == string.Empty) SetHostAndPort(m_GatekeeperURL); gatekeeper = new GridRegion(destination); gatekeeper.ExternalHostName = hostName; gatekeeper.HttpPort = (uint)port; gatekeeper.ServerURI = m_GatekeeperURL; } m_log.Debug("[LLLOGIN SERVICE]: no gatekeeper detected..... using " + m_GatekeeperURL); } bool success = false; if (m_UserAgentService == null && simConnector != null) { circuitCode = (uint)Util.RandomClass.Next(); ; aCircuit = MakeAgent(destination, account, avatar, session, secureSession, circuitCode, position, clientIP.Address.ToString(), viewer, channel, mac, id0); success = LaunchAgentDirectly(simConnector, destination, aCircuit, flags, out reason); if (!success && m_GridService != null) { // Try the fallback regions List<GridRegion> fallbacks = m_GridService.GetFallbackRegions(account.ScopeID, destination.RegionLocX, destination.RegionLocY); if (fallbacks != null) { foreach (GridRegion r in fallbacks) { success = LaunchAgentDirectly(simConnector, r, aCircuit, flags | TeleportFlags.ViaRegionID, out reason); if (success) { where = "safe"; destination = r; break; } } } } } if (m_UserAgentService != null) { circuitCode = (uint)Util.RandomClass.Next(); ; aCircuit = MakeAgent(destination, account, avatar, session, secureSession, circuitCode, position, clientIP.Address.ToString(), viewer, channel, mac, id0); aCircuit.teleportFlags |= (uint)flags; success = LaunchAgentIndirectly(gatekeeper, destination, aCircuit, clientIP, out reason); if (!success && m_GridService != null) { // Try the fallback regions List<GridRegion> fallbacks = m_GridService.GetFallbackRegions(account.ScopeID, destination.RegionLocX, destination.RegionLocY); if (fallbacks != null) { foreach (GridRegion r in fallbacks) { success = LaunchAgentIndirectly(gatekeeper, r, aCircuit, clientIP, out reason); if (success) { where = "safe"; destination = r; break; } } } } } dest = destination; if (success) return aCircuit; else return null; }
public override bool TeleportTo(SceneInterface sceneInterface, string gatekeeperURI, GridVector location, Vector3 position, Vector3 lookAt, TeleportFlags flags) { throw new NotImplementedException(); }
public override bool TeleportTo(SceneInterface sceneInterface, string regionName, Vector3 position, Vector3 lookAt, TeleportFlags flags) { throw new NotImplementedException(); }
public static bool IsGodlike(this TeleportFlags flags) => (flags & TeleportFlags.Godlike) != 0;
public void LoginTo(UserAccount account, ClientInfo clientInfo, SessionInfo sessionInfo, DestinationInfo destinationInfo, CircuitInfo circuitInfo, AppearanceInfo appearance, TeleportFlags flags, out string seedCapsURI) { if (!destinationInfo.LocalToGrid) { throw new NotSupportedException("Remote login not supported"); } string lastMessage = string.Empty; if (destinationInfo.ID != UUID.Zero) { /* try specified destination first */ destinationInfo.TeleportFlags = flags | TeleportFlags.ViaLogin; try { QueryAccess(destinationInfo, account, destinationInfo.Position); PostAgent_Local(account, clientInfo, sessionInfo, destinationInfo, circuitInfo, appearance, UUID.Random, (int)WearableType.NumWearables, out seedCapsURI); return; } catch (Exception e) { m_Log.Debug(string.Format("Failed to login {0} {1} to original destination {2} ({3})", account.Principal.FirstName, account.Principal.LastName, destinationInfo.Name, destinationInfo.ID), e); lastMessage = e.Message; } } foreach (RegionInfo fallbackRegion in m_GridService.GetFallbackRegions()) { destinationInfo.UpdateFromRegion(fallbackRegion); destinationInfo.StartLocation = "safe"; destinationInfo.Position = new Vector3(128, 128, 23); destinationInfo.LookAt = Vector3.UnitX; destinationInfo.TeleportFlags = flags | TeleportFlags.ViaRegionID; try { QueryAccess(destinationInfo, account, destinationInfo.Position); PostAgent_Local(account, clientInfo, sessionInfo, destinationInfo, circuitInfo, appearance, UUID.Random, (int)WearableType.NumWearables, out seedCapsURI); return; } catch (Exception e) { m_Log.Debug(string.Format("Failed to login {0} {1} to fallback destination {2} ({3})", account.Principal.FirstName, account.Principal.LastName, destinationInfo.Name, destinationInfo.ID), e); if (string.IsNullOrEmpty(lastMessage)) { lastMessage = e.Message; } } } throw new LoginFailedException("No suitable destination found"); }
public static bool IsLure(this TeleportFlags flags) => (flags & TeleportFlags.ViaLure) != 0;
public static bool IsLogin(this TeleportFlags flags) => (flags & (TeleportFlags.ViaLogin | TeleportFlags.ViaHGLogin)) != 0;
/// <summary> /// Login procedure, as copied from superclass. /// </summary> /// <param name="firstName"></param> /// <param name="lastName"></param> /// <param name="passwd"></param> /// <param name="startLocation"></param> /// <param name="scopeID"></param> /// <param name="clientVersion"></param> /// <param name="clientIP">The very important TCP/IP EndPoint of the client</param> /// <returns></returns> /// <remarks>You need to change bits and pieces of this method</remarks> public new LoginResponse Login(string firstName, string lastName, string passwd, string startLocation, UUID scopeID, string clientVersion, string channel, string mac, string id0, IPEndPoint clientIP) { bool success = false; UUID session = UUID.Random(); try { // // Get the account and check that it exists // UserAccount account = m_UserAccountService.GetUserAccount(scopeID, firstName, lastName); if (account == null) { // Account doesn't exist. Is this a user from an external ID provider? // // <your code here> // // After verification, your code should create a UserAccount object, filled out properly. // Do not store that account object persistently; we don't want to be creating local accounts // for external users! Create and fill out a UserAccount object, because it has the information // that the rest of the code needs. m_log.InfoFormat("[DIVA LLOGIN SERVICE]: Login failed, reason: user not found"); return(LLFailedLoginResponse.UserProblem); } if (account.UserLevel < m_MinLoginLevel) { m_log.InfoFormat("[DIVA LLOGIN SERVICE]: Login failed, reason: login is blocked for user level {0}", account.UserLevel); return(LLFailedLoginResponse.LoginBlockedProblem); } // If a scope id is requested, check that the account is in // that scope, or unscoped. // if (scopeID != UUID.Zero) { if (account.ScopeID != scopeID && account.ScopeID != UUID.Zero) { m_log.InfoFormat("[DIVA LLOGIN SERVICE]: Login failed, reason: user not found"); return(LLFailedLoginResponse.UserProblem); } } else { scopeID = account.ScopeID; } // // Authenticate this user // // Local users and external users will need completely different authentication procedures. // The piece of code below is for local users who authenticate with a password. // if (!passwd.StartsWith("$1$")) { passwd = "$1$" + Util.Md5Hash(passwd); } passwd = passwd.Remove(0, 3); //remove $1$ string token = m_AuthenticationService.Authenticate(account.PrincipalID, passwd, 30); UUID secureSession = UUID.Zero; if ((token == string.Empty) || (token != string.Empty && !UUID.TryParse(token, out secureSession))) { m_log.InfoFormat("[DIVA LLOGIN SERVICE]: Login failed, reason: authentication failed"); return(LLFailedLoginResponse.UserProblem); } // // Get the user's inventory // // m_RequireInventory is set to false in .ini, therefore inventory is not required for login. // If you want to change this state of affairs and let external users have local inventory, // you need to think carefully about how to do that. // if (m_RequireInventory && m_InventoryService == null) { m_log.WarnFormat("[DIVA LLOGIN SERVICE]: Login failed, reason: inventory service not set up"); return(LLFailedLoginResponse.InventoryProblem); } List <InventoryFolderBase> inventorySkel = m_InventoryService.GetInventorySkeleton(account.PrincipalID); if (m_RequireInventory && ((inventorySkel == null) || (inventorySkel != null && inventorySkel.Count == 0))) { m_log.InfoFormat("[DIVA LLOGIN SERVICE]: Login failed, reason: unable to retrieve user inventory"); return(LLFailedLoginResponse.InventoryProblem); } if (inventorySkel == null) { inventorySkel = new List <InventoryFolderBase>(); } // Get active gestures List <InventoryItemBase> gestures = m_InventoryService.GetActiveGestures(account.PrincipalID); m_log.DebugFormat("[LLOGIN SERVICE]: {0} active gestures", gestures.Count); // // From here on, things should be exactly the same for all users // // // Login the presence // if (m_PresenceService != null) { success = m_PresenceService.LoginAgent(account.PrincipalID.ToString(), session, secureSession); if (!success) { m_log.InfoFormat("[DIVA LLOGIN SERVICE]: Login failed, reason: could not login presence"); return(LLFailedLoginResponse.GridProblem); } } // // Change Online status and get the home region // GridRegion home = null; GridUserInfo guinfo = m_GridUserService.LoggedIn(account.PrincipalID.ToString()); if (guinfo != null && (guinfo.HomeRegionID != UUID.Zero) && m_GridService != null) { home = m_GridService.GetRegionByUUID(scopeID, guinfo.HomeRegionID); } if (guinfo == null) { // something went wrong, make something up, so that we don't have to test this anywhere else guinfo = new GridUserInfo(); guinfo.LastPosition = guinfo.HomePosition = new Vector3(128, 128, 30); } // // Find the destination region/grid // string where = string.Empty; Vector3 position = Vector3.Zero; Vector3 lookAt = Vector3.Zero; GridRegion gatekeeper = null; TeleportFlags flags = TeleportFlags.Default; GridRegion destination = FindDestination(account, scopeID, guinfo, session, startLocation, home, out gatekeeper, out where, out position, out lookAt, out flags); if (destination == null) { m_PresenceService.LogoutAgent(session); m_log.InfoFormat("[DIVA LLOGIN SERVICE]: Login failed, reason: destination not found"); return(LLFailedLoginResponse.GridProblem); } // // Get the avatar // AvatarAppearance avatar = null; if (m_AvatarService != null) { avatar = m_AvatarService.GetAppearance(account.PrincipalID); } // // Instantiate/get the simulation interface and launch an agent at the destination // string reason = string.Empty; GridRegion dest = null; AgentCircuitData aCircuit = LaunchAgentAtGrid(gatekeeper, destination, account, avatar, session, secureSession, position, where, clientVersion, channel, mac, id0, clientIP, flags, out where, out reason, out dest); if (aCircuit == null) { m_PresenceService.LogoutAgent(session); m_log.InfoFormat("[DIVA LLOGIN SERVICE]: Login failed, reason: {0}", reason); return(new LLFailedLoginResponse("key", reason, "false")); } // Get Friends list FriendInfo[] friendsList = new FriendInfo[0]; if (m_FriendsService != null) { friendsList = m_FriendsService.GetFriends(account.PrincipalID); m_log.DebugFormat("[DIVA LLOGIN SERVICE]: Retrieved {0} friends", friendsList.Length); } // // Finally, fill out the response and return it // LLLoginResponse response = new LLLoginResponse(account, aCircuit, guinfo, destination, inventorySkel, friendsList, m_LibraryService, where, startLocation, position, lookAt, gestures, m_WelcomeMessage, home, clientIP, m_MapTileURL, m_SearchURL, m_Currency); m_log.DebugFormat("[DIVA LLOGIN SERVICE]: All clear. Sending login response to client."); return(response); } catch (Exception e) { m_log.WarnFormat("[DIVA LLOGIN SERVICE]: Exception processing login for {0} {1}: {2} {3}", firstName, lastName, e.ToString(), e.StackTrace); if (m_PresenceService != null) { m_PresenceService.LogoutAgent(session); } return(LLFailedLoginResponse.InternalError); } }
private bool LaunchAgentDirectly(ISimulationService simConnector, GridRegion region, AgentCircuitData aCircuit, TeleportFlags flags, out string reason) { EntityTransferContext ctx = new EntityTransferContext(); if (!simConnector.QueryAccess( region, aCircuit.AgentID, null, true, aCircuit.startpos, new List<UUID>(), ctx, out reason)) return false; return simConnector.CreateAgent(null, region, aCircuit, (uint)flags, ctx, out reason); }
private bool OnAllowedIncomingTeleport(UUID userID, IScene scene, Vector3 Position, uint TeleportFlags, out Vector3 newPosition, out string reason) { newPosition = Position; UserAccount account = scene.UserAccountService.GetUserAccount(scene.RegionInfo.AllScopeIDs, userID); IScenePresence Sp = scene.GetScenePresence(userID); if (account == null) { reason = "Failed authentication."; return(false); //NO! } //Make sure that this user is inside the region as well if (Position.X < -2f || Position.Y < -2f || Position.X > scene.RegionInfo.RegionSizeX + 2 || Position.Y > scene.RegionInfo.RegionSizeY + 2) { MainConsole.Instance.DebugFormat( "[EstateService]: AllowedIncomingTeleport was given an illegal position of {0} for avatar {1}, {2}. Clamping", Position, Name, userID); bool changedX = false; bool changedY = false; while (Position.X < 0) { Position.X += scene.RegionInfo.RegionSizeX; changedX = true; } while (Position.X > scene.RegionInfo.RegionSizeX) { Position.X -= scene.RegionInfo.RegionSizeX; changedX = true; } while (Position.Y < 0) { Position.Y += scene.RegionInfo.RegionSizeY; changedY = true; } while (Position.Y > scene.RegionInfo.RegionSizeY) { Position.Y -= scene.RegionInfo.RegionSizeY; changedY = true; } if (changedX) { Position.X = scene.RegionInfo.RegionSizeX - Position.X; } if (changedY) { Position.Y = scene.RegionInfo.RegionSizeY - Position.Y; } } IAgentConnector AgentConnector = Framework.Utilities.DataManager.RequestPlugin <IAgentConnector>(); IAgentInfo agentInfo = null; if (AgentConnector != null) { agentInfo = AgentConnector.GetAgent(userID); } ILandObject ILO = null; IParcelManagementModule parcelManagement = scene.RequestModuleInterface <IParcelManagementModule>(); if (parcelManagement != null) { ILO = parcelManagement.GetLandObject(Position.X, Position.Y); } if (ILO == null) { if (Sp != null) { Sp.ClearSavedVelocity(); //If we are moving the agent, clear their velocity } //Can't find land, give them the first parcel in the region and find a good position for them ILO = parcelManagement.AllParcels()[0]; Position = parcelManagement.GetParcelCenterAtGround(ILO); } //parcel permissions if (ILO.IsBannedFromLand(userID)) //Note: restricted is dealt with in the next block { if (Sp != null) { Sp.ClearSavedVelocity(); //If we are moving the agent, clear their velocity } if (Sp == null) { reason = "Banned from this parcel."; return(false); } if (!FindUnBannedParcel(Position, Sp, userID, out ILO, out newPosition, out reason)) { //We found a place for them, but we don't need to check any further on positions here //return true; } } //Move them out of banned parcels ParcelFlags parcelflags = (ParcelFlags)ILO.LandData.Flags; if ((parcelflags & ParcelFlags.UseAccessGroup) == ParcelFlags.UseAccessGroup && (parcelflags & ParcelFlags.UseAccessList) == ParcelFlags.UseAccessList && (parcelflags & ParcelFlags.UsePassList) == ParcelFlags.UsePassList) { if (Sp != null) { Sp.ClearSavedVelocity(); //If we are moving the agent, clear their velocity } //One of these is in play then if ((parcelflags & ParcelFlags.UseAccessGroup) == ParcelFlags.UseAccessGroup) { if (Sp == null) { reason = "Banned from this parcel."; return(false); } if (Sp.ControllingClient.ActiveGroupId != ILO.LandData.GroupID) { if (!FindUnBannedParcel(Position, Sp, userID, out ILO, out newPosition, out reason)) { //We found a place for them, but we don't need to check any further on positions here //return true; } } } else if ((parcelflags & ParcelFlags.UseAccessList) == ParcelFlags.UseAccessList) { if (Sp == null) { reason = "Banned from this parcel."; return(false); } //All but the people on the access list are banned if (ILO.IsRestrictedFromLand(userID)) { if (!FindUnBannedParcel(Position, Sp, userID, out ILO, out newPosition, out reason)) { //We found a place for them, but we don't need to check any further on positions here //return true; } } } else if ((parcelflags & ParcelFlags.UsePassList) == ParcelFlags.UsePassList) { if (Sp == null) { reason = "Banned from this parcel."; return(false); } //All but the people on the pass/access list are banned if (ILO.IsRestrictedFromLand(Sp.UUID)) { if (!FindUnBannedParcel(Position, Sp, userID, out ILO, out newPosition, out reason)) { //We found a place for them, but we don't need to check any further on positions here //return true; } } } } EstateSettings ES = scene.RegionInfo.EstateSettings; TeleportFlags tpflags = (TeleportFlags)TeleportFlags; const TeleportFlags allowableFlags = OpenMetaverse.TeleportFlags.ViaLandmark | OpenMetaverse.TeleportFlags.ViaHome | OpenMetaverse.TeleportFlags.ViaLure | OpenMetaverse.TeleportFlags.ForceRedirect | OpenMetaverse.TeleportFlags.Godlike | OpenMetaverse.TeleportFlags.NineOneOne; //If the user wants to force landing points on crossing, we act like they are not crossing, otherwise, check the child property and that the ViaRegionID is set bool isCrossing = !ForceLandingPointsOnCrossing && (Sp != null && Sp.IsChildAgent && ((tpflags & OpenMetaverse.TeleportFlags.ViaRegionID) == OpenMetaverse.TeleportFlags.ViaRegionID)); //Move them to the nearest landing point if (!((tpflags & allowableFlags) != 0) && !isCrossing && !ES.AllowDirectTeleport) { if (Sp != null) { Sp.ClearSavedVelocity(); //If we are moving the agent, clear their velocity } if (!scene.Permissions.IsGod(userID)) { Telehub telehub = RegionConnector.FindTelehub(scene.RegionInfo.RegionID, scene.RegionInfo.RegionHandle); if (telehub != null) { if (telehub.SpawnPos.Count == 0) { Position = new Vector3(telehub.TelehubLocX, telehub.TelehubLocY, telehub.TelehubLocZ); } else { int LastTelehubNum = 0; if (!LastTelehub.TryGetValue(scene.RegionInfo.RegionID, out LastTelehubNum)) { LastTelehubNum = 0; } Position = telehub.SpawnPos[LastTelehubNum] + new Vector3(telehub.TelehubLocX, telehub.TelehubLocY, telehub.TelehubLocZ); LastTelehubNum++; if (LastTelehubNum == telehub.SpawnPos.Count) { LastTelehubNum = 0; } LastTelehub[scene.RegionInfo.RegionID] = LastTelehubNum; } } } } else if (!((tpflags & allowableFlags) != 0) && !isCrossing && !scene.Permissions.GenericParcelPermission(userID, ILO, (ulong)GroupPowers.None)) //Telehubs override parcels { if (Sp != null) { Sp.ClearSavedVelocity(); //If we are moving the agent, clear their velocity } if (ILO.LandData.LandingType == (int)LandingType.None) //Blocked, force this person off this land { //Find a new parcel for them List <ILandObject> Parcels = parcelManagement.ParcelsNearPoint(Position); if (Parcels.Count > 1) { newPosition = parcelManagement.GetNearestRegionEdgePosition(Sp); } else { bool found = false; //We need to check here as well for bans, can't toss someone into a parcel they are banned from foreach (ILandObject Parcel in Parcels.Where(Parcel => !Parcel.IsBannedFromLand(userID))) { //Now we have to check their userloc if (ILO.LandData.LandingType == (int)LandingType.None) { continue; //Blocked, check next one } else if (ILO.LandData.LandingType == (int)LandingType.LandingPoint) { //Use their landing spot newPosition = Parcel.LandData.UserLocation; } else //They allow for anywhere, so dump them in the center at the ground { newPosition = parcelManagement.GetParcelCenterAtGround(Parcel); } found = true; } if (!found) //Dump them at the edge { if (Sp != null) { newPosition = parcelManagement.GetNearestRegionEdgePosition(Sp); } else { reason = "Banned from this parcel."; return(false); } } } } else if (ILO.LandData.LandingType == (int)LandingType.LandingPoint) //Move to tp spot { newPosition = ILO.LandData.UserLocation != Vector3.Zero ? ILO.LandData.UserLocation : parcelManagement.GetNearestRegionEdgePosition(Sp); } } //We assume that our own region isn't null.... if (agentInfo != null) { //Can only enter prelude regions once! if (scene.RegionInfo.RegionFlags != -1 && ((scene.RegionInfo.RegionFlags & (int)RegionFlags.Prelude) == (int)RegionFlags.Prelude) && agentInfo != null) { if (agentInfo.OtherAgentInformation.ContainsKey("Prelude" + scene.RegionInfo.RegionID)) { reason = "You may not enter this region as you have already been to this prelude region."; return(false); } else { agentInfo.OtherAgentInformation.Add("Prelude" + scene.RegionInfo.RegionID, OSD.FromInteger((int)IAgentFlags.PastPrelude)); AgentConnector.UpdateAgent(agentInfo); } } if (agentInfo.OtherAgentInformation.ContainsKey("LimitedToEstate")) { int LimitedToEstate = agentInfo.OtherAgentInformation["LimitedToEstate"]; if (scene.RegionInfo.EstateSettings.EstateID != LimitedToEstate) { reason = "You may not enter this reason, as it is outside of the estate you are limited to."; return(false); } } } if ((ILO.LandData.Flags & (int)ParcelFlags.DenyAnonymous) != 0) { if (account != null && (account.UserFlags & (int)IUserProfileInfo.ProfileFlags.NoPaymentInfoOnFile) == (int)IUserProfileInfo.ProfileFlags.NoPaymentInfoOnFile) { reason = "You may not enter this region."; return(false); } } if ((ILO.LandData.Flags & (uint)ParcelFlags.DenyAgeUnverified) != 0 && agentInfo != null) { if ((agentInfo.Flags & IAgentFlags.Minor) == IAgentFlags.Minor) { reason = "You may not enter this region."; return(false); } } //Check that we are not underground as well ITerrainChannel chan = scene.RequestModuleInterface <ITerrainChannel>(); if (chan != null) { float posZLimit = chan[(int)newPosition.X, (int)newPosition.Y] + (float)1.25; if (posZLimit >= (newPosition.Z) && !(Single.IsInfinity(posZLimit) || Single.IsNaN(posZLimit))) { newPosition.Z = posZLimit; } } //newPosition = Position; reason = ""; return(true); }
protected AgentCircuitData LaunchAgentAtGrid(GridRegion destination, TeleportFlags tpFlags, UserAccount account, AvatarAppearance appearance, UUID session, UUID secureSession, Vector3 position, string currentWhere, IPEndPoint clientIP, out string where, out string reason, out GridRegion dest) { where = currentWhere; reason = string.Empty; uint circuitCode = 0; AgentCircuitData aCircuit = null; dest = destination; bool success = false; #region Launch Agent circuitCode = (uint)Util.RandomClass.Next(); ; aCircuit = MakeAgent(destination, account, appearance, session, secureSession, circuitCode, position, clientIP); aCircuit.teleportFlags = (uint)tpFlags; success = LaunchAgentDirectly(destination, ref aCircuit, out reason); if (!success && m_GridService != null) { //Remove the landmark flag (landmark is used for ignoring the landing points in the region) aCircuit.teleportFlags &= ~(uint)TeleportFlags.ViaLandmark; m_GridService.SetRegionUnsafe(destination.RegionID); // Make sure the client knows this isn't where they wanted to land where = "safe"; // Try the default regions List<GridRegion> defaultRegions = m_GridService.GetDefaultRegions(account.ScopeID); if (defaultRegions != null) { success = TryFindGridRegionForAgentLogin(defaultRegions, account, appearance, session, secureSession, circuitCode, position, clientIP, aCircuit, out dest); } if (!success) { // Try the fallback regions List<GridRegion> fallbacks = m_GridService.GetFallbackRegions(account.ScopeID, destination.RegionLocX, destination.RegionLocY); if (fallbacks != null) { success = TryFindGridRegionForAgentLogin(fallbacks, account, appearance, session, secureSession, circuitCode, position, clientIP, aCircuit, out dest); } if (!success) { //Try to find any safe region List<GridRegion> safeRegions = m_GridService.GetSafeRegions(account.ScopeID, destination.RegionLocX, destination.RegionLocY); if (safeRegions != null) { success = TryFindGridRegionForAgentLogin(safeRegions, account, appearance, session, secureSession, circuitCode, position, clientIP, aCircuit, out dest); if (!success) reason = "No Region Found"; } } } } #endregion if (success) { //Set the region to safe since we got there m_GridService.SetRegionSafe (destination.RegionID); return aCircuit; } else return null; }
public TeleportStatusEventArgs(string message, TeleportStatus status, TeleportFlags flags) { this.message = message; this.status = status; this.flags = flags; }
public virtual bool TeleportTo(SceneInterface sceneInterface, UUID regionID, Vector3 position, Vector3 lookAt, TeleportFlags flags) => TeleportTo(sceneInterface, sceneInterface.GatekeeperURI, regionID, position, lookAt, flags);
private bool LaunchAgentDirectly(ISimulationService simConnector, GridRegion region, AgentCircuitData aCircuit, TeleportFlags flags, out string reason) { string version; if ( !simConnector.QueryAccess( region, aCircuit.AgentID, null, true, aCircuit.startpos, "SIMULATION/0.3", out version, out reason)) { return(false); } return(simConnector.CreateAgent(null, region, aCircuit, (uint)flags, out reason)); }
private bool TeleportToLocal(SceneInterface sceneInterface, Vector3 position, Vector3 lookAt, TeleportFlags flags) { #if DEBUG m_Log.DebugFormat("Local Teleport Service for {0}", NamedOwner.FullName); #endif ParcelInfo oldParcel; ParcelInfo newParcel; sceneInterface.Parcels.TryGetValue(GlobalPosition, out oldParcel); sceneInterface.Parcels.TryGetValue(position, out newParcel); if (SittingOnObject != null) { UnSit(); } bool sameParcelOverride = oldParcel != null && newParcel != null && oldParcel.ID == newParcel.ID; sceneInterface.DetermineInitialAgentLocation(this, flags, position, lookAt, sameParcelOverride); SendMessageAlways(new TeleportStart(), sceneInterface.ID); SendMessageAlways(new TeleportLocal { AgentID = ID, Position = GlobalPosition, LookAt = LookAt, TeleportFlags = flags, LocationID = 2 }, sceneInterface.ID); return(true); }
public override bool TeleportTo(SceneInterface sceneInterface, GridVector location, Vector3 position, Vector3 lookAt, TeleportFlags flags) { if (sceneInterface.GridPosition == location) { return(TeleportToLocal(sceneInterface, position, lookAt, flags)); } foreach (var service in m_TeleportServices) { #if DEBUG m_Log.DebugFormat("Checking Teleport Service {0} for {1}", service.GetType().ToString(), NamedOwner.FullName); #endif if (service.TeleportTo(sceneInterface, location, position, lookAt, flags)) { return(true); } } return(false); }
public abstract bool TeleportTo(SceneInterface sceneInterface, string gatekeeperURI, GridVector location, Vector3 position, Vector3 lookAt, TeleportFlags flags);
public override bool TeleportTo(SceneInterface sceneInterface, string gatekeeperURI, UUID regionID, Vector3 position, Vector3 lookAt, TeleportFlags flags) { if (sceneInterface.ID == regionID && sceneInterface.GatekeeperURI == gatekeeperURI) { return(TeleportToLocal(sceneInterface, position, lookAt, flags)); } foreach (var service in m_TeleportServices) { #if DEBUG m_Log.DebugFormat("Checking Teleport Service {0} for {1}", service.GetType().ToString(), NamedOwner.FullName); #endif if (service.TeleportTo(sceneInterface, gatekeeperURI, regionID, position, lookAt, flags)) { return(true); } } return(false); }
protected AgentCircuitData LaunchAgentAtGrid(GridRegion destination, TeleportFlags tpFlags, UserAccount account, UUID session, UUID secureSession, Vector3 position, string currentWhere, IPEndPoint clientIP, List<UUID> friendsToInform, out string where, out string reason, out string seedCap, out GridRegion dest) { where = currentWhere; reason = string.Empty; uint circuitCode = 0; AgentCircuitData aCircuit = null; dest = destination; #region Launch Agent circuitCode = (uint) Util.RandomClass.Next(); aCircuit = MakeAgent(destination, account, session, secureSession, circuitCode, position, clientIP); aCircuit.TeleportFlags = (uint) tpFlags; MainConsole.Instance.DebugFormat("[LoginService]: Attempting to log {0} into {1} at {2}...", account.Name, destination.RegionName, destination.ServerURI); LoginAgentArgs args = m_registry.RequestModuleInterface<IAgentProcessing>(). LoginAgent(destination, aCircuit, friendsToInform); aCircuit.CachedUserInfo = args.CircuitData.CachedUserInfo; aCircuit.RegionUDPPort = args.CircuitData.RegionUDPPort; reason = args.Reason; reason = ""; seedCap = args.SeedCap; bool success = args.Success; if (!success && m_GridService != null) { MainConsole.Instance.DebugFormat("[LoginService]: Failed to log {0} into {1} at {2}...", account.Name, destination.RegionName, destination.ServerURI); //Remove the landmark flag (landmark is used for ignoring the landing points in the region) aCircuit.TeleportFlags &= ~(uint) TeleportFlags.ViaLandmark; m_GridService.SetRegionUnsafe(destination.RegionID); // Make sure the client knows this isn't where they wanted to land where = "safe"; // Try the default regions List<GridRegion> defaultRegions = m_GridService.GetDefaultRegions(account.AllScopeIDs); if (defaultRegions != null) { success = TryFindGridRegionForAgentLogin(defaultRegions, account, session, secureSession, circuitCode, position, clientIP, aCircuit, friendsToInform, out seedCap, out reason, out dest); } if (!success) { // Try the fallback regions List<GridRegion> fallbacks = m_GridService.GetFallbackRegions(account.AllScopeIDs, destination.RegionLocX, destination.RegionLocY); if (fallbacks != null) { success = TryFindGridRegionForAgentLogin(fallbacks, account, session, secureSession, circuitCode, position, clientIP, aCircuit, friendsToInform, out seedCap, out reason, out dest); } if (!success) { //Try to find any safe region List<GridRegion> safeRegions = m_GridService.GetSafeRegions(account.AllScopeIDs, destination.RegionLocX, destination.RegionLocY); if (safeRegions != null) { success = TryFindGridRegionForAgentLogin(safeRegions, account, session, secureSession, circuitCode, position, clientIP, aCircuit, friendsToInform, out seedCap, out reason, out dest); if (!success) reason = "No Region Found"; } } } } #endregion if (success) { MainConsole.Instance.DebugFormat("[LoginService]: Successfully logged {0} into {1} at {2}...", account.Name, destination.RegionName, destination.ServerURI); //Set the region to safe since we got there m_GridService.SetRegionSafe(destination.RegionID); return aCircuit; } return null; }
/// <summary> /// This turns a root agent into a child agent /// when an agent departs this region for a neighbor, this gets called. /// /// It doesn't get called for a teleport. Reason being, an agent that /// teleports out may not end up anywhere near this region /// </summary> public void MakeChildAgent() { // Reset these so that teleporting in and walking out isn't seen // as teleporting back m_teleportFlags = TeleportFlags.Default; // It looks like m_animator is set to null somewhere, and MakeChild // is called after that. Probably in aborted teleports. if (m_animator == null) m_animator = new ScenePresenceAnimator(this); else Animator.ResetAnimations(); // m_log.DebugFormat( // "[SCENEPRESENCE]: Downgrading root agent {0}, {1} to a child agent in {2}", // Name, UUID, m_scene.RegionInfo.RegionName); // Don't zero out the velocity since this can cause problems when an avatar is making a region crossing, // depending on the exact timing. This shouldn't matter anyway since child agent positions are not updated. //Velocity = new Vector3(0, 0, 0); m_isChildAgent = true; m_scene.SwapRootAgentCount(true); RemoveFromPhysicalScene(); // FIXME: Set m_rootRegionHandle to the region handle of the scene this agent is moving into m_scene.EventManager.TriggerOnMakeChildAgent(this); }
private bool LaunchAgentDirectly(ISimulationService simConnector, GridRegion region, AgentCircuitData aCircuit, TeleportFlags flags, out string reason) { return(simConnector.CreateAgent(null, region, aCircuit, (uint)flags, out reason)); }
public void DetermineInitialAgentLocation(IAgent agent, TeleportFlags teleportFlags, Vector3 destinationLocation, Vector3 destinationLookAt, bool sameParcelOverride = false) { UGUI agentOwner = agent.Owner; if (destinationLocation.X < 0 || destinationLocation.X >= SizeX) { destinationLocation.X = SizeX / 2f; } if (destinationLocation.Y < 0 || destinationLocation.Y >= SizeY) { destinationLocation.Y = SizeY / 2f; } if (teleportFlags.IsLogin()) { #if DEBUG m_Log.DebugFormat("Setting initial location to a suitable default"); #endif destinationLocation = new Vector3(SizeX / 2f, SizeY / 2f, 0); } ParcelInfo p = Parcels[destinationLocation]; EstateInfo estateInfo; if ((!p.Owner.EqualsGrid(agentOwner) && !IsEstateManager(agentOwner) && !Owner.EqualsGrid(agentOwner) && !IsPossibleGod(agentOwner) && !sameParcelOverride) || !EnableLandingOverride) { bool foundTelehub = false; estateInfo = CheckEstateRights(agent); #region Telehub logic if (RegionSettings.TelehubObject != UUID.Zero && (estateInfo.Flags & RegionSettings.AsFlags & RegionOptionFlags.AllowDirectTeleport) == 0) { IObject obj; if (Objects.TryGetValue(RegionSettings.TelehubObject, out obj)) { var relativeSpawns = SpawnPoints; var absoluteSpawns = new List <Vector3>(); switch (SpawnPointRouting) { case "random": { var rand = new Random(); while (relativeSpawns.Count > 0) { absoluteSpawns.Add(relativeSpawns[rand.Next(relativeSpawns.Count - 1).Clamp(0, relativeSpawns.Count - 1)] * obj.GlobalRotation + obj.GlobalPosition); } } break; case "emptiest": { var agentLocations = new List <Vector3>(); foreach (var retAgent in RootAgents) { agentLocations.Add(retAgent.GlobalPosition); } while (relativeSpawns.Count > 0) { int emptiestindex = -1; double emptiestdistindicator = 0; Vector3 emptiest = Vector3.Zero; for (int i = 0; i < relativeSpawns.Count; ++i) { double distindicator = 0; Vector3 absSpawnV = relativeSpawns[i] * obj.GlobalRotation + obj.GlobalPosition; foreach (Vector3 agLocation in agentLocations) { distindicator += (agLocation - absSpawnV).LengthSquared; } if (emptiestindex < 0 || distindicator < emptiestdistindicator) { emptiestdistindicator = distindicator; emptiest = absSpawnV; emptiestindex = i; } } relativeSpawns.RemoveAt(emptiestindex); absoluteSpawns.Add(emptiest); } } break; case "sequence": foreach (Vector3 v in relativeSpawns) { absoluteSpawns.Add(v * obj.GlobalRotation + obj.GlobalPosition); } break; case "closest": default: { while (relativeSpawns.Count > 0) { int closestindex = -1; double distance = 0; Vector3 closest = Vector3.Zero; for (int i = 0; i < relativeSpawns.Count; ++i) { Vector3 v = relativeSpawns[i] * obj.GlobalRotation + obj.GlobalPosition; double newDist = (v - destinationLocation).LengthSquared; if (closestindex < 0 || distance > newDist) { distance = newDist; closestindex = i; closest = v; } } relativeSpawns.RemoveAt(closestindex); absoluteSpawns.Add(closest); } } break; } foreach (var spawn in absoluteSpawns) { ParcelInfo spawnParcel; if (Parcels.TryGetValue(spawn, out spawnParcel) && (spawnParcel.PassPrice != 0 /* skip parcels with pass price here */ || CheckParcelAccessRights(agent, spawnParcel))) { /* found a viable spawn here */ p = spawnParcel; destinationLocation = spawn; foundTelehub = true; } } } } #endregion if (!CheckParcelAccessRights(agent, p) && !foundTelehub) { p = FindNonBlockedParcel(agent, destinationLocation); } /* do not block parcel owner, estate manager or estate owner when landing override is enabled */ if (!foundTelehub) { switch (p.LandingType) { case TeleportLandingType.Blocked: /* let's find another parcel */ p = FindNonBlockedParcel(agent, destinationLocation); break; case TeleportLandingType.LandingPoint: destinationLocation = p.LandingPosition; destinationLookAt = p.LandingLookAt; break; case TeleportLandingType.Anywhere: default: break; } } } if (!EstateService.ContainsKey(EstateService.RegionMap[ID])) { throw new ParcelAccessDeniedException(this.GetLanguageString(agent.CurrentCulture, "EstateDataNotAvailable", "Estate data not available.")); } if (destinationLocation.X < 0 || destinationLocation.X >= SizeX) { destinationLocation.X = SizeX / 2f; } if (destinationLocation.Y < 0 || destinationLocation.Y >= SizeY) { destinationLocation.Y = SizeY / 2f; } agent.Rotation = destinationLookAt.AgentLookAtToQuaternion(); double t0_0 = Terrain[(uint)Math.Floor(destinationLocation.X), (uint)Math.Floor(destinationLocation.Y)]; double t0_1 = Terrain[(uint)Math.Floor(destinationLocation.X), (uint)Math.Ceiling(destinationLocation.Y)]; double t1_0 = Terrain[(uint)Math.Ceiling(destinationLocation.X), (uint)Math.Floor(destinationLocation.Y)]; double t1_1 = Terrain[(uint)Math.Ceiling(destinationLocation.X), (uint)Math.Ceiling(destinationLocation.Y)]; double t_x = agent.Position.X - Math.Floor(destinationLocation.X); double t_y = agent.Position.Y - Math.Floor(destinationLocation.Y); double t0 = t0_0.Lerp(t0_1, t_y); double t1 = t1_0.Lerp(t1_1, t_y); destinationLocation.Z = t0.Lerp(t1, t_x) + 1; agent.Position = destinationLocation; }
protected AgentCircuitData LaunchAgentAtGrid(GridRegion gatekeeper, GridRegion destination, UserAccount account, AvatarAppearance avatar, UUID session, UUID secureSession, Vector3 position, string currentWhere, string viewer, string channel, string mac, string id0, IPEndPoint clientIP, TeleportFlags flags, out string where, out string reason, out GridRegion dest) { where = currentWhere; ISimulationService simConnector = null; reason = string.Empty; uint circuitCode = 0; AgentCircuitData aCircuit = null; if (m_UserAgentService == null) { // HG standalones have both a localSimulatonDll and a remoteSimulationDll // non-HG standalones have just a localSimulationDll // independent login servers have just a remoteSimulationDll if (m_LocalSimulationService != null) { simConnector = m_LocalSimulationService; } else if (m_RemoteSimulationService != null) { simConnector = m_RemoteSimulationService; } } else // User Agent Service is on { if (gatekeeper == null) // login to local grid { if (hostName == string.Empty) { SetHostAndPort(m_GatekeeperURL); } gatekeeper = new GridRegion(destination); gatekeeper.ExternalHostName = hostName; gatekeeper.HttpPort = (uint)port; gatekeeper.ServerURI = m_GatekeeperURL; } m_log.Debug("[LLLOGIN SERVICE]: no gatekeeper detected..... using " + m_GatekeeperURL); } bool success = false; if (m_UserAgentService == null && simConnector != null) { circuitCode = (uint)Util.RandomClass.Next();; aCircuit = MakeAgent(destination, account, avatar, session, secureSession, circuitCode, position, clientIP.Address.ToString(), viewer, channel, mac, id0); success = LaunchAgentDirectly(simConnector, destination, aCircuit, flags, out reason); if (!success && m_GridService != null) { // Try the fallback regions List <GridRegion> fallbacks = m_GridService.GetFallbackRegions(account.ScopeID, destination.RegionLocX, destination.RegionLocY); if (fallbacks != null) { foreach (GridRegion r in fallbacks) { success = LaunchAgentDirectly(simConnector, r, aCircuit, flags | TeleportFlags.ViaRegionID, out reason); if (success) { where = "safe"; destination = r; break; } } } } } if (m_UserAgentService != null) { circuitCode = (uint)Util.RandomClass.Next();; aCircuit = MakeAgent(destination, account, avatar, session, secureSession, circuitCode, position, clientIP.Address.ToString(), viewer, channel, mac, id0); aCircuit.teleportFlags |= (uint)flags; success = LaunchAgentIndirectly(gatekeeper, destination, aCircuit, clientIP, out reason); if (!success && m_GridService != null) { // Try the fallback regions List <GridRegion> fallbacks = m_GridService.GetFallbackRegions(account.ScopeID, destination.RegionLocX, destination.RegionLocY); if (fallbacks != null) { foreach (GridRegion r in fallbacks) { success = LaunchAgentIndirectly(gatekeeper, r, aCircuit, clientIP, out reason); if (success) { where = "safe"; destination = r; break; } } } } } dest = destination; if (success) { return(aCircuit); } else { return(null); } }
/// <summary> /// Introduce an agent into the scene by adding a new client. /// </summary> /// <returns>The scene presence added</returns> /// <param name='scene'></param> /// <param name='testClient'></param> /// <param name='agentData'></param> /// <param name='tf'></param> private static ScenePresence IntroduceClientToScene( Scene scene, IClientAPI client, AgentCircuitData agentData, TeleportFlags tf) { string reason; // Stage 1: tell the scene to expect a new user connection if (!scene.NewUserConnection(agentData, (uint)tf, null, out reason)) Console.WriteLine("NewUserConnection failed: " + reason); // Stage 2: add the new client as a child agent to the scene scene.AddNewAgent(client, PresenceType.User); return scene.GetScenePresence(client.AgentId); }
protected GridRegion FindDestination( UserAccount account, UUID scopeID, GridUserInfo pinfo, UUID sessionID, string startLocation, GridRegion home, out GridRegion gatekeeper, out string where, out Vector3 position, out Vector3 lookAt, out TeleportFlags flags) { flags = TeleportFlags.ViaLogin; m_log.DebugFormat( "[LLOGIN SERVICE]: Finding destination matching start location {0} for {1}", startLocation, account.Name); gatekeeper = null; where = "home"; position = new Vector3(128, 128, 0); lookAt = new Vector3(0, 1, 0); if (m_GridService == null) return null; if (startLocation.Equals("home")) { // logging into home region if (pinfo == null) return null; GridRegion region = null; bool tryDefaults = false; if (home == null) { tryDefaults = true; } else { region = home; position = pinfo.HomePosition; lookAt = pinfo.HomeLookAt; flags |= TeleportFlags.ViaHome; } if (tryDefaults) { List<GridRegion> defaults = m_GridService.GetDefaultRegions(scopeID); if (defaults != null && defaults.Count > 0) { region = defaults[0]; where = "safe"; } else { m_log.WarnFormat("[LLOGIN SERVICE]: User {0} {1} does not have a valid home and this grid does not have default locations. Attempting to find random region", account.FirstName, account.LastName); region = FindAlternativeRegion(scopeID); if (region != null) where = "safe"; } } return region; } else if (startLocation.Equals("last")) { // logging into last visited region where = "last"; if (pinfo == null) return null; GridRegion region = null; if (pinfo.LastRegionID.Equals(UUID.Zero) || (region = m_GridService.GetRegionByUUID(scopeID, pinfo.LastRegionID)) == null) { List<GridRegion> defaults = m_GridService.GetDefaultRegions(scopeID); if (defaults != null && defaults.Count > 0) { region = defaults[0]; where = "safe"; } else { m_log.Info("[LLOGIN SERVICE]: Last Region Not Found Attempting to find random region"); region = FindAlternativeRegion(scopeID); if (region != null) where = "safe"; } } else { position = pinfo.LastPosition; lookAt = pinfo.LastLookAt; } return region; } else { flags |= TeleportFlags.ViaRegionID; // free uri form // e.g. New Moon&135&46 New [email protected]:8002&153&34 where = "url"; GridRegion region = null; Regex reURI = new Regex(@"^uri:(?<region>[^&]+)&(?<x>\d+)&(?<y>\d+)&(?<z>\d+)$"); Match uriMatch = reURI.Match(startLocation); if (uriMatch == null) { m_log.InfoFormat("[LLLOGIN SERVICE]: Got Custom Login URI {0}, but can't process it", startLocation); return null; } else { position = new Vector3(float.Parse(uriMatch.Groups["x"].Value, Culture.NumberFormatInfo), float.Parse(uriMatch.Groups["y"].Value, Culture.NumberFormatInfo), float.Parse(uriMatch.Groups["z"].Value, Culture.NumberFormatInfo)); string regionName = uriMatch.Groups["region"].ToString(); if (regionName != null) { if (!regionName.Contains("@")) { List<GridRegion> regions = m_GridService.GetRegionsByName(scopeID, regionName, 1); if ((regions == null) || (regions != null && regions.Count == 0)) { m_log.InfoFormat("[LLLOGIN SERVICE]: Got Custom Login URI {0}, can't locate region {1}. Trying defaults.", startLocation, regionName); regions = m_GridService.GetDefaultRegions(scopeID); if (regions != null && regions.Count > 0) { where = "safe"; return regions[0]; } else { m_log.Info("[LLOGIN SERVICE]: Last Region Not Found Attempting to find random region"); region = FindAlternativeRegion(scopeID); if (region != null) { where = "safe"; return region; } else { m_log.InfoFormat("[LLLOGIN SERVICE]: Got Custom Login URI {0}, Grid does not provide default regions and no alternative found.", startLocation); return null; } } } return regions[0]; } else { if (m_UserAgentService == null) { m_log.WarnFormat("[LLLOGIN SERVICE]: This llogin service is not running a user agent service, as such it can't lauch agents at foreign grids"); return null; } string[] parts = regionName.Split(new char[] { '@' }); if (parts.Length < 2) { m_log.InfoFormat("[LLLOGIN SERVICE]: Got Custom Login URI {0}, can't locate region {1}", startLocation, regionName); return null; } // Valid specification of a remote grid regionName = parts[0]; string domainLocator = parts[1]; parts = domainLocator.Split(new char[] {':'}); string domainName = parts[0]; uint port = 0; if (parts.Length > 1) UInt32.TryParse(parts[1], out port); region = FindForeignRegion(domainName, port, regionName, account, out gatekeeper); return region; } } else { List<GridRegion> defaults = m_GridService.GetDefaultRegions(scopeID); if (defaults != null && defaults.Count > 0) { where = "safe"; return defaults[0]; } else return null; } } //response.LookAt = "[r0,r1,r0]"; //// can be: last, home, safe, url //response.StartLocation = "url"; } }
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); }
private bool LaunchAgentDirectly(ISimulationService simConnector, GridRegion region, AgentCircuitData aCircuit, TeleportFlags flags, out string reason) { return simConnector.CreateAgent(null, region, aCircuit, (uint)flags, out reason); }
public static bool NeedsInitialPosition(this TeleportFlags flags) => (flags & (TeleportFlags.ViaLogin | TeleportFlags.ViaHGLogin | TeleportFlags.ViaLocation | TeleportFlags.ViaLandmark)) != 0;