diff options
-rw-r--r-- | OpenSim/Framework/EstateSettings.cs | 23 | ||||
-rw-r--r-- | OpenSim/Framework/Tests/MundaneFrameworkTests.cs | 6 | ||||
-rw-r--r-- | OpenSim/Framework/Util.cs | 26 | ||||
-rw-r--r-- | OpenSim/Region/CoreModules/Agent/Capabilities/CapabilitiesModule.cs | 3 | ||||
-rw-r--r-- | OpenSim/Region/Framework/Scenes/Scene.cs | 42 | ||||
-rw-r--r-- | OpenSim/Region/Framework/Scenes/ScenePresence.cs | 8 | ||||
-rw-r--r-- | OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs | 4 |
7 files changed, 93 insertions, 19 deletions
diff --git a/OpenSim/Framework/EstateSettings.cs b/OpenSim/Framework/EstateSettings.cs index 2a495b0..f9c13f3 100644 --- a/OpenSim/Framework/EstateSettings.cs +++ b/OpenSim/Framework/EstateSettings.cs | |||
@@ -338,11 +338,30 @@ namespace OpenSim.Framework | |||
338 | return false; | 338 | return false; |
339 | } | 339 | } |
340 | 340 | ||
341 | public bool IsBanned(UUID avatarID) | 341 | public bool IsBanned(UUID avatarID, int userFlags) |
342 | { | 342 | { |
343 | foreach (EstateBan ban in l_EstateBans) | 343 | foreach (EstateBan ban in l_EstateBans) |
344 | if (ban.BannedUserID == avatarID) | 344 | if (ban.BannedUserID == avatarID) |
345 | return true; | 345 | return true; |
346 | |||
347 | if (!IsEstateManager(avatarID) && !HasAccess(avatarID)) | ||
348 | { | ||
349 | if (DenyMinors) | ||
350 | { | ||
351 | if ((userFlags & 32) == 0) | ||
352 | { | ||
353 | return true; | ||
354 | } | ||
355 | } | ||
356 | if (DenyAnonymous) | ||
357 | { | ||
358 | if ((userFlags & 4) == 0) | ||
359 | { | ||
360 | return true; | ||
361 | } | ||
362 | } | ||
363 | } | ||
364 | |||
346 | return false; | 365 | return false; |
347 | } | 366 | } |
348 | 367 | ||
@@ -350,7 +369,7 @@ namespace OpenSim.Framework | |||
350 | { | 369 | { |
351 | if (ban == null) | 370 | if (ban == null) |
352 | return; | 371 | return; |
353 | if (!IsBanned(ban.BannedUserID)) | 372 | if (!IsBanned(ban.BannedUserID, 32)) //Ignore age-based bans |
354 | l_EstateBans.Add(ban); | 373 | l_EstateBans.Add(ban); |
355 | } | 374 | } |
356 | 375 | ||
diff --git a/OpenSim/Framework/Tests/MundaneFrameworkTests.cs b/OpenSim/Framework/Tests/MundaneFrameworkTests.cs index e7f8bfc..e131260 100644 --- a/OpenSim/Framework/Tests/MundaneFrameworkTests.cs +++ b/OpenSim/Framework/Tests/MundaneFrameworkTests.cs | |||
@@ -217,12 +217,12 @@ namespace OpenSim.Framework.Tests | |||
217 | BannedHostNameMask = string.Empty, | 217 | BannedHostNameMask = string.Empty, |
218 | BannedUserID = bannedUserId} | 218 | BannedUserID = bannedUserId} |
219 | ); | 219 | ); |
220 | Assert.IsTrue(es.IsBanned(bannedUserId), "User Should be banned but is not."); | 220 | Assert.IsTrue(es.IsBanned(bannedUserId, 32), "User Should be banned but is not."); |
221 | Assert.IsFalse(es.IsBanned(UUID.Zero), "User Should not be banned but is."); | 221 | Assert.IsFalse(es.IsBanned(UUID.Zero, 32), "User Should not be banned but is."); |
222 | 222 | ||
223 | es.RemoveBan(bannedUserId); | 223 | es.RemoveBan(bannedUserId); |
224 | 224 | ||
225 | Assert.IsFalse(es.IsBanned(bannedUserId), "User Should not be banned but is."); | 225 | Assert.IsFalse(es.IsBanned(bannedUserId, 32), "User Should not be banned but is."); |
226 | 226 | ||
227 | es.AddEstateManager(UUID.Zero); | 227 | es.AddEstateManager(UUID.Zero); |
228 | 228 | ||
diff --git a/OpenSim/Framework/Util.cs b/OpenSim/Framework/Util.cs index cef756c..96292ff 100644 --- a/OpenSim/Framework/Util.cs +++ b/OpenSim/Framework/Util.cs | |||
@@ -409,19 +409,25 @@ namespace OpenSim.Framework | |||
409 | /// </summary> | 409 | /// </summary> |
410 | /// <param name="data"></param> | 410 | /// <param name="data"></param> |
411 | /// <returns></returns> | 411 | /// <returns></returns> |
412 | |||
412 | public static string Md5Hash(string data) | 413 | public static string Md5Hash(string data) |
413 | { | 414 | { |
414 | byte[] dataMd5 = ComputeMD5Hash(data); | 415 | return Md5Hash(data, Encoding.Default); |
416 | } | ||
417 | |||
418 | public static string Md5Hash(string data, Encoding encoding) | ||
419 | { | ||
420 | byte[] dataMd5 = ComputeMD5Hash(data, encoding); | ||
415 | StringBuilder sb = new StringBuilder(); | 421 | StringBuilder sb = new StringBuilder(); |
416 | for (int i = 0; i < dataMd5.Length; i++) | 422 | for (int i = 0; i < dataMd5.Length; i++) |
417 | sb.AppendFormat("{0:x2}", dataMd5[i]); | 423 | sb.AppendFormat("{0:x2}", dataMd5[i]); |
418 | return sb.ToString(); | 424 | return sb.ToString(); |
419 | } | 425 | } |
420 | 426 | ||
421 | private static byte[] ComputeMD5Hash(string data) | 427 | private static byte[] ComputeMD5Hash(string data, Encoding encoding) |
422 | { | 428 | { |
423 | MD5 md5 = MD5.Create(); | 429 | MD5 md5 = MD5.Create(); |
424 | return md5.ComputeHash(Encoding.Default.GetBytes(data)); | 430 | return md5.ComputeHash(encoding.GetBytes(data)); |
425 | } | 431 | } |
426 | 432 | ||
427 | /// <summary> | 433 | /// <summary> |
@@ -429,16 +435,22 @@ namespace OpenSim.Framework | |||
429 | /// </summary> | 435 | /// </summary> |
430 | /// <param name="data"></param> | 436 | /// <param name="data"></param> |
431 | /// <returns></returns> | 437 | /// <returns></returns> |
438 | |||
432 | public static string SHA1Hash(string data) | 439 | public static string SHA1Hash(string data) |
433 | { | 440 | { |
434 | byte[] hash = ComputeSHA1Hash(data); | 441 | return SHA1Hash(data, Encoding.Default); |
442 | } | ||
443 | |||
444 | public static string SHA1Hash(string data, Encoding encoding) | ||
445 | { | ||
446 | byte[] hash = ComputeSHA1Hash(data, encoding); | ||
435 | return BitConverter.ToString(hash).Replace("-", String.Empty); | 447 | return BitConverter.ToString(hash).Replace("-", String.Empty); |
436 | } | 448 | } |
437 | 449 | ||
438 | private static byte[] ComputeSHA1Hash(string src) | 450 | private static byte[] ComputeSHA1Hash(string src, Encoding encoding) |
439 | { | 451 | { |
440 | SHA1CryptoServiceProvider SHA1 = new SHA1CryptoServiceProvider(); | 452 | SHA1CryptoServiceProvider SHA1 = new SHA1CryptoServiceProvider(); |
441 | return SHA1.ComputeHash(Encoding.Default.GetBytes(src)); | 453 | return SHA1.ComputeHash(encoding.GetBytes(src)); |
442 | } | 454 | } |
443 | 455 | ||
444 | public static int fast_distance2d(int x, int y) | 456 | public static int fast_distance2d(int x, int y) |
@@ -1161,7 +1173,7 @@ namespace OpenSim.Framework | |||
1161 | 1173 | ||
1162 | public static Guid GetHashGuid(string data, string salt) | 1174 | public static Guid GetHashGuid(string data, string salt) |
1163 | { | 1175 | { |
1164 | byte[] hash = ComputeMD5Hash(data + salt); | 1176 | byte[] hash = ComputeMD5Hash(data + salt, Encoding.Default); |
1165 | 1177 | ||
1166 | //string s = BitConverter.ToString(hash); | 1178 | //string s = BitConverter.ToString(hash); |
1167 | 1179 | ||
diff --git a/OpenSim/Region/CoreModules/Agent/Capabilities/CapabilitiesModule.cs b/OpenSim/Region/CoreModules/Agent/Capabilities/CapabilitiesModule.cs index c023a6f..5c5cb70 100644 --- a/OpenSim/Region/CoreModules/Agent/Capabilities/CapabilitiesModule.cs +++ b/OpenSim/Region/CoreModules/Agent/Capabilities/CapabilitiesModule.cs | |||
@@ -88,7 +88,8 @@ namespace OpenSim.Region.CoreModules.Agent.Capabilities | |||
88 | 88 | ||
89 | public void AddCapsHandler(UUID agentId) | 89 | public void AddCapsHandler(UUID agentId) |
90 | { | 90 | { |
91 | if (m_scene.RegionInfo.EstateSettings.IsBanned(agentId)) | 91 | int flags = m_scene.GetUserFlags(agentId); |
92 | if (m_scene.RegionInfo.EstateSettings.IsBanned(agentId, flags)) | ||
92 | return; | 93 | return; |
93 | 94 | ||
94 | String capsObjectPath = GetCapsPath(agentId); | 95 | String capsObjectPath = GetCapsPath(agentId); |
diff --git a/OpenSim/Region/Framework/Scenes/Scene.cs b/OpenSim/Region/Framework/Scenes/Scene.cs index fc4110b..6a5f84a 100644 --- a/OpenSim/Region/Framework/Scenes/Scene.cs +++ b/OpenSim/Region/Framework/Scenes/Scene.cs | |||
@@ -2443,7 +2443,8 @@ namespace OpenSim.Region.Framework.Scenes | |||
2443 | // If the user is banned, we won't let any of their objects | 2443 | // If the user is banned, we won't let any of their objects |
2444 | // enter. Period. | 2444 | // enter. Period. |
2445 | // | 2445 | // |
2446 | if (m_regInfo.EstateSettings.IsBanned(sceneObject.OwnerID)) | 2446 | int flags = GetUserFlags(sceneObject.OwnerID); |
2447 | if (m_regInfo.EstateSettings.IsBanned(sceneObject.OwnerID, flags)) | ||
2447 | { | 2448 | { |
2448 | m_log.Info("[INTERREGION]: Denied prim crossing for " + | 2449 | m_log.Info("[INTERREGION]: Denied prim crossing for " + |
2449 | "banned avatar"); | 2450 | "banned avatar"); |
@@ -2547,6 +2548,22 @@ namespace OpenSim.Region.Framework.Scenes | |||
2547 | return 2; // StateSource.PrimCrossing | 2548 | return 2; // StateSource.PrimCrossing |
2548 | } | 2549 | } |
2549 | 2550 | ||
2551 | public int GetUserFlags(UUID user) | ||
2552 | { | ||
2553 | //Unfortunately the SP approach means that the value is cached until region is restarted | ||
2554 | /* | ||
2555 | ScenePresence sp; | ||
2556 | if (TryGetScenePresence(user, out sp)) | ||
2557 | { | ||
2558 | return sp.UserFlags; | ||
2559 | } | ||
2560 | else | ||
2561 | { | ||
2562 | */ | ||
2563 | UserAccount uac = UserAccountService.GetUserAccount(RegionInfo.ScopeID, user); | ||
2564 | return uac.UserFlags; | ||
2565 | //} | ||
2566 | } | ||
2550 | #endregion | 2567 | #endregion |
2551 | 2568 | ||
2552 | #region Add/Remove Avatar Methods | 2569 | #region Add/Remove Avatar Methods |
@@ -3626,10 +3643,26 @@ namespace OpenSim.Region.Framework.Scenes | |||
3626 | 3643 | ||
3627 | if (m_regInfo.EstateSettings != null) | 3644 | if (m_regInfo.EstateSettings != null) |
3628 | { | 3645 | { |
3629 | if (m_regInfo.EstateSettings.IsBanned(agentID)) | 3646 | int flags = GetUserFlags(agent.AgentID); |
3647 | if (m_regInfo.EstateSettings.IsBanned(agentID, flags)) | ||
3630 | { | 3648 | { |
3631 | m_log.WarnFormat("[CONNECTION BEGIN]: Denied access to: {0} at {1} because the user is on the banlist", | 3649 | //Add some more info to help users |
3650 | if (!m_regInfo.EstateSettings.IsBanned(agentID, 32)) | ||
3651 | { | ||
3652 | m_log.WarnFormat("[CONNECTION BEGIN]: Denied access to: {0} at {1} because the region requires age verification", | ||
3632 | agentID, RegionInfo.RegionName); | 3653 | agentID, RegionInfo.RegionName); |
3654 | reason = String.Format("Denied access to region {0}: Region requires age verification", RegionInfo.RegionName); | ||
3655 | return false; | ||
3656 | } | ||
3657 | if (!m_regInfo.EstateSettings.IsBanned(agentID, 4)) | ||
3658 | { | ||
3659 | m_log.WarnFormat("[CONNECTION BEGIN]: Denied access to: {0} {1} because the region requires payment info on file", | ||
3660 | agent.AgentID, agent.firstname, agent.lastname, RegionInfo.RegionName); | ||
3661 | reason = String.Format("Denied access to region {0}: Region requires payment info on file", RegionInfo.RegionName); | ||
3662 | return false; | ||
3663 | } | ||
3664 | m_log.WarnFormat("[CONNECTION BEGIN]: Denied access to: {0} at {3} because the user is on the banlist", | ||
3665 | agent.AgentID, RegionInfo.RegionName); | ||
3633 | reason = String.Format("Denied access to region {0}: You have been banned from that region.", | 3666 | reason = String.Format("Denied access to region {0}: You have been banned from that region.", |
3634 | RegionInfo.RegionName); | 3667 | RegionInfo.RegionName); |
3635 | return false; | 3668 | return false; |
@@ -3788,7 +3821,8 @@ namespace OpenSim.Region.Framework.Scenes | |||
3788 | 3821 | ||
3789 | // We have to wait until the viewer contacts this region after receiving EAC. | 3822 | // We have to wait until the viewer contacts this region after receiving EAC. |
3790 | // That calls AddNewClient, which finally creates the ScenePresence | 3823 | // That calls AddNewClient, which finally creates the ScenePresence |
3791 | if (m_regInfo.EstateSettings.IsBanned(cAgentData.AgentID)) | 3824 | int flags = GetUserFlags(cAgentData.AgentID); |
3825 | if (m_regInfo.EstateSettings.IsBanned(cAgentData.AgentID, flags)) | ||
3792 | { | 3826 | { |
3793 | m_log.DebugFormat("[SCENE]: Denying root agent entry to {0}: banned", cAgentData.AgentID); | 3827 | m_log.DebugFormat("[SCENE]: Denying root agent entry to {0}: banned", cAgentData.AgentID); |
3794 | return false; | 3828 | return false; |
diff --git a/OpenSim/Region/Framework/Scenes/ScenePresence.cs b/OpenSim/Region/Framework/Scenes/ScenePresence.cs index 6a3983f..c4ae0f0 100644 --- a/OpenSim/Region/Framework/Scenes/ScenePresence.cs +++ b/OpenSim/Region/Framework/Scenes/ScenePresence.cs | |||
@@ -113,6 +113,7 @@ namespace OpenSim.Region.Framework.Scenes | |||
113 | { | 113 | { |
114 | get { return m_attachments; } | 114 | get { return m_attachments; } |
115 | } | 115 | } |
116 | |||
116 | protected List<SceneObjectGroup> m_attachments = new List<SceneObjectGroup>(); | 117 | protected List<SceneObjectGroup> m_attachments = new List<SceneObjectGroup>(); |
117 | 118 | ||
118 | private Dictionary<UUID, ScriptControllers> scriptedcontrols = new Dictionary<UUID, ScriptControllers>(); | 119 | private Dictionary<UUID, ScriptControllers> scriptedcontrols = new Dictionary<UUID, ScriptControllers>(); |
@@ -136,6 +137,12 @@ namespace OpenSim.Region.Framework.Scenes | |||
136 | private bool m_updateflag; | 137 | private bool m_updateflag; |
137 | private byte m_movementflag; | 138 | private byte m_movementflag; |
138 | private Vector3? m_forceToApply; | 139 | private Vector3? m_forceToApply; |
140 | private int m_userFlags; | ||
141 | public int UserFlags | ||
142 | { | ||
143 | get { return m_userFlags; } | ||
144 | } | ||
145 | |||
139 | private uint m_requestedSitTargetID; | 146 | private uint m_requestedSitTargetID; |
140 | private UUID m_requestedSitTargetUUID; | 147 | private UUID m_requestedSitTargetUUID; |
141 | public bool SitGround = false; | 148 | public bool SitGround = false; |
@@ -763,6 +770,7 @@ namespace OpenSim.Region.Framework.Scenes | |||
763 | m_localId = m_scene.AllocateLocalId(); | 770 | m_localId = m_scene.AllocateLocalId(); |
764 | 771 | ||
765 | UserAccount account = m_scene.UserAccountService.GetUserAccount(m_scene.RegionInfo.ScopeID, m_uuid); | 772 | UserAccount account = m_scene.UserAccountService.GetUserAccount(m_scene.RegionInfo.ScopeID, m_uuid); |
773 | m_userFlags = account.UserFlags; | ||
766 | 774 | ||
767 | if (account != null) | 775 | if (account != null) |
768 | m_userLevel = account.UserLevel; | 776 | m_userLevel = account.UserLevel; |
diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs index dffc0bd..f5b7f5f 100644 --- a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs +++ b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs | |||
@@ -6938,13 +6938,13 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api | |||
6938 | public LSL_String llMD5String(string src, int nonce) | 6938 | public LSL_String llMD5String(string src, int nonce) |
6939 | { | 6939 | { |
6940 | m_host.AddScriptLPS(1); | 6940 | m_host.AddScriptLPS(1); |
6941 | return Util.Md5Hash(String.Format("{0}:{1}", src, nonce.ToString())); | 6941 | return Util.Md5Hash(String.Format("{0}:{1}", src, nonce.ToString()), Encoding.UTF8); |
6942 | } | 6942 | } |
6943 | 6943 | ||
6944 | public LSL_String llSHA1String(string src) | 6944 | public LSL_String llSHA1String(string src) |
6945 | { | 6945 | { |
6946 | m_host.AddScriptLPS(1); | 6946 | m_host.AddScriptLPS(1); |
6947 | return Util.SHA1Hash(src).ToLower(); | 6947 | return Util.SHA1Hash(src, Encoding.UTF8).ToLower(); |
6948 | } | 6948 | } |
6949 | 6949 | ||
6950 | protected ObjectShapePacket.ObjectDataBlock SetPrimitiveBlockShapeParams(SceneObjectPart part, int holeshape, LSL_Vector cut, float hollow, LSL_Vector twist) | 6950 | protected ObjectShapePacket.ObjectDataBlock SetPrimitiveBlockShapeParams(SceneObjectPart part, int holeshape, LSL_Vector cut, float hollow, LSL_Vector twist) |