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:

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");

>
>      // 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.

(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");
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);
context.getWiki().saveDocument(spacePrefs, context);
---------->8----------

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
> [email protected]
> http://lists.xwiki.org/mailman/listinfo/devs
_______________________________________________
devs mailing list
[email protected]
http://lists.xwiki.org/mailman/listinfo/devs

Reply via email to