Code Coverage |
||||||||||
Classes and Traits |
Functions and Methods |
Lines |
||||||||
Total | |
0.00% |
0 / 1 |
|
33.33% |
4 / 12 |
CRAP | |
55.56% |
40 / 72 |
Validator | |
0.00% |
0 / 1 |
|
33.33% |
4 / 12 |
180.47 | |
55.56% |
40 / 72 |
readableDirectory($value) | |
0.00% |
0 / 1 |
4.37 | |
71.43% |
5 / 7 |
|||
writableDirectory($value) | |
0.00% |
0 / 1 |
20 | |
0.00% |
0 / 7 |
|||
writableFile($value) | |
0.00% |
0 / 1 |
20 | |
0.00% |
0 / 7 |
|||
readableFile($value) | |
0.00% |
0 / 1 |
4.37 | |
71.43% |
5 / 7 |
|||
validUrl($value) | |
0.00% |
0 / 1 |
3.14 | |
75.00% |
6 / 8 |
|||
validEmail($value) | |
100.00% |
1 / 1 |
4 | |
100.00% |
5 / 5 |
|||
validIp($value) | |
100.00% |
1 / 1 |
3 | |
100.00% |
5 / 5 |
|||
validIpv4($value) | |
0.00% |
0 / 1 |
12 | |
0.00% |
0 / 5 |
|||
validIpv4NotReserved($value) | |
0.00% |
0 / 1 |
3.33 | |
66.67% |
4 / 6 |
|||
validIpv6($value) | |
0.00% |
0 / 1 |
12 | |
0.00% |
0 / 5 |
|||
fixRelativePath($path_with_dots) | |
100.00% |
1 / 1 |
2 | |
100.00% |
4 / 4 |
|||
fixPath($path) | |
100.00% |
1 / 1 |
3 | |
100.00% |
6 / 6 |
<?php | |
namespace Environaut\Checks; | |
/** | |
* Default validator class that may be used in checks | |
* for common types of data (esp. the Configurator). | |
*/ | |
class Validator | |
{ | |
/** | |
* Validates the given path and throws an exception | |
* if it is not a regular directory or readable. | |
* | |
* @param string $value value to check | |
* | |
* @return string path to valid directory | |
* | |
* @throws \InvalidArgumentException in case of validation errors (empty value, irregular or non-readable directory) | |
*/ | |
public static function readableDirectory($value) | |
{ | |
if (empty($value)) { | |
throw new \InvalidArgumentException("Empty path given."); | |
} | |
if (!is_dir($value)) { | |
throw new \InvalidArgumentException("Given path is not a regular directory."); | |
} | |
if (!is_readable($value)) { | |
throw new \InvalidArgumentException("Given directory is not readable."); | |
} | |
return $value; | |
} | |
/** | |
* Validates the given path and throws an exception | |
* if it is not a regular directory or writable. | |
* | |
* @param string $value value to check | |
* | |
* @return string path to valid directory | |
* | |
* @throws \InvalidArgumentException in case of validation errors (empty value, irregular or non-writable directory) | |
*/ | |
public static function writableDirectory($value) | |
{ | |
if (empty($value)) { | |
throw new \InvalidArgumentException("Empty path given."); | |
} | |
if (!is_dir($value)) { | |
throw new \InvalidArgumentException("Given path is not a regular directory."); | |
} | |
if (!is_writable($value)) { | |
throw new \InvalidArgumentException("Given directory is not writable."); | |
} | |
return $value; | |
} | |
/** | |
* Validates the given file path and throws an exception | |
* if it is not a regular file or writable. | |
* | |
* @param string $value value to check | |
* | |
* @return string path to valid file | |
* | |
* @throws \InvalidArgumentException in case of validation errors (empty value or irregular or non-writable file) | |
*/ | |
public static function writableFile($value) | |
{ | |
if (empty($value)) { | |
throw new \InvalidArgumentException("Empty file path given."); | |
} | |
if (!is_file($value)) { | |
throw new \InvalidArgumentException("Given file path is not a regular file."); | |
} | |
if (!is_writable($value)) { | |
throw new \InvalidArgumentException("Given file is not writable."); | |
} | |
return $value; | |
} | |
/** | |
* Validates the given file path and throws an exception | |
* if it is not a regular file or readable. | |
* | |
* @param string $value value to check | |
* | |
* @return string path to valid file | |
* | |
* @throws \InvalidArgumentException in case of validation errors (empty value or irregular or non-readable file) | |
*/ | |
public static function readableFile($value) | |
{ | |
if (empty($value)) { | |
throw new \InvalidArgumentException("Empty file path given."); | |
} | |
if (!is_file($value)) { | |
throw new \InvalidArgumentException("Given file path is not a regular file."); | |
} | |
if (!is_readable($value)) { | |
throw new \InvalidArgumentException("Given file is not readable."); | |
} | |
return $value; | |
} | |
/** | |
* Validates the given URL and throws an exception if | |
* it is not valid (Only http and https are valid as | |
* protocols). | |
* | |
* @param string $value value to check | |
* | |
* @return string URL | |
* | |
* @throws \InvalidArgumentException in case of validation errors (invalid or empty URL) | |
*/ | |
public static function validUrl($value) | |
{ | |
if (empty($value)) { | |
throw new \InvalidArgumentException( | |
"Empty URL given. Valid URLs have the format: http(s)://[(sub.)domain|ip][:port][/[optional_path]]" | |
); | |
} | |
// this pattern has been taken from the symfony url validator: | |
// https://github.com/symfony/Validator/blob/master/Constraints/UrlValidator.php | |
// @author Bernhard Schussek <bschussek@gmail.com> | |
$pattern = <<<EOT | |
~^ | |
(http|https):// # protocols | |
( | |
([\pL\pN\pS-]+\.)+[\pL]+ # domain name | |
| # or | |
\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3} # IPv4 address | |
| # or | |
\[ | |
(?:(?:(?:(?:(?:(?:(?:[0-9a-f]{1,4})):){6})(?:(?:(?:(?:(?:[0-9a-f]{1,4})): | |
(?:(?:[0-9a-f]{1,4})))|(?:(?:(?:(?:(?:25[0-5]|(?:[1-9]|1[0-9]|2[0-4])?[0-9]))\.){3} | |
(?:(?:25[0-5]|(?:[1-9]|1[0-9]|2[0-4])?[0-9])))))))|(?:(?:::(?:(?:(?:[0-9a-f]{1,4})):){5}) | |
(?:(?:(?:(?:(?:[0-9a-f]{1,4})):(?:(?:[0-9a-f]{1,4})))|(?:(?:(?:(?:(?:25[0-5]| | |
(?:[1-9]|1[0-9]|2[0-4])?[0-9]))\.){3}(?:(?:25[0-5]|(?:[1-9]|1[0-9]|2[0-4])?[0-9])))))))| | |
(?:(?:(?:(?:(?:[0-9a-f]{1,4})))?::(?:(?:(?:[0-9a-f]{1,4})):){4})(?:(?:(?:(?:(?:[0-9a-f]{1,4})): | |
(?:(?:[0-9a-f]{1,4})))|(?:(?:(?:(?:(?:25[0-5]|(?:[1-9]|1[0-9]|2[0-4])?[0-9]))\.){3} | |
(?:(?:25[0-5]|(?:[1-9]|1[0-9]|2[0-4])?[0-9])))))))|(?:(?:(?:(?:(?:(?:[0-9a-f]{1,4})):){0,1} | |
(?:(?:[0-9a-f]{1,4})))?::(?:(?:(?:[0-9a-f]{1,4})):){3})(?:(?:(?:(?:(?:[0-9a-f]{1,4})): | |
(?:(?:[0-9a-f]{1,4})))|(?:(?:(?:(?:(?:25[0-5]|(?:[1-9]|1[0-9]|2[0-4])?[0-9]))\.){3} | |
(?:(?:25[0-5]|(?:[1-9]|1[0-9]|2[0-4])?[0-9])))))))|(?:(?:(?:(?:(?:(?:[0-9a-f]{1,4})):){0,2} | |
(?:(?:[0-9a-f]{1,4})))?::(?:(?:(?:[0-9a-f]{1,4})):){2})(?:(?:(?:(?:(?:[0-9a-f]{1,4})): | |
(?:(?:[0-9a-f]{1,4})))|(?:(?:(?:(?:(?:25[0-5]|(?:[1-9]|1[0-9]|2[0-4])?[0-9]))\.){3} | |
(?:(?:25[0-5]|(?:[1-9]|1[0-9]|2[0-4])?[0-9])))))))|(?:(?:(?:(?:(?:(?:[0-9a-f]{1,4})):){0,3} | |
(?:(?:[0-9a-f]{1,4})))?::(?:(?:[0-9a-f]{1,4})):)(?:(?:(?:(?:(?:[0-9a-f]{1,4})): | |
(?:(?:[0-9a-f]{1,4})))|(?:(?:(?:(?:(?:25[0-5]|(?:[1-9]|1[0-9]|2[0-4])?[0-9]))\.){3} | |
(?:(?:25[0-5]|(?:[1-9]|1[0-9]|2[0-4])?[0-9])))))))|(?:(?:(?:(?:(?:(?:[0-9a-f]{1,4})):){0,4} | |
(?:(?:[0-9a-f]{1,4})))?::)(?:(?:(?:(?:(?:[0-9a-f]{1,4})):(?:(?:[0-9a-f]{1,4})))| | |
(?:(?:(?:(?:(?:25[0-5]|(?:[1-9]|1[0-9]|2[0-4])?[0-9]))\.){3}(?:(?:25[0-5]| | |
(?:[1-9]|1[0-9]|2[0-4])?[0-9])))))))|(?:(?:(?:(?:(?:(?:[0-9a-f]{1,4})):){0,5} | |
(?:(?:[0-9a-f]{1,4})))?::)(?:(?:[0-9a-f]{1,4})))|(?:(?:(?:(?:(?:(?:[0-9a-f]{1,4})):){0,6} | |
(?:(?:[0-9a-f]{1,4})))?::)))) | |
\] # IPv6 address | |
) | |
(:[0-9]+)? # port (optional) | |
(/?|/\S+) # /, nothing or / with something | |
$~ixu | |
EOT; | |
if (!preg_match($pattern, $value)) { | |
throw new \InvalidArgumentException( | |
"Invalid URL given. Valid URLs have the format: http(s)://[(sub.)domain|ip][:port][/[optional_path]]" | |
); | |
} | |
return $value; | |
} | |
/** | |
* Validates the given value using the PHP filter_var | |
* with FILTER_VALIDATE_EMAIL option. | |
* | |
* @param string $value value to check | |
* | |
* @return string email | |
* | |
* @throws \InvalidArgumentException in case of validation errors (invalid or empty email) | |
*/ | |
public static function validEmail($value) | |
{ | |
if (is_object($value) || empty($value)) { | |
throw new \InvalidArgumentException("Empty email given."); | |
} | |
if (!filter_var((string)$value, FILTER_VALIDATE_EMAIL)) { | |
throw new \InvalidArgumentException("Invalid email address given."); | |
} | |
return $value; | |
} | |
/** | |
* Validates the given value using the PHP filter_var with | |
* FILTER_VALIDATE_IP. | |
* | |
* @param string $value IP to validate | |
* | |
* @return string ipv4 or ipv6 (may still be in private or reserved range) | |
* | |
* @throws \InvalidArgumentException in case of validation errors (invalid or empty ip) | |
*/ | |
public static function validIp($value) | |
{ | |
if (empty($value)) { | |
throw new \InvalidArgumentException("Empty IP address given."); | |
} | |
if (!filter_var($value, FILTER_VALIDATE_IP)) { | |
throw new \InvalidArgumentException("Invalid IP address given."); | |
} | |
return $value; | |
} | |
/** | |
* Validates the given value using the PHP filter_var with | |
* FILTER_VALIDATE_IP and flag FILTER_FLAG_IPV4. | |
* | |
* @param string $value IP to validate | |
* | |
* @return string ipv4 (may still be in private or reserved range) | |
* | |
* @throws \InvalidArgumentException in case of validation errors (invalid or empty ip) | |
*/ | |
public static function validIpv4($value) | |
{ | |
if (empty($value)) { | |
throw new \InvalidArgumentException("Empty IPv4 address given."); | |
} | |
if (!filter_var($value, FILTER_VALIDATE_IP, FILTER_FLAG_IPV4)) { | |
throw new \InvalidArgumentException("Invalid IPv4 address given."); | |
} | |
return $value; | |
} | |
/** | |
* Validates the given value using the PHP filter_var with | |
* FILTER_VALIDATE_IP and flag FILTER_FLAG_IPV4 | FILTER_FLAG_NO_RES_RANGE. | |
* | |
* @param string $value IP to validate | |
* | |
* @return string ipv4 (may still be in private range) | |
* | |
* @throws \InvalidArgumentException in case of validation errors (invalid or empty ip) | |
*/ | |
public static function validIpv4NotReserved($value) | |
{ | |
if (empty($value)) { | |
throw new \InvalidArgumentException("Empty IPv4 address given."); | |
} | |
if (!filter_var($value, FILTER_VALIDATE_IP, FILTER_FLAG_IPV4 | FILTER_FLAG_NO_RES_RANGE)) { | |
throw new \InvalidArgumentException( | |
"Invalid IPv4 address given. Reserved ranges like 240.0.0.0/4 are disallowed." | |
); | |
} | |
return $value; | |
} | |
/** | |
* Validates the given value using the PHP filter_var with | |
* FILTER_VALIDATE_IP and flag FILTER_FLAG_IPV6 | |
* | |
* @param string $value IP to validate | |
* | |
* @return string ipv6 (may still be in private or reserved range) | |
* | |
* @throws \InvalidArgumentException in case of validation errors (invalid or empty ip) | |
*/ | |
public static function validIpv6($value) | |
{ | |
if (empty($value)) { | |
throw new \InvalidArgumentException("Empty IPv6 address given."); | |
} | |
if (!filter_var($value, FILTER_VALIDATE_IP, FILTER_FLAG_IPV6)) { | |
throw new \InvalidArgumentException("Invalid IPv6 address given."); | |
} | |
return $value; | |
} | |
/** | |
* Resolves dots and double slashes in relative paths to get | |
* nicer paths: "dev/data/assets/../../foo" will be "dev/foo/" | |
* and "foo/./bar" will be "foo/bar" etc. | |
* | |
* @return string | |
*/ | |
public static function fixRelativePath($path_with_dots) | |
{ | |
do { | |
$path_with_dots = preg_replace('#[^/\.]+/\.\./#', '', $path_with_dots, -1, $count); | |
} while ($count); | |
$path_with_dots = str_replace(array('/./', '//'), '/', $path_with_dots); | |
return $path_with_dots; | |
} | |
/** | |
* Appends '/' to the path if necessary. | |
* | |
* @param string $path file system path | |
* | |
* @return string path with trailing slash | |
*/ | |
public static function fixPath($path) | |
{ | |
if (empty($path)) { | |
return $path; | |
} | |
if ('/' != $path{strlen($path) - 1}) { | |
$path .= '/'; | |
} | |
return $path; | |
} | |
} |