diff options
Diffstat (limited to 'OpenSim/Region/Framework/Scenes/Scene.cs')
-rw-r--r-- | OpenSim/Region/Framework/Scenes/Scene.cs | 95 |
1 files changed, 47 insertions, 48 deletions
diff --git a/OpenSim/Region/Framework/Scenes/Scene.cs b/OpenSim/Region/Framework/Scenes/Scene.cs index 98c46bd..32211c4 100644 --- a/OpenSim/Region/Framework/Scenes/Scene.cs +++ b/OpenSim/Region/Framework/Scenes/Scene.cs | |||
@@ -2584,18 +2584,25 @@ namespace OpenSim.Region.Framework.Scenes | |||
2584 | /// <param name="client"></param> | 2584 | /// <param name="client"></param> |
2585 | public override void AddNewClient(IClientAPI client) | 2585 | public override void AddNewClient(IClientAPI client) |
2586 | { | 2586 | { |
2587 | AgentCircuitData aCircuit = m_authenticateHandler.GetAgentCircuitData(client.CircuitCode); | ||
2587 | bool vialogin = false; | 2588 | bool vialogin = false; |
2588 | 2589 | ||
2589 | m_clientManager.Add(client); | 2590 | if (aCircuit == null) // no good, didn't pass NewUserConnection successfully |
2591 | return; | ||
2592 | |||
2593 | vialogin = (aCircuit.teleportFlags & (uint)Constants.TeleportFlags.ViaHGLogin) != 0 || | ||
2594 | (aCircuit.teleportFlags & (uint)Constants.TeleportFlags.ViaLogin) != 0; | ||
2590 | 2595 | ||
2591 | CheckHeartbeat(); | 2596 | CheckHeartbeat(); |
2592 | SubscribeToClientEvents(client); | ||
2593 | ScenePresence presence; | 2597 | ScenePresence presence; |
2594 | 2598 | ||
2595 | if (m_restorePresences.ContainsKey(client.AgentId)) | 2599 | if (m_restorePresences.ContainsKey(client.AgentId)) |
2596 | { | 2600 | { |
2597 | m_log.DebugFormat("[SCENE]: Restoring agent {0} {1} in {2}", client.Name, client.AgentId, RegionInfo.RegionName); | 2601 | m_log.DebugFormat("[SCENE]: Restoring agent {0} {1} in {2}", client.Name, client.AgentId, RegionInfo.RegionName); |
2598 | 2602 | ||
2603 | m_clientManager.Add(client); | ||
2604 | SubscribeToClientEvents(client); | ||
2605 | |||
2599 | presence = m_restorePresences[client.AgentId]; | 2606 | presence = m_restorePresences[client.AgentId]; |
2600 | m_restorePresences.Remove(client.AgentId); | 2607 | m_restorePresences.Remove(client.AgentId); |
2601 | 2608 | ||
@@ -2618,49 +2625,35 @@ namespace OpenSim.Region.Framework.Scenes | |||
2618 | } | 2625 | } |
2619 | else | 2626 | else |
2620 | { | 2627 | { |
2621 | AgentCircuitData aCircuit = m_authenticateHandler.GetAgentCircuitData(client.CircuitCode); | 2628 | if (GetScenePresence(client.AgentId) == null) // ensure there is no SP here |
2622 | |||
2623 | // Do the verification here | ||
2624 | System.Net.IPEndPoint ep = (System.Net.IPEndPoint)client.GetClientEP(); | ||
2625 | if (aCircuit != null) | ||
2626 | { | 2629 | { |
2627 | if (!VerifyClient(aCircuit, ep, out vialogin)) | 2630 | m_log.Debug("[SCENE]: Adding new agent " + client.Name + " to scene " + RegionInfo.RegionName); |
2628 | { | ||
2629 | // uh-oh, this is fishy | ||
2630 | m_log.WarnFormat("[SCENE]: Agent {0} with session {1} connecting with unidentified end point {2}. Refusing service.", | ||
2631 | client.AgentId, client.SessionId, ep.ToString()); | ||
2632 | try | ||
2633 | { | ||
2634 | client.Close(); | ||
2635 | } | ||
2636 | catch (Exception e) | ||
2637 | { | ||
2638 | m_log.DebugFormat("[SCENE]: Exception while closing aborted client: {0}", e.StackTrace); | ||
2639 | } | ||
2640 | return; | ||
2641 | } | ||
2642 | } | ||
2643 | 2631 | ||
2644 | m_log.Debug("[SCENE]: Adding new agent " + client.Name + " to scene " + RegionInfo.RegionName); | 2632 | m_clientManager.Add(client); |
2633 | SubscribeToClientEvents(client); | ||
2645 | 2634 | ||
2646 | ScenePresence sp = CreateAndAddScenePresence(client); | 2635 | ScenePresence sp = CreateAndAddScenePresence(client); |
2647 | if (aCircuit != null) | 2636 | if (aCircuit != null) |
2648 | sp.Appearance = aCircuit.Appearance; | 2637 | sp.Appearance = aCircuit.Appearance; |
2649 | 2638 | ||
2650 | // HERE!!! Do the initial attachments right here | 2639 | // HERE!!! Do the initial attachments right here |
2651 | // first agent upon login is a root agent by design. | 2640 | // first agent upon login is a root agent by design. |
2652 | // All other AddNewClient calls find aCircuit.child to be true | 2641 | // All other AddNewClient calls find aCircuit.child to be true |
2653 | if (aCircuit == null || (aCircuit != null && aCircuit.child == false)) | 2642 | if (aCircuit == null || (aCircuit != null && aCircuit.child == false)) |
2654 | { | 2643 | { |
2655 | sp.IsChildAgent = false; | 2644 | sp.IsChildAgent = false; |
2656 | Util.FireAndForget(delegate(object o) { sp.RezAttachments(); }); | 2645 | Util.FireAndForget(delegate(object o) { sp.RezAttachments(); }); |
2646 | } | ||
2657 | } | 2647 | } |
2658 | } | 2648 | } |
2659 | 2649 | ||
2660 | m_LastLogin = Util.EnvironmentTickCount(); | 2650 | if (GetScenePresence(client.AgentId) != null) |
2661 | EventManager.TriggerOnNewClient(client); | 2651 | { |
2662 | if (vialogin) | 2652 | m_LastLogin = Util.EnvironmentTickCount(); |
2663 | EventManager.TriggerOnClientLogin(client); | 2653 | EventManager.TriggerOnNewClient(client); |
2654 | if (vialogin) | ||
2655 | EventManager.TriggerOnClientLogin(client); | ||
2656 | } | ||
2664 | } | 2657 | } |
2665 | 2658 | ||
2666 | private bool VerifyClient(AgentCircuitData aCircuit, System.Net.IPEndPoint ep, out bool vialogin) | 2659 | private bool VerifyClient(AgentCircuitData aCircuit, System.Net.IPEndPoint ep, out bool vialogin) |
@@ -2668,16 +2661,14 @@ namespace OpenSim.Region.Framework.Scenes | |||
2668 | vialogin = false; | 2661 | vialogin = false; |
2669 | 2662 | ||
2670 | // Do the verification here | 2663 | // Do the verification here |
2671 | if ((aCircuit.teleportFlags & (uint)Constants.TeleportFlags.ViaLogin) != 0) | 2664 | if ((aCircuit.teleportFlags & (uint)Constants.TeleportFlags.ViaHGLogin) != 0) |
2672 | { | 2665 | { |
2673 | m_log.DebugFormat("[SCENE]: Incoming client {0} {1} in region {2} via Login", aCircuit.firstname, aCircuit.lastname, RegionInfo.RegionName); | 2666 | m_log.DebugFormat("[SCENE]: Incoming client {0} {1} in region {2} via HG login", aCircuit.firstname, aCircuit.lastname, RegionInfo.RegionName); |
2674 | vialogin = true; | 2667 | vialogin = true; |
2675 | IUserAgentVerificationModule userVerification = RequestModuleInterface<IUserAgentVerificationModule>(); | 2668 | IUserAgentVerificationModule userVerification = RequestModuleInterface<IUserAgentVerificationModule>(); |
2676 | if (userVerification != null && ep != null) | 2669 | if (userVerification != null && ep != null) |
2677 | { | 2670 | { |
2678 | System.Net.IPAddress addr = NetworkUtil.GetExternalIPOf(ep.Address); | 2671 | if (!userVerification.VerifyClient(aCircuit, ep.Address.ToString())) |
2679 | |||
2680 | if (!userVerification.VerifyClient(aCircuit, /*ep.Address.ToString() */ addr.ToString())) | ||
2681 | { | 2672 | { |
2682 | // uh-oh, this is fishy | 2673 | // uh-oh, this is fishy |
2683 | m_log.DebugFormat("[SCENE]: User Client Verification for {0} {1} in {2} returned false", aCircuit.firstname, aCircuit.lastname, RegionInfo.RegionName); | 2674 | m_log.DebugFormat("[SCENE]: User Client Verification for {0} {1} in {2} returned false", aCircuit.firstname, aCircuit.lastname, RegionInfo.RegionName); |
@@ -2688,6 +2679,13 @@ namespace OpenSim.Region.Framework.Scenes | |||
2688 | } | 2679 | } |
2689 | } | 2680 | } |
2690 | 2681 | ||
2682 | else if ((aCircuit.teleportFlags & (uint)Constants.TeleportFlags.ViaLogin) != 0) | ||
2683 | { | ||
2684 | m_log.DebugFormat("[SCENE]: Incoming client {0} {1} in region {2} via regular login. Client IP verification not performed.", | ||
2685 | aCircuit.firstname, aCircuit.lastname, RegionInfo.RegionName); | ||
2686 | vialogin = true; | ||
2687 | } | ||
2688 | |||
2691 | return true; | 2689 | return true; |
2692 | } | 2690 | } |
2693 | 2691 | ||
@@ -3343,7 +3341,8 @@ namespace OpenSim.Region.Framework.Scenes | |||
3343 | /// also return a reason.</returns> | 3341 | /// also return a reason.</returns> |
3344 | public bool NewUserConnection(AgentCircuitData agent, uint teleportFlags, out string reason) | 3342 | public bool NewUserConnection(AgentCircuitData agent, uint teleportFlags, out string reason) |
3345 | { | 3343 | { |
3346 | TeleportFlags tp = (TeleportFlags)teleportFlags; | 3344 | bool vialogin = ((teleportFlags & (uint)Constants.TeleportFlags.ViaLogin) != 0 || |
3345 | (teleportFlags & (uint)Constants.TeleportFlags.ViaHGLogin) != 0); | ||
3347 | reason = String.Empty; | 3346 | reason = String.Empty; |
3348 | 3347 | ||
3349 | //Teleport flags: | 3348 | //Teleport flags: |
@@ -3380,7 +3379,7 @@ namespace OpenSim.Region.Framework.Scenes | |||
3380 | ILandObject land = LandChannel.GetLandObject(agent.startpos.X, agent.startpos.Y); | 3379 | ILandObject land = LandChannel.GetLandObject(agent.startpos.X, agent.startpos.Y); |
3381 | 3380 | ||
3382 | //On login test land permisions | 3381 | //On login test land permisions |
3383 | if (tp == TeleportFlags.ViaLogin) | 3382 | if (vialogin) |
3384 | { | 3383 | { |
3385 | if (land != null && !TestLandRestrictions(agent, land, out reason)) | 3384 | if (land != null && !TestLandRestrictions(agent, land, out reason)) |
3386 | { | 3385 | { |
@@ -3440,7 +3439,7 @@ namespace OpenSim.Region.Framework.Scenes | |||
3440 | agent.teleportFlags = teleportFlags; | 3439 | agent.teleportFlags = teleportFlags; |
3441 | m_authenticateHandler.AddNewCircuit(agent.circuitcode, agent); | 3440 | m_authenticateHandler.AddNewCircuit(agent.circuitcode, agent); |
3442 | 3441 | ||
3443 | if (tp == TeleportFlags.ViaLogin) | 3442 | if (vialogin) |
3444 | { | 3443 | { |
3445 | if (TestBorderCross(agent.startpos, Cardinals.E)) | 3444 | if (TestBorderCross(agent.startpos, Cardinals.E)) |
3446 | { | 3445 | { |
@@ -3561,7 +3560,7 @@ namespace OpenSim.Region.Framework.Scenes | |||
3561 | IPresenceService presence = RequestModuleInterface<IPresenceService>(); | 3560 | IPresenceService presence = RequestModuleInterface<IPresenceService>(); |
3562 | if (presence == null) | 3561 | if (presence == null) |
3563 | { | 3562 | { |
3564 | reason = String.Format("Failed to verify user {0} {1} in region {2}. Presence service does not exist.", agent.firstname, agent.lastname, RegionInfo.RegionName); | 3563 | reason = String.Format("Failed to verify user presence in the grid for {0} {1} in region {2}. Presence service does not exist.", agent.firstname, agent.lastname, RegionInfo.RegionName); |
3565 | return false; | 3564 | return false; |
3566 | } | 3565 | } |
3567 | 3566 | ||
@@ -3569,7 +3568,7 @@ namespace OpenSim.Region.Framework.Scenes | |||
3569 | 3568 | ||
3570 | if (pinfo == null) | 3569 | if (pinfo == null) |
3571 | { | 3570 | { |
3572 | reason = String.Format("Failed to verify user {0} {1}, access denied to region {2}.", agent.firstname, agent.lastname, RegionInfo.RegionName); | 3571 | reason = String.Format("Failed to verify user presence in the grid for {0} {1}, access denied to region {2}.", agent.firstname, agent.lastname, RegionInfo.RegionName); |
3573 | return false; | 3572 | return false; |
3574 | } | 3573 | } |
3575 | 3574 | ||