current_user_can(‘export’)

Ik wilde op alle 60 blogjes  iets veranderen aan WordPress, maar je kon het nergens instellen :
Een user zonder capabilities moet export-files kunnen maken, wat alleen administrator mag, zoals WordPress uit de doos komt.
Als ik iedereen administrator maak, is de beer los, dus dat wil ik niet.
Ik vond een filmpje over WordPress user roles, maar dat was voor absolute digibeten. Het filmpje wilde ook niet goed spelen, als ik het importeerde in mijn post.

Bij toeval ( ik had mezelf naar buiten gelanceerd, door de URL van mijn site te overschrijven in het options-scherm ) kwam ik er achter waar WordPress die capabilities opslaat, na de installatie.

Het ziet er een beetje gek uit, maar kennelijk is dat de manier waarop PHP arrays opslaat in MySQL :

_user_roles | a:5:{s:13:”administrator”;a:2:{s:4:”name”;s:13:”Administrator”;s:12:”capabilities”;a:62:{s:13:”switch_themes”;b:1;s:11:”edit_themes”;b:1;s:16:”activate_plugins”;b:1;s:12:”edit_plugins”;b:1;s:10:”edit_users”;b:1;s:10:”edit_files”;b:1;s:14:”manage_options”;b:1;s:17:”moderate_comments”;b:1;s:17:”manage_categories”;b:1;s:12:”manage_links”;b:1;s:12:”upload_files”;b:1;s:6:”import”;b:1;s:15:”unfiltered_html”;b:1;s:10:”edit_posts”;b:1;s:17:”edit_others_posts”;b:1;s:20:”edit_published_posts”;b:1;s:13:”publish_posts”;b:1;s:10:”edit_pages”;b:1;s:4:”read”;b:1;s:8:”level_10″;b:1;s:7:”level_9″;b:1;s:7:”level_8″;b:1;s:7:”level_7″;b:1;s:7:”level_6″;b:1;s:7:”level_5″;b:1;s:7:”level_4″;b:1;s:7:”level_3″;b:1;s:7:”level_2″;b:1;s:7:”level_1″;b:1;s:7:”level_0″;b:1;s:17:”edit_others_pages”;b:1;s:20:”edit_published_pages”;b:1;s:13:”publish_pages”;b:1;s:12:”delete_pages”;b:1;s:19:”delete_others_pages”;b:1;s:22:”delete_published_pages”;b:1;s:12:”delete_posts”;b:1;s:19:”delete_others_posts”;b:1;s:22:”delete_published_posts”;b:1;s:20:”delete_private_posts”;b:1;s:18:”edit_private_posts”;b:1;s:18:”read_private_posts”;b:1;s:20:”delete_private_pages”;b:1;s:18:”edit_private_pages”;b:1;s:18:”read_private_pages”;b:1;s:12:”delete_users”;b:1;s:12:”create_users”;b:1;s:17:”unfiltered_upload”;b:1;s:14:”edit_dashboard”;b:1;s:14:”update_plugins”;b:1;s:14:”delete_plugins”;b:1;s:15:”install_plugins”;b:1;s:13:”update_themes”;b:1;s:14:”install_themes”;b:1;s:11:”update_core”;b:1;s:10:”list_users”;b:1;s:12:”remove_users”;b:1;s:9:”add_users”;b:1;s:13:”promote_users”;b:1;s:18:”edit_theme_options”;b:1;s:13:”delete_themes”;b:1;s:6:”export”;b:1;}}s:6:”editor”;a:2:{s:4:”name”;s:6:”Editor”;s:12:”capabilities”;a:34:{s:17:”moderate_comments”;b:1;s:17:”manage_categories”;b:1;s:12:”manage_links”;b:1;s:12:”upload_files”;b:1;s:15:”unfiltered_html”;b:1;s:10:”edit_posts”;b:1;s:17:”edit_others_posts”;b:1;s:20:”edit_published_posts”;b:1;s:13:”publish_posts”;b:1;s:10:”edit_pages”;b:1;s:4:”read”;b:1;s:7:”level_7″;b:1;s:7:”level_6″;b:1;s:7:”level_5″;b:1;s:7:”level_4″;b:1;s:7:”level_3″;b:1;s:7:”level_2″;b:1;s:7:”level_1″;b:1;s:7:”level_0″;b:1;s:17:”edit_others_pages”;b:1;s:20:”edit_published_pages”;b:1;s:13:”publish_pages”;b:1;s:12:”delete_pages”;b:1;s:19:”delete_others_pages”;b:1;s:22:”delete_published_pages”;b:1;s:12:”delete_posts”;b:1;s:19:”delete_others_posts”;b:1;s:22:”delete_published_posts”;b:1;s:20:”delete_private_posts”;b:1;s:18:”edit_private_posts”;b:1;s:18:”read_private_posts”;b:1;s:20:”delete_private_pages”;b:1;s:18:”edit_private_pages”;b:1;s:18:”read_private_pages”;b:1;}}s:6:”author”;a:2:{s:4:”name”;s:6:”Author”;s:12:”capabilities”;a:10:{s:12:”upload_files”;b:1;s:10:”edit_posts”;b:1;s:20:”edit_published_posts”;b:1;s:13:”publish_posts”;b:1;s:4:”read”;b:1;s:7:”level_2″;b:1;s:7:”level_1″;b:1;s:7:”level_0″;b:1;s:12:”delete_posts”;b:1;s:22:”delete_published_posts”;b:1;}}s:11:”contributor”;a:2:{s:4:”name”;s:11:”Contributor”;s:12:”capabilities”;a:5:{s:10:”edit_posts”;b:1;s:4:”read”;b:1;s:7:”level_1″;b:1;s:7:”level_0″;b:1;s:12:”delete_posts”;b:1;}}s:10:”subscriber”;a:2:{s:4:”name”;s:10:”Subscriber”;s:12:”capabilities”;a:2:{s:4:”read”;b:1;s:7:”level_0″;b:1;}}} |

