[Opensim-dev] C# tip of the day Was:[Opensim-commits] r4554

Justin Clark-Casey jjustincc at googlemail.com
Thu May 8 19:58:46 UTC 2008


I think you're right.  I guess MingChen doesn't read this list.


Stefan Andersson wrote:
> Guys,
>  
> Just in case you all missed it; there's a compromise between delegates 
> and events : multicast delegates.
>  
> Right now, we're just adding delegates to an delegate handler and invoke 
> it by the default behaviour - run them all, in no defined order, 
> disregarding the result of the invocation;
>  
> If we want a bit more intelligent invocation, consider this:
>  
> ---
>  
> delegate bool CheckPermissionsHandler( LLUUID userId, object obj );
>  
> CheckPermissionsHandler handlerList = null;
>  
> handlerList += myHandler1;
> handlerList += myHandler2;
>  
> bool hasRights = true;
>  
> foreach (CheckPermissionsHandler handler in del.GetInvocationList())
> {
>    if( !handler(userId, obj ) )
>    {
>       hasRights = false;
>    }
> }
>  
> return hasRights;
>  
> ---
>  
> What this would do, is to broadcast a permissions check, and if anybody 
> objects, return false.
>  
> I guess this is what you want.
> 
> /Stefan
> 
> ------------------------------------------------------------------------
>  > Date: Wed, 7 May 2008 20:38:58 +0100
>  > From: jjustincc at googlemail.com
>  > To: opensim-dev at lists.berlios.de
>  > Subject: Re: [Opensim-dev] [Opensim-commits] r4554 - in 
> trunk/OpenSim/Region: ClientStack/LindenUDP Environment/Interfaces 
> Environment/Modules/World/Permissions Environment/Scenes
>  >
>  > Hi MingChen,
>  >
>  > Couldn't these external check hooks be added directly into the
>  > PermissionsModule, rather than having the scene call the module, only
>  > for the module to call back into the scene?
>  >
>  >
>  > mingchen at opensimulator.org wrote:
>  > > Author: mingchen
>  > > Date: 2008-05-07 10:33:57 -0700 (Wed, 07 May 2008)
>  > > New Revision: 4554
>  > >
>  > > Modified:
>  > > trunk/OpenSim/Region/ClientStack/LindenUDP/LLClientView.cs
>  > > trunk/OpenSim/Region/Environment/Interfaces/IScenePermissions.cs
>  > > 
> trunk/OpenSim/Region/Environment/Modules/World/Permissions/PermissionsModule.cs
>  > > trunk/OpenSim/Region/Environment/Scenes/Scene.Inventory.cs
>  > > trunk/OpenSim/Region/Environment/Scenes/Scene.cs
>  > > trunk/OpenSim/Region/Environment/Scenes/SceneBase.cs
>  > > Log:
>  > > *Added SceneExternalChecks.cs that is used to manage checking the 
> results of multiple functions that register with the class and return 
> the result (usually true/false) based on those results. This is useful 
> for module wanting to put their opinion in decisions such as 'can the 
> user rez this object?'
>  > >
>  > > Modified: trunk/OpenSim/Region/ClientStack/LindenUDP/LLClientView.cs
>  > > ===================================================================
>  > > --- trunk/OpenSim/Region/ClientStack/LindenUDP/LLClientView.cs 
> 2008-05-07 16:48:29 UTC (rev 4553)
>  > > +++ trunk/OpenSim/Region/ClientStack/LindenUDP/LLClientView.cs 
> 2008-05-07 17:33:57 UTC (rev 4554)
>  > > @@ -4047,6 +4047,9 @@
>  > > //RayEnd: <61.97724, 141.995, 92.58341>
>  > > //RayTargetID: 00000000-0000-0000-0000-000000000000
>  > >
>  > > + //Check to see if adding the prim is allowed; useful for any 
> module wanting to restrict the
>  > > + //object from rezing initially
>  > > +
>  > > handlerAddPrim = OnAddPrim;
>  > > if (handlerAddPrim != null)
>  > > handlerAddPrim(AgentId, addPacket.ObjectData.RayEnd, 
> addPacket.ObjectData.Rotation, shape, 
> addPacket.ObjectData.BypassRaycast, addPacket.ObjectData.RayStart, 
> addPacket.ObjectData.RayTargetID, 
> addPacket.ObjectData.RayEndIsIntersection);
>  > >
>  > > Modified: 
> trunk/OpenSim/Region/Environment/Interfaces/IScenePermissions.cs
>  > > ===================================================================
>  > > --- 
> trunk/OpenSim/Region/Environment/Interfaces/IScenePermissions.cs 
> 2008-05-07 16:48:29 UTC (rev 4553)
>  > > +++ 
> trunk/OpenSim/Region/Environment/Interfaces/IScenePermissions.cs 
> 2008-05-07 17:33:57 UTC (rev 4554)
>  > > @@ -34,9 +34,9 @@
>  > > bool BypassPermissions { get; set; }
>  > >
>  > > #region Object Permissions
>  > > +
>  > > + bool CanRezObject(LLUUID user, LLVector3 position, int count);
>  > >
>  > > - bool CanRezObject(LLUUID user, LLVector3 position);
>  > > -
>  > > /// <summary>
>  > > /// Permissions check - can user delete an object?
>  > > /// </summary>
>  > >
>  > > Modified: 
> trunk/OpenSim/Region/Environment/Modules/World/Permissions/PermissionsModule.cs
>  > > ===================================================================
>  > > --- 
> trunk/OpenSim/Region/Environment/Modules/World/Permissions/PermissionsModule.cs 
> 2008-05-07 16:48:29 UTC (rev 4553)
>  > > +++ 
> trunk/OpenSim/Region/Environment/Modules/World/Permissions/PermissionsModule.cs 
> 2008-05-07 17:33:57 UTC (rev 4554)
>  > > @@ -140,12 +140,21 @@
>  > > return false;
>  > > }
>  > >
>  > > - public virtual bool CanRezObject(LLUUID user, LLVector3 position)
>  > > + public virtual bool CanRezObject(LLUUID user, LLVector3 position, 
> int objectCount)
>  > > {
>  > > bool permission = false;
>  > >
>  > > +
>  > > +
>  > > string reason = "Insufficient permission";
>  > >
>  > > + //Perform ExternalChecks first!
>  > > + bool results = 
> m_scene.ExternalChecks.ExternalChecksCanRezObject(objectCount, user, 
> position);
>  > > + if (results == false)
>  > > + {
>  > > + return false;
>  > > + }
>  > > +
>  > > ILandObject land = m_scene.LandChannel.GetLandObject(position.X, 
> position.Y);
>  > > if (land == null) return false;
>  > >
>  > >
>  > > Modified: trunk/OpenSim/Region/Environment/Scenes/Scene.Inventory.cs
>  > > ===================================================================
>  > > --- trunk/OpenSim/Region/Environment/Scenes/Scene.Inventory.cs 
> 2008-05-07 16:48:29 UTC (rev 4553)
>  > > +++ trunk/OpenSim/Region/Environment/Scenes/Scene.Inventory.cs 
> 2008-05-07 17:33:57 UTC (rev 4554)
>  > > @@ -1267,10 +1267,7 @@
>  > > RayStart, RayEnd, RayTargetID, new LLQuaternion(0, 0, 0, 1),
>  > > BypassRayCast, bRayEndIsIntersection,true,scale, false);
>  > >
>  > > - if (!Permissions.CanRezObject(remoteClient.AgentId, pos) && 
> !attachment)
>  > > - {
>  > > - return null;
>  > > - }
>  > > +
>  > >
>  > > // Rez object
>  > > CachedUserInfo userInfo = 
> CommsManager.UserProfileCacheService.GetUserDetails(remoteClient.AgentId);
>  > > @@ -1288,6 +1285,11 @@
>  > > {
>  > > string xmlData = Helpers.FieldToUTF8String(rezAsset.Data);
>  > > SceneObjectGroup group = new SceneObjectGroup(this, m_regionHandle, 
> xmlData);
>  > > + if (!Permissions.CanRezObject(remoteClient.AgentId, pos, 
> group.Children.Count) && !attachment)
>  > > + {
>  > > + return null;
>  > > + }
>  > > +
>  > > group.ResetIDs();
>  > > AddEntity(group);
>  > >
>  > > @@ -1361,10 +1363,6 @@
>  > > {
>  > > LLUUID ownerID = item.OwnerID;
>  > >
>  > > - if (!Permissions.CanRezObject(ownerID, pos))
>  > > - {
>  > > - return null;
>  > > - }
>  > >
>  > > AssetBase rezAsset = AssetCache.GetAsset(item.AssetID, false);
>  > >
>  > > @@ -1372,6 +1370,11 @@
>  > > {
>  > > string xmlData = Helpers.FieldToUTF8String(rezAsset.Data);
>  > > SceneObjectGroup group = new SceneObjectGroup(this, m_regionHandle, 
> xmlData);
>  > > +
>  > > + if (!Permissions.CanRezObject(ownerID, pos, group.Children.Count))
>  > > + {
>  > > + return null;
>  > > + }
>  > > group.ResetIDs();
>  > > AddEntity(group);
>  > >
>  > >
>  > > Modified: trunk/OpenSim/Region/Environment/Scenes/Scene.cs
>  > > ===================================================================
>  > > --- trunk/OpenSim/Region/Environment/Scenes/Scene.cs 2008-05-07 
> 16:48:29 UTC (rev 4553)
>  > > +++ trunk/OpenSim/Region/Environment/Scenes/Scene.cs 2008-05-07 
> 17:33:57 UTC (rev 4554)
>  > > @@ -241,6 +241,7 @@
>  > > m_seeIntoRegionFromNeighbor = SeeIntoRegionFromNeighbor;
>  > >
>  > > m_eventManager = new EventManager();
>  > > + m_externalChecks = new SceneExternalChecks(this);
>  > >
>  > > //Bind Storage Manager functions to some land manager functions for 
> this scene
>  > > EventManager.OnLandObjectAdded +=
>  > > @@ -829,7 +830,7 @@
>  > > {
>  > > ForEachScenePresence(delegate(ScenePresence presence) { 
> whatToDo(presence.ControllingClient); });
>  > > }
>  > > -
>  > > +
>  > > /// <summary>
>  > > ///
>  > > /// </summary>
>  > > @@ -1244,7 +1245,7 @@
>  > >
>  > > LLVector3 pos = GetNewRezLocation(RayStart, RayEnd, RayTargetID, 
> rot, bypassRaycast, RayEndIsIntersection, true, new 
> LLVector3(0.5f,0.5f,0.5f), false);
>  > >
>  > > - if (Permissions.CanRezObject(ownerID, pos))
>  > > + if (Permissions.CanRezObject(ownerID, pos, 1))
>  > > {
>  > > // rez ON the ground, not IN the ground
>  > > pos.Z += 0.25F;
>  > > @@ -3217,5 +3218,7 @@
>  > > return visualParams;
>  > > }
>  > > #endregion
>  > > +
>  > > +
>  > > }
>  > > }
>  > >
>  > > Modified: trunk/OpenSim/Region/Environment/Scenes/SceneBase.cs
>  > > ===================================================================
>  > > --- trunk/OpenSim/Region/Environment/Scenes/SceneBase.cs 2008-05-07 
> 16:48:29 UTC (rev 4553)
>  > > +++ trunk/OpenSim/Region/Environment/Scenes/SceneBase.cs 2008-05-07 
> 17:33:57 UTC (rev 4554)
>  > > @@ -71,6 +71,12 @@
>  > > get { return m_eventManager; }
>  > > }
>  > >
>  > > +
>  > > + protected SceneExternalChecks m_externalChecks;
>  > > + public SceneExternalChecks ExternalChecks
>  > > + {
>  > > + get { return m_externalChecks; }
>  > > + }
>  > >
>  > > protected string m_datastore;
>  > >
>  > >
>  > > _______________________________________________
>  > > Opensim-commits mailing list
>  > > Opensim-commits at lists.berlios.de
>  > > https://lists.berlios.de/mailman/listinfo/opensim-commits
>  > >
>  >
>  >
>  > --
>  > justincc
>  > Justin Clark-Casey
>  > http://justincc.wordpress.com
>  > _______________________________________________
>  > Opensim-dev mailing list
>  > Opensim-dev at lists.berlios.de
>  > https://lists.berlios.de/mailman/listinfo/opensim-dev
> 
> 
> ------------------------------------------------------------------------
> 
> _______________________________________________
> Opensim-dev mailing list
> Opensim-dev at lists.berlios.de
> https://lists.berlios.de/mailman/listinfo/opensim-dev


-- 
justincc
Justin Clark-Casey
http://justincc.wordpress.com



More information about the Opensim-dev mailing list