Compare commits

..

22 Commits

Author SHA1 Message Date
Ubit Umarov
8a95a4dfe0 Merge pull request #41 from holoneon/patch-3
Update AvatarFactoryModule.cs
2026-06-16 20:54:32 +01:00
UbitUmarov
282db7dd1e update libomv 2026-06-16 19:09:47 +01:00
Fiona Sweet
dae81f7bf5 Update AvatarFactoryModule.cs
in logs i have noticed thousands of 'rebake' requests happening extremely rapidly from a few hg visitors, (for example yesterday 2400 from one hg visitor in 3 minutes) a potential denial of service vector. this adds throttling limit 1 per 30 seconds.  please review
2026-06-15 12:53:52 -07:00
UbitUmarov
29889f481a cosmetics 2026-06-12 12:12:24 +01:00
Vincent Sylvester
2494f23538 Postgres fixes for uuid type handling
Signed-off-by: UbitUmarov <ajlduarte@sapo.pt>
2026-06-12 11:35:40 +01:00
Ubit Umarov
cf8778f50f Merge pull request #36 from Tampa/webrtc-fix
Fix response for vivox server type under webrtc
2026-06-06 15:17:17 +01:00
Vincent Sylvester
a61b946563 Do not respond to vivox under webrtc 2026-06-04 23:48:20 +02:00
UbitUmarov
93ebb36904 cosmetics 2026-06-04 11:36:33 +01:00
Ubit Umarov
6a679f7cfa Merge pull request #35 from AdilElFarissi/master
Bug fixes and cosmetics
2026-06-04 11:03:34 +01:00
Adil El Farissi
9c2cc2d1af Bug fix and cosmetics
Fix: UserAgentServiceConnector return null if the destination is under TLS/SSL.
Refractor: DataSnapshot to use http> UnSecureInstance as @UbitUmarov recommaded. Personally, i prefer it to be under HTTPS as well.
2026-06-04 00:41:25 +00:00
Adil El Farissi
ad1d137c2e Merge branch 'master' of https://github.com/AdilElFarissi/opensim 2026-06-03 23:07:23 +00:00
UbitUmarov
9afd9e9e74 increase default SensorMaxResults to 32 2026-06-01 09:34:38 +01:00
UbitUmarov
c2569335b6 update libomv 2026-05-17 05:37:17 +01:00
UbitUmarov
94e887b9f7 update libomv fixing a silly typo 2026-05-14 03:12:09 +01:00
Adil El Farissi
d88947e07a Merge branch 'opensim:master' into master 2025-06-25 21:40:57 +00:00
Adil El Farissi
dfb3aed36a Merge branch 'opensim:master' into master 2025-06-10 22:28:02 +00:00
Adil El Farissi
fc75ae0011 Merge branch 'opensim:master' into master 2025-01-15 14:07:44 +00:00
Adil El Farissi
82842f26cc Merge branch 'opensim:master' into master 2025-01-02 16:56:39 +00:00
Adil El Farissi
e306a1c1de Merge branch 'opensim:master' into master 2024-10-23 01:31:28 +00:00
Adil El Farissi
a4b5986271 Merge branch 'opensim:master' into master 2024-10-10 01:02:56 +00:00
Adil El Farissi
dfd03c01ff Merge branch 'opensim:master' into master 2024-10-08 22:54:06 +00:00
Adil El Farissi
3c1ecad319 Fix to make datanapshot follows the configuration of the base server for the SSL Support
may be needed by web interfaces...
2024-10-08 22:45:19 +00:00
17 changed files with 127 additions and 100 deletions

View File

@@ -417,7 +417,7 @@ namespace osWebRtcVoice
m_log.Warn($"{LogHeader}[ProvisionVoice]: Request detail: {map}");
response.RawBuffer = llsdUndefAnswerBytes;
response.StatusCode = (int)HttpStatusCode.OK;
response.StatusCode = 0;
return;
}
}

View File

