novembre
2011
Dans SharePoint 2010 et plus précisément dans la partie “Réseau Social” du produit, il est possible d’ajouter un autre utilisateur en tant que collègue.
L’ajout d’un collègue est unidirectionnel : c’est-à-dire que lorsqu’une personne ajoutera une autre dans sa liste des collègues, le collègue ne verra cependant pas dans sa liste celui qui vient de l’ajouter.
Dans le cas de la mise en place d’une mise en relation comme Facebook par exemple, lorsqu’un utilisateur accepte la requête d’un autre, l’un est ajouté dans la liste de contacts de l’autre et inversement.
Pour réaliser cela avec SharePoint, on peut se dire que c’est très simple mais j’ai fait face à un petit soucis : lorsque l’utilisateur connecté accepte la requête, l’ajout du collègue dans sa propre liste fonctionne mais l’inverse ne fonctionne pas et on obtient une erreur de sécurité. En effet, il est impossible d’ajouter un collègue dans la liste d’un autre utilisateur que celui dans lequel le contexte tourne. Et ce, même en élévation de privilèges…
Il y a un hack possible pour “shooter” le contexte utilisateur pour faire en sorte que la requête passe :
public void AddToColleagues(UserProfile user, UserProfile colleagueToAdd, SPSite currentSite) { SPSecurity.RunWithElevatedPrivileges(delegate() { using (SPSite site = new SPSite(currentSite.Url)) { using (SPWeb web = ssite.OpenWeb()) { SPServiceContext context = SPServiceContext.GetContext(site); //On sauvegarde le contexte HttpContext currentContext = HttpContext.Current; //On “shoote” le contexte HttpContext.Current = null; UserProfileManager profManager = new UserProfileManager(context); user.Colleagues.CreateWithoutEmailNotification(colleagueToAdd, ColleagueGroupType.General, impersUser.Colleagues.GetGroupList()[0], false, Privacy.Public); colleagueToAdd.Colleagues.CreateWithoutEmailNotification(user, ColleagueGroupType.General, impersUser.Colleagues.GetGroupList()[0], false, Privacy.Public); //On recharge le contexte HttpContext.Current = currentContext; } } }); }