diff --git a/OpenSim/Framework/EstateSettings.cs b/OpenSim/Framework/EstateSettings.cs index 2a495b0e8c..f9c13f32bd 100644 --- a/OpenSim/Framework/EstateSettings.cs +++ b/OpenSim/Framework/EstateSettings.cs @@ -338,11 +338,30 @@ namespace OpenSim.Framework return false; } - public bool IsBanned(UUID avatarID) + public bool IsBanned(UUID avatarID, int userFlags) { foreach (EstateBan ban in l_EstateBans) if (ban.BannedUserID == avatarID) return true; + + if (!IsEstateManager(avatarID) && !HasAccess(avatarID)) + { + if (DenyMinors) + { + if ((userFlags & 32) == 0) + { + return true; + } + } + if (DenyAnonymous) + { + if ((userFlags & 4) == 0) + { + return true; + } + } + } + return false; } @@ -350,7 +369,7 @@ namespace OpenSim.Framework { if (ban == null) return; - if (!IsBanned(ban.BannedUserID)) + if (!IsBanned(ban.BannedUserID, 32)) //Ignore age-based bans l_EstateBans.Add(ban); } diff --git a/OpenSim/Framework/Tests/MundaneFrameworkTests.cs b/OpenSim/Framework/Tests/MundaneFrameworkTests.cs index e7f8bfc1f0..e131260ed5 100644 --- a/OpenSim/Framework/Tests/MundaneFrameworkTests.cs +++ b/OpenSim/Framework/Tests/MundaneFrameworkTests.cs @@ -217,12 +217,12 @@ namespace OpenSim.Framework.Tests BannedHostNameMask = string.Empty, BannedUserID = bannedUserId} ); - Assert.IsTrue(es.IsBanned(bannedUserId), "User Should be banned but is not."); - Assert.IsFalse(es.IsBanned(UUID.Zero), "User Should not be banned but is."); + Assert.IsTrue(es.IsBanned(bannedUserId, 32), "User Should be banned but is not."); + Assert.IsFalse(es.IsBanned(UUID.Zero, 32), "User Should not be banned but is."); es.RemoveBan(bannedUserId); - Assert.IsFalse(es.IsBanned(bannedUserId), "User Should not be banned but is."); + Assert.IsFalse(es.IsBanned(bannedUserId, 32), "User Should not be banned but is."); es.AddEstateManager(UUID.Zero); diff --git a/OpenSim/Framework/Util.cs b/OpenSim/Framework/Util.cs index cef756c66b..96292fff2e 100644 --- a/OpenSim/Framework/Util.cs +++ b/OpenSim/Framework/Util.cs @@ -409,19 +409,25 @@ namespace OpenSim.Framework /// /// /// + public static string Md5Hash(string data) { - byte[] dataMd5 = ComputeMD5Hash(data); + return Md5Hash(data, Encoding.Default); + } + + public static string Md5Hash(string data, Encoding encoding) + { + byte[] dataMd5 = ComputeMD5Hash(data, encoding); StringBuilder sb = new StringBuilder(); for (int i = 0; i < dataMd5.Length; i++) sb.AppendFormat("{0:x2}", dataMd5[i]); return sb.ToString(); } - private static byte[] ComputeMD5Hash(string data) + private static byte[] ComputeMD5Hash(string data, Encoding encoding) { MD5 md5 = MD5.Create(); - return md5.ComputeHash(Encoding.Default.GetBytes(data)); + return md5.ComputeHash(encoding.GetBytes(data)); } /// @@ -429,16 +435,22 @@ namespace OpenSim.Framework /// /// /// + public static string SHA1Hash(string data) { - byte[] hash = ComputeSHA1Hash(data); + return SHA1Hash(data, Encoding.Default); + } + + public static string SHA1Hash(string data, Encoding encoding) + { + byte[] hash = ComputeSHA1Hash(data, encoding); return BitConverter.ToString(hash).Replace("-", String.Empty); } - private static byte[] ComputeSHA1Hash(string src) + private static byte[] ComputeSHA1Hash(string src, Encoding encoding) { SHA1CryptoServiceProvider SHA1 = new SHA1CryptoServiceProvider(); - return SHA1.ComputeHash(Encoding.Default.GetBytes(src)); + return SHA1.ComputeHash(encoding.GetBytes(src)); } public static int fast_distance2d(int x, int y) @@ -1161,7 +1173,7 @@ namespace OpenSim.Framework public static Guid GetHashGuid(string data, string salt) { - byte[] hash = ComputeMD5Hash(data + salt); + byte[] hash = ComputeMD5Hash(data + salt, Encoding.Default); //string s = BitConverter.ToString(hash); diff --git a/OpenSim/Region/CoreModules/Agent/Capabilities/CapabilitiesModule.cs b/OpenSim/Region/CoreModules/Agent/Capabilities/CapabilitiesModule.cs index c023a6f738..5c5cb70e28 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 public void AddCapsHandler(UUID agentId) { - if (m_scene.RegionInfo.EstateSettings.IsBanned(agentId)) + int flags = m_scene.GetUserFlags(agentId); + if (m_scene.RegionInfo.EstateSettings.IsBanned(agentId, flags)) return; String capsObjectPath = GetCapsPath(agentId); diff --git a/OpenSim/Region/Framework/Scenes/Scene.cs b/OpenSim/Region/Framework/Scenes/Scene.cs index fc4110b41e..6a5f84aca3 100644 --- a/OpenSim/Region/Framework/Scenes/Scene.cs +++ b/OpenSim/Region/Framework/Scenes/Scene.cs @@ -2443,7 +2443,8 @@ namespace OpenSim.Region.Framework.Scenes // If the user is banned, we won't let any of their objects // enter. Period. // - if (m_regInfo.EstateSettings.IsBanned(sceneObject.OwnerID)) + int flags = GetUserFlags(sceneObject.OwnerID); + if (m_regInfo.EstateSettings.IsBanned(sceneObject.OwnerID, flags)) { m_log.Info("[INTERREGION]: Denied prim crossing for " + "banned avatar"); @@ -2547,6 +2548,22 @@ namespace OpenSim.Region.Framework.Scenes return 2; // StateSource.PrimCrossing } + public int GetUserFlags(UUID user) + { + //Unfortunately the SP approach means that the value is cached until region is restarted + /* + ScenePresence sp; + if (TryGetScenePresence(user, out sp)) + { + return sp.UserFlags; + } + else + { + */ + UserAccount uac = UserAccountService.GetUserAccount(RegionInfo.ScopeID, user); + return uac.UserFlags; + //} + } #endregion #region Add/Remove Avatar Methods @@ -3626,10 +3643,26 @@ namespace OpenSim.Region.Framework.Scenes if (m_regInfo.EstateSettings != null) { - if (m_regInfo.EstateSettings.IsBanned(agentID)) + int flags = GetUserFlags(agent.AgentID); + if (m_regInfo.EstateSettings.IsBanned(agentID, flags)) { - m_log.WarnFormat("[CONNECTION BEGIN]: Denied access to: {0} at {1} because the user is on the banlist", + //Add some more info to help users + if (!m_regInfo.EstateSettings.IsBanned(agentID, 32)) + { + m_log.WarnFormat("[CONNECTION BEGIN]: Denied access to: {0} at {1} because the region requires age verification", agentID, RegionInfo.RegionName); + reason = String.Format("Denied access to region {0}: Region requires age verification", RegionInfo.RegionName); + return false; + } + if (!m_regInfo.EstateSettings.IsBanned(agentID, 4)) + { + m_log.WarnFormat("[CONNECTION BEGIN]: Denied access to: {0} {1} because the region requires payment info on file", + agent.AgentID, agent.firstname, agent.lastname, RegionInfo.RegionName); + reason = String.Format("Denied access to region {0}: Region requires payment info on file", RegionInfo.RegionName); + return false; + } + m_log.WarnFormat("[CONNECTION BEGIN]: Denied access to: {0} at {3} because the user is on the banlist", + agent.AgentID, RegionInfo.RegionName); reason = String.Format("Denied access to region {0}: You have been banned from that region.", RegionInfo.RegionName); return false; @@ -3788,7 +3821,8 @@ namespace OpenSim.Region.Framework.Scenes // We have to wait until the viewer contacts this region after receiving EAC. // That calls AddNewClient, which finally creates the ScenePresence - if (m_regInfo.EstateSettings.IsBanned(cAgentData.AgentID)) + int flags = GetUserFlags(cAgentData.AgentID); + if (m_regInfo.EstateSettings.IsBanned(cAgentData.AgentID, flags)) { m_log.DebugFormat("[SCENE]: Denying root agent entry to {0}: banned", cAgentData.AgentID); return false; diff --git a/OpenSim/Region/Framework/Scenes/ScenePresence.cs b/OpenSim/Region/Framework/Scenes/ScenePresence.cs index 6a3983faa5..c4ae0f0758 100644 --- a/OpenSim/Region/Framework/Scenes/ScenePresence.cs +++ b/OpenSim/Region/Framework/Scenes/ScenePresence.cs @@ -113,6 +113,7 @@ namespace OpenSim.Region.Framework.Scenes { get { return m_attachments; } } + protected List m_attachments = new List(); private Dictionary scriptedcontrols = new Dictionary(); @@ -136,6 +137,12 @@ namespace OpenSim.Region.Framework.Scenes private bool m_updateflag; private byte m_movementflag; private Vector3? m_forceToApply; + private int m_userFlags; + public int UserFlags + { + get { return m_userFlags; } + } + private uint m_requestedSitTargetID; private UUID m_requestedSitTargetUUID; public bool SitGround = false; @@ -763,6 +770,7 @@ namespace OpenSim.Region.Framework.Scenes m_localId = m_scene.AllocateLocalId(); UserAccount account = m_scene.UserAccountService.GetUserAccount(m_scene.RegionInfo.ScopeID, m_uuid); + m_userFlags = account.UserFlags; if (account != null) 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 dffc0bdb51..f5b7f5f5cb 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 public LSL_String llMD5String(string src, int nonce) { m_host.AddScriptLPS(1); - return Util.Md5Hash(String.Format("{0}:{1}", src, nonce.ToString())); + return Util.Md5Hash(String.Format("{0}:{1}", src, nonce.ToString()), Encoding.UTF8); } public LSL_String llSHA1String(string src) { m_host.AddScriptLPS(1); - return Util.SHA1Hash(src).ToLower(); + return Util.SHA1Hash(src, Encoding.UTF8).ToLower(); } protected ObjectShapePacket.ObjectDataBlock SetPrimitiveBlockShapeParams(SceneObjectPart part, int holeshape, LSL_Vector cut, float hollow, LSL_Vector twist)