@@ -352,12 +352,12 @@ namespace OpenSim.Data.PGSQL
//Insert after
cmd.CommandText = "insert into estateban (\"EstateID\", \"bannedUUID\",\"bannedIp\", \"bannedIpHostMask\", \"bannedNameMask\", \"banningUUID\",\"banTime\" ) values ( :EstateID, :bannedUUID, '','','', :banningUUID, :banTime )";
cmd.Parameters.AddWithValue("bannedUUID", Guid.Empty);
foreach (EstateBan b in es.EstateBans)
{
cmd.Parameters.Clear();
cmd.Parameters["EstateID"].Value = b.EstateID;
cmd.Parameters["bannedUUID"].Value = b.BannedUserID.Guid;
cmd.Parameters["banningUUID"].Value = b.BanningUserID.Guid;
cmd.Parameters["bannedUUID"].Value = _Database.CreateParameter("bannedUUID", b.BannedUserID).Value;
cmd.Parameters["banningUUID"].Value = _Database.CreateParameter("banningUUID", b.BanningUserID).Value;
cmd.Parameters["banTime"].Value = b.BanTime;
cmd.ExecuteNonQuery();
@@ -378,10 +378,10 @@ namespace OpenSim.Data.PGSQL
cmd.ExecuteNonQuery();
cmd.CommandText = string.Format("insert into {0} (\"EstateID\", uuid) values ( :EstateID, :uuid )", table);
cmd.Parameters.AddWithValue("uuid", Guid.Empty);
foreach (UUID uuid in data)
{
cmd.Parameters["uuid"].Value = uuid.Guid; //.ToString(); //TODO check if this works
cmd.Parameters.Clear();
cmd.Parameters.Add(_Database.CreateParameter("uuid", uuid));
cmd.ExecuteNonQuery();
}
}

View File

@@ -134,10 +134,13 @@ namespace OpenSim.Data.PGSQL
foreach (DataRow row in schemaTable.Rows)
{
if (row["ColumnName"] != null &&
(!m_Fields.ContainsKey(row["ColumnName"].ToString())))
m_ColumnNames.Add(row["ColumnName"].ToString());
if (row["ColumnName"] == null)
continue;
string col = row["ColumnName"].ToString();
if (!m_Fields.ContainsKey(col))
m_ColumnNames.Add(col);
}
}

View File

