diff options
Diffstat (limited to '')
-rw-r--r-- | OpenSim/Client/MXP/PacketHandler/MXPPacketServer.cs | 121 |
1 files changed, 28 insertions, 93 deletions
diff --git a/OpenSim/Client/MXP/PacketHandler/MXPPacketServer.cs b/OpenSim/Client/MXP/PacketHandler/MXPPacketServer.cs index daf1fb0..2098625 100644 --- a/OpenSim/Client/MXP/PacketHandler/MXPPacketServer.cs +++ b/OpenSim/Client/MXP/PacketHandler/MXPPacketServer.cs | |||
@@ -41,6 +41,7 @@ using OpenSim.Client.MXP.ClientStack; | |||
41 | using OpenSim.Framework; | 41 | using OpenSim.Framework; |
42 | using OpenSim.Region.Framework.Scenes; | 42 | using OpenSim.Region.Framework.Scenes; |
43 | using OpenSim.Framework.Communications; | 43 | using OpenSim.Framework.Communications; |
44 | using OpenSim.Services.Interfaces; | ||
44 | using System.Security.Cryptography; | 45 | using System.Security.Cryptography; |
45 | 46 | ||
46 | namespace OpenSim.Client.MXP.PacketHandler | 47 | namespace OpenSim.Client.MXP.PacketHandler |
@@ -295,13 +296,11 @@ namespace OpenSim.Client.MXP.PacketHandler | |||
295 | regionExists = false; | 296 | regionExists = false; |
296 | } | 297 | } |
297 | 298 | ||
298 | UserProfileData user = null; | ||
299 | UUID userId = UUID.Zero; | 299 | UUID userId = UUID.Zero; |
300 | string firstName = null; | 300 | UserAccount account = null; |
301 | string lastName = null; | ||
302 | bool authorized = regionExists ? AuthoriseUser(joinRequestMessage.ParticipantName, | 301 | bool authorized = regionExists ? AuthoriseUser(joinRequestMessage.ParticipantName, |
303 | joinRequestMessage.ParticipantPassphrase, | 302 | joinRequestMessage.ParticipantPassphrase, |
304 | new UUID(joinRequestMessage.BubbleId), out userId, out firstName, out lastName, out user) | 303 | new UUID(joinRequestMessage.BubbleId), out account) |
305 | : false; | 304 | : false; |
306 | 305 | ||
307 | if (authorized) | 306 | if (authorized) |
@@ -316,10 +315,11 @@ namespace OpenSim.Client.MXP.PacketHandler | |||
316 | session.RemoteEndPoint.Port + ")"); | 315 | session.RemoteEndPoint.Port + ")"); |
317 | 316 | ||
318 | m_log.Debug("[MXP ClientStack]: Attaching UserAgent to UserProfile..."); | 317 | m_log.Debug("[MXP ClientStack]: Attaching UserAgent to UserProfile..."); |
319 | AttachUserAgentToUserProfile(session, mxpSessionID, sceneId, user); | 318 | UUID secureSession = UUID.Zero; |
319 | AttachUserAgentToUserProfile(account, session, mxpSessionID, sceneId, out secureSession); | ||
320 | m_log.Debug("[MXP ClientStack]: Attached UserAgent to UserProfile."); | 320 | m_log.Debug("[MXP ClientStack]: Attached UserAgent to UserProfile."); |
321 | m_log.Debug("[MXP ClientStack]: Preparing Scene to Connection..."); | 321 | m_log.Debug("[MXP ClientStack]: Preparing Scene to Connection..."); |
322 | if (!PrepareSceneForConnection(mxpSessionID, sceneId, user, out reason)) | 322 | if (!PrepareSceneForConnection(mxpSessionID, secureSession, sceneId, account, out reason)) |
323 | { | 323 | { |
324 | m_log.DebugFormat("[MXP ClientStack]: Scene refused connection: {0}", reason); | 324 | m_log.DebugFormat("[MXP ClientStack]: Scene refused connection: {0}", reason); |
325 | DeclineConnection(session, joinRequestMessage); | 325 | DeclineConnection(session, joinRequestMessage); |
@@ -332,7 +332,7 @@ namespace OpenSim.Client.MXP.PacketHandler | |||
332 | m_log.Info("[MXP ClientStack]: Accepted connection."); | 332 | m_log.Info("[MXP ClientStack]: Accepted connection."); |
333 | 333 | ||
334 | m_log.Debug("[MXP ClientStack]: Creating ClientView...."); | 334 | m_log.Debug("[MXP ClientStack]: Creating ClientView...."); |
335 | MXPClientView client = new MXPClientView(session, mxpSessionID, userId, scene, firstName, lastName); | 335 | MXPClientView client = new MXPClientView(session, mxpSessionID, userId, scene, account.FirstName, account.LastName); |
336 | m_clients.Add(client); | 336 | m_clients.Add(client); |
337 | m_log.Debug("[MXP ClientStack]: Created ClientView."); | 337 | m_log.Debug("[MXP ClientStack]: Created ClientView."); |
338 | 338 | ||
@@ -489,12 +489,12 @@ namespace OpenSim.Client.MXP.PacketHandler | |||
489 | session.SetStateDisconnected(); | 489 | session.SetStateDisconnected(); |
490 | } | 490 | } |
491 | 491 | ||
492 | public bool AuthoriseUser(string participantName, string password, UUID sceneId, out UUID userId, out string firstName, out string lastName, out UserProfileData userProfile) | 492 | public bool AuthoriseUser(string participantName, string password, UUID sceneId, out UserAccount account) |
493 | { | 493 | { |
494 | userId = UUID.Zero; | 494 | UUID userId = UUID.Zero; |
495 | firstName = ""; | 495 | string firstName = ""; |
496 | lastName = ""; | 496 | string lastName = ""; |
497 | userProfile = null; | 497 | account = null; |
498 | 498 | ||
499 | string[] nameParts = participantName.Split(' '); | 499 | string[] nameParts = participantName.Split(' '); |
500 | if (nameParts.Length != 2) | 500 | if (nameParts.Length != 2) |
@@ -505,103 +505,38 @@ namespace OpenSim.Client.MXP.PacketHandler | |||
505 | firstName = nameParts[0]; | 505 | firstName = nameParts[0]; |
506 | lastName = nameParts[1]; | 506 | lastName = nameParts[1]; |
507 | 507 | ||
508 | userProfile = m_scenes[sceneId].CommsManager.UserService.GetUserProfile(firstName, lastName); | 508 | account = m_scenes[sceneId].UserAccountService.GetUserAccount(m_scenes[sceneId].RegionInfo.ScopeID, firstName, lastName); |
509 | if (account != null) | ||
510 | return (m_scenes[sceneId].AuthenticationService.Authenticate(account.PrincipalID, password, 1) != string.Empty); | ||
509 | 511 | ||
510 | if (userProfile == null && !m_accountsAuthenticate) | 512 | return false; |
511 | { | ||
512 | userId = ((UserManagerBase)m_scenes[sceneId].CommsManager.UserService).AddUser(firstName, lastName, "test", "", 1000, 1000); | ||
513 | } | ||
514 | else | ||
515 | { | ||
516 | if (userProfile == null) | ||
517 | { | ||
518 | m_log.Error("[MXP ClientStack]: Login failed as user was not found: " + participantName); | ||
519 | return false; | ||
520 | } | ||
521 | userId = userProfile.ID; | ||
522 | } | ||
523 | |||
524 | if (m_accountsAuthenticate) | ||
525 | { | ||
526 | if (!password.StartsWith("$1$")) | ||
527 | { | ||
528 | password = "$1$" + Util.Md5Hash(password); | ||
529 | } | ||
530 | password = password.Remove(0, 3); //remove $1$ | ||
531 | string s = Util.Md5Hash(password + ":" + userProfile.PasswordSalt); | ||
532 | return (userProfile.PasswordHash.Equals(s.ToString(), StringComparison.InvariantCultureIgnoreCase) | ||
533 | || userProfile.PasswordHash.Equals(password, StringComparison.InvariantCulture)); | ||
534 | } | ||
535 | else | ||
536 | { | ||
537 | return true; | ||
538 | } | ||
539 | } | 513 | } |
540 | 514 | ||
541 | private void AttachUserAgentToUserProfile(Session session, UUID sessionId, UUID sceneId, UserProfileData userProfile) | 515 | private void AttachUserAgentToUserProfile(UserAccount account, Session session, UUID sessionId, UUID sceneId, out UUID secureSessionId) |
542 | { | 516 | { |
543 | //Scene scene = m_scenes[sceneId]; | 517 | secureSessionId = UUID.Random(); |
544 | CommunicationsManager commsManager = m_scenes[sceneId].CommsManager; | 518 | Scene scene = m_scenes[sceneId]; |
545 | IUserService userService = (IUserService)commsManager.UserService; | 519 | scene.PresenceService.LoginAgent(account.PrincipalID.ToString(), sessionId, secureSessionId); |
546 | |||
547 | UserAgentData agent = new UserAgentData(); | ||
548 | |||
549 | // User connection | ||
550 | agent.AgentOnline = true; | ||
551 | agent.AgentIP = session.RemoteEndPoint.Address.ToString(); | ||
552 | agent.AgentPort = (uint)session.RemoteEndPoint.Port; | ||
553 | |||
554 | agent.SecureSessionID = UUID.Random(); | ||
555 | agent.SessionID = sessionId; | ||
556 | |||
557 | // Profile UUID | ||
558 | agent.ProfileID = userProfile.ID; | ||
559 | |||
560 | // Current location/position/alignment | ||
561 | if (userProfile.CurrentAgent != null) | ||
562 | { | ||
563 | agent.Region = userProfile.CurrentAgent.Region; | ||
564 | agent.Handle = userProfile.CurrentAgent.Handle; | ||
565 | agent.Position = userProfile.CurrentAgent.Position; | ||
566 | agent.LookAt = userProfile.CurrentAgent.LookAt; | ||
567 | } | ||
568 | else | ||
569 | { | ||
570 | agent.Region = userProfile.HomeRegionID; | ||
571 | agent.Handle = userProfile.HomeRegion; | ||
572 | agent.Position = userProfile.HomeLocation; | ||
573 | agent.LookAt = userProfile.HomeLookAt; | ||
574 | } | ||
575 | |||
576 | // What time did the user login? | ||
577 | agent.LoginTime = Util.UnixTimeSinceEpoch(); | ||
578 | agent.LogoutTime = 0; | ||
579 | |||
580 | userProfile.CurrentAgent = agent; | ||
581 | |||
582 | |||
583 | userService.UpdateUserProfile(userProfile); | ||
584 | //userService.CommitAgent(ref userProfile); | ||
585 | } | 520 | } |
586 | 521 | ||
587 | private bool PrepareSceneForConnection(UUID sessionId, UUID sceneId, UserProfileData userProfile, out string reason) | 522 | private bool PrepareSceneForConnection(UUID sessionId, UUID secureSessionId, UUID sceneId, UserAccount account, out string reason) |
588 | { | 523 | { |
589 | Scene scene = m_scenes[sceneId]; | 524 | Scene scene = m_scenes[sceneId]; |
590 | CommunicationsManager commsManager = m_scenes[sceneId].CommsManager; | ||
591 | UserManagerBase userService = (UserManagerBase)commsManager.UserService; | ||
592 | 525 | ||
593 | AgentCircuitData agent = new AgentCircuitData(); | 526 | AgentCircuitData agent = new AgentCircuitData(); |
594 | agent.AgentID = userProfile.ID; | 527 | agent.AgentID = account.PrincipalID; |
595 | agent.firstname = userProfile.FirstName; | 528 | agent.firstname = account.FirstName; |
596 | agent.lastname = userProfile.SurName; | 529 | agent.lastname = account.LastName; |
597 | agent.SessionID = sessionId; | 530 | agent.SessionID = sessionId; |
598 | agent.SecureSessionID = userProfile.CurrentAgent.SecureSessionID; | 531 | agent.SecureSessionID = secureSessionId; |
599 | agent.circuitcode = sessionId.CRC(); | 532 | agent.circuitcode = sessionId.CRC(); |
600 | agent.BaseFolder = UUID.Zero; | 533 | agent.BaseFolder = UUID.Zero; |
601 | agent.InventoryFolder = UUID.Zero; | 534 | agent.InventoryFolder = UUID.Zero; |
602 | agent.startpos = new Vector3(0, 0, 0); // TODO Fill in region start position | 535 | agent.startpos = new Vector3(0, 0, 0); // TODO Fill in region start position |
603 | agent.CapsPath = "http://localhost/"; | 536 | agent.CapsPath = "http://localhost/"; |
604 | agent.Appearance = userService.GetUserAppearance(userProfile.ID); | 537 | AvatarData avatar = scene.AvatarService.GetAvatar(account.PrincipalID); |
538 | if (avatar != null) | ||
539 | agent.Appearance = avatar.ToAvatarAppearance(account.PrincipalID); //userService.GetUserAppearance(userProfile.ID); | ||
605 | 540 | ||
606 | if (agent.Appearance == null) | 541 | if (agent.Appearance == null) |
607 | { | 542 | { |