mirror of
https://github.com/opensim/opensim.git
synced 2026-08-06 17:32:42 +08:00
Merge branch 'master' into careminster
Conflicts: OpenSim/Region/Framework/Scenes/Scene.cs
This commit is contained in:
@@ -58,9 +58,11 @@ namespace OpenSim.Services.HypergridService
|
||||
private static IUserAgentService m_UserAgentService;
|
||||
private static ISimulationService m_SimulationService;
|
||||
|
||||
protected string m_AllowedClients = string.Empty;
|
||||
protected string m_DeniedClients = string.Empty;
|
||||
private static string m_AllowedClients = string.Empty;
|
||||
private static string m_DeniedClients = string.Empty;
|
||||
private static bool m_ForeignAgentsAllowed = true;
|
||||
private static List<string> m_ForeignsAllowedExceptions = new List<string>();
|
||||
private static List<string> m_ForeignsDisallowedExceptions = new List<string>();
|
||||
|
||||
private static UUID m_ScopeID;
|
||||
private static bool m_AllowTeleportsToAnyRegion;
|
||||
@@ -113,6 +115,9 @@ namespace OpenSim.Services.HypergridService
|
||||
m_DeniedClients = serverConfig.GetString("DeniedClients", string.Empty);
|
||||
m_ForeignAgentsAllowed = serverConfig.GetBoolean("ForeignAgentsAllowed", true);
|
||||
|
||||
LoadDomainExceptionsFromConfig(serverConfig, "AllowExcept", m_ForeignsAllowedExceptions);
|
||||
LoadDomainExceptionsFromConfig(serverConfig, "DisallowExcept", m_ForeignsDisallowedExceptions);
|
||||
|
||||
if (m_GridService == null || m_PresenceService == null || m_SimulationService == null)
|
||||
throw new Exception("Unable to load a required plugin, Gatekeeper Service cannot function.");
|
||||
|
||||
@@ -125,6 +130,15 @@ namespace OpenSim.Services.HypergridService
|
||||
{
|
||||
}
|
||||
|
||||
protected void LoadDomainExceptionsFromConfig(IConfig config, string variable, List<string> exceptions)
|
||||
{
|
||||
string value = config.GetString(variable, string.Empty);
|
||||
string[] parts = value.Split(new char[] { ',' }, StringSplitOptions.RemoveEmptyEntries);
|
||||
|
||||
foreach (string s in parts)
|
||||
exceptions.Add(s.Trim());
|
||||
}
|
||||
|
||||
public bool LinkRegion(string regionName, out UUID regionID, out ulong regionHandle, out string externalName, out string imageURL, out string reason)
|
||||
{
|
||||
regionID = UUID.Zero;
|
||||
@@ -260,14 +274,25 @@ namespace OpenSim.Services.HypergridService
|
||||
m_log.DebugFormat("[GATEKEEPER SERVICE]: User is ok");
|
||||
|
||||
//
|
||||
// Foreign agents allowed
|
||||
// Foreign agents allowed? Exceptions?
|
||||
//
|
||||
if (account == null && !m_ForeignAgentsAllowed)
|
||||
if (account == null)
|
||||
{
|
||||
reason = "Unauthorized";
|
||||
m_log.InfoFormat("[GATEKEEPER SERVICE]: Foreign agents are not permitted {0} {1}. Refusing service.",
|
||||
aCircuit.firstname, aCircuit.lastname);
|
||||
return false;
|
||||
bool allowed = m_ForeignAgentsAllowed;
|
||||
|
||||
if (m_ForeignAgentsAllowed && IsException(aCircuit, m_ForeignsAllowedExceptions))
|
||||
allowed = false;
|
||||
|
||||
if (!m_ForeignAgentsAllowed && IsException(aCircuit, m_ForeignsDisallowedExceptions))
|
||||
allowed = true;
|
||||
|
||||
if (!allowed)
|
||||
{
|
||||
reason = "Destination does not allow visitors from your world";
|
||||
m_log.InfoFormat("[GATEKEEPER SERVICE]: Foreign agents are not permitted {0} {1} @ {2}. Refusing service.",
|
||||
aCircuit.firstname, aCircuit.lastname, aCircuit.ServiceURLs["HomeURI"]);
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
// May want to authorize
|
||||
@@ -393,6 +418,27 @@ namespace OpenSim.Services.HypergridService
|
||||
|
||||
#region Misc
|
||||
|
||||
private bool IsException(AgentCircuitData aCircuit, List<string> exceptions)
|
||||
{
|
||||
bool exception = false;
|
||||
if (exceptions.Count > 0) // we have exceptions
|
||||
{
|
||||
// Retrieve the visitor's origin
|
||||
string userURL = aCircuit.ServiceURLs["HomeURI"].ToString();
|
||||
if (!userURL.EndsWith("/"))
|
||||
userURL += "/";
|
||||
|
||||
if (exceptions.Find(delegate(string s)
|
||||
{
|
||||
if (!s.EndsWith("/"))
|
||||
s += "/";
|
||||
return s == userURL;
|
||||
}) != null)
|
||||
exception = true;
|
||||
}
|
||||
|
||||
return exception;
|
||||
}
|
||||
|
||||
#endregion
|
||||
}
|
||||
|
||||
@@ -58,6 +58,8 @@ namespace OpenSim.Services.HypergridService
|
||||
|
||||
private UserAccountCache m_Cache;
|
||||
|
||||
private AssetPermissions m_AssetPerms;
|
||||
|
||||
public HGAssetService(IConfigSource config, string configName) : base(config, configName)
|
||||
{
|
||||
m_log.Debug("[HGAsset Service]: Starting");
|
||||
@@ -80,6 +82,10 @@ namespace OpenSim.Services.HypergridService
|
||||
m_HomeURL = assetConfig.GetString("HomeURI", m_HomeURL);
|
||||
|
||||
m_Cache = UserAccountCache.CreateUserAccountCache(m_UserAccountService);
|
||||
|
||||
// Permissions
|
||||
m_AssetPerms = new AssetPermissions(assetConfig);
|
||||
|
||||
}
|
||||
|
||||
#region IAssetService overrides
|
||||
@@ -90,6 +96,9 @@ namespace OpenSim.Services.HypergridService
|
||||
if (asset == null)
|
||||
return null;
|
||||
|
||||
if (!m_AssetPerms.AllowedExport(asset.Type))
|
||||
return null;
|
||||
|
||||
if (asset.Metadata.Type == (sbyte)AssetType.Object)
|
||||
asset.Data = AdjustIdentifiers(asset.Data); ;
|
||||
|
||||
@@ -112,16 +121,27 @@ namespace OpenSim.Services.HypergridService
|
||||
|
||||
public override byte[] GetData(string id)
|
||||
{
|
||||
byte[] data = base.GetData(id);
|
||||
AssetBase asset = Get(id);
|
||||
|
||||
if (data == null)
|
||||
if (asset == null)
|
||||
return null;
|
||||
|
||||
return AdjustIdentifiers(data);
|
||||
if (!m_AssetPerms.AllowedExport(asset.Type))
|
||||
return null;
|
||||
|
||||
return asset.Data;
|
||||
}
|
||||
|
||||
//public virtual bool Get(string id, Object sender, AssetRetrieved handler)
|
||||
|
||||
public override string Store(AssetBase asset)
|
||||
{
|
||||
if (!m_AssetPerms.AllowedImport(asset.Type))
|
||||
return string.Empty;
|
||||
|
||||
return base.Store(asset);
|
||||
}
|
||||
|
||||
public override bool Delete(string id)
|
||||
{
|
||||
// NOGO
|
||||
|
||||
@@ -77,6 +77,10 @@ namespace OpenSim.Services.HypergridService
|
||||
|
||||
protected static bool m_BypassClientVerification;
|
||||
|
||||
private static Dictionary<int, bool> m_ForeignTripsAllowed = new Dictionary<int, bool>();
|
||||
private static Dictionary<int, List<string>> m_TripsAllowedExceptions = new Dictionary<int, List<string>>();
|
||||
private static Dictionary<int, List<string>> m_TripsDisallowedExceptions = new Dictionary<int, List<string>>();
|
||||
|
||||
public UserAgentService(IConfigSource config) : this(config, null)
|
||||
{
|
||||
}
|
||||
@@ -121,6 +125,12 @@ namespace OpenSim.Services.HypergridService
|
||||
m_PresenceService = ServerUtils.LoadPlugin<IPresenceService>(presenceService, args);
|
||||
m_UserAccountService = ServerUtils.LoadPlugin<IUserAccountService>(userAccountService, args);
|
||||
|
||||
m_LevelOutsideContacts = serverConfig.GetInt("LevelOutsideContacts", 0);
|
||||
|
||||
LoadTripPermissionsFromConfig(serverConfig, "ForeignTripsAllowed");
|
||||
LoadDomainExceptionsFromConfig(serverConfig, "AllowExcept", m_TripsAllowedExceptions);
|
||||
LoadDomainExceptionsFromConfig(serverConfig, "DisallowExcept", m_TripsDisallowedExceptions);
|
||||
|
||||
m_GridName = serverConfig.GetString("ExternalName", string.Empty);
|
||||
if (m_GridName == string.Empty)
|
||||
{
|
||||
@@ -130,10 +140,43 @@ namespace OpenSim.Services.HypergridService
|
||||
if (!m_GridName.EndsWith("/"))
|
||||
m_GridName = m_GridName + "/";
|
||||
|
||||
m_LevelOutsideContacts = serverConfig.GetInt("LevelOutsideContacts", 0);
|
||||
}
|
||||
}
|
||||
|
||||
protected void LoadTripPermissionsFromConfig(IConfig config, string variable)
|
||||
{
|
||||
foreach (string keyName in config.GetKeys())
|
||||
{
|
||||
if (keyName.StartsWith(variable + "_Level_"))
|
||||
{
|
||||
int level = 0;
|
||||
if (Int32.TryParse(keyName.Replace(variable + "_Level_", ""), out level))
|
||||
m_ForeignTripsAllowed.Add(level, config.GetBoolean(keyName, true));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
protected void LoadDomainExceptionsFromConfig(IConfig config, string variable, Dictionary<int, List<string>> exceptions)
|
||||
{
|
||||
foreach (string keyName in config.GetKeys())
|
||||
{
|
||||
if (keyName.StartsWith(variable + "_Level_"))
|
||||
{
|
||||
int level = 0;
|
||||
if (Int32.TryParse(keyName.Replace(variable + "_Level_", ""), out level) && !exceptions.ContainsKey(level))
|
||||
{
|
||||
exceptions.Add(level, new List<string>());
|
||||
string value = config.GetString(keyName, string.Empty);
|
||||
string[] parts = value.Split(new char[] { ',' }, StringSplitOptions.RemoveEmptyEntries);
|
||||
|
||||
foreach (string s in parts)
|
||||
exceptions[level].Add(s.Trim());
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
public GridRegion GetHomeRegion(UUID userID, out Vector3 position, out Vector3 lookAt)
|
||||
{
|
||||
position = new Vector3(128, 128, 0); lookAt = Vector3.UnitY;
|
||||
@@ -166,13 +209,39 @@ namespace OpenSim.Services.HypergridService
|
||||
m_log.DebugFormat("[USER AGENT SERVICE]: Request to login user {0} {1} (@{2}) to grid {3}",
|
||||
agentCircuit.firstname, agentCircuit.lastname, ((clientIP == null) ? "stored IP" : clientIP.Address.ToString()), gatekeeper.ServerURI);
|
||||
|
||||
if (m_UserAccountService.GetUserAccount(UUID.Zero, agentCircuit.AgentID) == null)
|
||||
string gridName = gatekeeper.ServerURI;
|
||||
|
||||
UserAccount account = m_UserAccountService.GetUserAccount(UUID.Zero, agentCircuit.AgentID);
|
||||
if (account == null)
|
||||
{
|
||||
m_log.WarnFormat("[USER AGENT SERVICE]: Someone attempted to lauch a foreign user from here {0} {1}", agentCircuit.firstname, agentCircuit.lastname);
|
||||
reason = "Forbidden to launch your agents from here";
|
||||
return false;
|
||||
}
|
||||
|
||||
// Is this user allowed to go there?
|
||||
if (m_GridName != gridName)
|
||||
{
|
||||
if (m_ForeignTripsAllowed.ContainsKey(account.UserLevel))
|
||||
{
|
||||
bool allowed = m_ForeignTripsAllowed[account.UserLevel];
|
||||
|
||||
if (m_ForeignTripsAllowed[account.UserLevel] && IsException(gridName, account.UserLevel, m_TripsAllowedExceptions))
|
||||
allowed = false;
|
||||
|
||||
if (!m_ForeignTripsAllowed[account.UserLevel] && IsException(gridName, account.UserLevel, m_TripsDisallowedExceptions))
|
||||
allowed = true;
|
||||
|
||||
if (!allowed)
|
||||
{
|
||||
reason = "Your world does not allow you to visit the destination";
|
||||
m_log.InfoFormat("[USER AGENT SERVICE]: Agents not permitted to visit {0}. Refusing service.", gridName);
|
||||
return false;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
// Take the IP address + port of the gatekeeper (reg) plus the info of finalDestination
|
||||
GridRegion region = new GridRegion(gatekeeper);
|
||||
region.ServerURI = gatekeeper.ServerURI;
|
||||
@@ -189,7 +258,6 @@ namespace OpenSim.Services.HypergridService
|
||||
|
||||
bool success = false;
|
||||
string myExternalIP = string.Empty;
|
||||
string gridName = gatekeeper.ServerURI;
|
||||
|
||||
m_log.DebugFormat("[USER AGENT SERVICE]: this grid: {0}, desired grid: {1}", m_GridName, gridName);
|
||||
|
||||
@@ -586,6 +654,35 @@ namespace OpenSim.Services.HypergridService
|
||||
else
|
||||
return UUID.Zero;
|
||||
}
|
||||
|
||||
#region Misc
|
||||
|
||||
private bool IsException(string dest, int level, Dictionary<int, List<string>> exceptions)
|
||||
{
|
||||
if (!exceptions.ContainsKey(level))
|
||||
return false;
|
||||
|
||||
bool exception = false;
|
||||
if (exceptions[level].Count > 0) // we have exceptions
|
||||
{
|
||||
string destination = dest;
|
||||
if (!destination.EndsWith("/"))
|
||||
destination += "/";
|
||||
|
||||
if (exceptions[level].Find(delegate(string s)
|
||||
{
|
||||
if (!s.EndsWith("/"))
|
||||
s += "/";
|
||||
return s == destination;
|
||||
}) != null)
|
||||
exception = true;
|
||||
}
|
||||
|
||||
return exception;
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
}
|
||||
|
||||
class TravelingAgentInfo
|
||||
|
||||
Reference in New Issue
Block a user