Le problème était : pour un utilisateur lambda comment récupérer les droits dont il dispose sur un item depuis powerapps ?
Plusieurs éléments entre en compte pour commencer il faut comprendre le effectiveBasePermission, puis comment l'exploiter dans un Power automate puis l'implémenter dans PAPPS
Le point de terminaison est le suivant (pour un item de liste) :
_api/web/lists/GetByTitle('TitreDeLaListe')/items(10)/EffectiveBasePermissions
Le résultat retourné est sous la forme :
{ "d": { "EffectiveBasePermissions": { "__metadata": { "type": "SP.BasePermissions" }, "High": "176", "Low": "138612833" } } }
Cest quoi ce merdier ?
Chaque élément dans sharepoint dispose de permissions uniques.
Ces permissions sont représentées par des entiers non signés ou chaque Bit correspond à une permission différente.
| Permission Name | Hex (base 16) | Binary | Decimal | |------------------------------|--------------------|-----------------------------------------------------------------|---------------------| | EmptyMask | 0x0000000000000000 | 0 | 0 | | List and Document permission | | | | | ViewListItems | 0x0000000000000001 | 1 | 1 | | AddListItems | 0x0000000000000002 | 10 | 2 | | EditListItems | 0x0000000000000004 | 100 | 4 | | DeleteListItems | 0x0000000000000008 | 1000 | 8 | | ApproveItems | 0x0000000000000010 | 10000 | 16 | | OpenItems | 0x0000000000000020 | 100000 | 32 | | ViewVersions | 0x0000000000000040 | 1000000 | 64 | | DeleteVersions | 0x0000000000000080 | 10000000 | 128 | | CancelCheckout | 0x0000000000000100 | 100000000 | 256 | | ManagePersonalViews | 0x0000000000000200 | 1000000000 | 512 | | ManageLists | 0x0000000000000800 | 100000000000 | 2048 | | ViewFormPages | 0x0000000000001000 | 1000000000000 | 4096 | | Web level permission | | | | | Open | 0x0000000000010000 | 10000000000000000 | 65536 | | ViewPages | 0x0000000000020000 | 100000000000000000 | 131072 | | AddAndCustomizePages | 0x0000000000040000 | 1000000000000000000 | 262144 | | ApplyThemeAndBorder | 0x0000000000080000 | 10000000000000000000 | 524288 | | ApplyStyleSheets | 0x0000000000100000 | 100000000000000000000 | 1048576 | | ViewUsageData | 0x0000000000200000 | 1000000000000000000000 | 2097152 | | CreateSSCSite | 0x0000000000400000 | 10000000000000000000000 | 4194304 | | ManageSubwebs | 0x0000000000800000 | 100000000000000000000000 | 8388608 | | CreateGroups | 0x0000000001000000 | 1000000000000000000000000 | 16777216 | | ManagePermissions | 0x0000000002000000 | 10000000000000000000000000 | 33554432 | | BrowseDirectories | 0x0000000004000000 | 100000000000000000000000000 | 67108864 | | BrowseUserInfo | 0x0000000008000000 | 1000000000000000000000000000 | 134217728 | | AddDelPrivateWebParts | 0x0000000010000000 | 10000000000000000000000000000 | 268435456 | | UpdatePersonalWebParts | 0x0000000020000000 | 100000000000000000000000000000 | 536870912 | | ManageWeb | 0x0000000040000000 | 1000000000000000000000000000000 | 1073741824 High |Pour la partie high
| UseRemoteAPIs | 0x0000002000000000 | 100000 00000000000000000000000000000000 | 137438953472, 16 | | ManageAlerts | 0x0000004000000000 | 1000000 00000000000000000000000000000000 | 274877906944, 32 | | CreateAlerts | 0x0000008000000000 | 10000000 00000000000000000000000000000000 | 549755813888, 64 | | EditMyUserInfo | 0x0000010000000000 | 100000000 00000000000000000000000000000000 | 1099511627776, 128 |Permission spéciales :
| Special Permissions | | | | | EnumeratePermissions | 0x4000000000000000 | 1000000000000000000000000000000 00000000000000000000000000000000| 4611686018427387904 | | FullMask | 0x7FFFFFFFFFFFFFFF | 1111111111111111111111111111111 11111111111111111111111111111111| 9223372036854775807 | | UseClientIntegration | 0x1000000000 | 10000 00000000000000000000000000000000 | 68719476736 |Ces sources ont étés trouvés Sur stackExchange et aussi sur un blog perso
Concretement cela veut dire que chaque Bit à 1 indique que le droit associé est actif, si le bit est a 0, le droit n'est pas accordé.
Par exemple, la valeur low 1 011 028 719 s'écrit en binaire 0011 1100 0100 0011 0001 0010 1110 1111
On voit ici que le bit a la position 3 0011 1100 0100 0011 0001 0010 1110 1111 est égal a 1.
Cela indique que le droit EditListItems est accordé.
A l'inverse, la valeur 138 612 833 s'écrit 1000 0100 0011 0001 0000 0110 0001. On constate que le droit d'écriture n'est pas attribué, mais le droit de lecture l'est.
Alors, on connait l'ensemble des bits et leur correspondance, y'a t'il un moyen de savoir si un bit est A 1 Ou 0 ?
Eh bien merci, a ce site qui donne des pistes !
Si je reprends un peu, pour décaler des bits vers la droite il suffit de diviser par 2 et le dernier bit a droite se décale... Essayez chez vous... vous verrez (Avec la calculatrice du PC en mode programmeur ça fait le taf!)
Une fois décalé du nombre de bits que l'on souhaite, on fait un modulo 2 (Qui permet de tester si il y'a un reste), et on obtient soit 1 soit 0!
on obtient 1 si le bit est activé et 0 si il ne l'est pas.
Nous pouvons donc utiliser sous powerautomate la fonction suivante :
mod(div([laValeurLow],[ValuerDecimaleDuDroitATester]),2)
pour savoir si le bit est actif ou non.
Par exemple pour le droit d'écriture : il faudra diviser par 4 : (Décaler de 2 bits - Le droit EditListItems est = 4 en décimal)
Pour le droit de supression il faudra Diviser par 8
Ect...