Il est possible d’utiliser les web services de Sharepoint pour effectuer un certain nombre d’opérations. Il existe divers API (comme http://spservices.codeplex.com que j’utiliserai ici) pour aider dans ces opérations.
Cependant il est difficile de trouver de la documentation / exemples sur comment utiliser AddPermission
, RemovePermission
et UpdatePermissions
. Après avoir longuement fouillé le Net, voici ce que j’ai trouvé.
Tout d’abord, pour assigner un rôle défini sur votre site (comme « Contribute », « Full Control », « Read », etc) il va falloir trouver les droits associés. Pour cela on utilise GetRoleCollectionFromWeb
$().SPServices({ operation:"GetRoleCollectionFromWeb", webURL:"http://mon.site.com/ma/collection/", completefunc: function (xData, Status) { var roles=[]; // va contenir les différents rôles existants et les permissions associées var dom=xData.responseXML.getElementsByTagName("Role"); for (var i=dom.length; i--;) roles[dom[i].getAttribute("Name")]=dom[i].getAttribute("BasePermissions").split(", "); } });
Maintenant on va avoir un tableau associatif qui lie un rôle (par exemple « Contribute ») à un ensemble de permissions (ici ça sera « ViewListItems, AddListItems, EditListItems, DeleteListItems, OpenItems, ViewVersions, DeleteVersions, ManagePersonalViews, ViewFormPages, Open, ViewPages, CreateSSCSite, BrowseDirectories, BrowseUserInfo, AddDelPrivateWebParts, UpdatePersonalWebParts, UseClientIntegration, UseRemoteAPIs, CreateAlerts, EditMyUserInfo »).
Grâce à la documentation de Microsoft portant sur les masks de permissions on va créer un autre tableau associatif pour chacune de ces BasePermissions
.
Aussi on sait qu’il faut faire un OR
entre chaque mask pour avoir celui qu’on souhaite.
// @param basePermissions est un tableau function getPermissionMask(basePermissions) { // on crée un tableau basé sur la doc Microsoft var permissions=[]; // on rajoute "FullMask" qui est le Full Control permissions["FullMask"] = -1; permissions["ViewListItems"] = parseInt("0x0000000000000001"); permissions["AddListItems"] = parseInt("0x0000000000000002"); permissions["EditListItems"] = parseInt("0x0000000000000004"); permissions["DeleteListItems"] = parseInt("0x0000000000000008"); permissions["ApproveItems"] = parseInt("0x0000000000000010"); permissions["OpenItems"] = parseInt("0x0000000000000020"); permissions["ViewVersions"] = parseInt("0x0000000000000040"); permissions["DeleteVersions"] = parseInt("0x0000000000000080"); permissions["CancelCheckout"] = parseInt("0x0000000000000100"); permissions["ManagePersonalViews"] = parseInt("0x0000000000000200"); permissions["ManageLists"] = parseInt("0x0000000000000800"); permissions["ViewFormPages"] = parseInt("0x0000000000001000"); permissions["Open"] = parseInt("0x0000000000010000"); permissions["ViewPages"] = parseInt("0x0000000000020000"); permissions["AddAndCustomizePages"] = parseInt("0x0000000000040000"); permissions["ApplyThemeAndBorder"] = parseInt("0x0000000000080000"); permissions["ApplyStyleSheets"] = parseInt("0x0000000000100000"); permissions["ViewUsageData"] = parseInt("0x0000000000200000"); permissions["CreateSSCSite"] = parseInt("0x0000000000400000"); permissions["ManageSubwebs"] = parseInt("0x0000000000800000"); permissions["CreateGroups"] = parseInt("0x0000000001000000"); permissions["ManagePermissions"] = parseInt("0x0000000002000000"); permissions["BrowseDirectories"] = parseInt("0x0000000004000000"); permissions["BrowseUserInfo"] = parseInt("0x0000000008000000"); permissions["AddDelPrivateWebParts"] = parseInt("0x0000000010000000"); permissions["UpdatePersonalWebParts"] = parseInt("0x0000000020000000"); permissions["ManageWeb"] = parseInt("0x0000000040000000"); permissions["UseClientIntegration"] = parseInt("0x0000001000000000"); permissions["UseRemoteAPIs"] = parseInt("0x0000002000000000"); permissions["ManageAlerts"] = parseInt("0x0000004000000000"); permissions["CreateAlerts"] = parseInt("0x0000008000000000"); permissions["EditMyUserInfo"] = parseInt("0x0000010000000000"); //maintenant on va faire des OR selon basePermissions var mask = 1; for (var i=basePermissions.length; i--;) mask |= permissions[basePermissions[i]]; return mask; }
Et enfin on utilise ce mask avec AddPermission
:
$().SPServices({ operation:"AddPermission", webURL:"http://mon.site.com/ma/collection/", objectName:"Nom de la Liste", objectType:"List", permissionIdentifier:"domain\\login", // par exemple "europe\\john_doe" permissionType:"user", // car c'est un username qu'on a donné... si on avait donné un Sharepoint Group alors on aurait mis "group" permissionMask:getPermissionMask(roles["Contribute"]), completefunc: function (xData, Status) { alert("Permissions ajoutés"); } });
Plus d’infos sur les arguments disponibles dans la documentation de SPServices sur les Permissions.
On peut enfin tout mettre ensemble, ce qui donnera :
// @param basePermissions est un tableau function getPermissionMask(basePermissions) { // on crée un tableau basé sur la doc Microsoft var permissions=[]; // on rajoute "FullMask" qui est le Full Control permissions["FullMask"] = -1; permissions["ViewListItems"] = parseInt("0x0000000000000001"); permissions["AddListItems"] = parseInt("0x0000000000000002"); permissions["EditListItems"] = parseInt("0x0000000000000004"); permissions["DeleteListItems"] = parseInt("0x0000000000000008"); permissions["ApproveItems"] = parseInt("0x0000000000000010"); permissions["OpenItems"] = parseInt("0x0000000000000020"); permissions["ViewVersions"] = parseInt("0x0000000000000040"); permissions["DeleteVersions"] = parseInt("0x0000000000000080"); permissions["CancelCheckout"] = parseInt("0x0000000000000100"); permissions["ManagePersonalViews"] = parseInt("0x0000000000000200"); permissions["ManageLists"] = parseInt("0x0000000000000800"); permissions["ViewFormPages"] = parseInt("0x0000000000001000"); permissions["Open"] = parseInt("0x0000000000010000"); permissions["ViewPages"] = parseInt("0x0000000000020000"); permissions["AddAndCustomizePages"] = parseInt("0x0000000000040000"); permissions["ApplyThemeAndBorder"] = parseInt("0x0000000000080000"); permissions["ApplyStyleSheets"] = parseInt("0x0000000000100000"); permissions["ViewUsageData"] = parseInt("0x0000000000200000"); permissions["CreateSSCSite"] = parseInt("0x0000000000400000"); permissions["ManageSubwebs"] = parseInt("0x0000000000800000"); permissions["CreateGroups"] = parseInt("0x0000000001000000"); permissions["ManagePermissions"] = parseInt("0x0000000002000000"); permissions["BrowseDirectories"] = parseInt("0x0000000004000000"); permissions["BrowseUserInfo"] = parseInt("0x0000000008000000"); permissions["AddDelPrivateWebParts"] = parseInt("0x0000000010000000"); permissions["UpdatePersonalWebParts"] = parseInt("0x0000000020000000"); permissions["ManageWeb"] = parseInt("0x0000000040000000"); permissions["UseClientIntegration"] = parseInt("0x0000001000000000"); permissions["UseRemoteAPIs"] = parseInt("0x0000002000000000"); permissions["ManageAlerts"] = parseInt("0x0000004000000000"); permissions["CreateAlerts"] = parseInt("0x0000008000000000"); permissions["EditMyUserInfo"] = parseInt("0x0000010000000000"); //maintenant on va faire des OR selon basePermissions var mask = 1; for (var i=basePermissions.length; i--;) mask |= permissions[basePermissions[i]]; return mask; } $().SPServices({ operation:"GetRoleCollectionFromWeb", webURL:"http://mon.site.com/ma/collection/", completefunc: function (xData, Status) { var roles=[]; // va contenir les différents rôles existants et les permissions associées var dom=xData.responseXML.getElementsByTagName("Role"); for (var i=dom.length; i--;) roles[dom[i].getAttribute("Name")]=dom[i].getAttribute("BasePermissions").split(", "); $().SPServices({ operation:"AddPermission", webURL:"http://mon.site.com/ma/collection/", objectName:"Nom de la Liste", objectType:"List", permissionIdentifier:"domain\\login", // par exemple "europe\\john_doe" permissionType:"user", // car c'est un username qu'on a donné... si on avait donné un Sharepoint Group alors on aurait mis "group" permissionMask:getPermissionMask(roles["Contribute"]), completefunc: function (xData, Status) { alert("Permissions ajoutés"); } }); } });
A noter :
– UpdatePermission
va remplacer les permissions d’une personne;
– Toute personnalisation des permissions sur la liste va entrainer l’arrêt des droits inhérents (avec Sharepoint 2010 il sera possible de remettre les droits parents grâce à How to: Break Role Assignment Inheritance Using ECMAScript)