Een b:1 is een “true”
Een a:2 is een array met 2 elementen
Een s:12 is een string, 12 karakters lang
Een i zal wel een integer voorstellen

Dus dan stelt dat laatste regeltje zoiets voor :
array {

name = Subscriber
capabilities = {

read = true
level_0 = true

}

}

Een subscriber mag bijna niets, terwijl een administrator 62 capabilities heeft.
Ik weet toevallig dat capabilities in eerdere releases van WordPress werden gegroepeerd in levels : 0 tm 10 of zo. Kennelijk doen ze het zo om compatible te blijven met oudere software. Ik ga nu dus proberen de capability “export” toe te voegen aan de subscriber-rol :

De MySQL slikt het lange statement zonder problemen ( bij andere databases wil er nog weleens een maximum aan de lengte van een commando zitten ), maar daarna mag ik nog steeds niet exorteren als subscriber.
if (current_user_can…..
Dat regelt natuurlijk die toegang.
Even lezen….
Blablabla ingewikkeld…
Ze hebben een soort matrix bedacht.
Dat level speelt dus nog steeds een rol.
Even kijken in de user tabel :
Niks bijzonders hier.
Er is ook nog een user_meta tabel, daar zal de rest dan wel in staan :

| wp_capabilities | a:1:{s:13:”administrator”;s:1:”1″;} |
| wp_user_level | 10

Je rol en je level staan dus los van elkaar.
Maar even proberen wat er gebeurt als ik dat level opkrik :

wp_ is trouwens de database-prefix. Asl je zoals ik 60 wp installaties op 1 database zet, moet die prefix gelijk zijn aan de ingestelde prefix.
Even proberen …
Helaas, ik mag nog steeds niks.
Ik weet nu wel dat je WordPress flink boos kan maken door meer elementen in het array te stoppen dan je belooft…
Probeer het niet, je kan niet meer inloggen.

Na lang ploeteren ben ik er achter dat er nog een aantal ongedocumenteerde bugs in WordPress zitten. Je kan bijvoorbeeld importeren en exporteren onafhankelijk van elkaar wel of niet toestaan, maar probeer het maar niet. Beide aan, of beide uit.
Ik heb uiteindelijk het hele profiel van een administrator gekopieerd naar dat van een subscriber, en daarvan alles uitgeschakeld wat ik niet wilde toestaan. Dat werkt, maar vraag niet hoe WordPress het regelt. Een menu tonen is binnen WordPress niet hetzelfde als de acties die je met dat menu kan uitvoeren ook toestaan, al doen ze een dappere poging om het zo te regelen.

Het zal de gebruikers een worst zijn. Alleen programmeurs maken zich druk om netjes coderen.

Read Offline:
This entry was posted in Wordpress. Bookmark the permalink.

Leave a Reply

Your email address will not be published.