@@ -171,7 +171,7 @@ namespace OpenSim.Data.PGSQL
{
// cmd.CommandText = String.Format(@"select * from inventoryitems where ""avatarID"" = :uuid and ""assetType"" = :type and ""flags"" = 1", m_Realm);
cmd.CommandText = "select * from inventoryitems where avatarID = :uuid and assetType = :type and flags = 1";
cmd.CommandText = "select * from inventoryitems where \"avatarID\" = :uuid and \"assetType\" = :type and \"flags\" = 1";
cmd.Parameters.Add(m_database.CreateParameter("uuid", principalID));
cmd.Parameters.Add(m_database.CreateParameter("type", (int)AssetType.Gesture));

View File

@@ -67,6 +67,10 @@ namespace OpenSim.Region.CoreModules.Avatar.AvatarFactory
private object m_setAppearanceLock = new object();
// add throttle
private ConcurrentDictionary<string, long> m_rebakeThrottle = new ConcurrentDictionary<string, long>();
private const int REBAKE_THROTTLE_SECONDS = 30;
#region Region Module interface
public void Initialise(IConfigSource config)
@@ -451,10 +455,32 @@ namespace OpenSim.Region.CoreModules.Avatar.AvatarFactory
sp.Appearance.WearableCacheItems = wearableCache;
// throttle rebake requests
if (missing.Count > 0)
{
long now = DateTime.UtcNow.Ticks;
foreach (UUID id in missing)
{
string key = sp.UUID.ToString() + ":" + id.ToString();
long last;
if (m_rebakeThrottle.TryGetValue(key, out last))
{
TimeSpan age = new TimeSpan(now - last);
if (age.TotalSeconds < REBAKE_THROTTLE_SECONDS)
continue;
}
m_rebakeThrottle[key] = now;
m_log.DebugFormat(
"[AVFACTORY]: Missing baked texture {0} for {1}, requesting rebake",
id, sp.Name);
sp.ControllingClient.SendRebakeAvatarTextures(id);
}
}
bool changed = false;

View File

@@ -115,28 +115,39 @@ namespace OpenSim.Region.CoreModules.Framework.UserManagement
}
// This is it! Let's ask the other world
if (words[0].Contains("."))
if (words[0].Contains('.'))
{
string[] names = words[0].Split(Util.SplitDotArray);
if (names.Length >= 2)
{
string uriStr = "http://" + words[1];
ReadOnlySpan<char> words1lower = words[1].ToLower();
string uriStr = string.Concat("http://", words1lower);
// Let's check that the last name is a valid address
try
if(!Uri.TryCreate(uriStr, UriKind.Absolute, out _))
{
new Uri(uriStr);
}
catch (UriFormatException)
{
m_log.DebugFormat("[USER MANAGEMENT MODULE]: Malformed address {0}", uriStr);
m_log.Debug($"[USER MANAGEMENT MODULE]: Malformed address {words1lower}");
return;
}
UUID userID = UUID.Zero;
uriStr = uriStr.ToLower();
if(!WebUtil.GlobalExpiringBadURLs.ContainsKey(uriStr))
{
UserAgentServiceConnector uasConn = new UserAgentServiceConnector(uriStr);
UserAgentServiceConnector uasConn = new(uriStr);
// If fail to connect with http... try with https...
if (uasConn is null)
{
string SSLuriStr = string.Concat("https://", words1lower); // words[1] already validated
uasConn = new UserAgentServiceConnector(SSLuriStr);
if (uasConn is null)
{
m_log.Debug($"[USER MANAGEMENT MODULE]: UserAgentServiceConnector failed to connect to {words1lower}");
return;
}
uriStr = SSLuriStr;
}
try
{
userID = uasConn.GetUUID(names[0], names[1]);
@@ -147,18 +158,20 @@ namespace OpenSim.Region.CoreModules.Framework.UserManagement
}
}
if (!userID.Equals(UUID.Zero))
if (userID.IsNotZero())
{
UserData ud = new UserData();
ud.Id = userID;
ud.FirstName = words[0];
ud.LastName = "@" + words[1];
UserData ud = new()
{
Id = userID,
FirstName = words[0],
LastName = "@" + words[1]
};
users.Add(ud);
AddUser(userID, names[0], names[1], uriStr);
m_log.DebugFormat("[USER MANAGEMENT MODULE]: User {0}@{1} found", words[0], words[1]);
m_log.Debug($"[USER MANAGEMENT MODULE]: User {words[0]}@{words[1]} found");
}
else
m_log.DebugFormat("[USER MANAGEMENT MODULE]: User {0}@{1} not found", words[0], words[1]);
m_log.Debug($"[USER MANAGEMENT MODULE]: User {words[0]}@{words[1]} not found");
}
}
}

View File

