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)