diff options
author | Melanie | 2012-08-25 17:32:00 +0100 |
---|---|---|
committer | Melanie | 2012-08-25 17:32:00 +0100 |
commit | 6ea95a329451c803048f179abb4b4ea5014dd7b1 (patch) | |
tree | 2c88248fd82ee521843100abc170a5c4112e0600 | |
parent | stripping superfluous whitespace (diff) | |
download | opensim-SC-6ea95a329451c803048f179abb4b4ea5014dd7b1.zip opensim-SC-6ea95a329451c803048f179abb4b4ea5014dd7b1.tar.gz opensim-SC-6ea95a329451c803048f179abb4b4ea5014dd7b1.tar.bz2 opensim-SC-6ea95a329451c803048f179abb4b4ea5014dd7b1.tar.xz |
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.
-rw-r--r-- | OpenSim/Services/GridService/GridService.cs | 53 |
1 files changed, 28 insertions, 25 deletions
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 | |||
137 | if (regionInfos.RegionID == UUID.Zero) | 137 | if (regionInfos.RegionID == UUID.Zero) |
138 | return "Invalid RegionID - cannot be zero UUID"; | 138 | return "Invalid RegionID - cannot be zero UUID"; |
139 | 139 | ||
140 | // This needs better sanity testing. What if regionInfo is registering in | ||
141 | // overlapping coords? | ||
142 | RegionData region = m_Database.Get(regionInfos.RegionLocX, regionInfos.RegionLocY, scopeID); | 140 | RegionData region = m_Database.Get(regionInfos.RegionLocX, regionInfos.RegionLocY, scopeID); |
141 | if ((region != null) && (region.RegionID != regionInfos.RegionID)) | ||
142 | { | ||
143 | m_log.WarnFormat("[GRID SERVICE]: Region {0} tried to register in coordinates {1}, {2} which are already in use in scope {3}.", | ||
144 | regionInfos.RegionID, regionInfos.RegionLocX, regionInfos.RegionLocY, scopeID); | ||
145 | return "Region overlaps another region"; | ||
146 | } | ||
147 | |||
143 | if (region != null) | 148 | if (region != null) |
144 | { | 149 | { |
145 | // There is a preexisting record | 150 | // There is a preexisting record |
@@ -176,19 +181,36 @@ namespace OpenSim.Services.GridService | |||
176 | } | 181 | } |
177 | } | 182 | } |
178 | 183 | ||
179 | if ((region != null) && (region.RegionID != regionInfos.RegionID)) | 184 | // If we get here, the destination is clear. Now for the real check. |
185 | |||
186 | if (!m_AllowDuplicateNames) | ||
180 | { | 187 | { |
181 | m_log.WarnFormat("[GRID SERVICE]: Region {0} tried to register in coordinates {1}, {2} which are already in use in scope {3}.", | 188 | List<RegionData> dupe = m_Database.Get(regionInfos.RegionName, scopeID); |
182 | regionInfos.RegionID, regionInfos.RegionLocX, regionInfos.RegionLocY, scopeID); | 189 | if (dupe != null && dupe.Count > 0) |
183 | return "Region overlaps another region"; | 190 | { |
191 | foreach (RegionData d in dupe) | ||
192 | { | ||
193 | if (d.RegionID != regionInfos.RegionID) | ||
194 | { | ||
195 | m_log.WarnFormat("[GRID SERVICE]: Region {0} tried to register duplicate name with ID {1}.", | ||
196 | regionInfos.RegionName, regionInfos.RegionID); | ||
197 | return "Duplicate region name"; | ||
198 | } | ||
199 | } | ||
200 | } | ||
184 | } | 201 | } |
185 | 202 | ||
203 | // If there is an old record for us, delete it if it is elsewhere. | ||
204 | region = m_Database.Get(regionInfos.RegionID, scopeID); | ||
186 | if ((region != null) && (region.RegionID == regionInfos.RegionID) && | 205 | if ((region != null) && (region.RegionID == regionInfos.RegionID) && |
187 | ((region.posX != regionInfos.RegionLocX) || (region.posY != regionInfos.RegionLocY))) | 206 | ((region.posX != regionInfos.RegionLocX) || (region.posY != regionInfos.RegionLocY))) |
188 | { | 207 | { |
189 | if ((Convert.ToInt32(region.Data["flags"]) & (int)OpenSim.Data.RegionFlags.NoMove) != 0) | 208 | if ((Convert.ToInt32(region.Data["flags"]) & (int)OpenSim.Data.RegionFlags.NoMove) != 0) |
190 | return "Can't move this region"; | 209 | return "Can't move this region"; |
191 | 210 | ||
211 | if ((Convert.ToInt32(region.Data["flags"]) & (int)OpenSim.Data.RegionFlags.LockedOut) != 0) | ||
212 | return "Region locked out"; | ||
213 | |||
192 | // Region reregistering in other coordinates. Delete the old entry | 214 | // Region reregistering in other coordinates. Delete the old entry |
193 | m_log.DebugFormat("[GRID SERVICE]: Region {0} ({1}) was previously registered at {2}-{3}. Deleting old entry.", | 215 | m_log.DebugFormat("[GRID SERVICE]: Region {0} ({1}) was previously registered at {2}-{3}. Deleting old entry.", |
194 | regionInfos.RegionName, regionInfos.RegionID, regionInfos.RegionLocX, regionInfos.RegionLocY); | 216 | regionInfos.RegionName, regionInfos.RegionID, regionInfos.RegionLocX, regionInfos.RegionLocY); |
@@ -203,23 +225,6 @@ namespace OpenSim.Services.GridService | |||
203 | } | 225 | } |
204 | } | 226 | } |
205 | 227 | ||
206 | if (!m_AllowDuplicateNames) | ||
207 | { | ||
208 | List<RegionData> dupe = m_Database.Get(regionInfos.RegionName, scopeID); | ||
209 | if (dupe != null && dupe.Count > 0) | ||
210 | { | ||
211 | foreach (RegionData d in dupe) | ||
212 | { | ||
213 | if (d.RegionID != regionInfos.RegionID) | ||
214 | { | ||
215 | m_log.WarnFormat("[GRID SERVICE]: Region {0} tried to register duplicate name with ID {1}.", | ||
216 | regionInfos.RegionName, regionInfos.RegionID); | ||
217 | return "Duplicate region name"; | ||
218 | } | ||
219 | } | ||
220 | } | ||
221 | } | ||
222 | |||
223 | // Everything is ok, let's register | 228 | // Everything is ok, let's register |
224 | RegionData rdata = RegionInfo2RegionData(regionInfos); | 229 | RegionData rdata = RegionInfo2RegionData(regionInfos); |
225 | rdata.ScopeID = scopeID; | 230 | rdata.ScopeID = scopeID; |
@@ -227,8 +232,6 @@ namespace OpenSim.Services.GridService | |||
227 | if (region != null) | 232 | if (region != null) |
228 | { | 233 | { |
229 | int oldFlags = Convert.ToInt32(region.Data["flags"]); | 234 | int oldFlags = Convert.ToInt32(region.Data["flags"]); |
230 | if ((oldFlags & (int)OpenSim.Data.RegionFlags.LockedOut) != 0) | ||
231 | return "Region locked out"; | ||
232 | 235 | ||
233 | oldFlags &= ~(int)OpenSim.Data.RegionFlags.Reservation; | 236 | oldFlags &= ~(int)OpenSim.Data.RegionFlags.Reservation; |
234 | 237 | ||