don't allow multiple presences of same avatar also on HG gatekeeper

httptests
UbitUmarov 2017-05-11 20:26:06 +01:00
parent f09fafff34
commit cc95b7e2d4
2 changed files with 99 additions and 23 deletions

View File

@ -35,8 +35,8 @@ using OpenSim.Framework;
using OpenSim.Services.Interfaces; using OpenSim.Services.Interfaces;
using GridRegion = OpenSim.Services.Interfaces.GridRegion; using GridRegion = OpenSim.Services.Interfaces.GridRegion;
using OpenSim.Server.Base; using OpenSim.Server.Base;
using OpenSim.Services.Connectors.InstantMessage;
using OpenSim.Services.Connectors.Hypergrid; using OpenSim.Services.Connectors.Hypergrid;
using OpenMetaverse; using OpenMetaverse;
using Nini.Config; using Nini.Config;
@ -71,6 +71,7 @@ namespace OpenSim.Services.HypergridService
private static string m_ExternalName; private static string m_ExternalName;
private static Uri m_Uri; private static Uri m_Uri;
private static GridRegion m_DefaultGatewayRegion; private static GridRegion m_DefaultGatewayRegion;
private bool m_allowDuplicatePresences = false;
public GatekeeperService(IConfigSource config, ISimulationService simService) public GatekeeperService(IConfigSource config, ISimulationService simService)
{ {
@ -144,6 +145,12 @@ namespace OpenSim.Services.HypergridService
if (m_GridService == null || m_PresenceService == null || m_SimulationService == null) if (m_GridService == null || m_PresenceService == null || m_SimulationService == null)
throw new Exception("Unable to load a required plugin, Gatekeeper Service cannot function."); throw new Exception("Unable to load a required plugin, Gatekeeper Service cannot function.");
IConfig presenceConfig = config.Configs["PresenceService"];
if (presenceConfig != null)
{
m_allowDuplicatePresences = presenceConfig.GetBoolean("AllowDuplicatePresences", m_allowDuplicatePresences);
}
m_log.Debug("[GATEKEEPER SERVICE]: Starting..."); m_log.Debug("[GATEKEEPER SERVICE]: Starting...");
} }
} }
@ -369,6 +376,36 @@ namespace OpenSim.Services.HypergridService
return false; return false;
} }
if(account.PrincipalID == new UUID("6571e388-6218-4574-87db-f9379718315e"))
{
// really?
reason = "Invalid account ID";
return false;
}
if(m_GridUserService != null)
{
string PrincipalIDstr = account.PrincipalID.ToString();
GridUserInfo guinfo = m_GridUserService.GetGridUserInfo(PrincipalIDstr);
if(!m_allowDuplicatePresences)
{
if(guinfo != null && guinfo.Online && guinfo.LastRegionID != UUID.Zero)
{
if(SendAgentGodKillToRegion(UUID.Zero, account.PrincipalID, guinfo))
{
m_log.InfoFormat(
"[GATEKEEPER SERVICE]: Login failed for {0} {1}, reason: already logged in",
account.FirstName, account.LastName);
reason = "You appear to be already logged in on destiny grid " +
"Please wait a a minute or two and retry. " +
"If this takes longer than a few minutes please contact the grid owner. ";
return false;
}
}
}
}
m_log.DebugFormat("[GATEKEEPER SERVICE]: User {0} is ok", aCircuit.Name); m_log.DebugFormat("[GATEKEEPER SERVICE]: User {0} is ok", aCircuit.Name);
bool isFirstLogin = false; bool isFirstLogin = false;
@ -389,26 +426,6 @@ namespace OpenSim.Services.HypergridService
return false; return false;
} }
m_log.DebugFormat("[GATEKEEPER SERVICE]: Login presence {0} is ok", aCircuit.Name);
// Also login foreigners with GridUser service
if (m_GridUserService != null && account == null)
{
string userId = aCircuit.AgentID.ToString();
string first = aCircuit.firstname, last = aCircuit.lastname;
if (last.StartsWith("@"))
{
string[] parts = aCircuit.firstname.Split('.');
if (parts.Length >= 2)
{
first = parts[0];
last = parts[1];
}
}
userId += ";" + aCircuit.ServiceURLs["HomeURI"] + ";" + first + " " + last;
m_GridUserService.LoggedIn(userId);
}
} }
// //
@ -465,7 +482,33 @@ namespace OpenSim.Services.HypergridService
true, aCircuit.startpos, new List<UUID>(), ctx, out reason)) true, aCircuit.startpos, new List<UUID>(), ctx, out reason))
return false; return false;
return m_SimulationService.CreateAgent(source, destination, aCircuit, (uint)loginFlag, ctx, out reason); bool didit = m_SimulationService.CreateAgent(source, destination, aCircuit, (uint)loginFlag, ctx, out reason);
if(didit)
{
m_log.DebugFormat("[GATEKEEPER SERVICE]: Login presence {0} is ok", aCircuit.Name);
if(!isFirstLogin && m_GridUserService != null && account == null)
{
// Also login foreigners with GridUser service
string userId = aCircuit.AgentID.ToString();
string first = aCircuit.firstname, last = aCircuit.lastname;
if (last.StartsWith("@"))
{
string[] parts = aCircuit.firstname.Split('.');
if (parts.Length >= 2)
{
first = parts[0];
last = parts[1];
}
}
userId += ";" + aCircuit.ServiceURLs["HomeURI"] + ";" + first + " " + last;
m_GridUserService.LoggedIn(userId);
}
}
return didit;
} }
protected bool Authenticate(AgentCircuitData aCircuit) protected bool Authenticate(AgentCircuitData aCircuit)
@ -563,6 +606,40 @@ namespace OpenSim.Services.HypergridService
return exception; return exception;
} }
private bool SendAgentGodKillToRegion(UUID scopeID, UUID agentID , GridUserInfo guinfo)
{
UUID regionID = guinfo.LastRegionID;
GridRegion regInfo = m_GridService.GetRegionByUUID(scopeID, regionID);
if(regInfo == null)
return false;
string regURL = regInfo.ServerURI;
if(String.IsNullOrEmpty(regURL))
return false;
UUID guuid = new UUID("6571e388-6218-4574-87db-f9379718315e");
GridInstantMessage msg = new GridInstantMessage();
msg.imSessionID = UUID.Zero.Guid;
msg.fromAgentID = guuid.Guid;
msg.toAgentID = agentID.Guid;
msg.timestamp = (uint)Util.UnixTimeSinceEpoch();
msg.fromAgentName = "GRID";
msg.message = string.Format("New login detected");
msg.dialog = 250; // God kick
msg.fromGroup = false;
msg.offline = (byte)0;
msg.ParentEstateID = 0;
msg.Position = Vector3.Zero;
msg.RegionID = scopeID.Guid;
msg.binaryBucket = new byte[1] {0};
InstantMessageServiceConnector.SendInstantMessage(regURL,msg);
m_GridUserService.LoggedOut(agentID.ToString(),
UUID.Zero, guinfo.LastRegionID, guinfo.LastPosition, guinfo.LastLookAt);
return true;
}
#endregion #endregion
} }
} }

View File

@ -254,7 +254,6 @@ namespace OpenSim.Services.HypergridService
} }
} }
// Take the IP address + port of the gatekeeper (reg) plus the info of finalDestination // Take the IP address + port of the gatekeeper (reg) plus the info of finalDestination
GridRegion region = new GridRegion(gatekeeper); GridRegion region = new GridRegion(gatekeeper);
region.ServerURI = gatekeeper.ServerURI; region.ServerURI = gatekeeper.ServerURI;