diff options
Diffstat (limited to '')
-rw-r--r-- | OpenSim/Region/Environment/PermissionManager.cs | 361 |
1 files changed, 178 insertions, 183 deletions
diff --git a/OpenSim/Region/Environment/PermissionManager.cs b/OpenSim/Region/Environment/PermissionManager.cs index fd8387b..b2829a1 100644 --- a/OpenSim/Region/Environment/PermissionManager.cs +++ b/OpenSim/Region/Environment/PermissionManager.cs | |||
@@ -33,27 +33,21 @@ namespace OpenSim.Region.Environment | |||
33 | { | 33 | { |
34 | public class PermissionManager | 34 | public class PermissionManager |
35 | { | 35 | { |
36 | // Bypasses the permissions engine (always returns OK) | ||
37 | // disable in any production environment | ||
38 | // TODO: Change this to false when permissions are a desired default | ||
39 | // TODO: Move to configuration option. | ||
40 | private bool m_bypassPermissions = true; | ||
36 | protected Scene m_scene; | 41 | protected Scene m_scene; |
37 | 42 | ||
38 | // These are here for testing. They will be taken out | 43 | // These are here for testing. They will be taken out |
39 | |||
40 | //private uint PERM_ALL = (uint)2147483647; | 44 | //private uint PERM_ALL = (uint)2147483647; |
41 | private uint PERM_COPY = (uint)32768; | 45 | private uint PERM_COPY = 32768; |
42 | //private uint PERM_MODIFY = (uint)16384; | 46 | //private uint PERM_MODIFY = (uint)16384; |
43 | private uint PERM_MOVE = (uint)524288; | ||
44 | //private uint PERM_TRANS = (uint)8192; | 47 | //private uint PERM_TRANS = (uint)8192; |
45 | private uint PERM_LOCKED = (uint)540672; | 48 | private uint PERM_LOCKED = 540672; |
46 | // Bypasses the permissions engine (always returns OK) | 49 | private uint PERM_MOVE = 524288; |
47 | // disable in any production environment | ||
48 | // TODO: Change this to false when permissions are a desired default | ||
49 | // TODO: Move to configuration option. | ||
50 | private bool m_bypassPermissions = true; | ||
51 | 50 | ||
52 | public bool BypassPermissions | ||
53 | { | ||
54 | get { return m_bypassPermissions; } | ||
55 | set { m_bypassPermissions = value; } | ||
56 | } | ||
57 | 51 | ||
58 | public PermissionManager() | 52 | public PermissionManager() |
59 | { | 53 | { |
@@ -64,6 +58,12 @@ namespace OpenSim.Region.Environment | |||
64 | m_scene = scene; | 58 | m_scene = scene; |
65 | } | 59 | } |
66 | 60 | ||
61 | public bool BypassPermissions | ||
62 | { | ||
63 | get { return m_bypassPermissions; } | ||
64 | set { m_bypassPermissions = value; } | ||
65 | } | ||
66 | |||
67 | public void Initialise(Scene scene) | 67 | public void Initialise(Scene scene) |
68 | { | 68 | { |
69 | m_scene = scene; | 69 | m_scene = scene; |
@@ -129,8 +129,8 @@ namespace OpenSim.Region.Environment | |||
129 | ILandObject land = m_scene.LandChannel.getLandObject(position.X, position.Y); | 129 | ILandObject land = m_scene.LandChannel.getLandObject(position.X, position.Y); |
130 | if (land == null) return false; | 130 | if (land == null) return false; |
131 | 131 | ||
132 | if ((land.landData.landFlags & ((int)Parcel.ParcelFlags.CreateObjects)) == | 132 | if ((land.landData.landFlags & ((int) Parcel.ParcelFlags.CreateObjects)) == |
133 | (int)Parcel.ParcelFlags.CreateObjects) | 133 | (int) Parcel.ParcelFlags.CreateObjects) |
134 | permission = true; | 134 | permission = true; |
135 | 135 | ||
136 | //TODO: check for group rights | 136 | //TODO: check for group rights |
@@ -168,8 +168,6 @@ namespace OpenSim.Region.Environment | |||
168 | /// <returns>Has permission?</returns> | 168 | /// <returns>Has permission?</returns> |
169 | public virtual bool CanObjectEntry(LLUUID user, LLVector3 oldPos, LLVector3 newPos) | 169 | public virtual bool CanObjectEntry(LLUUID user, LLVector3 oldPos, LLVector3 newPos) |
170 | { | 170 | { |
171 | |||
172 | |||
173 | if ((newPos.X > 257f || newPos.X < -1f || newPos.Y > 257f || newPos.Y < -1f)) | 171 | if ((newPos.X > 257f || newPos.X < -1f || newPos.Y > 257f || newPos.Y < -1f)) |
174 | { | 172 | { |
175 | return true; | 173 | return true; |
@@ -193,7 +191,7 @@ namespace OpenSim.Region.Environment | |||
193 | return true; | 191 | return true; |
194 | } | 192 | } |
195 | 193 | ||
196 | if ((land2.landData.landFlags & ((int)Parcel.ParcelFlags.AllowAllObjectEntry)) != 0) | 194 | if ((land2.landData.landFlags & ((int) Parcel.ParcelFlags.AllowAllObjectEntry)) != 0) |
197 | { | 195 | { |
198 | return true; | 196 | return true; |
199 | } | 197 | } |
@@ -210,11 +208,142 @@ namespace OpenSim.Region.Environment | |||
210 | return false; | 208 | return false; |
211 | } | 209 | } |
212 | 210 | ||
211 | public virtual bool CanEditScript(LLUUID user, LLUUID script) | ||
212 | { | ||
213 | return IsAdministrator(user); | ||
214 | } | ||
215 | |||
216 | public virtual bool CanRunScript(LLUUID user, LLUUID script) | ||
217 | { | ||
218 | return IsAdministrator(user); | ||
219 | } | ||
220 | |||
221 | public virtual bool CanRunConsoleCommand(LLUUID user) | ||
222 | { | ||
223 | return IsAdministrator(user); | ||
224 | } | ||
225 | |||
226 | public virtual bool CanTerraform(LLUUID user, LLVector3 position) | ||
227 | { | ||
228 | bool permission = false; | ||
229 | |||
230 | // Estate override | ||
231 | if (GenericEstatePermission(user)) | ||
232 | permission = true; | ||
233 | |||
234 | float X = position.X; | ||
235 | float Y = position.Y; | ||
236 | |||
237 | if (X > 255) | ||
238 | X = 255; | ||
239 | if (Y > 255) | ||
240 | Y = 255; | ||
241 | if (X < 0) | ||
242 | X = 0; | ||
243 | if (Y < 0) | ||
244 | Y = 0; | ||
245 | |||
246 | // Land owner can terraform too | ||
247 | ILandObject parcel = m_scene.LandChannel.getLandObject(X, Y); | ||
248 | if (parcel != null && GenericParcelPermission(user, parcel)) | ||
249 | permission = true; | ||
250 | |||
251 | if (!permission) | ||
252 | SendPermissionError(user, "Not authorized to terraform at this location."); | ||
253 | |||
254 | return permission; | ||
255 | } | ||
256 | |||
257 | #region Estate Permissions | ||
258 | |||
259 | public virtual bool GenericEstatePermission(LLUUID user) | ||
260 | { | ||
261 | // Default: deny | ||
262 | bool permission = false; | ||
263 | |||
264 | // Estate admins should be able to use estate tools | ||
265 | if (IsEstateManager(user)) | ||
266 | permission = true; | ||
267 | |||
268 | // Administrators always have permission | ||
269 | if (IsAdministrator(user)) | ||
270 | permission = true; | ||
271 | |||
272 | return permission; | ||
273 | } | ||
274 | |||
275 | public virtual bool CanEditEstateTerrain(LLUUID user) | ||
276 | { | ||
277 | return GenericEstatePermission(user); | ||
278 | } | ||
279 | |||
280 | public virtual bool CanRestartSim(LLUUID user) | ||
281 | { | ||
282 | // Since this is potentially going on a grid... | ||
283 | |||
284 | return GenericEstatePermission(user); | ||
285 | //return m_scene.RegionInfo.MasterAvatarAssignedUUID == user; | ||
286 | } | ||
287 | |||
288 | #endregion | ||
289 | |||
290 | #region Parcel Permissions | ||
291 | |||
292 | protected virtual bool GenericParcelPermission(LLUUID user, ILandObject parcel) | ||
293 | { | ||
294 | bool permission = false; | ||
295 | |||
296 | if (parcel.landData.ownerID == user) | ||
297 | { | ||
298 | permission = true; | ||
299 | } | ||
300 | |||
301 | if (parcel.landData.isGroupOwned) | ||
302 | { | ||
303 | // TODO: Need to do some extra checks here. Requires group code. | ||
304 | } | ||
305 | |||
306 | if (IsEstateManager(user)) | ||
307 | { | ||
308 | permission = true; | ||
309 | } | ||
310 | |||
311 | if (IsAdministrator(user)) | ||
312 | { | ||
313 | permission = true; | ||
314 | } | ||
315 | |||
316 | return permission; | ||
317 | } | ||
318 | |||
319 | protected virtual bool GenericParcelPermission(LLUUID user, LLVector3 pos) | ||
320 | { | ||
321 | ILandObject parcel = m_scene.LandChannel.getLandObject(pos.X, pos.Y); | ||
322 | if (parcel == null) return false; | ||
323 | return GenericParcelPermission(user, parcel); | ||
324 | } | ||
325 | |||
326 | public virtual bool CanEditParcel(LLUUID user, ILandObject parcel) | ||
327 | { | ||
328 | return GenericParcelPermission(user, parcel); | ||
329 | } | ||
330 | |||
331 | public virtual bool CanSellParcel(LLUUID user, ILandObject parcel) | ||
332 | { | ||
333 | return GenericParcelPermission(user, parcel); | ||
334 | } | ||
335 | |||
336 | public virtual bool CanAbandonParcel(LLUUID user, ILandObject parcel) | ||
337 | { | ||
338 | return GenericParcelPermission(user, parcel); | ||
339 | } | ||
340 | |||
341 | #endregion | ||
342 | |||
213 | #region Object Permissions | 343 | #region Object Permissions |
214 | 344 | ||
215 | public virtual uint GenerateClientFlags(LLUUID user, LLUUID objID) | 345 | public virtual uint GenerateClientFlags(LLUUID user, LLUUID objID) |
216 | { | 346 | { |
217 | |||
218 | // Here's the way this works, | 347 | // Here's the way this works, |
219 | // ObjectFlags and Permission flags are two different enumerations | 348 | // ObjectFlags and Permission flags are two different enumerations |
220 | // ObjectFlags, however, tells the client to change what it will allow the user to do. | 349 | // ObjectFlags, however, tells the client to change what it will allow the user to do. |
@@ -226,32 +355,33 @@ namespace OpenSim.Region.Environment | |||
226 | // Outside of this method, they should never be added to objectflags! | 355 | // Outside of this method, they should never be added to objectflags! |
227 | // -teravus | 356 | // -teravus |
228 | 357 | ||
229 | SceneObjectPart task=m_scene.GetSceneObjectPart(objID); | 358 | SceneObjectPart task = m_scene.GetSceneObjectPart(objID); |
230 | 359 | ||
231 | // this shouldn't ever happen.. return no permissions/objectflags. | 360 | // this shouldn't ever happen.. return no permissions/objectflags. |
232 | if (task == null) | 361 | if (task == null) |
233 | return (uint)0; | 362 | return 0; |
234 | 363 | ||
235 | uint objflags = task.GetEffectiveObjectFlags(); | 364 | uint objflags = task.GetEffectiveObjectFlags(); |
236 | LLUUID objectOwner = task.OwnerID; | 365 | LLUUID objectOwner = task.OwnerID; |
237 | 366 | ||
238 | 367 | ||
239 | // Remove any of the objectFlags that are temporary. These will get added back if appropriate | 368 | // Remove any of the objectFlags that are temporary. These will get added back if appropriate |
240 | // in the next bit of code | 369 | // in the next bit of code |
241 | 370 | ||
242 | objflags &= (uint) | 371 | objflags &= (uint) |
243 | ~(LLObject.ObjectFlags.ObjectCopy | // Tells client you can copy the object | 372 | ~(LLObject.ObjectFlags.ObjectCopy | // Tells client you can copy the object |
244 | LLObject.ObjectFlags.ObjectModify | // tells client you can modify the object | 373 | LLObject.ObjectFlags.ObjectModify | // tells client you can modify the object |
245 | LLObject.ObjectFlags.ObjectMove | // tells client that you can move the object (only, no mod) | 374 | LLObject.ObjectFlags.ObjectMove | // tells client that you can move the object (only, no mod) |
246 | LLObject.ObjectFlags.ObjectTransfer | // tells the client that you can /take/ the object if you don't own it | 375 | LLObject.ObjectFlags.ObjectTransfer | // tells the client that you can /take/ the object if you don't own it |
247 | LLObject.ObjectFlags.ObjectYouOwner | // Tells client that you're the owner of the object | 376 | LLObject.ObjectFlags.ObjectYouOwner | // Tells client that you're the owner of the object |
248 | LLObject.ObjectFlags.ObjectYouOfficer // Tells client that you've got group object editing permission. Used when ObjectGroupOwned is set | 377 | LLObject.ObjectFlags.ObjectYouOfficer |
249 | ); | 378 | // Tells client that you've got group object editing permission. Used when ObjectGroupOwned is set |
379 | ); | ||
250 | 380 | ||
251 | // Creating the three ObjectFlags options for this method to choose from. | 381 | // Creating the three ObjectFlags options for this method to choose from. |
252 | // Customize the OwnerMask | 382 | // Customize the OwnerMask |
253 | uint objectOwnerMask = ApplyObjectModifyMasks(task.OwnerMask, objflags); | 383 | uint objectOwnerMask = ApplyObjectModifyMasks(task.OwnerMask, objflags); |
254 | objectOwnerMask |= (uint)LLObject.ObjectFlags.ObjectYouOwner; | 384 | objectOwnerMask |= (uint) LLObject.ObjectFlags.ObjectYouOwner; |
255 | 385 | ||
256 | // Customize the GroupMask | 386 | // Customize the GroupMask |
257 | uint objectGroupMask = ApplyObjectModifyMasks(task.GroupMask, objflags); | 387 | uint objectGroupMask = ApplyObjectModifyMasks(task.GroupMask, objflags); |
@@ -261,8 +391,8 @@ namespace OpenSim.Region.Environment | |||
261 | 391 | ||
262 | 392 | ||
263 | // Hack to allow collaboration until Groups and Group Permissions are implemented | 393 | // Hack to allow collaboration until Groups and Group Permissions are implemented |
264 | if ((objectEveryoneMask & (uint)LLObject.ObjectFlags.ObjectMove) != 0) | 394 | if ((objectEveryoneMask & (uint) LLObject.ObjectFlags.ObjectMove) != 0) |
265 | objectEveryoneMask |= (uint)LLObject.ObjectFlags.ObjectModify; | 395 | objectEveryoneMask |= (uint) LLObject.ObjectFlags.ObjectModify; |
266 | 396 | ||
267 | if (m_bypassPermissions) | 397 | if (m_bypassPermissions) |
268 | return objectOwnerMask; | 398 | return objectOwnerMask; |
@@ -287,7 +417,6 @@ namespace OpenSim.Region.Environment | |||
287 | return objectOwnerMask; | 417 | return objectOwnerMask; |
288 | 418 | ||
289 | 419 | ||
290 | |||
291 | // Admin should be able to edit anything in the sim (including admin objects) | 420 | // Admin should be able to edit anything in the sim (including admin objects) |
292 | if (IsAdministrator(user)) | 421 | if (IsAdministrator(user)) |
293 | return objectOwnerMask; | 422 | return objectOwnerMask; |
@@ -297,30 +426,29 @@ namespace OpenSim.Region.Environment | |||
297 | } | 426 | } |
298 | 427 | ||
299 | 428 | ||
300 | |||
301 | private uint ApplyObjectModifyMasks(uint setPermissionMask, uint objectFlagsMask) | 429 | private uint ApplyObjectModifyMasks(uint setPermissionMask, uint objectFlagsMask) |
302 | { | 430 | { |
303 | // We are adding the temporary objectflags to the object's objectflags based on the | 431 | // We are adding the temporary objectflags to the object's objectflags based on the |
304 | // permission flag given. These change the F flags on the client. | 432 | // permission flag given. These change the F flags on the client. |
305 | 433 | ||
306 | if ((setPermissionMask & (uint)PermissionMask.Copy) != 0) | 434 | if ((setPermissionMask & (uint) PermissionMask.Copy) != 0) |
307 | { | 435 | { |
308 | objectFlagsMask |= (uint)LLObject.ObjectFlags.ObjectCopy; | 436 | objectFlagsMask |= (uint) LLObject.ObjectFlags.ObjectCopy; |
309 | } | 437 | } |
310 | 438 | ||
311 | if ((setPermissionMask & (uint)PermissionMask.Move) != 0) | 439 | if ((setPermissionMask & (uint) PermissionMask.Move) != 0) |
312 | { | 440 | { |
313 | objectFlagsMask |= (uint)LLObject.ObjectFlags.ObjectMove; | 441 | objectFlagsMask |= (uint) LLObject.ObjectFlags.ObjectMove; |
314 | } | 442 | } |
315 | 443 | ||
316 | if ((setPermissionMask & (uint)PermissionMask.Modify) != 0) | 444 | if ((setPermissionMask & (uint) PermissionMask.Modify) != 0) |
317 | { | 445 | { |
318 | objectFlagsMask |= (uint)LLObject.ObjectFlags.ObjectModify; | 446 | objectFlagsMask |= (uint) LLObject.ObjectFlags.ObjectModify; |
319 | } | 447 | } |
320 | 448 | ||
321 | if ((setPermissionMask & (uint)PermissionMask.Transfer) != 0) | 449 | if ((setPermissionMask & (uint) PermissionMask.Transfer) != 0) |
322 | { | 450 | { |
323 | objectFlagsMask |= (uint)LLObject.ObjectFlags.ObjectTransfer; | 451 | objectFlagsMask |= (uint) LLObject.ObjectFlags.ObjectTransfer; |
324 | } | 452 | } |
325 | 453 | ||
326 | return objectFlagsMask; | 454 | return objectFlagsMask; |
@@ -344,7 +472,7 @@ namespace OpenSim.Region.Environment | |||
344 | } | 472 | } |
345 | 473 | ||
346 | 474 | ||
347 | SceneObjectGroup group = (SceneObjectGroup)m_scene.Entities[objId]; | 475 | SceneObjectGroup group = (SceneObjectGroup) m_scene.Entities[objId]; |
348 | 476 | ||
349 | LLUUID objectOwner = group.OwnerID; | 477 | LLUUID objectOwner = group.OwnerID; |
350 | locked = ((group.RootPart.OwnerMask & PERM_LOCKED) == 0); | 478 | locked = ((group.RootPart.OwnerMask & PERM_LOCKED) == 0); |
@@ -432,7 +560,7 @@ namespace OpenSim.Region.Environment | |||
432 | } | 560 | } |
433 | 561 | ||
434 | 562 | ||
435 | SceneObjectGroup task = (SceneObjectGroup)m_scene.Entities[obj]; | 563 | SceneObjectGroup task = (SceneObjectGroup) m_scene.Entities[obj]; |
436 | 564 | ||
437 | 565 | ||
438 | LLUUID taskOwner = null; | 566 | LLUUID taskOwner = null; |
@@ -447,7 +575,6 @@ namespace OpenSim.Region.Environment | |||
447 | // Locked | 575 | // Locked |
448 | if ((task.RootPart.OwnerMask & PERM_LOCKED) == 0) | 576 | if ((task.RootPart.OwnerMask & PERM_LOCKED) == 0) |
449 | permission = false; | 577 | permission = false; |
450 | |||
451 | } | 578 | } |
452 | else | 579 | else |
453 | { | 580 | { |
@@ -464,7 +591,7 @@ namespace OpenSim.Region.Environment | |||
464 | } | 591 | } |
465 | 592 | ||
466 | 593 | ||
467 | SceneObjectGroup group = (SceneObjectGroup)m_scene.Entities[obj]; | 594 | SceneObjectGroup group = (SceneObjectGroup) m_scene.Entities[obj]; |
468 | 595 | ||
469 | LLUUID objectOwner = group.OwnerID; | 596 | LLUUID objectOwner = group.OwnerID; |
470 | locked = ((group.RootPart.OwnerMask & PERM_LOCKED) == 0); | 597 | locked = ((group.RootPart.OwnerMask & PERM_LOCKED) == 0); |
@@ -502,7 +629,7 @@ namespace OpenSim.Region.Environment | |||
502 | return false; | 629 | return false; |
503 | } | 630 | } |
504 | 631 | ||
505 | SceneObjectGroup task = (SceneObjectGroup)m_scene.Entities[obj]; | 632 | SceneObjectGroup task = (SceneObjectGroup) m_scene.Entities[obj]; |
506 | LLUUID taskOwner = null; | 633 | LLUUID taskOwner = null; |
507 | // Added this because at this point in time it wouldn't be wise for | 634 | // Added this because at this point in time it wouldn't be wise for |
508 | // the administrator object permissions to take effect. | 635 | // the administrator object permissions to take effect. |
@@ -558,137 +685,5 @@ namespace OpenSim.Region.Environment | |||
558 | } | 685 | } |
559 | 686 | ||
560 | #endregion | 687 | #endregion |
561 | |||
562 | public virtual bool CanEditScript(LLUUID user, LLUUID script) | ||
563 | { | ||
564 | return IsAdministrator(user); | ||
565 | } | ||
566 | |||
567 | public virtual bool CanRunScript(LLUUID user, LLUUID script) | ||
568 | { | ||
569 | return IsAdministrator(user); | ||
570 | } | ||
571 | |||
572 | public virtual bool CanRunConsoleCommand(LLUUID user) | ||
573 | { | ||
574 | return IsAdministrator(user); | ||
575 | } | ||
576 | |||
577 | public virtual bool CanTerraform(LLUUID user, LLVector3 position) | ||
578 | { | ||
579 | bool permission = false; | ||
580 | |||
581 | // Estate override | ||
582 | if (GenericEstatePermission(user)) | ||
583 | permission = true; | ||
584 | |||
585 | float X = position.X; | ||
586 | float Y = position.Y; | ||
587 | |||
588 | if (X > 255) | ||
589 | X = 255; | ||
590 | if (Y > 255) | ||
591 | Y = 255; | ||
592 | if (X < 0) | ||
593 | X = 0; | ||
594 | if (Y < 0) | ||
595 | Y = 0; | ||
596 | |||
597 | // Land owner can terraform too | ||
598 | ILandObject parcel = m_scene.LandChannel.getLandObject(X, Y); | ||
599 | if (parcel != null && GenericParcelPermission(user, parcel)) | ||
600 | permission = true; | ||
601 | |||
602 | if (!permission) | ||
603 | SendPermissionError(user, "Not authorized to terraform at this location."); | ||
604 | |||
605 | return permission; | ||
606 | } | ||
607 | |||
608 | #region Estate Permissions | ||
609 | |||
610 | public virtual bool GenericEstatePermission(LLUUID user) | ||
611 | { | ||
612 | // Default: deny | ||
613 | bool permission = false; | ||
614 | |||
615 | // Estate admins should be able to use estate tools | ||
616 | if (IsEstateManager(user)) | ||
617 | permission = true; | ||
618 | |||
619 | // Administrators always have permission | ||
620 | if (IsAdministrator(user)) | ||
621 | permission = true; | ||
622 | |||
623 | return permission; | ||
624 | } | ||
625 | |||
626 | public virtual bool CanEditEstateTerrain(LLUUID user) | ||
627 | { | ||
628 | return GenericEstatePermission(user); | ||
629 | } | ||
630 | |||
631 | public virtual bool CanRestartSim(LLUUID user) | ||
632 | { | ||
633 | // Since this is potentially going on a grid... | ||
634 | |||
635 | return GenericEstatePermission(user); | ||
636 | //return m_scene.RegionInfo.MasterAvatarAssignedUUID == user; | ||
637 | } | ||
638 | |||
639 | #endregion | ||
640 | |||
641 | #region Parcel Permissions | ||
642 | |||
643 | protected virtual bool GenericParcelPermission(LLUUID user, ILandObject parcel) | ||
644 | { | ||
645 | bool permission = false; | ||
646 | |||
647 | if (parcel.landData.ownerID == user) | ||
648 | { | ||
649 | permission = true; | ||
650 | } | ||
651 | |||
652 | if (parcel.landData.isGroupOwned) | ||
653 | { | ||
654 | // TODO: Need to do some extra checks here. Requires group code. | ||
655 | } | ||
656 | |||
657 | if (IsEstateManager(user)) | ||
658 | { | ||
659 | permission = true; | ||
660 | } | ||
661 | |||
662 | if (IsAdministrator(user)) | ||
663 | { | ||
664 | permission = true; | ||
665 | } | ||
666 | |||
667 | return permission; | ||
668 | } | ||
669 | |||
670 | protected virtual bool GenericParcelPermission(LLUUID user, LLVector3 pos) | ||
671 | { | ||
672 | ILandObject parcel = m_scene.LandChannel.getLandObject(pos.X, pos.Y); | ||
673 | if (parcel == null) return false; | ||
674 | return GenericParcelPermission(user, parcel); | ||
675 | } | ||
676 | |||
677 | public virtual bool CanEditParcel(LLUUID user, ILandObject parcel) | ||
678 | { | ||
679 | return GenericParcelPermission(user, parcel); | ||
680 | } | ||
681 | |||
682 | public virtual bool CanSellParcel(LLUUID user, ILandObject parcel) | ||
683 | { | ||
684 | return GenericParcelPermission(user, parcel); | ||
685 | } | ||
686 | |||
687 | public virtual bool CanAbandonParcel(LLUUID user, ILandObject parcel) | ||
688 | { | ||
689 | return GenericParcelPermission(user, parcel); | ||
690 | } | ||
691 | |||
692 | #endregion | ||
693 | } | 688 | } |
694 | } | 689 | } \ No newline at end of file |