public static bool TryPrepareLogin(OpenSim.Grid.UserServer.Modules.RexLogin.Avatar avatar, CableBeachMessages.RegionInfo startRegion, Vector3 startPosition, string clientVersion, System.Net.IPAddress clientIP, ref OpenSim.Grid.UserServer.Modules.RexLogin.LindenLoginData response, X509Certificate2 httpCertificate ) { EnableClientMessage message = new EnableClientMessage(); message.Identity = avatar.Identity; message.AgentID = avatar.ID; message.Attributes = avatar.Attributes; message.CallbackUri = null; message.ChildAgent = false; message.CircuitCode = CreateCircuitCode(); message.ClientVersion = clientVersion; message.IP = clientIP; message.RegionHandle = startRegion.Handle; message.SecureSessionID = response.SecureSessionID; message.Services = avatar.Services.ToMessageDictionary(); Dictionary<Uri, Uri> avStrgDict = new Dictionary<Uri, Uri>(); avStrgDict.Add( OpenSim.Grid.UserServer.Modules.RexLogin.RexAvatarAttributes.AVATAR_STORAGE_URL, avatar.Attributes[OpenSim.Grid.UserServer.Modules.RexLogin.RexAvatarAttributes.AVATAR_STORAGE_URL].AsUri()); message.Services.Add(OpenSim.Grid.UserServer.Modules.RexLogin.RexAvatarAttributes.AVATAR_STORAGE_URL, avStrgDict); message.SessionID = response.SessionID; Uri enableClientCap; if (startRegion.Capabilities.TryGetValue(new Uri(CableBeachServices.SIMULATOR_ENABLE_CLIENT), out enableClientCap)) { CapsClient request = (httpCertificate != null) ? new CapsClient(enableClientCap, httpCertificate) : new CapsClient(enableClientCap); OSDMap responseMap = request.GetResponse(message.Serialize(), OSDFormat.Json, REQUEST_TIMEOUT) as OSDMap; if (responseMap != null) { EnableClientReplyMessage reply = new EnableClientReplyMessage(); reply.Deserialize(responseMap); if (reply.SeedCapability != null) { m_log.Info("enable_client succeeded, sent circuit code " + message.CircuitCode + " and received seed capability " + reply.SeedCapability + " from " + enableClientCap); response.CircuitCode = message.CircuitCode; response.SeedCapability = reply.SeedCapability.ToString(); return true; } else { m_log.Error("[LindenLoginHelper] enable_client call to region " + startRegion.Name + " for login from " + avatar.Identity + " failed, did not return a seed capability"); } } else { m_log.Error("[LindenLoginHelper] enable_client call to region " + startRegion.Name + " for login from " + avatar.Identity + " failed, could not contact or invalid response"); } } else { m_log.Error("[LindenLoginHelper] enable_client call failed, region " + startRegion.Name + " does not have an enable_client capability"); } return false; }
public static bool TryGetStartingRegion(Avatar avatar, string startLocation, ref OpenSim.Grid.UserServer.Modules.RexLogin.LindenLoginData response, out CableBeachMessages.RegionInfo startRegion, out Vector3 startPosition) { startPosition = Vector3.Zero; startRegion = new CableBeachMessages.RegionInfo(); uint regionX, regionY; switch (startLocation) { case "home": case "safe": // Try and get the home location for this avatar regionX = avatar.GetAttribute(AvatarAttributes.HOME_REGION_X).AsUInteger(); regionY = avatar.GetAttribute(AvatarAttributes.HOME_REGION_Y).AsUInteger(); m_log.Debug("Trying to fetch home region at " + regionX + "," + regionY); startRegion = GetNearestRegion(avatar, regionX, regionY); if (startRegion.ID != UUID.Zero) { startPosition = startRegion.DefaultPosition; response.StartLocation = "home"; } break; case "last": // Try and get the last location for this avatar regionX = avatar.GetAttribute(AvatarAttributes.LAST_REGION_X).AsUInteger(); regionX = avatar.Attributes[AvatarAttributes.LAST_REGION_X].AsUInteger(); regionY = avatar.GetAttribute(AvatarAttributes.LAST_REGION_Y).AsUInteger(); m_log.Debug("Trying to fetch last region at " + regionX + "," + regionY); startRegion = GetNearestRegion(avatar, regionX, regionY); if (startRegion.ID != UUID.Zero) { startPosition = startRegion.DefaultPosition; response.StartLocation = "last"; } break; default: Regex reURI = new Regex(@"^uri:(?<region>[^&]+)&(?<x>\d+)&(?<y>\d+)&(?<z>\d+)$"); Match uriMatch = reURI.Match(startLocation); if (uriMatch != null && m_OpenSimMap.TryFetchRegion(uriMatch.Groups["region"].Value, out startRegion) == BackendResponse.Success) { Single.TryParse(uriMatch.Groups["x"].Value, out startPosition.X); Single.TryParse(uriMatch.Groups["y"].Value, out startPosition.Y); Single.TryParse(uriMatch.Groups["z"].Value, out startPosition.Z); } else { m_log.Warn("[LindenLoginHelper] Can't locate a simulator from custom login URI: " + startLocation); } break; } if (startRegion.ID != UUID.Zero) { response.LookAt = startRegion.DefaultLookAt; response.RegionX = startRegion.X; response.RegionY = startRegion.Y; response.SimAddress = startRegion.IP.ToString(); response.SimPort = (uint)startRegion.Port; return true; } else { m_log.Error("[LindenLoginHelper] Could not find an available region for login"); return false; } }