1
1
Fork 0
mirror of https://code.mensbeam.com/MensBeam/Arsse.git synced 2024-12-22 21:22:40 +00:00

Use D modifier for all patterns with $ anchors

This commit is contained in:
J. King 2021-06-24 11:58:50 -04:00
parent 59c5c2eb14
commit fc2abc1203
14 changed files with 22 additions and 22 deletions

View file

@ -218,7 +218,7 @@ class RoboFile extends \Robo\Tasks {
// Remove files which lintian complains about; they're otherwise harmless // Remove files which lintian complains about; they're otherwise harmless
$files = []; $files = [];
foreach (new \CallbackFilterIterator(new \RecursiveIteratorIterator(new \RecursiveDirectoryIterator($dir."vendor", \FilesystemIterator::CURRENT_AS_PATHNAME | \FilesystemIterator::SKIP_DOTS)), function($v, $k, $i) { foreach (new \CallbackFilterIterator(new \RecursiveIteratorIterator(new \RecursiveDirectoryIterator($dir."vendor", \FilesystemIterator::CURRENT_AS_PATHNAME | \FilesystemIterator::SKIP_DOTS)), function($v, $k, $i) {
return preg_match('/\/\.git(?:ignore|attributes|modules)$/', $v); return preg_match('/\/\.git(?:ignore|attributes|modules)$/D', $v);
}) as $f) { }) as $f) {
$files[] = $f; $files[] = $f;
} }
@ -356,9 +356,9 @@ class RoboFile extends \Robo\Tasks {
$expected = ["version"]; $expected = ["version"];
for ($a = 0; $a < sizeof($lines);) { for ($a = 0; $a < sizeof($lines);) {
$l = rtrim($lines[$a++]); $l = rtrim($lines[$a++]);
if (in_array("version", $expected) && preg_match('/^Version (\d+(?:\.\d+)*) \(([\d\?]{4}-[\d\?]{2}-[\d\?]{2})\)\s*$/', $l, $m)) { if (in_array("version", $expected) && preg_match('/^Version (\d+(?:\.\d+)*) \(([\d\?]{4}-[\d\?]{2}-[\d\?]{2})\)\s*$/D', $l, $m)) {
$version = $m[1]; $version = $m[1];
if (!preg_match('/^\d{4}-\d{2}-\d{2}$/', $m[2])) { if (!preg_match('/^\d{4}-\d{2}-\d{2}$/D', $m[2])) {
// uncertain dates are allowed only for the top version, and only if it does not match the target version (otherwise we have forgotten to set the correct date before tagging) // uncertain dates are allowed only for the top version, and only if it does not match the target version (otherwise we have forgotten to set the correct date before tagging)
if (!$out && $targetVersion !== $version) { if (!$out && $targetVersion !== $version) {
// use today's date; local time is fine // use today's date; local time is fine
@ -398,10 +398,10 @@ class RoboFile extends \Robo\Tasks {
} elseif (in_array("changes section", $expected) && $l === "Changes:") { } elseif (in_array("changes section", $expected) && $l === "Changes:") {
$section = "changes"; $section = "changes";
$expected = ["item"]; $expected = ["item"];
} elseif (in_array("item", $expected) && preg_match('/^- (\w.*)$/', $l, $m)) { } elseif (in_array("item", $expected) && preg_match('/^- (\w.*)$/D', $l, $m)) {
$entry[$section][] = $m[1]; $entry[$section][] = $m[1];
$expected = ["item", "continuation", "blank line"]; $expected = ["item", "continuation", "blank line"];
} elseif (in_array("continuation", $expected) && preg_match('/^ (\w.*)$/', $l, $m)) { } elseif (in_array("continuation", $expected) && preg_match('/^ (\w.*)$/D', $l, $m)) {
$last = sizeof($entry[$section]) - 1; $last = sizeof($entry[$section]) - 1;
$entry[$section][$last] .= "\n".$m[1]; $entry[$section][$last] .= "\n".$m[1];
} else { } else {
@ -436,7 +436,7 @@ class RoboFile extends \Robo\Tasks {
$out = ""; $out = "";
foreach ($log as $entry) { foreach ($log as $entry) {
// normalize the version string // normalize the version string
preg_match('/^(\d+(?:\.\d+)*)(?:-(\d+)-.+)?$/', $entry['version'], $m); preg_match('/^(\d+(?:\.\d+)*)(?:-(\d+)-.+)?$/D', $entry['version'], $m);
$version = $m[1]."-".($m[2] ?: "1"); $version = $m[1]."-".($m[2] ?: "1");
// output the entry // output the entry
$out .= "arsse ($version) UNRELEASED; urgency=low\n"; $out .= "arsse ($version) UNRELEASED; urgency=low\n";

View file

@ -224,7 +224,7 @@ class Driver extends \JKingWeb\Arsse\Db\AbstractDriver {
// with MySQL each table must be analyzed separately, so we first have to get a list of tables // with MySQL each table must be analyzed separately, so we first have to get a list of tables
foreach ($this->query("SHOW TABLES like 'arsse\\_%'") as $table) { foreach ($this->query("SHOW TABLES like 'arsse\\_%'") as $table) {
$table = array_pop($table); $table = array_pop($table);
if (!preg_match("/^arsse_[a-z_]+$/", $table)) { if (!preg_match("/^arsse_[a-z_]+$/D", $table)) {
// table is not one of ours // table is not one of ours
continue; // @codeCoverageIgnore continue; // @codeCoverageIgnore
} }

View file

@ -12,7 +12,7 @@ class HTTP {
public static function matchType(MessageInterface $msg, string ...$type): bool { public static function matchType(MessageInterface $msg, string ...$type): bool {
$header = $msg->getHeaderLine("Content-Type") ?? ""; $header = $msg->getHeaderLine("Content-Type") ?? "";
foreach ($type as $t) { foreach ($type as $t) {
$pattern = "/^".preg_quote(trim($t), "/")."\s*($|;|,)/i"; $pattern = "/^".preg_quote(trim($t), "/")."\s*($|;|,)/Di";
if (preg_match($pattern, $header)) { if (preg_match($pattern, $header)) {
return true; return true;
} }

View file

@ -78,7 +78,7 @@ class URL {
if ($c === "%") { if ($c === "%") {
// the % character signals an encoded character... // the % character signals an encoded character...
$d = substr($part, $pos + 1, 2); $d = substr($part, $pos + 1, 2);
if (!preg_match("/^[0-9a-fA-F]{2}$/", $d)) { if (!preg_match("/^[0-9a-fA-F]{2}$/D", $d)) {
// unless there are fewer than two characters left in the string or the two characters are not hex digits // unless there are fewer than two characters left in the string or the two characters are not hex digits
$d = ord($c); $d = ord($c);
} else { } else {

View file

@ -222,7 +222,7 @@ class ValueInfo {
return $out; return $out;
} else { } else {
$out = sprintf("%F", $value); $out = sprintf("%F", $value);
return preg_match("/\.0{1,}$/", $out) ? (string) (int) $out : $out; return preg_match("/\.0{1,}$/D", $out) ? (string) (int) $out : $out;
} }
} }
$info = self::str($value); $info = self::str($value);
@ -256,7 +256,7 @@ class ValueInfo {
$out = false; $out = false;
if ($dateInFormat === "microtime") { if ($dateInFormat === "microtime") {
// PHP is not able to correctly handle the output of microtime() as the input of DateTime::createFromFormat(), so we fudge it to look like a float // PHP is not able to correctly handle the output of microtime() as the input of DateTime::createFromFormat(), so we fudge it to look like a float
if (preg_match("<^0\.\d{6}00 \d+$>", $value)) { if (preg_match("<^0\.\d{6}00 \d+$>D", $value)) {
$value = substr($value, 11).".".substr($value, 2, 6); $value = substr($value, 11).".".substr($value, 2, 6);
} else { } else {
throw new \Exception; throw new \Exception;

View file

@ -118,7 +118,7 @@ class REST {
// first try a simple substring match // first try a simple substring match
if (strpos($url, $api['match']) === 0) { if (strpos($url, $api['match']) === 0) {
// if it matches, perform a more rigorous match and then strip off any defined prefix // if it matches, perform a more rigorous match and then strip off any defined prefix
$pattern = "<^".preg_quote($api['match'])."([/\?#]|$)>"; $pattern = "<^".preg_quote($api['match'])."([/\?#]|$)>D";
if ($url === $api['match'] || in_array(substr($api['match'], -1, 1), ["/", "?", "#"]) || preg_match($pattern, $url)) { if ($url === $api['match'] || in_array(substr($api['match'], -1, 1), ["/", "?", "#"]) || preg_match($pattern, $url)) {
$target = substr($url, strlen($api['strip'])); $target = substr($url, strlen($api['strip']));
} else { } else {
@ -258,7 +258,7 @@ class REST {
// if the origin is the special value "null", use it // if the origin is the special value "null", use it
return "null"; return "null";
} }
if (preg_match("<^([^:]+)://(\[[^\]]+\]|[^\[\]:/\?#@]+)((?::.*)?)$>i", $origin, $match)) { if (preg_match("<^([^:]+)://(\[[^\]]+\]|[^\[\]:/\?#@]+)((?::.*)?)$>Di", $origin, $match)) {
// if the origin sort-of matches the syntax in a general sense, continue // if the origin sort-of matches the syntax in a general sense, continue
$scheme = $match[1]; $scheme = $match[1];
$host = $match[2]; $host = $match[2];
@ -266,7 +266,7 @@ class REST {
// decode and normalize the scheme and port (the port may be blank) // decode and normalize the scheme and port (the port may be blank)
$scheme = strtolower(rawurldecode($scheme)); $scheme = strtolower(rawurldecode($scheme));
$port = rawurldecode($port); $port = rawurldecode($port);
if (!preg_match("<^(?::[0-9]+)?$>", $port) || !preg_match("<^[a-z](?:[a-z0-9\+\-\.])*$>", $scheme)) { if (!preg_match("<^(?::[0-9]+)?$>D", $port) || !preg_match("<^[a-z](?:[a-z0-9\+\-\.])*$>D", $scheme)) {
// if the normalized port contains anything but numbers, or the scheme does not follow the generic URL syntax, the origin is invalid // if the normalized port contains anything but numbers, or the scheme does not follow the generic URL syntax, the origin is invalid
return ""; return "";
} }

View file

@ -332,7 +332,7 @@ class V1 extends \JKingWeb\Arsse\REST\AbstractHandler {
} }
} }
// handle special case "Get User By User Name", which can have any non-numeric string, non-empty as the last component // handle special case "Get User By User Name", which can have any non-numeric string, non-empty as the last component
if (sizeof($path) === 3 && $path[0] === "" && $path[1] === "users" && !preg_match("/^(?:\d+)?$/", $path[2])) { if (sizeof($path) === 3 && $path[0] === "" && $path[1] === "users" && !preg_match("/^(?:\d+)?$/D", $path[2])) {
$path[2] = "*"; $path[2] = "*";
} }
return implode("/", $path); return implode("/", $path);

View file

@ -16,7 +16,7 @@ class Versions implements \JKingWeb\Arsse\REST\Handler {
} }
public function dispatch(ServerRequestInterface $req): ResponseInterface { public function dispatch(ServerRequestInterface $req): ResponseInterface {
if (!preg_match("<^/?$>", $req->getRequestTarget())) { if (!preg_match("<^/?$>D", $req->getRequestTarget())) {
// if the request path is more than an empty string or a slash, the client is probably trying a version we don't support // if the request path is more than an empty string or a slash, the client is probably trying a version we don't support
return new EmptyResponse(404); return new EmptyResponse(404);
} }

View file

@ -94,7 +94,7 @@ class API extends \JKingWeb\Arsse\REST\AbstractHandler {
} }
public function dispatch(ServerRequestInterface $req): ResponseInterface { public function dispatch(ServerRequestInterface $req): ResponseInterface {
if (!preg_match("<^(?:/(?:index\.php)?)?$>", $req->getRequestTarget())) { if (!preg_match("<^(?:/(?:index\.php)?)?$>D", $req->getRequestTarget())) {
// reject paths other than the index // reject paths other than the index
return new EmptyResponse(404); return new EmptyResponse(404);
} }

View file

@ -27,7 +27,7 @@ class Icon extends \JKingWeb\Arsse\REST\AbstractHandler {
if ($req->getMethod() !== "GET") { if ($req->getMethod() !== "GET") {
// only GET requests are allowed // only GET requests are allowed
return new Response(405, ['Allow' => "GET"]); return new Response(405, ['Allow' => "GET"]);
} elseif (!preg_match("<^(\d+)\.ico$>", $req->getRequestTarget(), $match) || !((int) $match[1])) { } elseif (!preg_match("<^(\d+)\.ico$>D", $req->getRequestTarget(), $match) || !((int) $match[1])) {
return new Response(404); return new Response(404);
} }
try { try {

View file

@ -23,7 +23,7 @@ class TestStatement extends \JKingWeb\Arsse\TestCase\Db\BaseStatement {
case "float": case "float":
return (substr($value, -2) === ".0") ? "'".substr($value, 0, strlen($value) - 2)."'" : "'$value'"; return (substr($value, -2) === ".0") ? "'".substr($value, 0, strlen($value) - 2)."'" : "'$value'";
case "string": case "string":
if (preg_match("<^char\((\d+)\)$>", $value, $match)) { if (preg_match("<^char\((\d+)\)$>D", $value, $match)) {
return "'".\IntlChar::chr((int) $match[1])."'"; return "'".\IntlChar::chr((int) $match[1])."'";
} }
return $value; return $value;

View file

@ -24,7 +24,7 @@ class TestStatement extends \JKingWeb\Arsse\TestCase\Db\BaseStatement {
case "float": case "float":
return (substr($value, -2) === ".0") ? "'".substr($value, 0, strlen($value) - 2)."'" : "'$value'"; return (substr($value, -2) === ".0") ? "'".substr($value, 0, strlen($value) - 2)."'" : "'$value'";
case "string": case "string":
if (preg_match("<^char\((\d+)\)$>", $value, $match)) { if (preg_match("<^char\((\d+)\)$>D", $value, $match)) {
return "'".\IntlChar::chr((int) $match[1])."'"; return "'".\IntlChar::chr((int) $match[1])."'";
} }
return $value; return $value;

View file

@ -23,7 +23,7 @@ class TestStatement extends \JKingWeb\Arsse\TestCase\Db\BaseStatement {
case "float": case "float":
return (substr($value, -2) === ".0") ? "'".substr($value, 0, strlen($value) - 2)."'" : "'$value'"; return (substr($value, -2) === ".0") ? "'".substr($value, 0, strlen($value) - 2)."'" : "'$value'";
case "string": case "string":
if (preg_match("<^char\((\d+)\)$>", $value, $match)) { if (preg_match("<^char\((\d+)\)$>D", $value, $match)) {
return "U&'\\+".str_pad(dechex((int) $match[1]), 6, "0", \STR_PAD_LEFT)."'"; return "U&'\\+".str_pad(dechex((int) $match[1]), 6, "0", \STR_PAD_LEFT)."'";
} }
return $value; return $value;

View file

@ -23,7 +23,7 @@ class TestStatement extends \JKingWeb\Arsse\TestCase\Db\BaseStatement {
case "float": case "float":
return (substr($value, -2) === ".0") ? "'".substr($value, 0, strlen($value) - 2)."'" : "'$value'"; return (substr($value, -2) === ".0") ? "'".substr($value, 0, strlen($value) - 2)."'" : "'$value'";
case "string": case "string":
if (preg_match("<^char\((\d+)\)$>", $value, $match)) { if (preg_match("<^char\((\d+)\)$>D", $value, $match)) {
return "U&'\\+".str_pad(dechex((int) $match[1]), 6, "0", \STR_PAD_LEFT)."'"; return "U&'\\+".str_pad(dechex((int) $match[1]), 6, "0", \STR_PAD_LEFT)."'";
} }
return $value; return $value;