diff options
author | onefang | 2020-09-11 00:41:12 +1000 |
---|---|---|
committer | onefang | 2020-09-11 00:41:12 +1000 |
commit | b95b03b409578da87f1dbaf809001e88e4e4fd56 (patch) | |
tree | 1db95cf20313408ef581377ae8e508d6d01cea00 /OpenSim/Region/Framework/Scenes/Scene.cs | |
parent | Add DefaultRegionAccess in [AuthorizationService] section. (diff) | |
download | opensim-SC-b95b03b409578da87f1dbaf809001e88e4e4fd56.zip opensim-SC-b95b03b409578da87f1dbaf809001e88e4e4fd56.tar.gz opensim-SC-b95b03b409578da87f1dbaf809001e88e4e4fd56.tar.bz2 opensim-SC-b95b03b409578da87f1dbaf809001e88e4e4fd56.tar.xz |
Automatically add members to certain groups, and HGers from specific grids to certain other groups.
It doesn't let them know, though the last group added will be their
active group. This replaces a PHP script I used to use, that got broken
by a PHP update. It also didn't let people know, no one complained.
This is better.
Another attempt at sorting out the auto group chicken and egg problems.
Are you a local? Asking for a friend.
Hypergridders have their full name in firstname, and their grid in
lastname. Sometimes.
Code filled with gotos may be spaghetti code, but object oriented code
can be like chopped spaghetti that's hidden all over the kitchen. At
least with gotos you can follow them.
Diffstat (limited to 'OpenSim/Region/Framework/Scenes/Scene.cs')
-rw-r--r-- | OpenSim/Region/Framework/Scenes/Scene.cs | 131 |
1 files changed, 126 insertions, 5 deletions
diff --git a/OpenSim/Region/Framework/Scenes/Scene.cs b/OpenSim/Region/Framework/Scenes/Scene.cs index 5f1497a..eee288a 100644 --- a/OpenSim/Region/Framework/Scenes/Scene.cs +++ b/OpenSim/Region/Framework/Scenes/Scene.cs | |||
@@ -338,6 +338,9 @@ namespace OpenSim.Region.Framework.Scenes | |||
338 | protected ICapabilitiesModule m_capsModule; | 338 | protected ICapabilitiesModule m_capsModule; |
339 | protected IGroupsModule m_groupsModule; | 339 | protected IGroupsModule m_groupsModule; |
340 | 340 | ||
341 | // The lists of groups to automatically add to logging in users. | ||
342 | private Dictionary<string, string[]> m_AutoGroups; | ||
343 | |||
341 | private Dictionary<string, string> m_extraSettings; | 344 | private Dictionary<string, string> m_extraSettings; |
342 | 345 | ||
343 | /// <summary> | 346 | /// <summary> |
@@ -1156,6 +1159,50 @@ namespace OpenSim.Region.Framework.Scenes | |||
1156 | 1159 | ||
1157 | #endregion Interest Management | 1160 | #endregion Interest Management |
1158 | 1161 | ||
1162 | #region Group | ||
1163 | |||
1164 | IConfig groupsConfig = m_config.Configs["Groups"]; | ||
1165 | m_AutoGroups = new Dictionary<string, string[]>(); | ||
1166 | if (groupsConfig != null) | ||
1167 | { | ||
1168 | string groups = groupsConfig.GetString("AddDefaultGroup", string.Empty); | ||
1169 | if (groups.Length > 0) | ||
1170 | { | ||
1171 | try | ||
1172 | { | ||
1173 | m_AutoGroups.Add("local", groups.Split('|')); | ||
1174 | } | ||
1175 | catch (ArgumentException) | ||
1176 | { | ||
1177 | m_log.Warn("[SCENE]: Duplicated AddDefaultGroup option."); | ||
1178 | } | ||
1179 | } | ||
1180 | string[] keys = groupsConfig.GetKeys(); | ||
1181 | if (0 < keys.Length) | ||
1182 | { | ||
1183 | foreach (string k in keys) | ||
1184 | { | ||
1185 | if (k.StartsWith("AddHGDefaultGroup_")) | ||
1186 | { | ||
1187 | groups = groupsConfig.GetString(k, string.Empty); | ||
1188 | if (groups.Length > 0) | ||
1189 | { | ||
1190 | try | ||
1191 | { | ||
1192 | m_AutoGroups.Add(k.Substring(18), groups.Split('|')); | ||
1193 | } | ||
1194 | catch (ArgumentException) | ||
1195 | { | ||
1196 | m_log.WarnFormat("[SCENE]: Duplicated {0} option.", k); | ||
1197 | } | ||
1198 | } | ||
1199 | } | ||
1200 | } | ||
1201 | } | ||
1202 | } | ||
1203 | |||
1204 | #endregion Group | ||
1205 | |||
1159 | StatsReporter = new SimStatsReporter(this); | 1206 | StatsReporter = new SimStatsReporter(this); |
1160 | 1207 | ||
1161 | StatsReporter.OnSendStatsResult += SendSimStatsPackets; | 1208 | StatsReporter.OnSendStatsResult += SendSimStatsPackets; |
@@ -4333,6 +4380,7 @@ namespace OpenSim.Region.Framework.Scenes | |||
4333 | protected virtual bool AuthorizeUser(AgentCircuitData agent, bool bypassAccessControl, out string reason) | 4380 | protected virtual bool AuthorizeUser(AgentCircuitData agent, bool bypassAccessControl, out string reason) |
4334 | { | 4381 | { |
4335 | reason = String.Empty; | 4382 | reason = String.Empty; |
4383 | bool isLocal = false; | ||
4336 | 4384 | ||
4337 | if (!m_strictAccessControl) | 4385 | if (!m_strictAccessControl) |
4338 | return true; | 4386 | return true; |
@@ -4342,7 +4390,7 @@ namespace OpenSim.Region.Framework.Scenes | |||
4342 | if (AuthorizationService != null) | 4390 | if (AuthorizationService != null) |
4343 | { | 4391 | { |
4344 | if (!AuthorizationService.IsAuthorizedForRegion( | 4392 | if (!AuthorizationService.IsAuthorizedForRegion( |
4345 | agent.AgentID.ToString(), agent.firstname, agent.lastname, RegionInfo.RegionID.ToString(), out reason)) | 4393 | agent.AgentID.ToString(), agent.firstname, agent.lastname, RegionInfo.RegionID.ToString(), out reason, out isLocal)) |
4346 | { | 4394 | { |
4347 | m_log.WarnFormat("[CONNECTION BEGIN]: Denied access to: {0} ({1} {2}) at {3} because: {4}", | 4395 | m_log.WarnFormat("[CONNECTION BEGIN]: Denied access to: {0} ({1} {2}) at {3} because: {4}", |
4348 | agent.AgentID, agent.firstname, agent.lastname, RegionInfo.RegionName, reason); | 4396 | agent.AgentID, agent.firstname, agent.lastname, RegionInfo.RegionName, reason); |
@@ -4375,6 +4423,79 @@ namespace OpenSim.Region.Framework.Scenes | |||
4375 | return false; | 4423 | return false; |
4376 | } | 4424 | } |
4377 | 4425 | ||
4426 | List<UUID> agentGroups = new List<UUID>(); | ||
4427 | GroupMembershipData[] GroupMembership = null; | ||
4428 | if(m_groupsModule != null) | ||
4429 | GroupMembership = m_groupsModule.GetMembershipData(agent.AgentID); | ||
4430 | |||
4431 | if (null != GroupMembership) | ||
4432 | { | ||
4433 | for(int i = 0;i < GroupMembership.Length;i++) | ||
4434 | agentGroups.Add(GroupMembership[i].GroupID); | ||
4435 | // We get called twice, the first time the name is set to a single space. | ||
4436 | // The first time is from QueryAccess(), the second from NewUserConnection() | ||
4437 | // if (" " != agent.Name) | ||
4438 | { | ||
4439 | string grid = ""; | ||
4440 | if (isLocal) | ||
4441 | { | ||
4442 | grid = "local"; | ||
4443 | m_log.InfoFormat("[CONNECTION BEGIN]: LOCAL agent {0} {1} {2} {3}, checking auto groups.", agent.firstname, agent.lastname, agent.Name, agent.AgentID); | ||
4444 | } | ||
4445 | else | ||
4446 | { | ||
4447 | // agent.AgentID could look like this - @grid.com:8002 01234567-89ab-cdef-0123-456789abcdef | ||
4448 | // Or agent.lastname could. | ||
4449 | string a = agent.AgentID.ToString(); | ||
4450 | if ("@" == a.Substring(0, 1)) | ||
4451 | { | ||
4452 | grid = a.Split(':')[0].Substring(1); | ||
4453 | m_log.InfoFormat("[CONNECTION BEGIN]: HYPERGRID agent {0} from grid {1}, checking auto groups.", agent.AgentID, grid); | ||
4454 | } | ||
4455 | else | ||
4456 | { | ||
4457 | a = agent.lastname; | ||
4458 | if (String.Empty != a) | ||
4459 | { | ||
4460 | if ("@" == a.Substring(0, 1)) | ||
4461 | { | ||
4462 | grid = a.Split(':')[0].Substring(1); | ||
4463 | m_log.InfoFormat("[CONNECTION BEGIN]: HYPERGRID agent {0} from grid {1}, checking auto groups.", agent.firstname, grid); | ||
4464 | } | ||
4465 | } | ||
4466 | } | ||
4467 | } | ||
4468 | string[] groupIDs = null; | ||
4469 | try | ||
4470 | { | ||
4471 | groupIDs = m_AutoGroups[grid]; | ||
4472 | } | ||
4473 | catch (KeyNotFoundException) | ||
4474 | { | ||
4475 | // Do nothing. | ||
4476 | } | ||
4477 | if (null != groupIDs) | ||
4478 | { | ||
4479 | foreach(string name in groupIDs) | ||
4480 | { | ||
4481 | GroupRecord g = m_groupsModule.GetGroupRecord(name); | ||
4482 | if (null != g) | ||
4483 | { | ||
4484 | UUID group = g.GroupID; | ||
4485 | if(!agentGroups.Contains(group)) | ||
4486 | { | ||
4487 | m_groupsModule.JoinGroup(agent.AgentID.ToString(), group); | ||
4488 | agentGroups.Add(group); | ||
4489 | m_log.InfoFormat("[CONNECTION BEGIN]: Automatically added {0} to group {1}.", agent.AgentID, name); | ||
4490 | } | ||
4491 | } | ||
4492 | else | ||
4493 | m_log.ErrorFormat("[CONNECTION BEGIN]: Bogus group {0}, not adding {1}.", name, agent.AgentID); | ||
4494 | } | ||
4495 | } | ||
4496 | } | ||
4497 | } | ||
4498 | |||
4378 | // public access | 4499 | // public access |
4379 | if (RegionInfo.EstateSettings.PublicAccess) | 4500 | if (RegionInfo.EstateSettings.PublicAccess) |
4380 | return true; | 4501 | return true; |
@@ -4401,8 +4522,8 @@ namespace OpenSim.Region.Framework.Scenes | |||
4401 | if(estateGroups.Length == 0) | 4522 | if(estateGroups.Length == 0) |
4402 | goto Label_GroupsDone; | 4523 | goto Label_GroupsDone; |
4403 | 4524 | ||
4404 | List<UUID> agentGroups = new List<UUID>(); | 4525 | //// List<UUID> agentGroups = new List<UUID>(); |
4405 | GroupMembershipData[] GroupMembership = m_groupsModule.GetMembershipData(agent.AgentID); | 4526 | //// GroupMembershipData[] GroupMembership = m_groupsModule.GetMembershipData(agent.AgentID); |
4406 | 4527 | ||
4407 | if(GroupMembership == null) | 4528 | if(GroupMembership == null) |
4408 | { | 4529 | { |
@@ -4413,8 +4534,8 @@ namespace OpenSim.Region.Framework.Scenes | |||
4413 | if(GroupMembership.Length == 0) | 4534 | if(GroupMembership.Length == 0) |
4414 | goto Label_GroupsDone; | 4535 | goto Label_GroupsDone; |
4415 | 4536 | ||
4416 | for(int i = 0;i < GroupMembership.Length;i++) | 4537 | //// for(int i = 0;i < GroupMembership.Length;i++) |
4417 | agentGroups.Add(GroupMembership[i].GroupID); | 4538 | //// agentGroups.Add(GroupMembership[i].GroupID); |
4418 | 4539 | ||
4419 | foreach(UUID group in estateGroups) | 4540 | foreach(UUID group in estateGroups) |
4420 | { | 4541 | { |