freenetis-github/application/helpers/url_tpath.php @ c10966eb
18ac9009 | Ondřej Fibich | <?php defined('SYSPATH') or die('No direct script access.');
|
|
/*
|
|||
* This file is part of open source system FreenetIS
|
|||
* and it is release under GPLv3 licence.
|
|||
*
|
|||
* More info about licence can be found:
|
|||
* http://www.gnu.org/licenses/gpl-3.0.html
|
|||
*
|
|||
* More info about project can be found:
|
|||
* http://www.freenetis.org/
|
|||
*
|
|||
*/
|
|||
/**
|
|||
* The "url_tpath" helper is user for easy usage of template URL path. It was
|
|||
* introduce for API authorization purposes, because we wanted to set URL
|
|||
* paths which are allowed for a certain API account. Easies way is to
|
|||
* write multiple URL path with wildcard * and **.
|
|||
*
|
|||
* For example URL path template that matches all URL paths is: /**
|
|||
* template that matches /members/ and /members/112 is: /members/*
|
|||
* template that matches /m/, /m/112 and /m/112/users is: /members/**
|
|||
*
|
|||
* This helper provides function for validation of URL path template,
|
|||
* matching agains URL path and function for working with grouped
|
|||
* URL path templates.
|
|||
*
|
|||
* @package Helpers
|
|||
* @author Ondřej Fibich
|
|||
* @since 1.2
|
|||
*/
|
|||
class url_tpath
|
|||
{
|
|||
/**
|
|||
* Regular expression for validation of single URL template path.
|
|||
*/
|
|||
const VALID_REGEX = '@^(/|((/([a-zA-Z0-9_\-]+|[*]{1,2}))+))$@';
|
|||
/**
|
|||
* Checks whether given string is a valid URL template path.
|
|||
*
|
|||
* @param string $url_tpath URL template path
|
|||
* @return boolean is valid?
|
|||
*/
|
|||
public static function is_valid($url_tpath)
|
|||
{
|
|||
if (empty($url_tpath) || !is_string($url_tpath))
|
|||
{
|
|||
return FALSE;
|
|||
}
|
|||
return !!preg_match(self::VALID_REGEX, $url_tpath);
|
|||
}
|
|||
/**
|
|||
* Checks whether given array of strings contains valid URL template paths.
|
|||
*
|
|||
* @param array $url_tpaths array of URL template paths
|
|||
* @param string $delim delimiter character between groups [opional: ,]
|
|||
* @return boolean is valid?
|
|||
*/
|
|||
public static function is_group_valid($url_tpaths)
|
|||
{
|
|||
if (!is_array($url_tpaths))
|
|||
{
|
|||
return FALSE;
|
|||
}
|
|||
foreach ($url_tpaths as $url_tpath)
|
|||
{
|
|||
if (!self::is_valid($url_tpath))
|
|||
{
|
|||
return FALSE;
|
|||
}
|
|||
}
|
|||
return TRUE;
|
|||
}
|
|||
/**
|
|||
* Check whether given URL path match given URL template path.
|
|||
*
|
|||
* @param string $url_tpath URL template path
|
|||
* @param $url_path URL path to be matched
|
|||
* @return boolean URL path match URL template path?
|
|||
* @throws InvalidArgumentException on invalid URL template path
|
|||
*/
|
|||
public static function match($url_tpath, $url_path)
|
|||
{
|
|||
$url_tpath_regex = self::compile_url_tpath($url_tpath);
|
|||
$n_path = '/';
|
|||
if ($url_path != '/') // special threatment for /
|
|||
{
|
|||
$n_path = self::normalize($url_path);
|
|||
}
|
|||
$match_result = preg_match($url_tpath_regex, $n_path);
|
|||
if ($match_result === FALSE)
|
|||
{
|
|||
throw new ErrorException('Internal error: invalid compiled regex: '
|
|||
. $url_tpath_regex);
|
|||
}
|
|||
return ($match_result > 0);
|
|||
}
|
|||
/**
|
|||
* Check whther given URL path match one of given URL template paths.
|
|||
*
|
|||
* @param array $url_tpaths array of URL template paths
|
|||
* @param string $url_path URL path to be matched
|
|||
* @return boolean URL path match one of URL template path?
|
|||
* @throws InvalidArgumentException on invalid one of URL template paths
|
|||
*/
|
|||
public static function match_one_of($url_tpaths, $url_path)
|
|||
{
|
|||
if (!is_array($url_tpaths))
|
|||
{
|
|||
return FALSE;
|
|||
}
|
|||
foreach ($url_tpaths as $url_tpath)
|
|||
{
|
|||
if (self::match($url_tpath, $url_path))
|
|||
{
|
|||
return TRUE;
|
|||
}
|
|||
}
|
|||
return FALSE;
|
|||
}
|
|||
/**
|
|||
* Compiles URL path template to regular expression that may be used for
|
|||
* matching of URL paths agains the template.
|
|||
*
|
|||
* @param string $url_tpath valid URL template path
|
|||
* @return string string with regular expression compiled from URL template
|
|||
* path, regex is delimited by @
|
|||
* @throws InvalidArgumentException on invalid URL template path
|
|||
*/
|
|||
private static function compile_url_tpath($url_tpath)
|
|||
{
|
|||
if (!self::is_valid($url_tpath))
|
|||
{
|
|||
throw new InvalidArgumentException('Invalid URL template path: '
|
|||
. $url_tpath);
|
|||
}
|
|||
$n_url_tpath = self::normalize($url_tpath);
|
|||
// end with /** or /* than do last / is optional
|
|||
preg_replace(
|
|||
array("@(/\*\*)$@", "@(/\*)$@"),
|
|||
array('/@@', '/@'),
|
|||
$n_url_tpath
|
|||
);
|
|||
// build regex
|
|||
return '@^' . str_replace(
|
|||
array('*', '/@@', '/@', '@@', '@'),
|
|||
array('@', '(|/[a-zA-Z0-9_\-/]*)', '(|/[a-zA-Z0-9_\-]*)',
|
|||
'([a-zA-Z0-9_\-/]*)', '([a-zA-Z0-9_\-]*)'),
|
|||
self::normalize($url_tpath)
|
|||
) . '$@';
|
|||
}
|
|||
/**
|
|||
* Normalize URL path or template - that means that each path always ends
|
|||
* by /.
|
|||
*
|
|||
* @param string $url_path
|
|||
* @return string
|
|||
*/
|
|||
private static function normalize($url_path)
|
|||
{
|
|||
return rtrim($url_path, '/');
|
|||
}
|
|||
}
|