示例#1
0
        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;
            }
        }