weblogue Xerus

Aller au contenu | Aller au menu | Aller à la recherche

mardi 7 novembre 2006

Sécurité et Sharepoint 2007

On va voir ici comment rechercher un utilisateur et assigner à cet utilisateur des rôles pour un document donné.

Voici le code en question, qui serait expliqué plus bas :

SPSite spSite = SPControl.GetContextSite(Context);
using (SPWeb spWeb = spSite.RootWeb)
{
   SPFile spFile = spWeb.GetFile("Documents/Proposal for my company.doc");
   SPListItem spListItem = spFile.Item;
   bool reachMaxCount;
   IList<SPPrincipalInfo> principalInfos = SPUtility.SearchPrincipals(spWeb, "cédric", SPPrincipalType.All, SPPrincipalSource.All, null, 100, out reachMaxCount);
   if (principalInfos.Count == 1)
   {
       SPPrincipalInfo spPrincipalInfo = principalInfos0;
       string loginName = spPrincipalInfo.LoginName;
       string email = spPrincipalInfo.Email;
       string name = spPrincipalInfo.DisplayName;
       string notes = string.Empty;
       SPRoleAssignment roleAssignment = new SPRoleAssignment(loginName, email, name, notes);
       SPRoleDefinition roleDefinition1 = spWeb.RoleDefinitions.GetByType(SPRoleType.Contributor);
       SPRoleDefinition roleDefinition2 = spWeb.RoleDefinitions.GetByType(SPRoleType.WebDesigner);
       roleAssignment.RoleDefinitionBindings.Add(roleDefinition1);
       roleAssignment.RoleDefinitionBindings.Add(roleDefinition2);
       if (!spListItem.HasUniqueRoleAssignments)
       {
           spListItem.BreakRoleInheritance(true);
       }
       spListItem.RoleAssignments.Add(roleAssignment);
       spListItem.Update();
    }
}

On fait attention à ne pas gaspiller les ressources :

using (SPWeb spWeb = spSite.RootWeb)

Voir à ce sujet http://msdn2.microsoft.com/en-us/library/ms778813.aspx

La recherche se fait par SPUtility.SearchPrincipals :

   IList<SPPrincipalInfo> principalInfos = SPUtility.SearchPrincipals(spWeb, "cédric", SPPrincipalType.All, SPPrincipalSource.All, null, 100, out reachMaxCount);

Cette méthode n'est pas (encore) documentée dans les MSDN.

  • SPWeb :
  • input

On recherche ici un utilisateur ou un groupe "cédric". Une recherche avec "a" aurait retourné tous les principals contenant la lettre "a".

SearchPrincipals est notamment utilisé par la fenêtre de recherche d'utilisateurs de sharepoint 2007.

  • SPPrincipalType

On a choisi ici de rechercher tous les types de principal mais on aurait pu se limiter aux utilisateurs par exemple (SPPrincipalType.User)

  • SPPrincipalSource

On utilise ici toutes les sources possibles mais on aurait pu se limiter aux utilisateurs Windows du domaine (SPPrincipalSource.Windows) ou à un membership provider (MembershipProvider) par exemple.

Un membership provider permet de mettre en place une authentification qui ne repose pas sur l'authentification windows mais sur des utilisateurs stockés en base de données par exemple). Voir à ce sujet l'article de Sahil Malik : Enabling Custom Authentication for SharePoint 2007

Le reste du code est déjà plus classique et est expliqué par exemple à http://www.sharepointblogs.com/ssa/archive/2006/11/04/15719.aspx

mardi 24 octobre 2006

Sharepoint & versioning

Sharepoint 2007 a une API qui est loin d'être claire. La documentation n'aide pas beaucoup.

La récupération des versions d'un document dans une document library n'est pas aisée ...

La version courante
  • le contenu : SPFile.OpenBinary()
  • les propriétés : SPFile.Item
  • le label de version : SPFile.UIVersionLabel
Les autres versions

Je pensais pouvoir récupérer le SPFile correspondant à la version en question et de là récupérer ses propriétés de la façon suivante :

SPFileVersion spFileVersion = spFile.Versions[0];
SPWeb spWeb = spFileVersion.File.Item.Web;
SPFile spVersionFile = spWeb.GetFile(spFileVersion.Url);

mais spVersionFile.Item est null ...

En fait il faut faire, à partir du spFileVersion :

  • le contenu : spFileVersion.OpenBinary()
  • les propriétés : spFileversion.File.Item.Versions[spFileVersion.ID]
  • le label de version : spFileVersion.VersionLabel