Merge branch 'ubitwork' of ssh://3dhosting.de/var/git/careminster into ubitwork

avinationmerge
ubit 2012-07-28 02:03:18 +02:00
commit 7f5ac795be
8 changed files with 142 additions and 47 deletions

View File

@ -28,6 +28,7 @@
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Reflection; using System.Reflection;
using System.IO;
using System.Xml; using System.Xml;
using log4net; using log4net;
using Mono.Addins; using Mono.Addins;
@ -248,7 +249,7 @@ namespace OpenSim.Region.CoreModules.Avatar.Attachments
} }
} }
public void DeRezAttachments(IScenePresence sp, bool saveChanged, bool saveAllScripted) public void DeRezAttachments(IScenePresence sp)
{ {
if (!Enabled) if (!Enabled)
return; return;
@ -259,18 +260,7 @@ namespace OpenSim.Region.CoreModules.Avatar.Attachments
{ {
foreach (SceneObjectGroup so in sp.GetAttachments()) foreach (SceneObjectGroup so in sp.GetAttachments())
{ {
// We can only remove the script instances from the script engine after we've retrieved their xml state UpdateDetachedObject(sp, so);
// when we update the attachment item.
m_scene.DeleteSceneObject(so, false, false);
if (saveChanged || saveAllScripted)
{
so.IsAttachment = false;
so.AbsolutePosition = so.RootPart.AttachedPos;
UpdateKnownItem(sp, so, saveAllScripted);
}
so.RemoveScriptInstances(true);
} }
sp.ClearAttachments(); sp.ClearAttachments();
@ -597,7 +587,7 @@ namespace OpenSim.Region.CoreModules.Avatar.Attachments
/// <param name="sp"></param> /// <param name="sp"></param>
/// <param name="grp"></param> /// <param name="grp"></param>
/// <param name="saveAllScripted"></param> /// <param name="saveAllScripted"></param>
private void UpdateKnownItem(IScenePresence sp, SceneObjectGroup grp, bool saveAllScripted) private void UpdateKnownItem(IScenePresence sp, SceneObjectGroup grp, string scriptedState)
{ {
// Saving attachments for NPCs messes them up for the real owner! // Saving attachments for NPCs messes them up for the real owner!
INPCModule module = m_scene.RequestModuleInterface<INPCModule>(); INPCModule module = m_scene.RequestModuleInterface<INPCModule>();
@ -607,13 +597,13 @@ namespace OpenSim.Region.CoreModules.Avatar.Attachments
return; return;
} }
if (grp.HasGroupChanged || (saveAllScripted && grp.ContainsScripts())) if (grp.HasGroupChanged)
{ {
// m_log.DebugFormat( // m_log.DebugFormat(
// "[ATTACHMENTS MODULE]: Updating asset for attachment {0}, attachpoint {1}", // "[ATTACHMENTS MODULE]: Updating asset for attachment {0}, attachpoint {1}",
// grp.UUID, grp.AttachmentPoint); // grp.UUID, grp.AttachmentPoint);
string sceneObjectXml = SceneObjectSerializer.ToOriginalXmlFormat(grp); string sceneObjectXml = SceneObjectSerializer.ToOriginalXmlFormat(grp, scriptedState);
InventoryItemBase item = new InventoryItemBase(grp.FromItemID, sp.UUID); InventoryItemBase item = new InventoryItemBase(grp.FromItemID, sp.UUID);
item = m_scene.InventoryService.GetItem(item); item = m_scene.InventoryService.GetItem(item);
@ -750,6 +740,60 @@ namespace OpenSim.Region.CoreModules.Avatar.Attachments
return newItem; return newItem;
} }
private string GetObjectScriptStates(SceneObjectGroup grp)
{
using (StringWriter sw = new StringWriter())
{
using (XmlTextWriter writer = new XmlTextWriter(sw))
{
grp.SaveScriptedState(writer);
}
return sw.ToString();
}
}
private void UpdateDetachedObject(IScenePresence sp, SceneObjectGroup so)
{
// Don't save attachments for HG visitors, it
// messes up their inventory. When a HG visitor logs
// out on a foreign grid, their attachments will be
// reloaded in the state they were in when they left
// the home grid. This is best anyway as the visited
// grid may use an incompatible script engine.
bool saveChanged
= sp.PresenceType != PresenceType.Npc
&& (m_scene.UserManagementModule == null
|| m_scene.UserManagementModule.IsLocalGridUser(sp.UUID));
// Scripts MUST be snapshotted before the object is
// removed from the scene because doing otherwise will
// clobber the run flag
string scriptedState = GetObjectScriptStates(so);
// Remove the object from the scene so no more updates
// are sent. Doing this before the below changes will ensure
// updates can't cause "HUD artefacts"
m_scene.DeleteSceneObject(so, false, false);
// Prepare sog for storage
so.AttachedAvatar = UUID.Zero;
so.RootPart.SetParentLocalId(0);
so.IsAttachment = false;
if (saveChanged)
{
// We cannot use AbsolutePosition here because that would
// attempt to cross the prim as it is detached
so.ForEachPart(x => { x.GroupPosition = so.RootPart.AttachedPos; });
UpdateKnownItem(sp, so, scriptedState);
}
// Now, remove the scripts
so.RemoveScriptInstances(true);
}
private void DetachSingleAttachmentToInvInternal(IScenePresence sp, SceneObjectGroup so) private void DetachSingleAttachmentToInvInternal(IScenePresence sp, SceneObjectGroup so)
{ {
// m_log.DebugFormat("[ATTACHMENTS MODULE]: Detaching item {0} to inventory for {1}", itemID, sp.Name); // m_log.DebugFormat("[ATTACHMENTS MODULE]: Detaching item {0} to inventory for {1}", itemID, sp.Name);
@ -757,22 +801,7 @@ namespace OpenSim.Region.CoreModules.Avatar.Attachments
m_scene.EventManager.TriggerOnAttach(so.LocalId, so.FromItemID, UUID.Zero); m_scene.EventManager.TriggerOnAttach(so.LocalId, so.FromItemID, UUID.Zero);
sp.RemoveAttachment(so); sp.RemoveAttachment(so);
// Prepare sog for storage UpdateDetachedObject(sp, so);
so.AttachedAvatar = UUID.Zero;
so.RootPart.SetParentLocalId(0);
so.IsAttachment = false;
// We cannot use AbsolutePosition here because that would
// attempt to cross the prim as it is detached
so.ForEachPart(x => { x.GroupPosition = so.RootPart.AttachedPos; });
UpdateKnownItem(sp, so, true);
// This MUST happen AFTER serialization because it will
// either stop or remove the scripts. Both will cause scripts
// to be serialized in a stopped state with the true run
// state already lost.
m_scene.DeleteSceneObject(so, false, true);
} }
protected SceneObjectGroup RezSingleAttachmentFromInventoryInternal( protected SceneObjectGroup RezSingleAttachmentFromInventoryInternal(

View File

@ -492,6 +492,8 @@ namespace OpenSim.Region.CoreModules.Avatar.Inventory.Archiver
return null; return null;
} }
return account;
/*
try try
{ {
string encpass = Util.Md5Hash(pass); string encpass = Util.Md5Hash(pass);
@ -512,6 +514,7 @@ namespace OpenSim.Region.CoreModules.Avatar.Inventory.Archiver
m_log.ErrorFormat("[INVENTORY ARCHIVER]: Could not authenticate password, {0}", e.Message); m_log.ErrorFormat("[INVENTORY ARCHIVER]: Could not authenticate password, {0}", e.Message);
return null; return null;
} }
*/
} }
/// <summary> /// <summary>

View File

@ -66,7 +66,7 @@ namespace OpenSim.Region.Framework.Interfaces
/// <param name="sp">The presence closing</param> /// <param name="sp">The presence closing</param>
/// <param name="saveChanged">Save changed attachments.</param> /// <param name="saveChanged">Save changed attachments.</param>
/// <param name="saveAllScripted">Save attachments with scripts even if they haven't changed.</para> /// <param name="saveAllScripted">Save attachments with scripts even if they haven't changed.</para>
void DeRezAttachments(IScenePresence sp, bool saveChanged, bool saveAllScripted); void DeRezAttachments(IScenePresence sp);
/// <summary> /// <summary>
/// Delete all the presence's attachments from the scene /// Delete all the presence's attachments from the scene

View File

@ -40,6 +40,8 @@ namespace OpenSim.Region.Framework.Interfaces
/// </remarks> /// </remarks>
public interface IScenePresence : ISceneAgent public interface IScenePresence : ISceneAgent
{ {
PresenceType PresenceType { get; }
/// <summary> /// <summary>
/// Copy of the script states while the agent is in transit. This state may /// Copy of the script states while the agent is in transit. This state may
/// need to be placed back in case of transfer fail. /// need to be placed back in case of transfer fail.

View File

@ -3461,17 +3461,7 @@ namespace OpenSim.Region.Framework.Scenes
{ {
if (AttachmentsModule != null) if (AttachmentsModule != null)
{ {
// Don't save attachments for HG visitors, it AttachmentsModule.DeRezAttachments(avatar);
// messes up their inventory. When a HG visitor logs
// out on a foreign grid, their attachments will be
// reloaded in the state they were in when they left
// the home grid. This is best anyway as the visited
// grid may use an incompatible script engine.
bool saveChanged
= avatar.PresenceType != PresenceType.Npc
&& (UserManagementModule == null || UserManagementModule.IsLocalGridUser(avatar.UUID));
AttachmentsModule.DeRezAttachments(avatar, saveChanged, false);
} }
ForEachClient( ForEachClient(

View File

@ -151,6 +151,24 @@ namespace OpenSim.Region.Framework.Scenes.Serialization
ToOriginalXmlFormat(sceneObject, writer, doScriptStates, false); ToOriginalXmlFormat(sceneObject, writer, doScriptStates, false);
} }
public static string ToOriginalXmlFormat(SceneObjectGroup sceneObject, string scriptedState)
{
using (StringWriter sw = new StringWriter())
{
using (XmlTextWriter writer = new XmlTextWriter(sw))
{
writer.WriteStartElement(String.Empty, "SceneObjectGroup", String.Empty);
ToOriginalXmlFormat(sceneObject, writer, false, true);
writer.WriteRaw(scriptedState);
writer.WriteEndElement();
}
return sw.ToString();
}
}
/// <summary> /// <summary>
/// Serialize a scene object to the original xml format /// Serialize a scene object to the original xml format
/// </summary> /// </summary>

View File

@ -1027,7 +1027,7 @@ namespace OpenSim.Region.Physics.OdePlugin
{ {
d.AABB aabb; d.AABB aabb;
d.GeomGetAABB(g2, out aabb); d.GeomGetAABB(g2, out aabb);
float tmp = vtmp.Z - sz * .25f; float tmp = vtmp.Z - sz * .18f;
if (aabb.MaxZ < tmp) if (aabb.MaxZ < tmp)
{ {
@ -1057,7 +1057,7 @@ namespace OpenSim.Region.Physics.OdePlugin
{ {
d.AABB aabb; d.AABB aabb;
d.GeomGetAABB(g1, out aabb); d.GeomGetAABB(g1, out aabb);
float tmp = vtmp.Z - sz * .25f; float tmp = vtmp.Z - sz * .18f;
if (aabb.MaxZ < tmp) if (aabb.MaxZ < tmp)
{ {

View File

@ -11471,6 +11471,59 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
if (userAgent != null) if (userAgent != null)
httpHeaders["User-Agent"] = userAgent; httpHeaders["User-Agent"] = userAgent;
// See if the URL contains any header hacks
string[] urlParts = url.Split(new char[] {'\n'});
if (urlParts.Length > 1)
{
// Iterate the passed headers and parse them
for (int i = 1 ; i < urlParts.Length ; i++ )
{
// The rest of those would be added to the body in SL.
// Let's not do that.
if (urlParts[i] == String.Empty)
break;
// See if this could be a valid header
string[] headerParts = urlParts[i].Split(new char[] {':'}, 2);
if (headerParts.Length != 2)
continue;
string headerName = headerParts[0].Trim();
string headerValue = headerParts[1].Trim();
// Filter out headers that could be used to abuse
// another system or cloak the request
if (headerName.ToLower() == "x-secondlife-shard" ||
headerName.ToLower() == "x-secondlife-object-name" ||
headerName.ToLower() == "x-secondlife-object-key" ||
headerName.ToLower() == "x-secondlife-region" ||
headerName.ToLower() == "x-secondlife-local-position" ||
headerName.ToLower() == "x-secondlife-local-velocity" ||
headerName.ToLower() == "x-secondlife-local-rotation" ||
headerName.ToLower() == "x-secondlife-owner-name" ||
headerName.ToLower() == "x-secondlife-owner-key" ||
headerName.ToLower() == "connection" ||
headerName.ToLower() == "content-length" ||
headerName.ToLower() == "from" ||
headerName.ToLower() == "host" ||
headerName.ToLower() == "proxy-authorization" ||
headerName.ToLower() == "referer" ||
headerName.ToLower() == "trailer" ||
headerName.ToLower() == "transfer-encoding" ||
headerName.ToLower() == "via" ||
headerName.ToLower() == "authorization")
continue;
httpHeaders[headerName] = headerValue;
}
// Finally, strip any protocol specifier from the URL
url = urlParts[0].Trim();
int idx = url.IndexOf(" HTTP/");
if (idx != -1)
url = url.Substring(0, idx);
}
string authregex = @"^(https?:\/\/)(\w+):(\w+)@(.*)$"; string authregex = @"^(https?:\/\/)(\w+):(\w+)@(.*)$";
Regex r = new Regex(authregex); Regex r = new Regex(authregex);
int[] gnums = r.GetGroupNumbers(); int[] gnums = r.GetGroupNumbers();