diff --git a/OpenSim/Client/MXP/ClientStack/MXPClientView.cs b/OpenSim/Client/MXP/ClientStack/MXPClientView.cs index 3d734ad159..db606225e6 100644 --- a/OpenSim/Client/MXP/ClientStack/MXPClientView.cs +++ b/OpenSim/Client/MXP/ClientStack/MXPClientView.cs @@ -46,30 +46,38 @@ namespace OpenSim.Client.MXP.ClientStack { internal static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); - private readonly Session mxpSession; - private readonly UUID mxpSessionID; - private readonly IScene mxpHostBubble; - private readonly string mxpUsername; + private readonly Session m_session; + private readonly UUID m_sessionID; + private readonly UUID m_userID; + private readonly IScene m_hostBubble; + private readonly string m_firstName; + private readonly string m_lastName; - private int debugLevel; + private Vector3 m_startPosition=new Vector3(128f, 128f, 128f); + private int m_debugLevel; + - public MXPClientView(Session mxpSession, UUID mxpSessionID, IScene mxpHostBubble, string mxpUsername) + public MXPClientView(Session mxpSession, UUID mxpSessionID, UUID userID, IScene mxpHostBubble, string mxpFirstName, string mxpLastName) { - this.mxpSession = mxpSession; - this.mxpUsername = mxpUsername; - this.mxpHostBubble = mxpHostBubble; - this.mxpSessionID = mxpSessionID; + this.m_session = mxpSession; + this.m_userID = userID; + this.m_firstName = mxpFirstName; + this.m_lastName = mxpLastName; + this.m_hostBubble = mxpHostBubble; + this.m_sessionID = mxpSessionID; } public Session Session { - get { return mxpSession; } + get { return m_session; } } public bool ProcessMXPPacket(Message msg) { - if (debugLevel > 0) - m_log.Warn("[MXP] Got Action/Command Packet: " + msg); + if (m_debugLevel > 0) + { + m_log.Warn("[MXP] Received messaged unhandled: " + msg); + } return false; } @@ -78,23 +86,23 @@ namespace OpenSim.Client.MXP.ClientStack public Vector3 StartPos { - get { return new Vector3(128f, 128f, 128f); } - set { } // TODO: Implement Me + get { return m_startPosition; } + set { m_startPosition = value; } } public UUID AgentId { - get { return mxpSessionID; } + get { return m_userID; } } public UUID SessionId { - get { return mxpSessionID; } + get { return m_sessionID; } } public UUID SecureSessionId { - get { return mxpSessionID; } + get { return m_sessionID; } } public UUID ActiveGroupId @@ -124,17 +132,17 @@ namespace OpenSim.Client.MXP.ClientStack public string FirstName { - get { return mxpUsername; } + get { return m_firstName; } } public string LastName { - get { return "@mxp://" + Session.RemoteEndPoint.Address; } + get { return m_lastName; } } public IScene Scene { - get { return mxpHostBubble; } + get { return m_hostBubble; } } public int NextAnimationSequenceNumber @@ -165,7 +173,7 @@ namespace OpenSim.Client.MXP.ClientStack public uint CircuitCode { - get { return mxpSessionID.CRC(); } + get { return m_sessionID.CRC(); } } public event GenericMessage OnGenericMessage; @@ -348,7 +356,7 @@ namespace OpenSim.Client.MXP.ClientStack public void SetDebugPacketLevel(int newDebug) { - debugLevel = newDebug; + m_debugLevel = newDebug; } public void InPacket(object NewPack) @@ -560,14 +568,42 @@ namespace OpenSim.Client.MXP.ClientStack // Need to translate to MXP somehow } - public void SendAvatarData(ulong regionHandle, string firstName, string lastName, string grouptitle, UUID avatarID, uint avatarLocalID, Vector3 Pos, byte[] textureEntry, uint parentID, Quaternion rotation) + public void SendAvatarData(ulong regionHandle, string firstName, string lastName, string grouptitle, UUID avatarID, uint avatarLocalID, Vector3 pos, byte[] textureEntry, uint parentID, Quaternion rotation) { - // TODO: This needs handling - to display other avatars + m_log.Info("[MXP] Transmitting Avatar Data " + firstName + " " + lastName); + + PerceptionEventMessage pe = new PerceptionEventMessage(); + + pe.ObjectFragment.ObjectId = avatarID.Guid; + // TODO Resolve ParentID + pe.ObjectFragment.ParentObjectId = Guid.Empty; + pe.ObjectFragment.ObjectIndex = avatarLocalID; + pe.ObjectFragment.ObjectName = firstName+" "+lastName; + pe.ObjectFragment.OwnerId = Guid.Empty; + pe.ObjectFragment.TypeId = Guid.Empty; + pe.ObjectFragment.TypeName = "Avatar"; + pe.ObjectFragment.Acceleration = new float[3]; + pe.ObjectFragment.AngularAcceleration = new float[4]; + pe.ObjectFragment.AngularVelocity = new float[4]; + pe.ObjectFragment.BoundingSphereRadius = 1; // TODO Fill in appropriate value + + pe.ObjectFragment.Location = new float[] { pos.X, pos.Y, pos.Z }; + + pe.ObjectFragment.Mass = 1.0f; // TODO Fill in appropriate value + pe.ObjectFragment.Orientation = new float[] { rotation.X, rotation.Y, rotation.Z, rotation.W }; + pe.ObjectFragment.Velocity = new float[3]; + + Session.Send(pe); } public void SendAvatarTerseUpdate(ulong regionHandle, ushort timeDilation, uint localID, Vector3 position, Vector3 velocity, Quaternion rotation) { - // TODO: This probably needs handling - update other avatar positions + MovementEventMessage me = new MovementEventMessage(); + me.ObjectIndex = localID; + me.Location = new float[] { position.X, position.Y, position.Z }; + me.Orientation = new float[] { rotation.X, rotation.Y, rotation.Z, rotation.W }; + + Session.Send(me); } public void SendCoarseLocationUpdate(List CoarseLocations) @@ -610,20 +646,17 @@ namespace OpenSim.Client.MXP.ClientStack pe.ObjectFragment.AngularVelocity = new float[] { rvel.X, rvel.Y, rvel.Z, 0.0f }; pe.ObjectFragment.BoundingSphereRadius = primShape.Scale.Length(); - pe.ObjectFragment.Location = new float[] { pos.X - 120.0f, pos.Z, pos.Y - 128.0f }; + pe.ObjectFragment.Location = new float[] { pos.X , pos.Y, pos.Z }; pe.ObjectFragment.Mass = 1.0f; pe.ObjectFragment.Orientation = new float[] { rotation.X, rotation.Y, rotation.Z, rotation.W }; pe.ObjectFragment.Velocity = new float[] { vel.X, vel.Y, vel.Z }; + ObjectExtFragment ext = new ObjectExtFragment(); + if (!((primShape.PCode == (byte)PCode.NewTree) || (primShape.PCode == (byte)PCode.Tree) || (primShape.PCode == (byte)PCode.Grass))) { - ObjectExtFragment ext = new ObjectExtFragment(); - ext.UpdateFlags = flags; - ext.TextureEntry = primShape.TextureEntry; - ext.TextureAnim = textureanim; - ext.State = primShape.State; ext.PathBegin = primShape.PathBegin; ext.PathEnd = primShape.PathEnd; ext.PathScaleX = primShape.PathScaleX; @@ -633,7 +666,6 @@ namespace OpenSim.Client.MXP.ClientStack ext.PathSkew = primShape.PathSkew; ext.ProfileBegin = primShape.ProfileBegin; ext.ProfileEnd = primShape.ProfileEnd; - ext.Scale = EncodeVector(primShape.Scale); ext.PathCurve = primShape.PathCurve; ext.ProfileCurve = primShape.ProfileCurve; ext.ProfileHollow = primShape.ProfileHollow; @@ -643,18 +675,24 @@ namespace OpenSim.Client.MXP.ClientStack ext.PathTaperY = primShape.PathTaperY; ext.PathTwist = primShape.PathTwist; ext.PathTwistBegin = primShape.PathTwistBegin; - ext.ExtraParams = primShape.ExtraParams; - ext.Text = text; - ext.TextColor = EncodeColor(textColor); - ext.PSBlock = particleSystem; - ext.ClickAction = clickAction; - ext.Material = material; - - pe.SetExtension(ext); } + ext.UpdateFlags = flags; + ext.ExtraParams = primShape.ExtraParams; + ext.State = primShape.State; + ext.TextureEntry = primShape.TextureEntry; + ext.TextureAnim = textureanim; + ext.Scale = EncodeVector(primShape.Scale); + ext.Text = text; + ext.TextColor = EncodeColor(textColor); + ext.PSBlock = particleSystem; + ext.ClickAction = clickAction; + ext.Material = material; + + pe.SetExtension(ext); + Session.Send(pe); } diff --git a/OpenSim/Client/MXP/PacketHandler/MXPPacketServer.cs b/OpenSim/Client/MXP/PacketHandler/MXPPacketServer.cs index e540286a1d..1eceef6a85 100644 --- a/OpenSim/Client/MXP/PacketHandler/MXPPacketServer.cs +++ b/OpenSim/Client/MXP/PacketHandler/MXPPacketServer.cs @@ -216,8 +216,8 @@ namespace OpenSim.Client.MXP.PacketHandler m_log.Info("Pending Sessions: " + PendingSessionCount); m_log.Info("Sessions: " + SessionCount + " (Clients: " + Clients.Count + " )"); m_log.Info("Transmitter Alive?: " + IsTransmitterAlive); - m_log.Info("Packets Sent/Recieved: " + PacketsSent + " / " + PacketsReceived); - m_log.Info("Bytes Sent/Recieved: " + BytesSent + " / " + BytesReceived); + m_log.Info("Packets Sent/Received: " + PacketsSent + " / " + PacketsReceived); + m_log.Info("Bytes Sent/Received: " + BytesSent + " / " + BytesReceived); m_log.Info("Send/Recieve Rate (bps): " + SendRate + " / " + ReceiveRate); } @@ -247,12 +247,43 @@ namespace OpenSim.Client.MXP.PacketHandler sessionsToRemove.Clear(); } - public bool AuthoriseUser(string participantName, string pass, UUID scene) + public bool AuthoriseUser(string participantName, string password, UUID sceneId, out UUID userId, out string firstName, out string lastName) { - if (Scenes.ContainsKey(scene)) - return true; + userId = UUID.Zero; + firstName = ""; + lastName = ""; - return false; + if (!Scenes.ContainsKey(sceneId)) + { + m_log.Info("Login failed as region was not found: " + sceneId); + return false; + } + + string[] nameParts=participantName.Split(' '); + if(nameParts.Length!=2) + { + m_log.Info("Login failed as user name is not formed of first and last name separated by space: " + participantName); + return false; + } + firstName = nameParts[0]; + lastName = nameParts[1]; + + UserProfileData userProfile = Scenes[sceneId].CommsManager.UserService.GetUserProfile(firstName, lastName); + if (userProfile == null) + { + m_log.Info("Login failed as user was not found: " + participantName); + return false; + } + userId = userProfile.ID; + + if (!password.StartsWith("$1$")) + { + password = "$1$" + Util.Md5Hash(password); + } + password = password.Remove(0, 3); //remove $1$ + string s = Util.Md5Hash(password + ":" + userProfile.PasswordSalt); + return (userProfile.PasswordHash.Equals(s.ToString(), StringComparison.InvariantCultureIgnoreCase) + || userProfile.PasswordHash.Equals(password, StringComparison.InvariantCultureIgnoreCase)); } public void ProcessMessages() @@ -278,9 +309,13 @@ namespace OpenSim.Client.MXP.PacketHandler JoinRequestMessage joinRequestMessage = (JoinRequestMessage) message; + UUID userId; + string firstName; + string lastName; + bool authorized = AuthoriseUser(joinRequestMessage.ParticipantName, joinRequestMessage.ParticipantPassphrase, - new UUID(joinRequestMessage.BubbleId)); + new UUID(joinRequestMessage.BubbleId), out userId, out firstName, out lastName); if (authorized) { @@ -292,10 +327,10 @@ namespace OpenSim.Client.MXP.PacketHandler (session.IsIncoming ? "from" : "to") + " " + session.RemoteEndPoint.Address + ":" + session.RemoteEndPoint.Port + ")"); - AcceptConnection(session, joinRequestMessage, mxpSessionID); + AcceptConnection(session, joinRequestMessage, mxpSessionID,userId); - MXPClientView client = new MXPClientView(session, mxpSessionID, target, - joinRequestMessage.ParticipantName); + MXPClientView client = new MXPClientView(session, mxpSessionID,userId, target, + firstName, lastName); m_log.Info("[MXP ClientStack] Created Client"); Clients.Add(client); @@ -393,7 +428,7 @@ namespace OpenSim.Client.MXP.PacketHandler } } - private void AcceptConnection(Session session, JoinRequestMessage joinRequestMessage, UUID mxpSessionID) + private void AcceptConnection(Session session, JoinRequestMessage joinRequestMessage, UUID mxpSessionID, UUID userId) { JoinResponseMessage joinResponseMessage = (JoinResponseMessage)MessageFactory.Current.ReserveMessage( typeof(JoinResponseMessage)); @@ -401,7 +436,7 @@ namespace OpenSim.Client.MXP.PacketHandler joinResponseMessage.RequestMessageId = joinRequestMessage.MessageId; joinResponseMessage.FailureCode = 0; - joinResponseMessage.ParticipantId = mxpSessionID.Guid; + joinResponseMessage.ParticipantId = userId.Guid; joinResponseMessage.CloudUrl = cloudUrl; joinResponseMessage.BubbleName = Scenes[new UUID(joinRequestMessage.BubbleId)].RegionInfo.RegionName; diff --git a/prebuild.xml b/prebuild.xml index 85e429dbb5..70d4feadc2 100644 --- a/prebuild.xml +++ b/prebuild.xml @@ -1702,6 +1702,7 @@ +