@@ -2117,7 +2117,7 @@ namespace OpenSim.Region.CoreModules.World.Land
{
// if you do a "About Landmark" on a landmark a second time, the viewer sends the
// region_handle it got earlier via RegionHandleRequest
ulong regionHandle = Util.BytesToUInt64Big((byte[])tmp);
ulong regionHandle = tmp.AsULong();
if(regionHandle == myHandle)
{
ILandObject l = GetLandObjectClippedXY(x, y);

View File

@@ -75,8 +75,8 @@ namespace OpenSim.Region.PhysicsModule.ubODEMeshing
private bool doConvexPrims = true;
private bool doConvexSculpts = true;
private readonly Dictionary<AMeshKey, Mesh> m_uniqueMeshes = new();
private readonly Dictionary<AMeshKey, Mesh> m_uniqueReleasedMeshes = new ();
private readonly Dictionary<AMeshKey, Mesh> m_uniqueMeshes = [];
private readonly Dictionary<AMeshKey, Mesh> m_uniqueReleasedMeshes = [];
#region INonSharedRegionModule
public string Name
@@ -173,7 +173,7 @@ namespace OpenSim.Region.PhysicsModule.ubODEMeshing
/// <param name="size">Size of entire object</param>
/// <param name="coords"></param>
/// <param name="faces"></param>
private unsafe void AddSubMesh(OSDMap subMeshData, List<Vector3> coords, List<Face> faces)
private unsafe void AddSubMesh(OSDMap subMeshData, List<Vector3> coords, List<Face> faces)
{
// Console.WriteLine("subMeshMap for {0} - {1}", primName, Util.GetFormattedXml((OSD)subMeshMap));
@@ -209,7 +209,7 @@ namespace OpenSim.Region.PhysicsModule.ubODEMeshing
int faceIndexOffset = coords.Count;
fixed (byte* ptrstart = posBytes)
{
{
byte* end = ptrstart + posBytes.Length;
byte* ptr = ptrstart;
while (ptr < end)

View File

@@ -80,7 +80,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api.Plugins
{
m_CmdManager = CmdManager;
maximumRange = CmdManager.m_ScriptEngine.Config.GetFloat("SensorMaxRange", 96.0f);
maximumToReturn = CmdManager.m_ScriptEngine.Config.GetInt("SensorMaxResults", 16);
maximumToReturn = CmdManager.m_ScriptEngine.Config.GetInt("SensorMaxResults", 32);
m_npcModule = m_CmdManager.m_ScriptEngine.World.RequestModuleInterface<INPCModule>();
}
@@ -96,7 +96,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api.Plugins
private const int SCRIPTED = 8;
private readonly float maximumRange = 96.0f;
private readonly int maximumToReturn = 16;
private readonly int maximumToReturn = 32;
//
// Sensed entity

View File

@@ -43,6 +43,7 @@ using GridRegion = OpenSim.Services.Interfaces.GridRegion;
using OpenSim.Framework;
using OpenSim.Framework.Servers.HttpServer;
using OpenMetaverse;
using OpenMetaverse.StructuredData;
namespace OpenSim.Server.Handlers.Hypergrid
{
@@ -80,13 +81,13 @@ namespace OpenSim.Server.Handlers.Hypergrid
try
{
Dictionary<string, object> request =
ServerUtils.ParseQueryString(body);
Dictionary<string, object> request = ServerUtils.ParseQueryString(body);
if (!request.ContainsKey("METHOD"))
object tmpObj;
if (!request.TryGetValue("METHOD", out tmpObj))
return FailureResult();
string method = request["METHOD"].ToString();
string method = tmpObj.ToString();
switch (method)
{
@@ -140,19 +141,14 @@ namespace OpenSim.Server.Handlers.Hypergrid
if (!VerifyServiceKey(request))
return FailureResult();
UUID principalID = UUID.Zero;
if (request.ContainsKey("PRINCIPALID"))
UUID.TryParse(request["PRINCIPALID"].ToString(), out principalID);
else
object tmpObj;
if (!request.TryGetValue("PRINCIPALID", out tmpObj) || !UUID.TryParse(tmpObj.ToString(), out UUID principalID))
{
m_log.WarnFormat("[HGFRIENDS HANDLER]: no principalID in request to get friend perms");
return FailureResult();
}
UUID friendID = UUID.Zero;
if (request.ContainsKey("FRIENDID"))
UUID.TryParse(request["FRIENDID"].ToString(), out friendID);
else
if (!request.TryGetValue("FRIENDID", out tmpObj) || !UUID.TryParse(tmpObj.ToString(), out UUID friendID))
{
m_log.WarnFormat("[HGFRIENDS HANDLER]: no friendID in request to get friend perms");
return FailureResult();
@@ -181,14 +177,14 @@ namespace OpenSim.Server.Handlers.Hypergrid
byte[] DeleteFriendship(Dictionary<string, object> request)
{
FriendInfo friend = new FriendInfo(request);
string secret = string.Empty;
if (request.ContainsKey("SECRET"))
secret = request["SECRET"].ToString();
if (request.TryGetValue("SECRET", out object tmpObj) || tmpObj is null)
return BoolResult(false);
string secret = tmpObj.ToString();
if (secret.Length == 0)
return BoolResult(false);
FriendInfo friend = new FriendInfo(request);
bool success = m_TheService.DeleteFriendship(friend, secret);
return BoolResult(success);
@@ -196,27 +192,15 @@ namespace OpenSim.Server.Handlers.Hypergrid
byte[] FriendshipOffered(Dictionary<string, object> request)
{
UUID fromID = UUID.Zero;
UUID toID = UUID.Zero;
string message = string.Empty;
string name = string.Empty;
if (!request.ContainsKey("FromID") || !request.ContainsKey("ToID"))
if (!request.TryGetValue("FromID", out object FromIDobj) || !UUID.TryParse(FromIDobj.ToString(), out UUID fromID))
return BoolResult(false);
if (!request.TryGetValue("ToID", out object ToIDobj) || !UUID.TryParse(ToIDobj.ToString(), out UUID toID))
return BoolResult(false);
if (!UUID.TryParse(request["ToID"].ToString(), out toID))
return BoolResult(false);
message = request["Message"].ToString();
if (!UUID.TryParse(request["FromID"].ToString(), out fromID))
return BoolResult(false);
if (request.ContainsKey("FromName"))
name = request["FromName"].ToString();
string name = request.TryGetValue("FromName", out object FromNameobj) ? FromNameobj.ToString() : string.Empty;
string message = request.TryGetValue("Message", out object Messageobj) ? Messageobj.ToString() : string.Empty;
bool success = m_TheService.FriendshipOffered(fromID, name, toID, message);
return BoolResult(success);
}
@@ -234,9 +218,10 @@ namespace OpenSim.Server.Handlers.Hypergrid
byte[] StatusNotification(Dictionary<string, object> request)
{
object tmpObj;
UUID principalID = UUID.Zero;
if (request.ContainsKey("userID"))
UUID.TryParse(request["userID"].ToString(), out principalID);
if (request.TryGetValue("userID", out tmpObj))
UUID.TryParse(tmpObj.ToString(), out principalID);
else
{
m_log.WarnFormat("[HGFRIENDS HANDLER]: no userID in request to notify");
@@ -244,8 +229,8 @@ namespace OpenSim.Server.Handlers.Hypergrid
}
bool online = true;
if (request.ContainsKey("online"))
Boolean.TryParse(request["online"].ToString(), out online);
if (request.TryGetValue("online", out tmpObj))
bool.TryParse(tmpObj.ToString(), out online);
else
{
m_log.WarnFormat("[HGFRIENDS HANDLER]: no online in request to notify");
@@ -266,7 +251,7 @@ namespace OpenSim.Server.Handlers.Hypergrid
List<UUID> onlineFriends = m_TheService.StatusNotification(friends, principalID, online);
Dictionary<string, object> result = new Dictionary<string, object>();
if ((onlineFriends == null) || ((onlineFriends != null) && (onlineFriends.Count == 0)))
if (onlineFriends == null || onlineFriends.Count == 0)
result["RESULT"] = "NULL";
else
{
@@ -290,20 +275,14 @@ namespace OpenSim.Server.Handlers.Hypergrid
private bool VerifyServiceKey(Dictionary<string, object> request)
{
if (!request.ContainsKey("KEY") || !request.ContainsKey("SESSIONID"))
if (!request.TryGetValue("KEY", out object KEYobj) || KEYobj is not string serviceKey || serviceKey.Length == 0 ||
!request.TryGetValue("SESSIONID", out object SESSIONIDobj) || SESSIONIDobj is not string sessionStr)
{
m_log.WarnFormat("[HGFRIENDS HANDLER]: ignoring request without Key or SessionID");
return false;
}
if (request["KEY"] == null || request["SESSIONID"] == null)
return false;
string serviceKey = request["KEY"].ToString();
string sessionStr = request["SESSIONID"].ToString();
UUID sessionID;
if (!UUID.TryParse(sessionStr, out sessionID) || serviceKey.Length == 0)
if (!UUID.TryParse(sessionStr, out UUID sessionID))
return false;
if (!m_UserAgentService.VerifyAgent(sessionID, serviceKey))
@@ -325,8 +304,7 @@ namespace OpenSim.Server.Handlers.Hypergrid
doc.AppendChild(xmlnode);
XmlElement rootElement = doc.CreateElement("", "ServerResponse",
"");
XmlElement rootElement = doc.CreateElement("", "ServerResponse", "");
doc.AppendChild(rootElement);
@@ -342,8 +320,7 @@ namespace OpenSim.Server.Handlers.Hypergrid
{
XmlDocument doc = new XmlDocument();
XmlNode xmlnode = doc.CreateNode(XmlNodeType.XmlDeclaration,
"", "");
XmlNode xmlnode = doc.CreateNode(XmlNodeType.XmlDeclaration, "", "");
doc.AppendChild(xmlnode);
@@ -380,8 +357,7 @@ namespace OpenSim.Server.Handlers.Hypergrid
doc.AppendChild(xmlnode);
XmlElement rootElement = doc.CreateElement("", "ServerResponse",
"");
XmlElement rootElement = doc.CreateElement("", "ServerResponse", "");
doc.AppendChild(rootElement);
@@ -407,8 +383,7 @@ namespace OpenSim.Server.Handlers.Hypergrid
doc.AppendChild(xmlnode);
XmlElement rootElement = doc.CreateElement("", "ServerResponse",
"");
XmlElement rootElement = doc.CreateElement("", "ServerResponse", "");
doc.AppendChild(rootElement);

View File

@@ -78,7 +78,7 @@ namespace OpenSim.Services.HypergridService
if (configName != String.Empty)
m_ConfigName = configName;
Object[] args = new Object[] { config };
Object[] args = [ config ];
IConfig serverConfig = config.Configs[m_ConfigName];
if (serverConfig == null)
@@ -309,29 +309,39 @@ namespace OpenSim.Services.HypergridService
// But now we need to confirm that the requester is who he says he is
// before we act on the friendship request.
if (!fromName.Contains("@"))
if (!fromName.Contains('@'))
return;
string[] parts = fromName.Split(new char[] {'@'});
if (parts.Length != 2)
return;
string uriStr = "http://" + parts[1];
try
{
new Uri(uriStr);
}
catch (UriFormatException)
string uriStr = "http://" + parts[1].ToLower();
string SSLuriStr = "https://" + parts[1].ToLower();
if(!Uri.TryCreate(uriStr, UriKind.Absolute, out _))
{
m_log.DebugFormat("[HGFRIENDS SERVICE]: Malformed address {0}", parts[1].ToLower());
return;
}
UserAgentServiceConnector uasConn = new UserAgentServiceConnector(uriStr);
UserAgentServiceConnector uasConn = new(uriStr);
// If fail to connect with http... try with https...
if (uasConn is null)
{
uasConn = new UserAgentServiceConnector(SSLuriStr);
if (uasConn is null)
{
m_log.DebugFormat("[HGFRIENDS SERVICE]: UserAgentServiceConnector failed to connect to {0}", parts[1].ToLower());
return;
}
uriStr = SSLuriStr;
}
Dictionary<string, object> servers = uasConn.GetServerURLs(fromID);
if (!servers.ContainsKey("FriendsServerURI"))
if (!servers.TryGetValue("FriendsServerURI", out object friendsServerURI))
return;
HGFriendsServicesConnector friendsConn = new HGFriendsServicesConnector(servers["FriendsServerURI"].ToString());
HGFriendsServicesConnector friendsConn = new(friendsServerURI.ToString());
if (!friendsConn.ValidateFriendshipOffered(fromID, toID))
{
m_log.WarnFormat("[HGFRIENDS SERVICE]: Friendship request from {0} to {1} is invalid. Impersonations?", fromID, toID);

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.