aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/OpenSim/Region/CoreModules/Agent
diff options
context:
space:
mode:
Diffstat (limited to 'OpenSim/Region/CoreModules/Agent')
-rw-r--r--OpenSim/Region/CoreModules/Agent/AssetTransaction/AssetXferUploader.cs142
-rw-r--r--OpenSim/Region/CoreModules/Agent/Xfer/XferModule.cs11
2 files changed, 148 insertions, 5 deletions
diff --git a/OpenSim/Region/CoreModules/Agent/AssetTransaction/AssetXferUploader.cs b/OpenSim/Region/CoreModules/Agent/AssetTransaction/AssetXferUploader.cs
index 8add4bb..f6dd5af 100644
--- a/OpenSim/Region/CoreModules/Agent/AssetTransaction/AssetXferUploader.cs
+++ b/OpenSim/Region/CoreModules/Agent/AssetTransaction/AssetXferUploader.cs
@@ -28,6 +28,7 @@
28using System; 28using System;
29using System.IO; 29using System.IO;
30using System.Reflection; 30using System.Reflection;
31using System.Collections.Generic;
31using log4net; 32using log4net;
32using OpenMetaverse; 33using OpenMetaverse;
33using OpenSim.Framework; 34using OpenSim.Framework;
@@ -38,6 +39,13 @@ namespace OpenSim.Region.CoreModules.Agent.AssetTransaction
38{ 39{
39 public class AssetXferUploader 40 public class AssetXferUploader
40 { 41 {
42 // Viewer's notion of the default texture
43 private List<UUID> defaultIDs = new List<UUID> {
44 new UUID("5748decc-f629-461c-9a36-a35a221fe21f"),
45 new UUID("7ca39b4c-bd19-4699-aff7-f93fd03d3e7b"),
46 new UUID("6522e74d-1660-4e7f-b601-6f48c1659a77"),
47 new UUID("c228d1cf-4b5d-4ba8-84f4-899a0796aa97")
48 };
41 private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); 49 private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
42 50
43 /// <summary> 51 /// <summary>
@@ -85,6 +93,7 @@ namespace OpenSim.Region.CoreModules.Agent.AssetTransaction
85 93
86 private sbyte type = 0; 94 private sbyte type = 0;
87 private byte wearableType = 0; 95 private byte wearableType = 0;
96 private byte[] m_oldData = null;
88 public ulong XferID; 97 public ulong XferID;
89 private Scene m_Scene; 98 private Scene m_Scene;
90 99
@@ -393,6 +402,7 @@ namespace OpenSim.Region.CoreModules.Agent.AssetTransaction
393 402
394 private void CompleteCreateItem(uint callbackID) 403 private void CompleteCreateItem(uint callbackID)
395 { 404 {
405 ValidateAssets();
396 m_Scene.AssetService.Store(m_asset); 406 m_Scene.AssetService.Store(m_asset);
397 407
398 InventoryItemBase item = new InventoryItemBase(); 408 InventoryItemBase item = new InventoryItemBase();
@@ -413,6 +423,9 @@ namespace OpenSim.Region.CoreModules.Agent.AssetTransaction
413 item.Flags = (uint) wearableType; 423 item.Flags = (uint) wearableType;
414 item.CreationDate = Util.UnixTimeSinceEpoch(); 424 item.CreationDate = Util.UnixTimeSinceEpoch();
415 425
426 m_log.DebugFormat("[XFER]: Created item {0} with asset {1}",
427 item.ID, item.AssetID);
428
416 if (m_Scene.AddInventoryItem(item)) 429 if (m_Scene.AddInventoryItem(item))
417 ourClient.SendInventoryItemCreateUpdate(item, callbackID); 430 ourClient.SendInventoryItemCreateUpdate(item, callbackID);
418 else 431 else
@@ -420,5 +433,132 @@ namespace OpenSim.Region.CoreModules.Agent.AssetTransaction
420 433
421 m_transactions.RemoveXferUploader(m_transactionID); 434 m_transactions.RemoveXferUploader(m_transactionID);
422 } 435 }
436
437 private void ValidateAssets()
438 {
439 if (m_asset.Type == (sbyte)AssetType.Clothing ||
440 m_asset.Type == (sbyte)AssetType.Bodypart)
441 {
442 string content = System.Text.Encoding.ASCII.GetString(m_asset.Data);
443 string[] lines = content.Split(new char[] {'\n'});
444
445 List<string> validated = new List<string>();
446
447 Dictionary<int, UUID> allowed = ExtractTexturesFromOldData();
448
449 int textures = 0;
450
451 foreach (string line in lines)
452 {
453 try
454 {
455 if (line.StartsWith("textures "))
456 {
457 textures = Convert.ToInt32(line.Substring(9));
458 validated.Add(line);
459 }
460 else if (textures > 0)
461 {
462 string[] parts = line.Split(new char[] {' '});
463
464 UUID tx = new UUID(parts[1]);
465 int id = Convert.ToInt32(parts[0]);
466
467 if (defaultIDs.Contains(tx) || tx == UUID.Zero ||
468 (allowed.ContainsKey(id) && allowed[id] == tx))
469 {
470 validated.Add(parts[0] + " " + tx.ToString());
471 }
472 else
473 {
474 int perms = m_Scene.InventoryService.GetAssetPermissions(ourClient.AgentId, tx);
475 int full = (int)(PermissionMask.Modify | PermissionMask.Transfer | PermissionMask.Copy);
476
477 if ((perms & full) != full)
478 {
479 m_log.ErrorFormat("[ASSET UPLOADER]: REJECTED update with texture {0} from {1} because they do not own the texture", tx, ourClient.AgentId);
480 validated.Add(parts[0] + " " + UUID.Zero.ToString());
481 }
482 else
483 {
484 validated.Add(line);
485 }
486 }
487 textures--;
488 }
489 else
490 {
491 validated.Add(line);
492 }
493 }
494 catch
495 {
496 // If it's malformed, skip it
497 }
498 }
499
500 string final = String.Join("\n", validated.ToArray());
501
502 m_asset.Data = System.Text.Encoding.ASCII.GetBytes(final);
503 }
504 }
505
506 /// <summary>
507 /// Get the asset data uploaded in this transfer.
508 /// </summary>
509 /// <returns>null if the asset has not finished uploading</returns>
510 public AssetBase GetAssetData()
511 {
512 if (m_uploadState == UploadState.Complete)
513 {
514 ValidateAssets();
515 return m_asset;
516 }
517
518 return null;
519 }
520
521 public void SetOldData(byte[] d)
522 {
523 m_oldData = d;
524 }
525
526 private Dictionary<int,UUID> ExtractTexturesFromOldData()
527 {
528 Dictionary<int,UUID> result = new Dictionary<int,UUID>();
529 if (m_oldData == null)
530 return result;
531
532 string content = System.Text.Encoding.ASCII.GetString(m_oldData);
533 string[] lines = content.Split(new char[] {'\n'});
534
535 int textures = 0;
536
537 foreach (string line in lines)
538 {
539 try
540 {
541 if (line.StartsWith("textures "))
542 {
543 textures = Convert.ToInt32(line.Substring(9));
544 }
545 else if (textures > 0)
546 {
547 string[] parts = line.Split(new char[] {' '});
548
549 UUID tx = new UUID(parts[1]);
550 int id = Convert.ToInt32(parts[0]);
551 result[id] = tx;
552 textures--;
553 }
554 }
555 catch
556 {
557 // If it's malformed, skip it
558 }
559 }
560
561 return result;
562 }
423 } 563 }
424} \ No newline at end of file 564}
diff --git a/OpenSim/Region/CoreModules/Agent/Xfer/XferModule.cs b/OpenSim/Region/CoreModules/Agent/Xfer/XferModule.cs
index b8e2820..78d597d 100644
--- a/OpenSim/Region/CoreModules/Agent/Xfer/XferModule.cs
+++ b/OpenSim/Region/CoreModules/Agent/Xfer/XferModule.cs
@@ -145,6 +145,8 @@ namespace OpenSim.Region.CoreModules.Agent.Xfer
145 { 145 {
146 byte[] fileData = NewFiles[fileName].Data; 146 byte[] fileData = NewFiles[fileName].Data;
147 XferDownLoad transaction = new XferDownLoad(fileName, fileData, xferID, remoteClient); 147 XferDownLoad transaction = new XferDownLoad(fileName, fileData, xferID, remoteClient);
148 if (fileName.StartsWith("inventory_"))
149 transaction.isTaskInventory = true;
148 150
149 Transfers.Add(xferID, transaction); 151 Transfers.Add(xferID, transaction);
150 152
@@ -228,6 +230,7 @@ namespace OpenSim.Region.CoreModules.Agent.Xfer
228 public uint Packet = 0; 230 public uint Packet = 0;
229 public uint Serial = 1; 231 public uint Serial = 1;
230 public ulong XferID = 0; 232 public ulong XferID = 0;
233 public bool isTaskInventory = false;
231 234
232 public XferDownLoad(string fileName, byte[] data, ulong xferID, IClientAPI client) 235 public XferDownLoad(string fileName, byte[] data, ulong xferID, IClientAPI client)
233 { 236 {
@@ -253,7 +256,7 @@ namespace OpenSim.Region.CoreModules.Agent.Xfer
253 byte[] transferData = new byte[Data.Length + 4]; 256 byte[] transferData = new byte[Data.Length + 4];
254 Array.Copy(Utils.IntToBytes(Data.Length), 0, transferData, 0, 4); 257 Array.Copy(Utils.IntToBytes(Data.Length), 0, transferData, 0, 4);
255 Array.Copy(Data, 0, transferData, 4, Data.Length); 258 Array.Copy(Data, 0, transferData, 4, Data.Length);
256 Client.SendXferPacket(XferID, 0 + 0x80000000, transferData); 259 Client.SendXferPacket(XferID, 0 + 0x80000000, transferData, isTaskInventory);
257 complete = true; 260 complete = true;
258 } 261 }
259 else 262 else
@@ -261,7 +264,7 @@ namespace OpenSim.Region.CoreModules.Agent.Xfer
261 byte[] transferData = new byte[1000 + 4]; 264 byte[] transferData = new byte[1000 + 4];
262 Array.Copy(Utils.IntToBytes(Data.Length), 0, transferData, 0, 4); 265 Array.Copy(Utils.IntToBytes(Data.Length), 0, transferData, 0, 4);
263 Array.Copy(Data, 0, transferData, 4, 1000); 266 Array.Copy(Data, 0, transferData, 4, 1000);
264 Client.SendXferPacket(XferID, 0, transferData); 267 Client.SendXferPacket(XferID, 0, transferData, isTaskInventory);
265 Packet++; 268 Packet++;
266 DataPointer = 1000; 269 DataPointer = 1000;
267 } 270 }
@@ -282,7 +285,7 @@ namespace OpenSim.Region.CoreModules.Agent.Xfer
282 { 285 {
283 byte[] transferData = new byte[1000]; 286 byte[] transferData = new byte[1000];
284 Array.Copy(Data, DataPointer, transferData, 0, 1000); 287 Array.Copy(Data, DataPointer, transferData, 0, 1000);
285 Client.SendXferPacket(XferID, Packet, transferData); 288 Client.SendXferPacket(XferID, Packet, transferData, isTaskInventory);
286 Packet++; 289 Packet++;
287 DataPointer += 1000; 290 DataPointer += 1000;
288 } 291 }
@@ -291,7 +294,7 @@ namespace OpenSim.Region.CoreModules.Agent.Xfer
291 byte[] transferData = new byte[Data.Length - DataPointer]; 294 byte[] transferData = new byte[Data.Length - DataPointer];
292 Array.Copy(Data, DataPointer, transferData, 0, Data.Length - DataPointer); 295 Array.Copy(Data, DataPointer, transferData, 0, Data.Length - DataPointer);
293 uint endPacket = Packet |= (uint) 0x80000000; 296 uint endPacket = Packet |= (uint) 0x80000000;
294 Client.SendXferPacket(XferID, endPacket, transferData); 297 Client.SendXferPacket(XferID, endPacket, transferData, isTaskInventory);
295 Packet++; 298 Packet++;
296 DataPointer += (Data.Length - DataPointer); 299 DataPointer += (Data.Length - DataPointer);
297 300