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)