X-Git-Url: http://git.polytechnique.org/?a=blobdiff_plain;f=classes%2Fplatal.php;h=4c1f60a8521886e19383b2ba1dad53e083c4bcec;hb=06df222b7962dd5b71b34ec1dd078276d7327dbc;hp=46de9009d229fcb6ec6d708ad1380d845a74aa20;hpb=787bb3d745141f2f85bd947ad7dd775d2c63f908;p=platal.git diff --git a/classes/platal.php b/classes/platal.php index 46de900..4c1f60a 100644 --- a/classes/platal.php +++ b/classes/platal.php @@ -1,6 +1,6 @@ __mods[$module] = $m = PLModule::factory($module); $this->__hooks += $m->handlers(); } + + global $globals; + if ($globals->mode == '') { + pl_redirect('index.html'); + } } public function pl_self($n = null) @@ -116,14 +121,16 @@ class Platal continue; } $lev = levenshtein($key, $k); - if ((!isset($val) || $lev < $val) && $lev <= (strlen($k)*2)/3) { + + if ((!isset($val) || $lev < $val) + && ($lev <= strlen($k)/2 || strpos($k, $key) !== false || strpos($key, $k) !== false)) { $val = $lev; $best = $k; } } if (!isset($best) && $has_end) { return "#final#"; - } else { + } else if (isset($best)) { return $best; } return null; @@ -132,8 +139,9 @@ class Platal public function near_hook() { $hooks = array(); + $leafs = array(); foreach ($this->__hooks as $hook=>$handler) { - if (!empty($handler['perms']) && $handler['perms'] != S::v('perms')) { + if (!$this->check_perms($handler['perms'])) { continue; } $parts = split('/', $hook); @@ -144,9 +152,18 @@ class Platal } $place =& $place[$part]; } + $leaf = $parts[count($parts)-1]; + if (!isset($leafs[$leaf])) { + $leafs[$leaf] = $hook; + } else if (is_array($leafs[$leaf])) { + $leafs[$leaf][] = $hook; + } else { + $leafs[$leaf] = array($hook, $leafs[$leaf]); + } $place["#final#"] = array(); } + // search for the nearest full path $p = split('/', $this->path); $place =& $hooks; $link = ''; @@ -158,7 +175,8 @@ class Platal } if ($key == "#final#") { if (!array_key_exists($link, $this->__hooks)) { - return null; + $link = ''; + break; } $key = $k; $ended = true; @@ -170,13 +188,38 @@ class Platal $link .= $key; $place =& $place[$key]; } else { - return null; + $link = ''; + break; } } - if ($link != $this->path) { + if ($link == $this->path) { + $link = ''; + } + if ($link && levenshtein($link, $this->path) < strlen($link)/3) { return $link; } - return null; + + // search for missing namespace (the given name is a leaf) + $leaf = array_shift($p); + $args = count($p) ? '/' . implode('/', $p) : ''; + if (isset($leafs[$leaf]) && !is_array($leafs[$leaf]) && $leafs[$leaf] != $this->path) { + return $leafs[$leaf] . $args; + } + unset($val); + $best = null; + foreach ($leafs as $k=>&$path) { + if (is_array($path)) { + continue; + } + $lev = levenshtein($leaf, $k); + + if ((!isset($val) || $lev < $val) + && ($lev <= strlen($k)/2 || strpos($k, $leaf) !== false || strpos($leaf, $k) !== false)) { + $val = $lev; + $best = $path; + } + } + return $best == null ? ( $link ? $link : null ) : $best . $args; } protected function check_perms($perms) @@ -216,7 +259,7 @@ class Platal } $val = call_user_func_array($hook['hook'], $args); - if ($val & PL_DO_AUTH) { + if ($val == PL_DO_AUTH) { // The handler need a better auth with the current args if (!call_user_func(array($globals->session, 'doAuth'))) { $this->force_login($page); @@ -228,6 +271,7 @@ class Platal public function force_login(PlatalPage &$page) { + header($_SERVER['SERVER_PROTOCOL'] . ' 403 Forbidden'); if (S::logged()) { $page->changeTpl('core/password_prompt_logged.tpl'); $page->addJsLink('do_challenge_response_logged.js');