diff options
Diffstat (limited to '')
-rw-r--r-- | OpenSim/Region/CoreModules/Avatar/Friends/FriendsModule.cs | 84 | ||||
-rw-r--r-- | OpenSim/Region/Framework/Scenes/Scene.cs | 59 |
2 files changed, 77 insertions, 66 deletions
diff --git a/OpenSim/Region/CoreModules/Avatar/Friends/FriendsModule.cs b/OpenSim/Region/CoreModules/Avatar/Friends/FriendsModule.cs index 2979e29..4c01985 100644 --- a/OpenSim/Region/CoreModules/Avatar/Friends/FriendsModule.cs +++ b/OpenSim/Region/CoreModules/Avatar/Friends/FriendsModule.cs | |||
@@ -221,8 +221,6 @@ namespace OpenSim.Region.CoreModules.Avatar.Friends | |||
221 | 221 | ||
222 | client.OnGrantUserRights += OnGrantUserRights; | 222 | client.OnGrantUserRights += OnGrantUserRights; |
223 | 223 | ||
224 | client.OnLogout += OnLogout; | ||
225 | |||
226 | lock (m_Friends) | 224 | lock (m_Friends) |
227 | { | 225 | { |
228 | if (m_Friends.ContainsKey(client.AgentId)) | 226 | if (m_Friends.ContainsKey(client.AgentId)) |
@@ -241,11 +239,15 @@ namespace OpenSim.Region.CoreModules.Avatar.Friends | |||
241 | m_Friends.Add(client.AgentId, newFriends); | 239 | m_Friends.Add(client.AgentId, newFriends); |
242 | } | 240 | } |
243 | 241 | ||
244 | //StatusChange(client.AgentId, true); | ||
245 | } | 242 | } |
246 | 243 | ||
247 | private void OnClientClosed(UUID agentID, Scene scene) | 244 | private void OnClientClosed(UUID agentID, Scene scene) |
248 | { | 245 | { |
246 | ScenePresence sp = scene.GetScenePresence(agentID); | ||
247 | if (sp != null && !sp.IsChildAgent) | ||
248 | // do this for root agents closing out | ||
249 | StatusChange(agentID, false); | ||
250 | |||
249 | lock (m_Friends) | 251 | lock (m_Friends) |
250 | if (m_Friends.ContainsKey(agentID)) | 252 | if (m_Friends.ContainsKey(agentID)) |
251 | { | 253 | { |
@@ -256,23 +258,18 @@ namespace OpenSim.Region.CoreModules.Avatar.Friends | |||
256 | } | 258 | } |
257 | } | 259 | } |
258 | 260 | ||
259 | private void OnLogout(IClientAPI client) | ||
260 | { | ||
261 | StatusChange(client.AgentId, false); | ||
262 | m_Friends.Remove(client.AgentId); | ||
263 | } | ||
264 | |||
265 | private void OnMakeRootAgent(ScenePresence sp) | 261 | private void OnMakeRootAgent(ScenePresence sp) |
266 | { | 262 | { |
267 | UUID agentID = sp.ControllingClient.AgentId; | 263 | UUID agentID = sp.ControllingClient.AgentId; |
268 | 264 | ||
269 | if (m_Friends.ContainsKey(agentID)) | 265 | if (m_Friends.ContainsKey(agentID)) |
270 | { | 266 | { |
271 | if (m_Friends[agentID].RegionID == UUID.Zero) | 267 | // This is probably an overkill, but just |
272 | { | 268 | // to make sure we have the latest and greatest |
273 | m_Friends[agentID].Friends = | 269 | // friends list -- always pull OnMakeRoot |
270 | m_Friends[agentID].Friends = | ||
274 | m_FriendsService.GetFriends(agentID); | 271 | m_FriendsService.GetFriends(agentID); |
275 | } | 272 | |
276 | m_Friends[agentID].RegionID = | 273 | m_Friends[agentID].RegionID = |
277 | sp.ControllingClient.Scene.RegionInfo.RegionID; | 274 | sp.ControllingClient.Scene.RegionInfo.RegionID; |
278 | } | 275 | } |
@@ -438,56 +435,29 @@ namespace OpenSim.Region.CoreModules.Avatar.Friends | |||
438 | /// <param name="online"></param> | 435 | /// <param name="online"></param> |
439 | private void StatusChange(UUID agentID, bool online) | 436 | private void StatusChange(UUID agentID, bool online) |
440 | { | 437 | { |
438 | //m_log.DebugFormat("[FRIENDS]: StatusChange {0}", online); | ||
441 | if (m_Friends.ContainsKey(agentID)) | 439 | if (m_Friends.ContainsKey(agentID)) |
442 | { | 440 | { |
441 | //m_log.DebugFormat("[FRIENDS]: # of friends: {0}", m_Friends[agentID].Friends.Length); | ||
443 | List<FriendInfo> friendList = new List<FriendInfo>(); | 442 | List<FriendInfo> friendList = new List<FriendInfo>(); |
444 | foreach (FriendInfo fi in m_Friends[agentID].Friends) | 443 | foreach (FriendInfo fi in m_Friends[agentID].Friends) |
445 | { | 444 | { |
446 | if (((fi.MyFlags & 1) != 0) && (fi.TheirFlags != -1)) | 445 | if (((fi.MyFlags & 1) != 0) && (fi.TheirFlags != -1)) |
447 | friendList.Add(fi); | 446 | friendList.Add(fi); |
448 | } | 447 | } |
449 | /* | ||
450 | foreach (FriendInfo fi in friendList) | ||
451 | { | ||
452 | // Notify about this user status | ||
453 | StatusNotify(fi, agentID, online); | ||
454 | } | ||
455 | */ | ||
456 | 448 | ||
457 | StatusNotifyMass(friendList, agentID, online); | 449 | Util.FireAndForget(delegate |
458 | } | ||
459 | } | ||
460 | |||
461 | private void StatusNotifyMass(List<FriendInfo> friendList, UUID userID, bool online) | ||
462 | { | ||
463 | int fct = friendList.Count; | ||
464 | string[] friendIDs = new string[fct]; | ||
465 | int notlocal = 0; | ||
466 | for (int x = 0 ; x < fct ; x++) | ||
467 | { | ||
468 | UUID friendID = UUID.Zero; | ||
469 | if (UUID.TryParse(friendList[x].Friend, out friendID)) | ||
470 | { | 450 | { |
471 | if (!LocalStatusNotification(userID, friendID, online)) | 451 | foreach (FriendInfo fi in friendList) |
472 | { | 452 | { |
473 | friendIDs[notlocal++] = friendID.ToString(); | 453 | //m_log.DebugFormat("[FRIENDS]: Notifying {0}", fi.PrincipalID); |
454 | // Notify about this user status | ||
455 | StatusNotify(fi, agentID, online); | ||
474 | } | 456 | } |
475 | } | 457 | }); |
476 | } | ||
477 | |||
478 | PresenceInfo[] friendSessions = PresenceService.GetAgents(friendIDs); | ||
479 | |||
480 | for (int x = 0; x < friendSessions.GetLength(0); x++) | ||
481 | { | ||
482 | if (friendIDs.Length <= x) | ||
483 | continue; | ||
484 | PresenceInfo friendSession = friendSessions[x]; | ||
485 | if (friendSession != null) | ||
486 | { | ||
487 | GridRegion region = GridService.GetRegionByUUID(m_Scenes[0].RegionInfo.ScopeID, friendSession.RegionID); | ||
488 | m_FriendsSimConnector.StatusNotify(region, userID, new UUID(friendIDs[x]), online); | ||
489 | } | ||
490 | } | 458 | } |
459 | else | ||
460 | m_log.WarnFormat("[FRIENDS]: {0} not found in cache", agentID); | ||
491 | } | 461 | } |
492 | 462 | ||
493 | private void StatusNotify(FriendInfo friend, UUID userID, bool online) | 463 | private void StatusNotify(FriendInfo friend, UUID userID, bool online) |
@@ -504,16 +474,26 @@ namespace OpenSim.Region.CoreModules.Avatar.Friends | |||
504 | PresenceInfo[] friendSessions = PresenceService.GetAgents(new string[] { friendID.ToString() }); | 474 | PresenceInfo[] friendSessions = PresenceService.GetAgents(new string[] { friendID.ToString() }); |
505 | if (friendSessions != null && friendSessions.Length > 0) | 475 | if (friendSessions != null && friendSessions.Length > 0) |
506 | { | 476 | { |
507 | PresenceInfo friendSession = friendSessions[0]; | 477 | PresenceInfo friendSession = null; |
478 | foreach (PresenceInfo pinfo in friendSessions) | ||
479 | if (pinfo.RegionID != UUID.Zero) // let's guard against sessions-gone-bad | ||
480 | { | ||
481 | friendSession = pinfo; | ||
482 | break; | ||
483 | } | ||
484 | |||
508 | if (friendSession != null) | 485 | if (friendSession != null) |
509 | { | 486 | { |
510 | GridRegion region = GridService.GetRegionByUUID(m_Scenes[0].RegionInfo.ScopeID, friendSession.RegionID); | 487 | GridRegion region = GridService.GetRegionByUUID(m_Scenes[0].RegionInfo.ScopeID, friendSession.RegionID); |
488 | //m_log.DebugFormat("[FRIENDS]: Remote Notify to region {0}", region.RegionName); | ||
511 | m_FriendsSimConnector.StatusNotify(region, userID, friendID, online); | 489 | m_FriendsSimConnector.StatusNotify(region, userID, friendID, online); |
512 | } | 490 | } |
513 | } | 491 | } |
514 | 492 | ||
515 | // Friend is not online. Ignore. | 493 | // Friend is not online. Ignore. |
516 | } | 494 | } |
495 | else | ||
496 | m_log.WarnFormat("[FRIENDS]: Error parsing friend ID {0}", friend.Friend); | ||
517 | } | 497 | } |
518 | 498 | ||
519 | private void OnInstantMessage(IClientAPI client, GridInstantMessage im) | 499 | private void OnInstantMessage(IClientAPI client, GridInstantMessage im) |
@@ -800,7 +780,7 @@ namespace OpenSim.Region.CoreModules.Avatar.Friends | |||
800 | IClientAPI friendClient = LocateClientObject(friendID); | 780 | IClientAPI friendClient = LocateClientObject(friendID); |
801 | if (friendClient != null) | 781 | if (friendClient != null) |
802 | { | 782 | { |
803 | //m_log.DebugFormat("[FRIENDS]: Notify {0} that user {1} is {2}", friend.Friend, userID, online); | 783 | //m_log.DebugFormat("[FRIENDS]: Local Status Notify {0} that user {1} is {2}", friendID, userID, online); |
804 | // the friend in this sim as root agent | 784 | // the friend in this sim as root agent |
805 | if (online) | 785 | if (online) |
806 | friendClient.SendAgentOnline(new UUID[] { userID }); | 786 | friendClient.SendAgentOnline(new UUID[] { userID }); |
diff --git a/OpenSim/Region/Framework/Scenes/Scene.cs b/OpenSim/Region/Framework/Scenes/Scene.cs index e80dff7..7bea166 100644 --- a/OpenSim/Region/Framework/Scenes/Scene.cs +++ b/OpenSim/Region/Framework/Scenes/Scene.cs | |||
@@ -3485,11 +3485,27 @@ namespace OpenSim.Region.Framework.Scenes | |||
3485 | agent.AgentID, agent.circuitcode, teleportFlags); | 3485 | agent.AgentID, agent.circuitcode, teleportFlags); |
3486 | 3486 | ||
3487 | reason = String.Empty; | 3487 | reason = String.Empty; |
3488 | if (!VerifyUserPresence(agent, out reason)) | 3488 | try |
3489 | { | ||
3490 | if (!VerifyUserPresence(agent, out reason)) | ||
3491 | return false; | ||
3492 | } | ||
3493 | catch (Exception e) | ||
3494 | { | ||
3495 | m_log.DebugFormat("[CONNECTION BEGIN]: Exception verifying presence {0}", e.Message); | ||
3489 | return false; | 3496 | return false; |
3497 | } | ||
3490 | 3498 | ||
3491 | if (!AuthorizeUser(agent, out reason)) | 3499 | try |
3500 | { | ||
3501 | if (!AuthorizeUser(agent, out reason)) | ||
3502 | return false; | ||
3503 | } | ||
3504 | catch (Exception e) | ||
3505 | { | ||
3506 | m_log.DebugFormat("[CONNECTION BEGIN]: Exception authorizing user {0}", e.Message); | ||
3492 | return false; | 3507 | return false; |
3508 | } | ||
3493 | 3509 | ||
3494 | m_log.InfoFormat( | 3510 | m_log.InfoFormat( |
3495 | "[CONNECTION BEGIN]: Region {0} authenticated and authorized incoming {1} agent {2} {3} {4} (circuit code {5})", | 3511 | "[CONNECTION BEGIN]: Region {0} authenticated and authorized incoming {1} agent {2} {3} {4} (circuit code {5})", |
@@ -3699,14 +3715,19 @@ namespace OpenSim.Region.Framework.Scenes | |||
3699 | } | 3715 | } |
3700 | } | 3716 | } |
3701 | 3717 | ||
3702 | if (m_regInfo.EstateSettings.IsBanned(agent.AgentID)) | 3718 | if (m_regInfo.EstateSettings != null) |
3703 | { | 3719 | { |
3704 | m_log.WarnFormat("[CONNECTION BEGIN]: Denied access to: {0} ({1} {2}) at {3} because the user is on the banlist", | 3720 | if (m_regInfo.EstateSettings.IsBanned(agent.AgentID)) |
3705 | agent.AgentID, agent.firstname, agent.lastname, RegionInfo.RegionName); | 3721 | { |
3706 | reason = String.Format("Denied access to region {0}: You have been banned from that region.", | 3722 | m_log.WarnFormat("[CONNECTION BEGIN]: Denied access to: {0} ({1} {2}) at {3} because the user is on the banlist", |
3707 | RegionInfo.RegionName); | 3723 | agent.AgentID, agent.firstname, agent.lastname, RegionInfo.RegionName); |
3708 | return false; | 3724 | reason = String.Format("Denied access to region {0}: You have been banned from that region.", |
3725 | RegionInfo.RegionName); | ||
3726 | return false; | ||
3727 | } | ||
3709 | } | 3728 | } |
3729 | else | ||
3730 | m_log.ErrorFormat("[CONNECTION BEGIN]: Estate Settings is null!"); | ||
3710 | 3731 | ||
3711 | IGroupsModule groupsModule = | 3732 | IGroupsModule groupsModule = |
3712 | RequestModuleInterface<IGroupsModule>(); | 3733 | RequestModuleInterface<IGroupsModule>(); |
@@ -3718,21 +3739,31 @@ namespace OpenSim.Region.Framework.Scenes | |||
3718 | GroupMembershipData[] GroupMembership = | 3739 | GroupMembershipData[] GroupMembership = |
3719 | groupsModule.GetMembershipData(agent.AgentID); | 3740 | groupsModule.GetMembershipData(agent.AgentID); |
3720 | 3741 | ||
3721 | for (int i = 0; i < GroupMembership.Length; i++) | 3742 | if (GroupMembership != null) |
3722 | agentGroups.Add(GroupMembership[i].GroupID); | 3743 | { |
3744 | for (int i = 0; i < GroupMembership.Length; i++) | ||
3745 | agentGroups.Add(GroupMembership[i].GroupID); | ||
3746 | } | ||
3747 | else | ||
3748 | m_log.ErrorFormat("[CONNECTION BEGIN]: GroupMembership is null!"); | ||
3723 | } | 3749 | } |
3724 | 3750 | ||
3725 | bool groupAccess = false; | 3751 | bool groupAccess = false; |
3726 | UUID[] estateGroups = m_regInfo.EstateSettings.EstateGroups; | 3752 | UUID[] estateGroups = m_regInfo.EstateSettings.EstateGroups; |
3727 | 3753 | ||
3728 | foreach (UUID group in estateGroups) | 3754 | if (estateGroups != null) |
3729 | { | 3755 | { |
3730 | if (agentGroups.Contains(group)) | 3756 | foreach (UUID group in estateGroups) |
3731 | { | 3757 | { |
3732 | groupAccess = true; | 3758 | if (agentGroups.Contains(group)) |
3733 | break; | 3759 | { |
3760 | groupAccess = true; | ||
3761 | break; | ||
3762 | } | ||
3734 | } | 3763 | } |
3735 | } | 3764 | } |
3765 | else | ||
3766 | m_log.ErrorFormat("[CONNECTION BEGIN]: EstateGroups is null!"); | ||
3736 | 3767 | ||
3737 | if (!m_regInfo.EstateSettings.PublicAccess && | 3768 | if (!m_regInfo.EstateSettings.PublicAccess && |
3738 | !m_regInfo.EstateSettings.HasAccess(agent.AgentID) && | 3769 | !m_regInfo.EstateSettings.HasAccess(agent.AgentID) && |