private void AddHyperlinkRegion(GridRegion regionInfo, ulong regionHandle) { int flags = (int)Aurora.Framework.RegionFlags.Hyperlink + (int)Aurora.Framework.RegionFlags.NoDirectLogin + (int)Aurora.Framework.RegionFlags.RegionOnline; regionInfo.Flags = flags; m_Database.Store(regionInfo); }
// Not currently used // /// <summary> // /// Cope with this viewer limitation. // /// </summary> // /// <param name="regInfo"></param> // /// <returns></returns> // public bool Check4096(ulong realHandle, out uint x, out uint y) // { // uint ux = 0, uy = 0; // Utils.LongToUInts(realHandle, out ux, out uy); // x = Util.WorldToRegionLoc(ux); // y = Util.WorldToRegionLoc(uy); // // const uint limit = Util.RegionToWorldLoc(4096 - 1); // uint xmin = ux - limit; // uint xmax = ux + limit; // uint ymin = uy - limit; // uint ymax = uy + limit; // // World map boundary checks // if (xmin < 0 || xmin > ux) // xmin = 0; // if (xmax > int.MaxValue || xmax < ux) // xmax = int.MaxValue; // if (ymin < 0 || ymin > uy) // ymin = 0; // if (ymax > int.MaxValue || ymax < uy) // ymax = int.MaxValue; // // // Check for any regions that are within the possible teleport range to the linked region // List<GridRegion> regions = m_GridService.GetRegionRange(m_ScopeID, (int)xmin, (int)xmax, (int)ymin, (int)ymax); // if (regions.Count == 0) // { // return false; // } // else // { // // Check for regions which are not linked regions // List<GridRegion> hyperlinks = m_GridService.GetHyperlinks(m_ScopeID); // IEnumerable<GridRegion> availableRegions = regions.Except(hyperlinks); // if (availableRegions.Count() == 0) // return false; // } // // return true; // } private void AddHyperlinkRegion(GridRegion regionInfo, ulong regionHandle) { RegionData rdata = m_GridService.RegionInfo2RegionData(regionInfo); int flags = (int)OpenSim.Framework.RegionFlags.Hyperlink + (int)OpenSim.Framework.RegionFlags.NoDirectLogin + (int)OpenSim.Framework.RegionFlags.RegionOnline; rdata.Data["flags"] = flags.ToString(); m_Database.Store(rdata); }
/// <summary> /// Tells the grid server that this region is not able to be connected to. /// This updates the down flag in the map and blocks it from becoming a 'safe' region fallback /// Only called by LLLoginService /// </summary> /// <param name = "r"></param> public virtual void SetRegionUnsafe(UUID ID) { GridRegion data = m_Database.Get(ID, UUID.Zero); if (data == null) { return; } if ((data.Flags & (int)RegionFlags.Safe) == (int)RegionFlags.Safe) { data.Flags &= ~(int)RegionFlags.Safe; //Remove only the safe var the first time } else if ((data.Flags & (int)RegionFlags.RegionOnline) == (int)RegionFlags.RegionOnline) { data.Flags &= ~(int)RegionFlags.RegionOnline; //Remove online the second time it fails } m_Database.Store(data); }
public string RegisterRegion(GridRegion regionInfos, UUID oldSessionID, out UUID SessionID) { SessionID = UUID.Zero; if (m_DisableRegistrations) { return("Registrations are disabled."); } UUID NeedToDeletePreviousRegion = UUID.Zero; IConfig gridConfig = m_config.Configs["GridService"]; //Get the range of this so that we get the full count and make sure that we are not overlapping smaller regions List <GridRegion> regions = m_Database.Get(regionInfos.RegionLocX, regionInfos.RegionLocY, regionInfos.RegionLocX + regionInfos.RegionSizeX - 1, regionInfos.RegionLocY + regionInfos.RegionSizeY - 1, regionInfos.ScopeID); if (regions.Count > 1) { //More than one region is here... it is overlapping stuff 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, regionInfos.ScopeID); return("Region overlaps another region"); } GridRegion region = regions.Count > 0 ? regions[0] : null; if (!m_AllowNewRegistrations && region == null) { m_log.WarnFormat("[GRID SERVICE]: Region {0} tried to register but registrations are disabled.", regionInfos.RegionName); return("Registrations are disabled."); } if (m_maxRegionSize != 0 && (regionInfos.RegionSizeX > m_maxRegionSize || regionInfos.RegionSizeY > m_maxRegionSize)) { //Too big... kick it out m_log.WarnFormat("[GRID SERVICE]: Region {0} tried to register with too large of a size {1},{2}.", regionInfos.RegionName, regionInfos.RegionSizeX, regionInfos.RegionSizeY); return("Region overlaps another region"); } 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.RegionName, regionInfos.RegionLocX, regionInfos.RegionLocY, regionInfos.ScopeID); return("Region overlaps another region"); } if ((region != null) && (region.RegionID == regionInfos.RegionID) && ((region.RegionLocX != regionInfos.RegionLocX) || (region.RegionLocY != regionInfos.RegionLocY))) { if ((region.Flags & (int)RegionFlags.NoMove) != 0) { return("Can't move this region," + region.RegionLocX + "," + region.RegionLocY); } // 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); NeedToDeletePreviousRegion = regionInfos.RegionID; } if (region != null) { // There is a preexisting record // // Get it's flags // RegionFlags rflags = (RegionFlags)region.Flags; // Is this a reservation? // if ((rflags & RegionFlags.Reservation) != 0) { // Regions reserved for the null key cannot be taken. if (region.SessionID == UUID.Zero) { return("Region location is reserved"); } // Treat it as an auth request // // NOTE: Fudging the flags value here, so these flags // should not be used elsewhere. Don't optimize // this with the later retrieval of the same flags! rflags |= RegionFlags.Authenticate; } if ((rflags & RegionFlags.Authenticate) != 0) { // Can we authenticate at all? // if (m_AuthenticationService == null) { return("No authentication possible"); } //Make sure the key exists if (!m_AuthenticationService.CheckExists(regionInfos.SessionID)) { return("Bad authentication"); } //Now verify the key if (!m_AuthenticationService.Verify(regionInfos.SessionID, regionInfos.AuthToken, 30)) { return("Bad authentication"); } } } if (!m_AllowDuplicateNames) { List <GridRegion> dupe = m_Database.Get(regionInfos.RegionName, regionInfos.ScopeID); if (dupe != null && dupe.Count > 0) { foreach (GridRegion 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 (region != null) { //If we are locked out, we can't come in if ((region.Flags & (int)RegionFlags.LockedOut) != 0) { return("Region locked out"); } //Remove the reservation if we are there now region.Flags &= ~(int)RegionFlags.Reservation; regionInfos.Flags = region.Flags; // Preserve flags } else { //Regions do not get to set flags, so wipe them regionInfos.Flags = 0; //See if we are in the configs anywhere and have flags set if ((gridConfig != null) && regionInfos.RegionName != string.Empty) { int newFlags = 0; string regionName = regionInfos.RegionName.Trim().Replace(' ', '_'); newFlags = ParseFlags(newFlags, gridConfig.GetString("DefaultRegionFlags", String.Empty)); newFlags = ParseFlags(newFlags, gridConfig.GetString("Region_" + regionName, String.Empty)); newFlags = ParseFlags(newFlags, gridConfig.GetString("Region_" + regionInfos.RegionID.ToString(), String.Empty)); regionInfos.Flags = newFlags; } } //Set these so that we can make sure the region is online later regionInfos.Flags |= (int)RegionFlags.RegionOnline; regionInfos.Flags |= (int)RegionFlags.Safe; regionInfos.LastSeen = Util.UnixTimeSinceEpoch(); if (region != null) { //If we already have a session, we need to check it if (m_UseSessionID && region.SessionID != oldSessionID) { m_log.WarnFormat("[GRID SERVICE]: Region {0} called register, but the sessionID they provided is wrong!", region.RegionName); return("Wrong Session ID"); } } //Update the sessionID, use the old so that we don't generate a bunch of these if (oldSessionID == UUID.Zero) { SessionID = UUID.Random(); } else { SessionID = oldSessionID; } regionInfos.SessionID = SessionID; // Everything is ok, let's register try { if (NeedToDeletePreviousRegion != UUID.Zero) { m_Database.Delete(NeedToDeletePreviousRegion); } if (m_Database.Store(regionInfos)) { //Fire the event so that other modules notice m_simulationBase.EventManager.FireGenericEventHandler("RegionRegistered", regionInfos); m_log.DebugFormat("[GRID SERVICE]: Region {0} registered successfully at {1}-{2}", regionInfos.RegionName, regionInfos.RegionLocX, regionInfos.RegionLocY); return(String.Empty); } } catch (Exception e) { m_log.WarnFormat("[GRID SERVICE]: Database exception: {0}", e.ToString()); } return("Failed to save region into the database."); }