X-Git-Url: http://git.polytechnique.org/?a=blobdiff_plain;ds=sidebyside;f=classes%2Fplatal.php;h=e72fc0bf8c98877e71af0ec4905db2e14c570a22;hb=797d27dbbcdaec6e021fa33f785a55e4b9346de1;hp=27b75a55c168a1177a82d1d9921b6fb80c898b07;hpb=42a50827dc2ac2b13ddaf77ea16c0989cd8b960d;p=platal.git diff --git a/classes/platal.php b/classes/platal.php index 27b75a5..e72fc0b 100644 --- a/classes/platal.php +++ b/classes/platal.php @@ -1,6 +1,6 @@ path = trim(Get::_get('n', null), '/'); $this->__mods = array(); @@ -46,7 +50,7 @@ class Platal } } - function pl_self($n = null) + public function pl_self($n = null) { if (is_null($n)) return $this->path; @@ -60,7 +64,7 @@ class Platal return join('/', array_slice($this->argv, 0, $n)); } - function find_hook() + protected function find_hook() { $p = $this->path; @@ -87,11 +91,103 @@ class Platal return $hook; } - function call_hook(&$page) + protected function find_nearest_key($key, array &$array) { - $hook = $this->find_hook(); + $keys = array_keys($array); + if (in_array($key, $keys)) { + return $key; + } + + if (($pos = strpos($key, '.php')) !== false) { + $key = substr($key, 0, $pos); + } + + $has_end = in_array("#final#", $keys); + if (strlen($key) > 24 && $has_end) { + return "#final#"; + } + + foreach ($keys as $k) { + if ($k == "#final#") { + continue; + } + $lev = levenshtein($key, $k); + if ((!isset($val) || $lev < $val) && $lev <= (strlen($k)*2)/3) { + $val = $lev; + $best = $k; + } + } + if (!isset($best) && $has_end) { + return "#final#"; + } else { + return $best; + } + return null; + } + + public function near_hook() + { + $hooks = array(); + foreach ($this->__hooks as $hook=>$handler) { + if (!empty($handler['perms']) && $handler['perms'] != S::v('perms')) { + continue; + } + $parts = split('/', $hook); + $place =& $hooks; + foreach ($parts as $part) { + if (!isset($place[$part])) { + $place[$part] = array(); + } + $place =& $place[$part]; + } + $place["#final#"] = array(); + } - if (is_null($hook)) { + $p = split('/', $this->path); + $place =& $hooks; + $link = ''; + foreach ($p as $k) { + if (!isset($ended)) { + $key = $this->find_nearest_key($k, $place); + } else { + $key = $k; + } + if ($key == "#final#") { + if (!array_key_exists($link, $this->__hooks)) { + return null; + } + $key = $k; + $ended = true; + } + if (!is_null($key)) { + if (!empty($link)) { + $link .= '/'; + } + $link .= $key; + $place =& $place[$key]; + } else { + return null; + } + } + if ($link != $this->path) { + return $link; + } + return null; + } + + protected function check_perms($perms) + { + if (!$perms) { // No perms, no check + return true; + } + $s_perms = S::v('perms'); + return $s_perms->hasFlagCombination($perms); + } + + private function call_hook(PlatalPage &$page) + { + $hook = $this->find_hook(); + if (empty($hook)) { return PL_NOT_FOUND; } @@ -99,38 +195,56 @@ class Platal $args[0] = &$page; if ($hook['auth'] > S::v('auth', AUTH_PUBLIC)) { - global $globals; + if ($hook['type'] == DO_AUTH) { + global $globals; + + if (!call_user_func(array($globals->session, 'doAuth'))) { + $this->force_login($page); + } + } else { + return PL_FORBIDDEN; + } + } + if ($hook['auth'] != AUTH_PUBLIC && !$this->check_perms($hook['perms'])) { + return PL_FORBIDDEN; + } + $val = call_user_func_array($hook['hook'], $args); + if ($val == PL_DO_AUTH) { + global $globals; + // The handler need a better auth with the current args if (!call_user_func(array($globals->session, 'doAuth'))) { $this->force_login($page); } + $val = call_user_func_array($hook['hook'], $args); } - - return call_user_func_array($hook['hook'], $args); + return $val; } - function force_login(&$page) + public function force_login(PlatalPage &$page) { - if (S::logged() and !$new_name) { - $page->changeTpl('password_prompt_logged.tpl'); + if (S::logged()) { + $page->changeTpl('core/password_prompt_logged.tpl'); $page->addJsLink('do_challenge_response_logged.js'); } else { - $page->changeTpl('password_prompt.tpl'); + $page->changeTpl('core/password_prompt.tpl'); $page->addJsLink('do_challenge_response.js'); - } + } + $page->assign('platal', $this); $page->run(); } - function run() + public function run() { global $page; - new_skinned_page('index.tpl'); + new_skinned_page('platal/index.tpl'); if (empty($this->path)) { $this->path = 'index'; } + $page->assign('platal', $this); switch ($this->call_hook($page)) { case PL_FORBIDDEN: $this->__mods['core']->handler_403($page); @@ -140,11 +254,12 @@ class Platal $this->__mods['core']->handler_404($page); break; } - $page->assign_by_ref('platal', $this); + + $page->assign('platal', $this); $page->run(); } - function on_subscribe($forlife, $uid, $promo, $pass) + private function on_subscribe($forlife, $uid, $promo, $pass) { $args = func_get_args(); foreach ($this->__mods as $mod) { @@ -155,4 +270,5 @@ class Platal } } +// vim:set et sw=4 sts=4 sws=4 foldmethod=marker enc=utf-8: ?>