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)