aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/OpenSim/Region
diff options
context:
space:
mode:
authorTeravus Ovares2008-05-31 12:18:29 +0000
committerTeravus Ovares2008-05-31 12:18:29 +0000
commitfebe78d06249cd4d36a86e97610dd45ab518a757 (patch)
tree7b9733fc14045f09e874440b923cfe443b781b6a /OpenSim/Region
parentMantis#1425. Thank you kindly, Melanie for a patch that: (diff)
downloadopensim-SC-febe78d06249cd4d36a86e97610dd45ab518a757.zip
opensim-SC-febe78d06249cd4d36a86e97610dd45ab518a757.tar.gz
opensim-SC-febe78d06249cd4d36a86e97610dd45ab518a757.tar.bz2
opensim-SC-febe78d06249cd4d36a86e97610dd45ab518a757.tar.xz
* Implements UserServer logoff in a few situations
* User tries to log-in but is already logged in. Userserver will send message to simulator user was in to log the user out there. * From the UserServer, admin types 'logoff-user firstname lastname message'. * Some regions may not get the message because they're not updated yet.
Diffstat (limited to 'OpenSim/Region')
-rw-r--r--OpenSim/Region/Communications/Local/LocalBackEndServices.cs10
-rw-r--r--OpenSim/Region/Communications/OGS1/OGS1GridServices.cs26
-rw-r--r--OpenSim/Region/Communications/OGS1/OGS1UserServices.cs30
-rw-r--r--OpenSim/Region/Environment/Scenes/Scene.cs34
-rw-r--r--OpenSim/Region/Environment/Scenes/SceneCommunicationService.cs13
-rw-r--r--OpenSim/Region/Environment/Scenes/ScenePresence.cs1
6 files changed, 112 insertions, 2 deletions
diff --git a/OpenSim/Region/Communications/Local/LocalBackEndServices.cs b/OpenSim/Region/Communications/Local/LocalBackEndServices.cs
index 0203821..989f08a 100644
--- a/OpenSim/Region/Communications/Local/LocalBackEndServices.cs
+++ b/OpenSim/Region/Communications/Local/LocalBackEndServices.cs
@@ -419,6 +419,16 @@ namespace OpenSim.Region.Communications.Local
419 } 419 }
420 } 420 }
421 421
422 public void TriggerLogOffUser(ulong regionHandle, LLUUID agentID, LLUUID RegionSecret, string message)
423 {
424 if (m_regionListeners.ContainsKey(regionHandle))
425 {
426 //m_log.Info("[INTER]: " + rdebugRegionName + ":Local BackEnd: FoundLocalRegion To send it to: " + agent.firstname + " " + agent.lastname);
427
428 m_regionListeners[regionHandle].TriggerLogOffUser(regionHandle, agentID, RegionSecret, message);
429 }
430 }
431
422 public void TriggerExpectPrim(ulong regionHandle, LLUUID primID, string objData, int XMLMethod) 432 public void TriggerExpectPrim(ulong regionHandle, LLUUID primID, string objData, int XMLMethod)
423 { 433 {
424 if (m_regionListeners.ContainsKey(regionHandle)) 434 if (m_regionListeners.ContainsKey(regionHandle))
diff --git a/OpenSim/Region/Communications/OGS1/OGS1GridServices.cs b/OpenSim/Region/Communications/OGS1/OGS1GridServices.cs
index 309a795..2e892c2 100644
--- a/OpenSim/Region/Communications/OGS1/OGS1GridServices.cs
+++ b/OpenSim/Region/Communications/OGS1/OGS1GridServices.cs
@@ -86,6 +86,7 @@ namespace OpenSim.Region.Communications.OGS1
86 httpServer = httpServe; 86 httpServer = httpServe;
87 //Respond to Grid Services requests 87 //Respond to Grid Services requests
88 httpServer.AddXmlRPCHandler("expect_user", ExpectUser); 88 httpServer.AddXmlRPCHandler("expect_user", ExpectUser);
89 httpServer.AddXmlRPCHandler("logoff_user", LogOffUser);
89 httpServer.AddXmlRPCHandler("check", PingCheckReply); 90 httpServer.AddXmlRPCHandler("check", PingCheckReply);
90 91
91 StartRemoting(); 92 StartRemoting();
@@ -603,6 +604,31 @@ namespace OpenSim.Region.Communications.OGS1
603 604
604 return new XmlRpcResponse(); 605 return new XmlRpcResponse();
605 } 606 }
607 // Grid Request Processing
608 /// <summary>
609 /// Ooops, our Agent must be dead if we're getting this request!
610 /// </summary>
611 /// <param name="request"></param>
612 /// <returns></returns>
613 public XmlRpcResponse LogOffUser(XmlRpcRequest request)
614 {
615 m_log.Debug("[CONNECTION DEBUGGING]: LogOff User Called ");
616 Hashtable requestData = (Hashtable)request.Params[0];
617 string message = (string)requestData["message"];
618 LLUUID agentID = LLUUID.Zero;
619 LLUUID RegionSecret = LLUUID.Zero;
620 Helpers.TryParse((string)requestData["agent_id"], out agentID);
621 Helpers.TryParse((string)requestData["region_secret"], out RegionSecret);
622
623 ulong regionHandle = Convert.ToUInt64((string)requestData["regionhandle"]);
624
625
626 m_localBackend.TriggerLogOffUser(regionHandle, agentID, RegionSecret,message);
627
628
629
630 return new XmlRpcResponse();
631 }
606 632
607 #region m_interRegion Comms 633 #region m_interRegion Comms
608 634
diff --git a/OpenSim/Region/Communications/OGS1/OGS1UserServices.cs b/OpenSim/Region/Communications/OGS1/OGS1UserServices.cs
index 8807eab..e0e17df 100644
--- a/OpenSim/Region/Communications/OGS1/OGS1UserServices.cs
+++ b/OpenSim/Region/Communications/OGS1/OGS1UserServices.cs
@@ -196,6 +196,36 @@ namespace OpenSim.Region.Communications.OGS1
196 return GetUserProfile(firstName + " " + lastName); 196 return GetUserProfile(firstName + " " + lastName);
197 } 197 }
198 198
199 public void UpdateUserCurrentRegion(LLUUID avatarid, LLUUID regionuuid, ulong regionhandle)
200 {
201 Hashtable param = new Hashtable();
202 param.Add("avatar_id", avatarid.ToString());
203 param.Add("region_uuid", regionuuid.ToString());
204 param.Add("region_handle", regionhandle.ToString());
205 IList parameters = new ArrayList();
206 parameters.Add(param);
207 XmlRpcRequest req = new XmlRpcRequest("update_user_current_region", parameters);
208 XmlRpcResponse resp = req.Send(m_parent.NetworkServersInfo.UserURL, 3000);
209 Hashtable respData = (Hashtable)resp.Value;
210 if (respData.ContainsKey("returnString"))
211 {
212 if ((string)respData["returnString"] == "TRUE")
213 {
214 m_log.Info("[OSG1 USER SERVICES]: Successfully updated user record");
215 }
216 else
217 {
218 m_log.Error("[OSG1 USER SERVICES]: Error updating user record");
219 }
220 }
221 else
222 {
223 m_log.Warn("[OSG1 USER SERVICES]: Error updating user record, Grid server may not be updated.");
224 }
225
226
227 }
228
199 public List<AvatarPickerAvatar> GenerateAgentPickerRequestResponse(LLUUID queryID, string query) 229 public List<AvatarPickerAvatar> GenerateAgentPickerRequestResponse(LLUUID queryID, string query)
200 { 230 {
201 List<AvatarPickerAvatar> pickerlist = new List<AvatarPickerAvatar>(); 231 List<AvatarPickerAvatar> pickerlist = new List<AvatarPickerAvatar>();
diff --git a/OpenSim/Region/Environment/Scenes/Scene.cs b/OpenSim/Region/Environment/Scenes/Scene.cs
index 6916c6d..c74dca4 100644
--- a/OpenSim/Region/Environment/Scenes/Scene.cs
+++ b/OpenSim/Region/Environment/Scenes/Scene.cs
@@ -2003,8 +2003,8 @@ namespace OpenSim.Region.Environment.Scenes
2003 m_sceneGridService.OnChildAgentUpdate += IncomingChildAgentDataUpdate; 2003 m_sceneGridService.OnChildAgentUpdate += IncomingChildAgentDataUpdate;
2004 m_sceneGridService.OnExpectPrim += IncomingInterRegionPrimGroup; 2004 m_sceneGridService.OnExpectPrim += IncomingInterRegionPrimGroup;
2005 m_sceneGridService.OnRemoveKnownRegionFromAvatar += HandleRemoveKnownRegionsFromAvatar; 2005 m_sceneGridService.OnRemoveKnownRegionFromAvatar += HandleRemoveKnownRegionsFromAvatar;
2006 2006 m_sceneGridService.OnLogOffUser += HandleLogOffUserFromGrid;
2007 m_sceneGridService.KillObject = SendKillObject; 2007 m_sceneGridService.KillObject += SendKillObject;
2008 } 2008 }
2009 2009
2010 /// <summary> 2010 /// <summary>
@@ -2012,6 +2012,8 @@ namespace OpenSim.Region.Environment.Scenes
2012 /// </summary> 2012 /// </summary>
2013 public void UnRegisterReginWithComms() 2013 public void UnRegisterReginWithComms()
2014 { 2014 {
2015 m_sceneGridService.KillObject -= SendKillObject;
2016 m_sceneGridService.OnLogOffUser -= HandleLogOffUserFromGrid;
2015 m_sceneGridService.OnRemoveKnownRegionFromAvatar -= HandleRemoveKnownRegionsFromAvatar; 2017 m_sceneGridService.OnRemoveKnownRegionFromAvatar -= HandleRemoveKnownRegionsFromAvatar;
2016 m_sceneGridService.OnExpectPrim -= IncomingInterRegionPrimGroup; 2018 m_sceneGridService.OnExpectPrim -= IncomingInterRegionPrimGroup;
2017 m_sceneGridService.OnChildAgentUpdate -= IncomingChildAgentDataUpdate; 2019 m_sceneGridService.OnChildAgentUpdate -= IncomingChildAgentDataUpdate;
@@ -2064,6 +2066,34 @@ namespace OpenSim.Region.Environment.Scenes
2064 } 2066 }
2065 } 2067 }
2066 2068
2069 protected void HandleLogOffUserFromGrid(ulong regionHandle, LLUUID AvatarID, LLUUID RegionSecret, string message)
2070 {
2071 if (RegionInfo.RegionHandle == regionHandle)
2072 {
2073 ScenePresence loggingOffUser = null;
2074 loggingOffUser = GetScenePresence(AvatarID);
2075 if (loggingOffUser != null)
2076 {
2077 if (RegionSecret == loggingOffUser.ControllingClient.SecureSessionId)
2078 {
2079 loggingOffUser.ControllingClient.Kick(message);
2080 // Give them a second to receive the message!
2081 System.Threading.Thread.Sleep(1000);
2082 loggingOffUser.ControllingClient.Close(true);
2083 }
2084 else
2085 {
2086 m_log.Info("[USERLOGOFF]: System sending the LogOff user message failed to sucessfully authenticate");
2087 }
2088 }
2089 else
2090 {
2091 m_log.InfoFormat("[USERLOGOFF]: Got a logoff request for {0} but the user isn't here. The user might already have been logged out", AvatarID.ToString());
2092 }
2093 }
2094
2095
2096 }
2067 /// <summary> 2097 /// <summary>
2068 /// Add a caps handler for the given agent. If the CAPS handler already exists for this agent, 2098 /// Add a caps handler for the given agent. If the CAPS handler already exists for this agent,
2069 /// then it is replaced by a new CAPS handler. 2099 /// then it is replaced by a new CAPS handler.
diff --git a/OpenSim/Region/Environment/Scenes/SceneCommunicationService.cs b/OpenSim/Region/Environment/Scenes/SceneCommunicationService.cs
index d2d75e8..e841ad4 100644
--- a/OpenSim/Region/Environment/Scenes/SceneCommunicationService.cs
+++ b/OpenSim/Region/Environment/Scenes/SceneCommunicationService.cs
@@ -58,6 +58,7 @@ namespace OpenSim.Region.Environment.Scenes
58 public event RegionUp OnRegionUp; 58 public event RegionUp OnRegionUp;
59 public event ChildAgentUpdate OnChildAgentUpdate; 59 public event ChildAgentUpdate OnChildAgentUpdate;
60 public event RemoveKnownRegionsFromAvatarList OnRemoveKnownRegionFromAvatar; 60 public event RemoveKnownRegionsFromAvatarList OnRemoveKnownRegionFromAvatar;
61 public event LogOffUser OnLogOffUser;
61 62
62 private AgentCrossing handlerAvatarCrossingIntoRegion = null; // OnAvatarCrossingIntoRegion; 63 private AgentCrossing handlerAvatarCrossingIntoRegion = null; // OnAvatarCrossingIntoRegion;
63 private ExpectUserDelegate handlerExpectUser = null; // OnExpectUser; 64 private ExpectUserDelegate handlerExpectUser = null; // OnExpectUser;
@@ -67,6 +68,7 @@ namespace OpenSim.Region.Environment.Scenes
67 private RegionUp handlerRegionUp = null; // OnRegionUp; 68 private RegionUp handlerRegionUp = null; // OnRegionUp;
68 private ChildAgentUpdate handlerChildAgentUpdate = null; // OnChildAgentUpdate; 69 private ChildAgentUpdate handlerChildAgentUpdate = null; // OnChildAgentUpdate;
69 private RemoveKnownRegionsFromAvatarList handlerRemoveKnownRegionFromAvatar = null; // OnRemoveKnownRegionFromAvatar; 70 private RemoveKnownRegionsFromAvatarList handlerRemoveKnownRegionFromAvatar = null; // OnRemoveKnownRegionFromAvatar;
71 private LogOffUser handlerLogOffUser = null;
70 72
71 public KillObjectDelegate KillObject; 73 public KillObjectDelegate KillObject;
72 public string _debugRegionName = String.Empty; 74 public string _debugRegionName = String.Empty;
@@ -105,6 +107,7 @@ namespace OpenSim.Region.Environment.Scenes
105 regionCommsHost.OnCloseAgentConnection += CloseConnection; 107 regionCommsHost.OnCloseAgentConnection += CloseConnection;
106 regionCommsHost.OnRegionUp += newRegionUp; 108 regionCommsHost.OnRegionUp += newRegionUp;
107 regionCommsHost.OnChildAgentUpdate += ChildAgentUpdate; 109 regionCommsHost.OnChildAgentUpdate += ChildAgentUpdate;
110 regionCommsHost.OnLogOffUser += GridLogOffUser;
108 } 111 }
109 else 112 else
110 { 113 {
@@ -121,6 +124,7 @@ namespace OpenSim.Region.Environment.Scenes
121 { 124 {
122 if (regionCommsHost != null) 125 if (regionCommsHost != null)
123 { 126 {
127 regionCommsHost.OnLogOffUser -= GridLogOffUser;
124 regionCommsHost.OnChildAgentUpdate -= ChildAgentUpdate; 128 regionCommsHost.OnChildAgentUpdate -= ChildAgentUpdate;
125 regionCommsHost.OnRegionUp -= newRegionUp; 129 regionCommsHost.OnRegionUp -= newRegionUp;
126 regionCommsHost.OnExpectUser -= NewUserConnection; 130 regionCommsHost.OnExpectUser -= NewUserConnection;
@@ -150,6 +154,15 @@ namespace OpenSim.Region.Environment.Scenes
150 } 154 }
151 } 155 }
152 156
157 protected void GridLogOffUser(ulong regionHandle, LLUUID AgentID, LLUUID RegionSecret, string message)
158 {
159 handlerLogOffUser = OnLogOffUser;
160 if (handlerLogOffUser != null)
161 {
162 handlerLogOffUser(regionHandle, AgentID, RegionSecret, message);
163 }
164 }
165
153 protected bool newRegionUp(RegionInfo region) 166 protected bool newRegionUp(RegionInfo region)
154 { 167 {
155 handlerRegionUp = OnRegionUp; 168 handlerRegionUp = OnRegionUp;
diff --git a/OpenSim/Region/Environment/Scenes/ScenePresence.cs b/OpenSim/Region/Environment/Scenes/ScenePresence.cs
index 30075da..0fdd720 100644
--- a/OpenSim/Region/Environment/Scenes/ScenePresence.cs
+++ b/OpenSim/Region/Environment/Scenes/ScenePresence.cs
@@ -596,6 +596,7 @@ namespace OpenSim.Region.Environment.Scenes
596 m_scene.SendAllSceneObjectsToClient(this); 596 m_scene.SendAllSceneObjectsToClient(this);
597 597
598 m_scene.EventManager.TriggerOnMakeRootAgent(this); 598 m_scene.EventManager.TriggerOnMakeRootAgent(this);
599 m_scene.CommsManager.UserService.UpdateUserCurrentRegion(UUID, m_scene.RegionInfo.RegionID, m_scene.RegionInfo.RegionHandle);
599 600
600 //m_gotAllObjectsInScene = true; 601 //m_gotAllObjectsInScene = true;
601 //} 602 //}