diff options
author | Justin Clark-Casey (justincc) | 2010-07-13 23:19:45 +0100 |
---|---|---|
committer | Justin Clark-Casey (justincc) | 2010-07-26 23:34:20 +0100 |
commit | 51b208e96c881bd322b3769b843f0ebae3c09a84 (patch) | |
tree | 7acd05a16a5d667087c25b8f7936515343c5e885 | |
parent | discard an object media update message if it tries to set more media textures... (diff) | |
download | opensim-SC-51b208e96c881bd322b3769b843f0ebae3c09a84.zip opensim-SC-51b208e96c881bd322b3769b843f0ebae3c09a84.tar.gz opensim-SC-51b208e96c881bd322b3769b843f0ebae3c09a84.tar.bz2 opensim-SC-51b208e96c881bd322b3769b843f0ebae3c09a84.tar.xz |
implement prim media control permissions serverside in order to stop bad clients
3 files changed, 127 insertions, 24 deletions
diff --git a/OpenSim/Region/CoreModules/World/Media/Moap/MoapModule.cs b/OpenSim/Region/CoreModules/World/Media/Moap/MoapModule.cs index 378ff4a..d7aede9 100644 --- a/OpenSim/Region/CoreModules/World/Media/Moap/MoapModule.cs +++ b/OpenSim/Region/CoreModules/World/Media/Moap/MoapModule.cs | |||
@@ -58,8 +58,21 @@ namespace OpenSim.Region.CoreModules.Media.Moap | |||
58 | public string Name { get { return "MoapModule"; } } | 58 | public string Name { get { return "MoapModule"; } } |
59 | public Type ReplaceableInterface { get { return null; } } | 59 | public Type ReplaceableInterface { get { return null; } } |
60 | 60 | ||
61 | /// <summary> | ||
62 | /// The scene to which this module is attached | ||
63 | /// </summary> | ||
61 | protected Scene m_scene; | 64 | protected Scene m_scene; |
62 | 65 | ||
66 | /// <summary> | ||
67 | /// Track the ObjectMedia capabilities given to users | ||
68 | /// </summary> | ||
69 | protected Dictionary<string, UUID> m_omCapUsers = new Dictionary<string, UUID>(); | ||
70 | |||
71 | /// <summary> | ||
72 | /// Track the ObjectMediaUpdate capabilities given to users | ||
73 | /// </summary> | ||
74 | protected Dictionary<string, UUID> m_omuCapUsers = new Dictionary<string, UUID>(); | ||
75 | |||
63 | public void Initialise(IConfigSource config) | 76 | public void Initialise(IConfigSource config) |
64 | { | 77 | { |
65 | // TODO: Add config switches to enable/disable this module | 78 | // TODO: Add config switches to enable/disable this module |
@@ -87,16 +100,27 @@ namespace OpenSim.Region.CoreModules.Media.Moap | |||
87 | m_log.DebugFormat( | 100 | m_log.DebugFormat( |
88 | "[MOAP]: Registering ObjectMedia and ObjectMediaNavigate capabilities for agent {0}", agentID); | 101 | "[MOAP]: Registering ObjectMedia and ObjectMediaNavigate capabilities for agent {0}", agentID); |
89 | 102 | ||
90 | // We do receive a post to ObjectMedia when a new avatar enters the region - though admittedly this is the | 103 | string omCapUrl = "/CAPS/" + UUID.Random(); |
91 | // avatar that set the texture in the first place. | 104 | |
92 | // Even though we're registering for POST we're going to get GETS and UPDATES too | 105 | lock (m_omCapUsers) |
93 | caps.RegisterHandler( | 106 | { |
94 | "ObjectMedia", new RestStreamHandler("POST", "/CAPS/" + UUID.Random(), HandleObjectMediaMessage)); | 107 | m_omCapUsers[omCapUrl] = agentID; |
108 | |||
109 | // Even though we're registering for POST we're going to get GETS and UPDATES too | ||
110 | caps.RegisterHandler( | ||
111 | "ObjectMedia", new RestStreamHandler("POST", omCapUrl, HandleObjectMediaMessage)); | ||
112 | } | ||
113 | |||
114 | string omuCapUrl = "/CAPS/" + UUID.Random(); | ||
95 | 115 | ||
96 | // We do get these posts when the url has been changed. | 116 | lock (m_omuCapUsers) |
97 | // Even though we're registering for POST we're going to get GETS and UPDATES too | 117 | { |
98 | caps.RegisterHandler( | 118 | m_omuCapUsers[omuCapUrl] = agentID; |
99 | "ObjectMediaNavigate", new RestStreamHandler("POST", "/CAPS/" + UUID.Random(), HandleObjectMediaNavigateMessage)); | 119 | |
120 | // Even though we're registering for POST we're going to get GETS and UPDATES too | ||
121 | caps.RegisterHandler( | ||
122 | "ObjectMediaNavigate", new RestStreamHandler("POST", omuCapUrl, HandleObjectMediaNavigateMessage)); | ||
123 | } | ||
100 | } | 124 | } |
101 | 125 | ||
102 | public MediaEntry GetMediaEntry(SceneObjectPart part, int face) | 126 | public MediaEntry GetMediaEntry(SceneObjectPart part, int face) |
@@ -147,7 +171,7 @@ namespace OpenSim.Region.CoreModules.Media.Moap | |||
147 | protected string HandleObjectMediaMessage( | 171 | protected string HandleObjectMediaMessage( |
148 | string request, string path, string param, OSHttpRequest httpRequest, OSHttpResponse httpResponse) | 172 | string request, string path, string param, OSHttpRequest httpRequest, OSHttpResponse httpResponse) |
149 | { | 173 | { |
150 | m_log.DebugFormat("[MOAP]: Got ObjectMedia raw request [{0}]", request); | 174 | m_log.DebugFormat("[MOAP]: Got ObjectMedia path [{0}], raw request [{1}]", path, request); |
151 | 175 | ||
152 | OSDMap osd = (OSDMap)OSDParser.DeserializeLLSDXml(request); | 176 | OSDMap osd = (OSDMap)OSDParser.DeserializeLLSDXml(request); |
153 | ObjectMediaMessage omm = new ObjectMediaMessage(); | 177 | ObjectMediaMessage omm = new ObjectMediaMessage(); |
@@ -156,7 +180,7 @@ namespace OpenSim.Region.CoreModules.Media.Moap | |||
156 | if (omm.Request is ObjectMediaRequest) | 180 | if (omm.Request is ObjectMediaRequest) |
157 | return HandleObjectMediaRequest(omm.Request as ObjectMediaRequest); | 181 | return HandleObjectMediaRequest(omm.Request as ObjectMediaRequest); |
158 | else if (omm.Request is ObjectMediaUpdate) | 182 | else if (omm.Request is ObjectMediaUpdate) |
159 | return HandleObjectMediaUpdate(omm.Request as ObjectMediaUpdate); | 183 | return HandleObjectMediaUpdate(path, omm.Request as ObjectMediaUpdate); |
160 | 184 | ||
161 | throw new Exception( | 185 | throw new Exception( |
162 | string.Format( | 186 | string.Format( |
@@ -165,7 +189,7 @@ namespace OpenSim.Region.CoreModules.Media.Moap | |||
165 | } | 189 | } |
166 | 190 | ||
167 | /// <summary> | 191 | /// <summary> |
168 | /// Handle a request for media textures | 192 | /// Handle a fetch request for media textures |
169 | /// </summary> | 193 | /// </summary> |
170 | /// <param name="omr"></param> | 194 | /// <param name="omr"></param> |
171 | /// <returns></returns> | 195 | /// <returns></returns> |
@@ -202,9 +226,10 @@ namespace OpenSim.Region.CoreModules.Media.Moap | |||
202 | /// <summary> | 226 | /// <summary> |
203 | /// Handle an update of media textures. | 227 | /// Handle an update of media textures. |
204 | /// </summary> | 228 | /// </summary> |
229 | /// <param name="path">Path on which this request was made</param> | ||
205 | /// <param name="omu">/param> | 230 | /// <param name="omu">/param> |
206 | /// <returns></returns> | 231 | /// <returns></returns> |
207 | protected string HandleObjectMediaUpdate(ObjectMediaUpdate omu) | 232 | protected string HandleObjectMediaUpdate(string path, ObjectMediaUpdate omu) |
208 | { | 233 | { |
209 | UUID primId = omu.PrimID; | 234 | UUID primId = omu.PrimID; |
210 | 235 | ||
@@ -216,16 +241,16 @@ namespace OpenSim.Region.CoreModules.Media.Moap | |||
216 | "[MOAP]: Received an UPDATE ObjectMediaRequest for prim {0} but this doesn't exist in region {1}", | 241 | "[MOAP]: Received an UPDATE ObjectMediaRequest for prim {0} but this doesn't exist in region {1}", |
217 | primId, m_scene.RegionInfo.RegionName); | 242 | primId, m_scene.RegionInfo.RegionName); |
218 | return string.Empty; | 243 | return string.Empty; |
219 | } | 244 | } |
220 | 245 | ||
221 | m_log.DebugFormat("[MOAP]: Received {0} media entries for prim {1}", omu.FaceMedia.Length, primId); | 246 | m_log.DebugFormat("[MOAP]: Received {0} media entries for prim {1}", omu.FaceMedia.Length, primId); |
222 | 247 | ||
223 | // for (int i = 0; i < omu.FaceMedia.Length; i++) | 248 | for (int i = 0; i < omu.FaceMedia.Length; i++) |
224 | // { | 249 | { |
225 | // MediaEntry me = omu.FaceMedia[i]; | 250 | MediaEntry me = omu.FaceMedia[i]; |
226 | // string v = (null == me ? "null": OSDParser.SerializeLLSDXmlString(me.GetOSD())); | 251 | string v = (null == me ? "null": OSDParser.SerializeLLSDXmlString(me.GetOSD())); |
227 | // m_log.DebugFormat("[MOAP]: Face {0} [{1}]", i, v); | 252 | m_log.DebugFormat("[MOAP]: Face {0} [{1}]", i, v); |
228 | // } | 253 | } |
229 | 254 | ||
230 | if (omu.FaceMedia.Length > part.GetNumberOfSides()) | 255 | if (omu.FaceMedia.Length > part.GetNumberOfSides()) |
231 | { | 256 | { |
@@ -235,7 +260,27 @@ namespace OpenSim.Region.CoreModules.Media.Moap | |||
235 | return string.Empty; | 260 | return string.Empty; |
236 | } | 261 | } |
237 | 262 | ||
238 | part.Shape.Media = new List<MediaEntry>(omu.FaceMedia); | 263 | List<MediaEntry> media = part.Shape.Media; |
264 | |||
265 | if (null == media) | ||
266 | { | ||
267 | part.Shape.Media = new List<MediaEntry>(omu.FaceMedia); | ||
268 | } | ||
269 | else | ||
270 | { | ||
271 | // We need to go through the media textures one at a time to make sure that we have permission | ||
272 | // to change them | ||
273 | UUID agentId = default(UUID); | ||
274 | |||
275 | lock (m_omCapUsers) | ||
276 | agentId = m_omCapUsers[path]; | ||
277 | |||
278 | for (int i = 0; i < media.Count; i++) | ||
279 | { | ||
280 | if (m_scene.Permissions.CanControlPrimMedia(agentId, part.UUID, i)) | ||
281 | media[i] = omu.FaceMedia[i]; | ||
282 | } | ||
283 | } | ||
239 | 284 | ||
240 | UpdateMediaUrl(part); | 285 | UpdateMediaUrl(part); |
241 | 286 | ||
diff --git a/OpenSim/Region/CoreModules/World/Permissions/PermissionsModule.cs b/OpenSim/Region/CoreModules/World/Permissions/PermissionsModule.cs index 69b247c..358ea59 100644 --- a/OpenSim/Region/CoreModules/World/Permissions/PermissionsModule.cs +++ b/OpenSim/Region/CoreModules/World/Permissions/PermissionsModule.cs | |||
@@ -164,6 +164,7 @@ namespace OpenSim.Region.CoreModules.World.Permissions | |||
164 | private Dictionary<string, bool> GrantYP = new Dictionary<string, bool>(); | 164 | private Dictionary<string, bool> GrantYP = new Dictionary<string, bool>(); |
165 | private IFriendsModule m_friendsModule; | 165 | private IFriendsModule m_friendsModule; |
166 | private IGroupsModule m_groupsModule; | 166 | private IGroupsModule m_groupsModule; |
167 | private IMoapModule m_moapModule; | ||
167 | 168 | ||
168 | #endregion | 169 | #endregion |
169 | 170 | ||
@@ -248,6 +249,8 @@ namespace OpenSim.Region.CoreModules.World.Permissions | |||
248 | m_scene.Permissions.OnDeleteUserInventory += CanDeleteUserInventory; //NOT YET IMPLEMENTED | 249 | m_scene.Permissions.OnDeleteUserInventory += CanDeleteUserInventory; //NOT YET IMPLEMENTED |
249 | 250 | ||
250 | m_scene.Permissions.OnTeleport += CanTeleport; //NOT YET IMPLEMENTED | 251 | m_scene.Permissions.OnTeleport += CanTeleport; //NOT YET IMPLEMENTED |
252 | |||
253 | m_scene.Permissions.OnControlPrimMedia += CanControlPrimMedia; | ||
251 | 254 | ||
252 | m_scene.AddCommand(this, "bypass permissions", | 255 | m_scene.AddCommand(this, "bypass permissions", |
253 | "bypass permissions <true / false>", | 256 | "bypass permissions <true / false>", |
@@ -393,6 +396,8 @@ namespace OpenSim.Region.CoreModules.World.Permissions | |||
393 | 396 | ||
394 | if (m_groupsModule == null) | 397 | if (m_groupsModule == null) |
395 | m_log.Warn("[PERMISSIONS]: Groups module not found, group permissions will not work"); | 398 | m_log.Warn("[PERMISSIONS]: Groups module not found, group permissions will not work"); |
399 | |||
400 | m_moapModule = m_scene.RequestModuleInterface<IMoapModule>(); | ||
396 | } | 401 | } |
397 | 402 | ||
398 | public void Close() | 403 | public void Close() |
@@ -1893,5 +1898,41 @@ namespace OpenSim.Region.CoreModules.World.Permissions | |||
1893 | } | 1898 | } |
1894 | return(false); | 1899 | return(false); |
1895 | } | 1900 | } |
1901 | |||
1902 | private bool CanControlPrimMedia(UUID agentID, UUID primID, int face) | ||
1903 | { | ||
1904 | if (null == m_moapModule) | ||
1905 | return false; | ||
1906 | |||
1907 | SceneObjectPart part = m_scene.GetSceneObjectPart(primID); | ||
1908 | if (null == part) | ||
1909 | return false; | ||
1910 | |||
1911 | MediaEntry me = m_moapModule.GetMediaEntry(part, face); | ||
1912 | |||
1913 | // If there is no existing media entry then it can be controlled (in this context, created). | ||
1914 | if (null == me) | ||
1915 | return true; | ||
1916 | |||
1917 | if (IsAdministrator(agentID)) | ||
1918 | return true; | ||
1919 | |||
1920 | if ((me.ControlPermissions & MediaPermission.Anyone) == MediaPermission.Anyone) | ||
1921 | return true; | ||
1922 | |||
1923 | if ((me.ControlPermissions & MediaPermission.Owner) == MediaPermission.Owner) | ||
1924 | { | ||
1925 | if (agentID == part.OwnerID) | ||
1926 | return true; | ||
1927 | } | ||
1928 | |||
1929 | if ((me.ControlPermissions & MediaPermission.Group) == MediaPermission.Group) | ||
1930 | { | ||
1931 | if (IsGroupMember(part.GroupID, agentID, 0)) | ||
1932 | return true; | ||
1933 | } | ||
1934 | |||
1935 | return false; | ||
1936 | } | ||
1896 | } | 1937 | } |
1897 | } | 1938 | } \ No newline at end of file |
diff --git a/OpenSim/Region/Framework/Scenes/Scene.Permissions.cs b/OpenSim/Region/Framework/Scenes/Scene.Permissions.cs index 7dab04f..70af978 100644 --- a/OpenSim/Region/Framework/Scenes/Scene.Permissions.cs +++ b/OpenSim/Region/Framework/Scenes/Scene.Permissions.cs | |||
@@ -1,4 +1,4 @@ | |||
1 | /* | 1 | /* |
2 | * Copyright (c) Contributors, http://opensimulator.org/ | 2 | * Copyright (c) Contributors, http://opensimulator.org/ |
3 | * See CONTRIBUTORS.TXT for a full list of copyright holders. | 3 | * See CONTRIBUTORS.TXT for a full list of copyright holders. |
4 | * | 4 | * |
@@ -81,6 +81,7 @@ namespace OpenSim.Region.Framework.Scenes | |||
81 | public delegate bool CopyUserInventoryHandler(UUID itemID, UUID userID); | 81 | public delegate bool CopyUserInventoryHandler(UUID itemID, UUID userID); |
82 | public delegate bool DeleteUserInventoryHandler(UUID itemID, UUID userID); | 82 | public delegate bool DeleteUserInventoryHandler(UUID itemID, UUID userID); |
83 | public delegate bool TeleportHandler(UUID userID, Scene scene); | 83 | public delegate bool TeleportHandler(UUID userID, Scene scene); |
84 | public delegate bool ControlPrimMediaHandler(UUID userID, UUID primID, int face); | ||
84 | #endregion | 85 | #endregion |
85 | 86 | ||
86 | public class ScenePermissions | 87 | public class ScenePermissions |
@@ -139,6 +140,7 @@ namespace OpenSim.Region.Framework.Scenes | |||
139 | public event CopyUserInventoryHandler OnCopyUserInventory; | 140 | public event CopyUserInventoryHandler OnCopyUserInventory; |
140 | public event DeleteUserInventoryHandler OnDeleteUserInventory; | 141 | public event DeleteUserInventoryHandler OnDeleteUserInventory; |
141 | public event TeleportHandler OnTeleport; | 142 | public event TeleportHandler OnTeleport; |
143 | public event ControlPrimMediaHandler OnControlPrimMedia; | ||
142 | #endregion | 144 | #endregion |
143 | 145 | ||
144 | #region Object Permission Checks | 146 | #region Object Permission Checks |
@@ -947,5 +949,20 @@ namespace OpenSim.Region.Framework.Scenes | |||
947 | } | 949 | } |
948 | return true; | 950 | return true; |
949 | } | 951 | } |
952 | |||
953 | public bool CanControlPrimMedia(UUID userID, UUID primID, int face) | ||
954 | { | ||
955 | ControlPrimMediaHandler handler = OnControlPrimMedia; | ||
956 | if (handler != null) | ||
957 | { | ||
958 | Delegate[] list = handler.GetInvocationList(); | ||
959 | foreach (ControlPrimMediaHandler h in list) | ||
960 | { | ||
961 | if (h(userID, primID, face) == false) | ||
962 | return false; | ||
963 | } | ||
964 | } | ||
965 | return true; | ||
966 | } | ||
950 | } | 967 | } |
951 | } | 968 | } \ No newline at end of file |