From 6ea95a329451c803048f179abb4b4ea5014dd7b1 Mon Sep 17 00:00:00 2001 From: Melanie Date: Sat, 25 Aug 2012 17:32:00 +0100 Subject: Fix and refactor region registration. Reorder checks to short-curcuit expensive and destructive ones. Properly fix region reservation and authentication. Make region moves and flags preservation work again as intended. Prevent failes reservation take-over from damging reservation data. --- OpenSim/Services/GridService/GridService.cs | 53 +++++++++++++++-------------- 1 file changed, 28 insertions(+), 25 deletions(-) (limited to 'OpenSim/Services/GridService') diff --git a/OpenSim/Services/GridService/GridService.cs b/OpenSim/Services/GridService/GridService.cs index aab403a..5bdea06 100644 --- a/OpenSim/Services/GridService/GridService.cs +++ b/OpenSim/Services/GridService/GridService.cs @@ -137,9 +137,14 @@ namespace OpenSim.Services.GridService if (regionInfos.RegionID == UUID.Zero) return "Invalid RegionID - cannot be zero UUID"; - // This needs better sanity testing. What if regionInfo is registering in - // overlapping coords? RegionData region = m_Database.Get(regionInfos.RegionLocX, regionInfos.RegionLocY, scopeID); + if ((region != null) && (region.RegionID != regionInfos.RegionID)) + { + m_log.WarnFormat("[GRID SERVICE]: Region {0} tried to register in coordinates {1}, {2} which are already in use in scope {3}.", + regionInfos.RegionID, regionInfos.RegionLocX, regionInfos.RegionLocY, scopeID); + return "Region overlaps another region"; + } + if (region != null) { // There is a preexisting record @@ -176,19 +181,36 @@ namespace OpenSim.Services.GridService } } - if ((region != null) && (region.RegionID != regionInfos.RegionID)) + // If we get here, the destination is clear. Now for the real check. + + if (!m_AllowDuplicateNames) { - m_log.WarnFormat("[GRID SERVICE]: Region {0} tried to register in coordinates {1}, {2} which are already in use in scope {3}.", - regionInfos.RegionID, regionInfos.RegionLocX, regionInfos.RegionLocY, scopeID); - return "Region overlaps another region"; + List dupe = m_Database.Get(regionInfos.RegionName, scopeID); + if (dupe != null && dupe.Count > 0) + { + foreach (RegionData d in dupe) + { + if (d.RegionID != regionInfos.RegionID) + { + m_log.WarnFormat("[GRID SERVICE]: Region {0} tried to register duplicate name with ID {1}.", + regionInfos.RegionName, regionInfos.RegionID); + return "Duplicate region name"; + } + } + } } + // If there is an old record for us, delete it if it is elsewhere. + region = m_Database.Get(regionInfos.RegionID, scopeID); if ((region != null) && (region.RegionID == regionInfos.RegionID) && ((region.posX != regionInfos.RegionLocX) || (region.posY != regionInfos.RegionLocY))) { if ((Convert.ToInt32(region.Data["flags"]) & (int)OpenSim.Data.RegionFlags.NoMove) != 0) return "Can't move this region"; + if ((Convert.ToInt32(region.Data["flags"]) & (int)OpenSim.Data.RegionFlags.LockedOut) != 0) + return "Region locked out"; + // Region reregistering in other coordinates. Delete the old entry m_log.DebugFormat("[GRID SERVICE]: Region {0} ({1}) was previously registered at {2}-{3}. Deleting old entry.", regionInfos.RegionName, regionInfos.RegionID, regionInfos.RegionLocX, regionInfos.RegionLocY); @@ -203,23 +225,6 @@ namespace OpenSim.Services.GridService } } - if (!m_AllowDuplicateNames) - { - List dupe = m_Database.Get(regionInfos.RegionName, scopeID); - if (dupe != null && dupe.Count > 0) - { - foreach (RegionData d in dupe) - { - if (d.RegionID != regionInfos.RegionID) - { - m_log.WarnFormat("[GRID SERVICE]: Region {0} tried to register duplicate name with ID {1}.", - regionInfos.RegionName, regionInfos.RegionID); - return "Duplicate region name"; - } - } - } - } - // Everything is ok, let's register RegionData rdata = RegionInfo2RegionData(regionInfos); rdata.ScopeID = scopeID; @@ -227,8 +232,6 @@ namespace OpenSim.Services.GridService if (region != null) { int oldFlags = Convert.ToInt32(region.Data["flags"]); - if ((oldFlags & (int)OpenSim.Data.RegionFlags.LockedOut) != 0) - return "Region locked out"; oldFlags &= ~(int)OpenSim.Data.RegionFlags.Reservation; -- cgit v1.1