diff options
author | Teravus Ovares | 2008-05-31 12:18:29 +0000 |
---|---|---|
committer | Teravus Ovares | 2008-05-31 12:18:29 +0000 |
commit | febe78d06249cd4d36a86e97610dd45ab518a757 (patch) | |
tree | 7b9733fc14045f09e874440b923cfe443b781b6a /OpenSim/Grid/UserServer | |
parent | Mantis#1425. Thank you kindly, Melanie for a patch that: (diff) | |
download | opensim-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/Grid/UserServer')
-rw-r--r-- | OpenSim/Grid/UserServer/Main.cs | 63 | ||||
-rw-r--r-- | OpenSim/Grid/UserServer/UserLoginService.cs | 59 | ||||
-rw-r--r-- | OpenSim/Grid/UserServer/UserManager.cs | 48 |
3 files changed, 170 insertions, 0 deletions
diff --git a/OpenSim/Grid/UserServer/Main.cs b/OpenSim/Grid/UserServer/Main.cs index 810c24e..9d7421c 100644 --- a/OpenSim/Grid/UserServer/Main.cs +++ b/OpenSim/Grid/UserServer/Main.cs | |||
@@ -129,6 +129,7 @@ namespace OpenSim.Grid.UserServer | |||
129 | m_httpServer.AddXmlRPCHandler("get_user_friend_list", m_userManager.XmlRpcResponseXmlRPCGetUserFriendList); | 129 | m_httpServer.AddXmlRPCHandler("get_user_friend_list", m_userManager.XmlRpcResponseXmlRPCGetUserFriendList); |
130 | m_httpServer.AddXmlRPCHandler("get_avatar_appearance", m_userManager.XmlRPCGetAvatarAppearance); | 130 | m_httpServer.AddXmlRPCHandler("get_avatar_appearance", m_userManager.XmlRPCGetAvatarAppearance); |
131 | m_httpServer.AddXmlRPCHandler("update_avatar_appearance", m_userManager.XmlRPCUpdateAvatarAppearance); | 131 | m_httpServer.AddXmlRPCHandler("update_avatar_appearance", m_userManager.XmlRPCUpdateAvatarAppearance); |
132 | m_httpServer.AddXmlRPCHandler("update_user_current_region", m_userManager.XmlRPCAtRegion); | ||
132 | m_httpServer.AddXmlRPCHandler("logout_of_simulator", m_userManager.XmlRPCLogOffUserMethodUUID); | 133 | m_httpServer.AddXmlRPCHandler("logout_of_simulator", m_userManager.XmlRPCLogOffUserMethodUUID); |
133 | 134 | ||
134 | // Message Server ---> User Server | 135 | // Message Server ---> User Server |
@@ -221,6 +222,7 @@ namespace OpenSim.Grid.UserServer | |||
221 | { | 222 | { |
222 | case "help": | 223 | case "help": |
223 | m_console.Notice("create user - create a new user"); | 224 | m_console.Notice("create user - create a new user"); |
225 | m_console.Notice("logoff-user <firstname> <lastname> <message> - logs off the specified user from the grid"); | ||
224 | break; | 226 | break; |
225 | 227 | ||
226 | case "create": | 228 | case "create": |
@@ -238,6 +240,67 @@ namespace OpenSim.Grid.UserServer | |||
238 | "RootFolders/", | 240 | "RootFolders/", |
239 | m_lastCreatedUser); | 241 | m_lastCreatedUser); |
240 | break; | 242 | break; |
243 | case "logoff-user": | ||
244 | |||
245 | if (cmdparams.Length >= 3) | ||
246 | { | ||
247 | string firstname = cmdparams[0]; | ||
248 | string lastname = cmdparams[1]; | ||
249 | string message = ""; | ||
250 | |||
251 | for (int i = 2; i < cmdparams.Length; i++) | ||
252 | message += " " + cmdparams[i]; | ||
253 | |||
254 | UserProfileData theUser = null; | ||
255 | try | ||
256 | { | ||
257 | theUser = m_loginService.GetTheUser(firstname, lastname); | ||
258 | } | ||
259 | catch (Exception) | ||
260 | { | ||
261 | m_log.Error("[LOGOFF]: Error getting user data from the database."); | ||
262 | } | ||
263 | |||
264 | if (theUser != null) | ||
265 | { | ||
266 | if (theUser.CurrentAgent != null) | ||
267 | { | ||
268 | if (theUser.CurrentAgent.AgentOnline) | ||
269 | { | ||
270 | m_log.Info("[LOGOFF]: Logging off requested user!"); | ||
271 | m_loginService.LogOffUser(theUser, message); | ||
272 | |||
273 | theUser.CurrentAgent.AgentOnline = false; | ||
274 | |||
275 | m_loginService.CommitAgent(ref theUser); | ||
276 | } | ||
277 | else | ||
278 | { | ||
279 | m_log.Info("[LOGOFF]: User Doesn't appear to be online, sending the logoff message anyway."); | ||
280 | m_loginService.LogOffUser(theUser, message); | ||
281 | |||
282 | theUser.CurrentAgent.AgentOnline = false; | ||
283 | |||
284 | m_loginService.CommitAgent(ref theUser); | ||
285 | } | ||
286 | } | ||
287 | else | ||
288 | { | ||
289 | m_log.Error("[LOGOFF]: Unable to logoff-user. User doesn't have an agent record so I can't find the simulator to notify"); | ||
290 | } | ||
291 | |||
292 | } | ||
293 | else | ||
294 | { | ||
295 | m_log.Info("[LOGOFF]: User doesn't exist in the database"); | ||
296 | } | ||
297 | } | ||
298 | else | ||
299 | { | ||
300 | m_log.Error("[LOGOFF]: Invalid amount of parameters. logoff-user takes at least three. Firstname, Lastname, and message"); | ||
301 | } | ||
302 | |||
303 | break; | ||
241 | } | 304 | } |
242 | } | 305 | } |
243 | 306 | ||
diff --git a/OpenSim/Grid/UserServer/UserLoginService.cs b/OpenSim/Grid/UserServer/UserLoginService.cs index 628c471..d538d36 100644 --- a/OpenSim/Grid/UserServer/UserLoginService.cs +++ b/OpenSim/Grid/UserServer/UserLoginService.cs | |||
@@ -60,6 +60,65 @@ namespace OpenSim.Grid.UserServer | |||
60 | { | 60 | { |
61 | m_config = config; | 61 | m_config = config; |
62 | } | 62 | } |
63 | public override void LogOffUser(UserProfileData theUser, string message) | ||
64 | { | ||
65 | RegionProfileData SimInfo = null; | ||
66 | try | ||
67 | { | ||
68 | SimInfo = RegionProfileData.RequestSimProfileData( | ||
69 | theUser.CurrentAgent.Handle, m_config.GridServerURL, | ||
70 | m_config.GridSendKey, m_config.GridRecvKey); | ||
71 | if (SimInfo == null) | ||
72 | { | ||
73 | m_log.Error("[GRID]: Region user was in isn't currently logged in"); | ||
74 | return; | ||
75 | } | ||
76 | |||
77 | } | ||
78 | catch (Exception) | ||
79 | { | ||
80 | m_log.Error("[GRID]: Unable to look up region to log user off"); | ||
81 | return; | ||
82 | } | ||
83 | // Prepare notification | ||
84 | Hashtable SimParams = new Hashtable(); | ||
85 | SimParams["agent_id"] = theUser.ID.ToString(); | ||
86 | SimParams["region_secret"] = theUser.CurrentAgent.SecureSessionID.ToString(); | ||
87 | //SimParams["region_secret"] = SimInfo.regionSecret; | ||
88 | //m_log.Info(SimInfo.regionSecret); | ||
89 | SimParams["regionhandle"] = theUser.CurrentAgent.Handle.ToString(); | ||
90 | SimParams["message"] = message; | ||
91 | ArrayList SendParams = new ArrayList(); | ||
92 | SendParams.Add(SimParams); | ||
93 | |||
94 | // Update agent with target sim | ||
95 | |||
96 | m_log.InfoFormat( | ||
97 | "[ASSUMED CRASH]: Telling region {0} @ {1},{2} ({3}) that their agent is dead: {4}", | ||
98 | SimInfo.regionName, SimInfo.regionLocX, SimInfo.regionLocY, SimInfo.httpServerURI, theUser.FirstName + " " + theUser.SurName); | ||
99 | try | ||
100 | { | ||
101 | XmlRpcRequest GridReq = new XmlRpcRequest("logoff_user", SendParams); | ||
102 | XmlRpcResponse GridResp = GridReq.Send(SimInfo.httpServerURI, 6000); | ||
103 | |||
104 | if (GridResp.IsFault) | ||
105 | { | ||
106 | m_log.ErrorFormat( | ||
107 | "[LOGIN]: XMLRPC request for {0} failed, fault code: {1}, reason: {2}, This is likely an old region revision.", | ||
108 | SimInfo.httpServerURI, GridResp.FaultCode, GridResp.FaultString); | ||
109 | } | ||
110 | } | ||
111 | catch (Exception) | ||
112 | { | ||
113 | m_log.Error("[LOGIN]: Error telling region to logout user!"); | ||
114 | } | ||
115 | |||
116 | //base.LogOffUser(theUser); | ||
117 | } | ||
118 | //public override void LogOffUser(UserProfileData theUser) | ||
119 | //{ | ||
120 | |||
121 | //} | ||
63 | 122 | ||
64 | /// <summary> | 123 | /// <summary> |
65 | /// Customises the login response and fills in missing values. | 124 | /// Customises the login response and fills in missing values. |
diff --git a/OpenSim/Grid/UserServer/UserManager.cs b/OpenSim/Grid/UserServer/UserManager.cs index a82505d..1b47289 100644 --- a/OpenSim/Grid/UserServer/UserManager.cs +++ b/OpenSim/Grid/UserServer/UserManager.cs | |||
@@ -179,6 +179,54 @@ namespace OpenSim.Grid.UserServer | |||
179 | return AvatarPickerListtoXmlRPCResponse(queryID, returnAvatar); | 179 | return AvatarPickerListtoXmlRPCResponse(queryID, returnAvatar); |
180 | } | 180 | } |
181 | 181 | ||
182 | public XmlRpcResponse XmlRPCAtRegion(XmlRpcRequest request) | ||
183 | { | ||
184 | XmlRpcResponse response = new XmlRpcResponse(); | ||
185 | Hashtable requestData = (Hashtable)request.Params[0]; | ||
186 | Hashtable responseData = new Hashtable(); | ||
187 | string returnstring = "FALSE"; | ||
188 | |||
189 | if (requestData.Contains("avatar_id") && requestData.Contains("region_handle") && requestData.Contains("region_uuid")) | ||
190 | { | ||
191 | ulong cregionhandle = 0; | ||
192 | LLUUID regionUUID = LLUUID.Zero; | ||
193 | LLUUID AvatarID = LLUUID.Zero; | ||
194 | |||
195 | Helpers.TryParse((string)requestData["avatar_id"], out AvatarID); | ||
196 | Helpers.TryParse((string)requestData["region_uuid"], out regionUUID); | ||
197 | try | ||
198 | { | ||
199 | cregionhandle = (ulong)Convert.ToInt64((string)requestData["region_handle"]); | ||
200 | } | ||
201 | catch (ArgumentException) | ||
202 | { | ||
203 | } | ||
204 | catch (OverflowException) | ||
205 | { | ||
206 | } | ||
207 | catch (FormatException) | ||
208 | { | ||
209 | } | ||
210 | |||
211 | if (AvatarID != LLUUID.Zero) | ||
212 | { | ||
213 | UserProfileData userProfile = GetUserProfile(new LLUUID((string)requestData["avatar_id"])); | ||
214 | userProfile.CurrentAgent.Region = new LLUUID((string)requestData["region_uuid"]); | ||
215 | userProfile.CurrentAgent.Handle = (ulong)Convert.ToInt64((string)requestData["region_handle"]); | ||
216 | //userProfile.CurrentAgent. | ||
217 | CommitAgent(ref userProfile); | ||
218 | //setUserProfile(userProfile); | ||
219 | |||
220 | |||
221 | returnstring = "TRUE"; | ||
222 | } | ||
223 | |||
224 | } | ||
225 | responseData.Add("returnString", returnstring); | ||
226 | response.Value = responseData; | ||
227 | return response; | ||
228 | } | ||
229 | |||
182 | public XmlRpcResponse XmlRpcResponseXmlRPCAddUserFriend(XmlRpcRequest request) | 230 | public XmlRpcResponse XmlRpcResponseXmlRPCAddUserFriend(XmlRpcRequest request) |
183 | { | 231 | { |
184 | XmlRpcResponse response = new XmlRpcResponse(); | 232 | XmlRpcResponse response = new XmlRpcResponse(); |