Hi Marius, 

> On 04/03/2011 13:43 PM, Marius Dumitru Florea wrote
>
> Hi Marco, 
>
> On 04/01/2011 12:53 PM, Marco Antonio González wrote: 
>
> > Hi All, 
> > 
> > What I'm trying to get is: 
> > User logs into XWiki through CAS Auth, I also have a webservice to get 
> > remote user credentials (where a User can be in many Groups), and some 
> > rights > over that groups (only membership), so what I want is to: 
> > 
> > - Create a Space for each remote "Group" (named "remoteGroupSpaceX"), 
> > - Create a Group in XWiki (named "remoteGroupX") 
> > - Assign "edit" right to the "remoteGroupX" over "remoteGroupSpaceX". 
> > 
> > I already have created the Space (/xwiki/bin/view/remoteGroupSpace/), the 
> > Group (XWiki.remoteGroupX) and what I'm trying to get is the XWikiRights 
> > from the remoteGroup, but I can't find where can I get the XWikiRights 
> > object. 
> > 
> > I tried to duplicate (through XWikiDocument.duplicate(EntityReference) 
> > method) an existing group (XWikiAdminGroup) and search where is the 
> > XWikiRight object, and then change the "levels" field to "edit", and saving 
> > the remoteGroup with the modified rights, but the Edit button is still 
> > there. 
> > 
> > Here's a sample of my code: 
> > 
> > private void assignRights(String spaceName, String groupName, String 
> > rights, XWikiContext context) throws XWikiException { 
>
> >      // Prepare EntityReferences 
> >      WikiReference wikiRef = new WikiReference("XWiki"); 
>
> Are you sure you have a wiki named "XWiki"? The main wiki is called by 
> default "xwiki" (lower case). Anyway, you should avoid hard-coding the 
> name of the main wiki. You should write instead: 

Yes, you are right, I "simplified" the code a bit for easier understanding and 
made the caps mistake. The current main wiki is 'xwiki' and I get it from 
context.getDatabase() method.

>
> context.getMainXWiki() --> for main wiki or, 
> context.getDatabase()  --> for current wiki. 
>
> >      SpaceReference xwikiSpaceRef = new SpaceReference("XWiki", wikiRef); 
> > 
> >      SpaceReference remoteSpaceRef = new SpaceReference(spaceName, 
> > wikiRef); 
> >      DocumentReference refGroup = new DocumentReference(new 
> > EntityReference(groupName, EntityType.DOCUMENT, xwikiSpaceRef)); 
> >      DocumentReference refRights = new DocumentReference(new 
> > EntityReference("XWikiRights", EntityType.DOCUMENT, remoteSpaceRef)); 
>
> The above 5 lines are equivalent to this: 
>
> DocumentReference refGroup = new 
> DocumentReference(context.getDatabase(), "XWiki", groupName); 
> DocumentReference refRights = new 
> DocumentReference(context.getDatabase(), spaceName, "XWikiRights"); 

Thanks for the tip!

>
> > 
> >      // Get the XWikiDocument relative to the Group 
> >      XWikiDocument docGroup = context.getWiki().getDocument(refGroup, 
> > context); 
> > 
> >      // Get the XWikiRights from the Group 
> >      BaseObject groupRights = docGroup.getXObject(refRights); 
> >      // Modify rights 
> >      groupRights.set("levels", rights, context); 
> > 
> >      context.getWiki().saveDocument(docGroup, context); 
>
> I see 2 mistakes here: 
>
> (1) You assume that space level rights are saved on the group document. 
> You should edit the group document using the object editor and see what 
> objects it has attached. XWikiRights objects don't have any information 
> about the target entity (page/space/wiki) because the target entity is 
> determined based on the document where XWikiRights objects are attached. 
> So for space rights you should look at the objects attached to 
> <SpaceName>.WebPreferences page. 

On my <SpaceName>.WebPreferences, I only get a XWiki.XWikiGlobalRights object, 
so I proceed to change the "levels" field, but anything changes whatever value 
I put on it.

>
> (2) In order to retrieve an object from a document you need the class 
> name/reference, which is the same no matter where the objects are 
> attached. The class reference fro XWikiRights is xwiki:XWiki.XWikiRights 
> not xwiki:<SpaceName>.XWikiRights . Now, if I go to the space 
> administration and edit the user/group rights I get 
> XWiki.XWikiGlobalRights objects attached to <SpaceName>.WebPreference so 
> you should use this class instead of XWikiRights. 
>
> I would start with this code (which I haven't tested): 
>
> ----------8<---------- 
> DocumentReference rightsClassRef = new 
> DocumentReference(context.getMainWiki(), "XWiki", "XWikiGlobalRights"); 

context.getMainWiki() must be context.getMainXWiki().

> DocumentReference spacePrefsRef = new 
> DocumentReference(context.getDatabase(), spaceName, "WebPreferences"); 
> // Get the space preferences page, where space level rights are saved. 
> XWikiDocument spacePrefs = context.getWiki().getDocument(spacePrefsRef, 
> context); 
> // Get the XWikiGlobalRights from the space preferences page. 
> BaseObject spaceRights = spacePrefs.getXObject(rightsClassRef); 
> // Modify space rights. 
> spaceRights.set("levels", rights, context); 
> spaceRights.set("groups", groupName, context); 

// Set "1" to allow <rights>, or "0" to deny them.
spaceRights.set("allow", "1", context);

> context.getWiki().saveDocument(spacePrefs, context); 
> ---------->8---------- 

Inspecting the spaceRights.getXObjects(rightsClassRef) I get a treeMap that has 
one item for each right, I'll continue testing how to mix allow/deny rights at 
the same time, for example allow "edit" and deny "admin".

Thank you,

>
> Hope this helps, 
> Marius 
>
> > } 
> > 
> > Where: 
> > String spaceName = "remoteGroupSpaceX"; 
> > String groupName = "remoteGroupX"; 
> > String rights = "edit"; 
> > 
> > I know about relation between XWikiGlobalRights and XWikiRights and also 
> > about rights priority (Page>  Space>  Wiki / page.XWikiRights>  
> > space.XWikiRights>  wiki.XWikiGlobalRights). 
> > 
> > So my plan is: 
> > Everybody has "view" (XWiki.XWikiAllUsers) right in the whole wiki, and 
> > only members of each "remoteGroupX" has "edit" right over their own space 
> > "remoteGroupSpaceX". 
> > 
> > I'm a little bit lost with this and I hope any help. 
> > 
> > Thank you, 
> > Marco A. Gonzalez 
> > _______________________________________________ 
> > devs mailing list 
> > [hidden email] 
> > http://lists.xwiki.org/mailman/listinfo/devs
> _______________________________________________ 
> devs mailing list 
> [hidden email] 
> http://lists.xwiki.org/mailman/listinfo/devs
_______________________________________________
devs mailing list
[email protected]
http://lists.xwiki.org/mailman/listinfo/devs

Reply via email to