9. 12. 2009

PostNuke - Práva : něco navíc ...

V tomto článku si rozebereme dvě oblasti, které sice nejsou pro nastavování práv nezbytně nutné, ale mohou být vcelku užitečné. Jedná se o využití regulárních výrazů při zápisu instance a navíc si vysvětlíme, kde a jak hledat konkrétní konotrlu práv uvnitř zdro
jových kódů.

Regulární výrazy - pomocník nejen pro práva

Nechci nikoho nutit do zbytečného učení, ale regulární výrazy by dnes měliy být jednou z běžných dovedností tvůrců webových stránek ba i začínajících programátorů. S tímto "nástrojem" pro zpracovávání řetězců se setkáte nejen v PHP, ale i v ASP či dokonce JavaScriptu. Znáte-li navíc tzv. hvězdičkovou konvenci (nebo také souborovou masku), používanou již v DOSu, pak regulární výrazy pro vás nebudou zas tak velkým problémem.
Regulární výraz je totiž speciální řetězec znaků, kterým určujete tzv.masku pro jiné řetězce. Laicky řečeno, regulární výraz je jakýmsi sítem pro jiné textové řetězce - buď řetězec síto zachytí (říká se, že regulárnímu výrazu vyhovuje) nebo propadne a systém s daným řetězcem již nepočítá.
Považuji však za zbytečné cokoliv vysvětlovat, když existují vynikající stránky o regulárních výrazech.
Takže nyní jen jednoduché příklady:
  • Představme si využití modulu Sekce pro statické stránky tříd. Pak doporučuji nazvat sekce Třída 1, Třída 2 ... V takovém případě lze uplatnit pro konponentu Sections::Section instanci Třída.*::. (Znalci souborové masky by napsali Třída* - pozor však, v regulárních výrazech je nutné přidat před hvězdičku tečku).
  • pokud u komponenty Topics::Topic napíšete instanci (Porady|Návody)::, pak příslušná práva uplatňuje pouze pro objekty, které náleží buď tématu Porady nebo Návody.
  • Je-li zápis instance ::, pak je to to samé jako .*:.*:.* a to je to samé jako .*. (Poznámka: jinak řečeno, vyhovují všechny hodnoty instance, neboli platí pro všechny případy).

Jak pracuje systém práv ve zdrojových kódech uvnitř PostNuke?

Připomínám, že je tato část určena především těm, kteří se alespoň trochu orientují v PHP.
Systém práv využívá ve zdorojových kódech funkci pnSecAuthAction(). Přitom konkrétní obsah funkce najdete v souboru /includes/pnSecurity.php, konkrétně začíná na řádku 189. Porovnání regulárních výrazů pak probíhá v rámci funkce pnSecGetLevel(), konkrétně ve smyčce na řádcích 455-461. Ta vlastně prochází "odshora dolů" tabulku groups_perm , jak jsme se zmiňovali v prvním díle našeho seriálu. Přitom se navíc byužívá PHP funkce preg_match, kdy v prvním případě se kontroluje řetězec komponenty (řádek 446) a v druhém případě řetězec instance (řádek 452).
Než opustíme soubor pnSecurity.php, prohlédněte si řádky 46-55. Ty totiž definují řetězce, které budou využity v jiných souborech při kontrole síly práv. Domnívám se, že jejich význam je zřejmý...
Nyní si ukažme konkrétní kontrolu práv k konkrétním případě.
Otevřete si soubor /modules/News/index.php. V něm vyhlejte řetězec pnSecAuthAction. Měli byste se dostat na řádek 256. Zde najdete zápis:
if (pnSecAuthAction(0, 'Stories::Story', "$info[aid]:$info[cattitle]:$info[sid]", ACCESS_OVERVIEW) &&
pnSecAuthAction(0, 'Topics::Topic',"$info[topicname]::$info[tid]",ACCESS_OVERVIEW)) {
Všimněte si, že se jedná o podmínku, kdy musí platit dvě práva současně - zjednodušeně řečeno, příslušný článek musí být minimálně k nahlédnutí (viz ACCESS_OVERVIEW z definice v rámci pnSecurity.php) a zároveň článek musí být v tématu, které je také minimálně k nahlédnutí. Důležitá poznámka: Přívlastek minimálně označuje, že právo bude uplatněno i v případě, kdy je silnější než nahlédnutí (tedy může být i čtení, komentář .... administrátor).
Pokud je podmínka splněna, pokračuje se ve zpracování kódu. V našem konkrétním případě, zobrazí se článek v seznamu článků - například na úvodní stránce.
Důležité je si uvědomit, že komponenta je vyjádřena přesně bez užití jakékoliv proměnné (není tam žádný $) - tudíž porvnávání je velmi jednoduché, nicméně musí být zapsáno přesně. Instance však již proměnné obsahuje. Jejich hodnota je nastavena v kódu, který námi popisované podmínce předcházel. Místo těchto proměnných se tedy přiřadí konkrétní hodnoty a ty jsou následně v rámci funkcí pnSecAuthAction() a pnSecGetLevel() postupně porovnávány s regulárními výrazy z tabulky groups_perm.