diff options
3 files changed, 116 insertions, 32 deletions
diff --git a/OpenSim/Region/CoreModules/Avatar/Inventory/Archiver/InventoryArchiverModule.cs b/OpenSim/Region/CoreModules/Avatar/Inventory/Archiver/InventoryArchiverModule.cs index 3869de2..2340fad 100644 --- a/OpenSim/Region/CoreModules/Avatar/Inventory/Archiver/InventoryArchiverModule.cs +++ b/OpenSim/Region/CoreModules/Avatar/Inventory/Archiver/InventoryArchiverModule.cs | |||
@@ -51,6 +51,11 @@ namespace OpenSim.Region.CoreModules.Avatar.Inventory.Archiver | |||
51 | public string Name { get { return "Inventory Archiver Module"; } } | 51 | public string Name { get { return "Inventory Archiver Module"; } } |
52 | 52 | ||
53 | public bool IsSharedModule { get { return true; } } | 53 | public bool IsSharedModule { get { return true; } } |
54 | |||
55 | /// <value> | ||
56 | /// Enable or disable checking whether the iar user is actually logged in | ||
57 | /// </value> | ||
58 | public bool DisablePresenceChecks { get; set; } | ||
54 | 59 | ||
55 | public event InventoryArchiveSaved OnInventoryArchiveSaved; | 60 | public event InventoryArchiveSaved OnInventoryArchiveSaved; |
56 | 61 | ||
@@ -70,6 +75,13 @@ namespace OpenSim.Region.CoreModules.Avatar.Inventory.Archiver | |||
70 | private Dictionary<UUID, Scene> m_scenes = new Dictionary<UUID, Scene>(); | 75 | private Dictionary<UUID, Scene> m_scenes = new Dictionary<UUID, Scene>(); |
71 | private Scene m_aScene; | 76 | private Scene m_aScene; |
72 | 77 | ||
78 | public InventoryArchiverModule() {} | ||
79 | |||
80 | public InventoryArchiverModule(bool disablePresenceChecks) | ||
81 | { | ||
82 | DisablePresenceChecks = disablePresenceChecks; | ||
83 | } | ||
84 | |||
73 | public void Initialise(Scene scene, IConfigSource source) | 85 | public void Initialise(Scene scene, IConfigSource source) |
74 | { | 86 | { |
75 | if (m_scenes.Count == 0) | 87 | if (m_scenes.Count == 0) |
@@ -109,29 +121,57 @@ namespace OpenSim.Region.CoreModules.Avatar.Inventory.Archiver | |||
109 | handlerInventoryArchiveSaved(id, succeeded, userInfo, invPath, saveStream, reportedException); | 121 | handlerInventoryArchiveSaved(id, succeeded, userInfo, invPath, saveStream, reportedException); |
110 | } | 122 | } |
111 | 123 | ||
112 | public void ArchiveInventory(Guid id, string firstName, string lastName, string invPath, Stream saveStream) | 124 | public bool ArchiveInventory(Guid id, string firstName, string lastName, string invPath, Stream saveStream) |
113 | { | 125 | { |
114 | if (m_scenes.Count > 0) | 126 | if (m_scenes.Count > 0) |
115 | { | 127 | { |
116 | CachedUserInfo userInfo = GetUserInfo(firstName, lastName); | 128 | CachedUserInfo userInfo = GetUserInfo(firstName, lastName); |
117 | 129 | ||
118 | if (userInfo != null) | 130 | if (userInfo != null) |
119 | new InventoryArchiveWriteRequest(id, this, m_aScene, userInfo, invPath, saveStream).Execute(); | 131 | { |
120 | } | 132 | if (CheckPresence(userInfo.UserProfile.ID)) |
133 | { | ||
134 | new InventoryArchiveWriteRequest(id, this, m_aScene, userInfo, invPath, saveStream).Execute(); | ||
135 | return true; | ||
136 | } | ||
137 | else | ||
138 | { | ||
139 | m_log.ErrorFormat( | ||
140 | "[INVENTORY ARCHIVER]: User {0} {1} not logged in to this region simulator", | ||
141 | userInfo.UserProfile.Name, userInfo.UserProfile.ID); | ||
142 | } | ||
143 | } | ||
144 | } | ||
145 | |||
146 | return false; | ||
121 | } | 147 | } |
122 | 148 | ||
123 | public void ArchiveInventory(Guid id, string firstName, string lastName, string invPath, string savePath) | 149 | public bool ArchiveInventory(Guid id, string firstName, string lastName, string invPath, string savePath) |
124 | { | 150 | { |
125 | if (m_scenes.Count > 0) | 151 | if (m_scenes.Count > 0) |
126 | { | 152 | { |
127 | CachedUserInfo userInfo = GetUserInfo(firstName, lastName); | 153 | CachedUserInfo userInfo = GetUserInfo(firstName, lastName); |
128 | 154 | ||
129 | if (userInfo != null) | 155 | if (userInfo != null) |
130 | new InventoryArchiveWriteRequest(id, this, m_aScene, userInfo, invPath, savePath).Execute(); | 156 | { |
131 | } | 157 | if (CheckPresence(userInfo.UserProfile.ID)) |
158 | { | ||
159 | new InventoryArchiveWriteRequest(id, this, m_aScene, userInfo, invPath, savePath).Execute(); | ||
160 | return true; | ||
161 | } | ||
162 | else | ||
163 | { | ||
164 | m_log.ErrorFormat( | ||
165 | "[INVENTORY ARCHIVER]: User {0} {1} not logged in to this region simulator", | ||
166 | userInfo.UserProfile.Name, userInfo.UserProfile.ID); | ||
167 | } | ||
168 | } | ||
169 | } | ||
170 | |||
171 | return false; | ||
132 | } | 172 | } |
133 | 173 | ||
134 | public void DearchiveInventory(string firstName, string lastName, string invPath, Stream loadStream) | 174 | public bool DearchiveInventory(string firstName, string lastName, string invPath, Stream loadStream) |
135 | { | 175 | { |
136 | if (m_scenes.Count > 0) | 176 | if (m_scenes.Count > 0) |
137 | { | 177 | { |
@@ -139,14 +179,27 @@ namespace OpenSim.Region.CoreModules.Avatar.Inventory.Archiver | |||
139 | 179 | ||
140 | if (userInfo != null) | 180 | if (userInfo != null) |
141 | { | 181 | { |
142 | InventoryArchiveReadRequest request = | 182 | if (CheckPresence(userInfo.UserProfile.ID)) |
143 | new InventoryArchiveReadRequest(m_aScene, userInfo, invPath, loadStream); | 183 | { |
144 | UpdateClientWithLoadedNodes(userInfo, request.Execute()); | 184 | InventoryArchiveReadRequest request = |
185 | new InventoryArchiveReadRequest(m_aScene, userInfo, invPath, loadStream); | ||
186 | UpdateClientWithLoadedNodes(userInfo, request.Execute()); | ||
187 | |||
188 | return true; | ||
189 | } | ||
190 | else | ||
191 | { | ||
192 | m_log.ErrorFormat( | ||
193 | "[INVENTORY ARCHIVER]: User {0} {1} not logged in to this region simulator", | ||
194 | userInfo.UserProfile.Name, userInfo.UserProfile.ID); | ||
195 | } | ||
145 | } | 196 | } |
146 | } | 197 | } |
198 | |||
199 | return false; | ||
147 | } | 200 | } |
148 | 201 | ||
149 | public void DearchiveInventory(string firstName, string lastName, string invPath, string loadPath) | 202 | public bool DearchiveInventory(string firstName, string lastName, string invPath, string loadPath) |
150 | { | 203 | { |
151 | if (m_scenes.Count > 0) | 204 | if (m_scenes.Count > 0) |
152 | { | 205 | { |
@@ -154,11 +207,24 @@ namespace OpenSim.Region.CoreModules.Avatar.Inventory.Archiver | |||
154 | 207 | ||
155 | if (userInfo != null) | 208 | if (userInfo != null) |
156 | { | 209 | { |
157 | InventoryArchiveReadRequest request = | 210 | if (CheckPresence(userInfo.UserProfile.ID)) |
158 | new InventoryArchiveReadRequest(m_aScene, userInfo, invPath, loadPath); | 211 | { |
159 | UpdateClientWithLoadedNodes(userInfo, request.Execute()); | 212 | InventoryArchiveReadRequest request = |
160 | } | 213 | new InventoryArchiveReadRequest(m_aScene, userInfo, invPath, loadPath); |
161 | } | 214 | UpdateClientWithLoadedNodes(userInfo, request.Execute()); |
215 | |||
216 | return true; | ||
217 | } | ||
218 | else | ||
219 | { | ||
220 | m_log.ErrorFormat( | ||
221 | "[INVENTORY ARCHIVER]: User {0} {1} not logged in to this region simulator", | ||
222 | userInfo.UserProfile.Name, userInfo.UserProfile.ID); | ||
223 | } | ||
224 | } | ||
225 | } | ||
226 | |||
227 | return false; | ||
162 | } | 228 | } |
163 | 229 | ||
164 | /// <summary> | 230 | /// <summary> |
@@ -183,11 +249,10 @@ namespace OpenSim.Region.CoreModules.Avatar.Inventory.Archiver | |||
183 | "[INVENTORY ARCHIVER]: Loading archive {0} to inventory path {1} for {2} {3}", | 249 | "[INVENTORY ARCHIVER]: Loading archive {0} to inventory path {1} for {2} {3}", |
184 | loadPath, invPath, firstName, lastName); | 250 | loadPath, invPath, firstName, lastName); |
185 | 251 | ||
186 | DearchiveInventory(firstName, lastName, invPath, loadPath); | 252 | if (DearchiveInventory(firstName, lastName, invPath, loadPath)) |
187 | 253 | m_log.InfoFormat( | |
188 | m_log.InfoFormat( | 254 | "[INVENTORY ARCHIVER]: Loaded archive {0} for {1} {2}", |
189 | "[INVENTORY ARCHIVER]: Loaded archive {0} for {1} {2}", | 255 | loadPath, firstName, lastName); |
190 | loadPath, firstName, lastName); | ||
191 | } | 256 | } |
192 | 257 | ||
193 | /// <summary> | 258 | /// <summary> |
@@ -291,5 +356,24 @@ namespace OpenSim.Region.CoreModules.Avatar.Inventory.Archiver | |||
291 | } | 356 | } |
292 | } | 357 | } |
293 | } | 358 | } |
359 | |||
360 | /// <summary> | ||
361 | /// Check if the given user is present in any of the scenes. | ||
362 | /// </summary> | ||
363 | /// <param name="userId">The user to check</param> | ||
364 | /// <returns>true if the user is in any of the scenes, false otherwise</returns> | ||
365 | protected bool CheckPresence(UUID userId) | ||
366 | { | ||
367 | if (DisablePresenceChecks) | ||
368 | return true; | ||
369 | |||
370 | foreach (Scene scene in m_scenes.Values) | ||
371 | { | ||
372 | if (scene.GetScenePresence(userId) != null) | ||
373 | return true; | ||
374 | } | ||
375 | |||
376 | return false; | ||
377 | } | ||
294 | } | 378 | } |
295 | } | 379 | } |
diff --git a/OpenSim/Region/CoreModules/Avatar/Inventory/Archiver/Tests/InventoryArchiverTests.cs b/OpenSim/Region/CoreModules/Avatar/Inventory/Archiver/Tests/InventoryArchiverTests.cs index c21adef..d579a81 100644 --- a/OpenSim/Region/CoreModules/Avatar/Inventory/Archiver/Tests/InventoryArchiverTests.cs +++ b/OpenSim/Region/CoreModules/Avatar/Inventory/Archiver/Tests/InventoryArchiverTests.cs | |||
@@ -83,7 +83,7 @@ namespace OpenSim.Region.CoreModules.Avatar.Inventory.Archiver.Tests | |||
83 | TestHelper.InMethod(); | 83 | TestHelper.InMethod(); |
84 | log4net.Config.XmlConfigurator.Configure(); | 84 | log4net.Config.XmlConfigurator.Configure(); |
85 | 85 | ||
86 | InventoryArchiverModule archiverModule = new InventoryArchiverModule(); | 86 | InventoryArchiverModule archiverModule = new InventoryArchiverModule(true); |
87 | 87 | ||
88 | Scene scene = SceneSetupHelpers.SetupScene("Inventory"); | 88 | Scene scene = SceneSetupHelpers.SetupScene("Inventory"); |
89 | SceneSetupHelpers.SetupSceneModules(scene, archiverModule); | 89 | SceneSetupHelpers.SetupSceneModules(scene, archiverModule); |
@@ -100,9 +100,7 @@ namespace OpenSim.Region.CoreModules.Avatar.Inventory.Archiver.Tests | |||
100 | cm, userFirstName, userLastName, userId, InventoryReceived); | 100 | cm, userFirstName, userLastName, userId, InventoryReceived); |
101 | Monitor.Wait(this, 60000); | 101 | Monitor.Wait(this, 60000); |
102 | } | 102 | } |
103 | 103 | ||
104 | Console.WriteLine("here"); | ||
105 | |||
106 | // Create asset | 104 | // Create asset |
107 | SceneObjectGroup object1; | 105 | SceneObjectGroup object1; |
108 | SceneObjectPart part1; | 106 | SceneObjectPart part1; |
@@ -248,7 +246,7 @@ namespace OpenSim.Region.CoreModules.Avatar.Inventory.Archiver.Tests | |||
248 | 246 | ||
249 | MemoryStream archiveReadStream = new MemoryStream(archiveWriteStream.ToArray()); | 247 | MemoryStream archiveReadStream = new MemoryStream(archiveWriteStream.ToArray()); |
250 | SerialiserModule serialiserModule = new SerialiserModule(); | 248 | SerialiserModule serialiserModule = new SerialiserModule(); |
251 | InventoryArchiverModule archiverModule = new InventoryArchiverModule(); | 249 | InventoryArchiverModule archiverModule = new InventoryArchiverModule(true); |
252 | 250 | ||
253 | // Annoyingly, we have to set up a scene even though inventory loading has nothing to do with a scene | 251 | // Annoyingly, we have to set up a scene even though inventory loading has nothing to do with a scene |
254 | Scene scene = SceneSetupHelpers.SetupScene("inventory"); | 252 | Scene scene = SceneSetupHelpers.SetupScene("inventory"); |
@@ -318,7 +316,7 @@ namespace OpenSim.Region.CoreModules.Avatar.Inventory.Archiver.Tests | |||
318 | 316 | ||
319 | MemoryStream archiveReadStream = new MemoryStream(archiveWriteStream.ToArray()); | 317 | MemoryStream archiveReadStream = new MemoryStream(archiveWriteStream.ToArray()); |
320 | SerialiserModule serialiserModule = new SerialiserModule(); | 318 | SerialiserModule serialiserModule = new SerialiserModule(); |
321 | InventoryArchiverModule archiverModule = new InventoryArchiverModule(); | 319 | InventoryArchiverModule archiverModule = new InventoryArchiverModule(true); |
322 | 320 | ||
323 | // Annoyingly, we have to set up a scene even though inventory loading has nothing to do with a scene | 321 | // Annoyingly, we have to set up a scene even though inventory loading has nothing to do with a scene |
324 | Scene scene = SceneSetupHelpers.SetupScene(); | 322 | Scene scene = SceneSetupHelpers.SetupScene(); |
diff --git a/OpenSim/Region/Framework/Interfaces/IInventoryArchiverModule.cs b/OpenSim/Region/Framework/Interfaces/IInventoryArchiverModule.cs index 457b5b8..ca7abf8 100644 --- a/OpenSim/Region/Framework/Interfaces/IInventoryArchiverModule.cs +++ b/OpenSim/Region/Framework/Interfaces/IInventoryArchiverModule.cs | |||
@@ -56,8 +56,9 @@ namespace OpenSim.Region.Framework.Interfaces | |||
56 | /// <param name="firstName"></param> | 56 | /// <param name="firstName"></param> |
57 | /// <param name="lastName"></param> | 57 | /// <param name="lastName"></param> |
58 | /// <param name="invPath">The inventory path in which to place the loaded folders and items</param> | 58 | /// <param name="invPath">The inventory path in which to place the loaded folders and items</param> |
59 | /// <param name="loadStream">The stream from which the inventory archive will be loaded</param> | 59 | /// <param name="loadStream">The stream from which the inventory archive will be loaded</param> |
60 | void DearchiveInventory(string firstName, string lastName, string invPath, Stream loadStream); | 60 | /// <returns>true if the first stage of the operation succeeded, false otherwise</returns> |
61 | bool DearchiveInventory(string firstName, string lastName, string invPath, Stream loadStream); | ||
61 | 62 | ||
62 | /// <summary> | 63 | /// <summary> |
63 | /// Archive a user's inventory folder to the given stream | 64 | /// Archive a user's inventory folder to the given stream |
@@ -67,6 +68,7 @@ namespace OpenSim.Region.Framework.Interfaces | |||
67 | /// <param name="lastName"></param> | 68 | /// <param name="lastName"></param> |
68 | /// <param name="invPath">The inventory path from which the inventory should be saved.</param> | 69 | /// <param name="invPath">The inventory path from which the inventory should be saved.</param> |
69 | /// <param name="saveStream">The stream to which the inventory archive will be saved</param> | 70 | /// <param name="saveStream">The stream to which the inventory archive will be saved</param> |
70 | void ArchiveInventory(Guid id, string firstName, string lastName, string invPath, Stream saveStream); | 71 | /// <returns>true if the first stage of the operation succeeded, false otherwise</returns> |
72 | bool ArchiveInventory(Guid id, string firstName, string lastName, string invPath, Stream saveStream); | ||
71 | } | 73 | } |
72 | } | 74 | } \ No newline at end of file |