From 0db34fe2284f3f329f2d4ae302423895052108ea Mon Sep 17 00:00:00 2001 From: Dave Mc Nicoll Date: Fri, 23 May 2025 19:03:23 +0000 Subject: [PATCH] - Added old migration script, reworked security attribute also --- bin/migrate.php | 129 ------------------------------- src/Common/Reflected.php | 2 + src/Security/SecurityHandler.php | 36 ++++++--- 3 files changed, 26 insertions(+), 141 deletions(-) delete mode 100755 bin/migrate.php diff --git a/bin/migrate.php b/bin/migrate.php deleted file mode 100755 index cfedca9..0000000 --- a/bin/migrate.php +++ /dev/null @@ -1,129 +0,0 @@ -#!/usr/bin/php -getExtension() !== "php" || $info->isDir() ) { - continue; - } - - echo sprintf("\n### MIGRATING FILE %s\n", $info->getFilename()); - - $opened = false; - - $attr = $newContent = []; - - $content = file_get_contents($info->getPathname()); - - if ( isset($opt['clean']) ) { - foreach (explode(PHP_EOL, $content) as $lineIdx => $line) { - if ( $pos = strpos($line, '# migrated from: ') ) { - $attr = true; - - $newContent[] = $newLine = substr($line, 0, $pos); - - echo sprintf("Changed line '%s' \n", trim($newLine)); - } - else { - $newContent[] = $line; - } - } - - } - else { - foreach (explode(PHP_EOL, $content) as $lineIdx => $line) { - $tline = trim($line); - - if ($tline === "/**") { - $opened = true; - } elseif ($tline === '*/') { - $opened = false; - } elseif (substr($tline, 0, 1) === '*') { - $annotation = trim(substr($tline, 1)); - - if (strpos($annotation, '@') === 0) { - $argpos = strpos($annotation, '('); - - if ($argpos !== false) { - $name = substr($annotation, 1, $argpos - 1); - $args = substr($annotation, $argpos + 1, strrpos($annotation, ')') - $argpos - 1); - - try { - $array = eval("return [{$args}];"); - - $renderedArgs = []; - - foreach ($array as $key => $argument) { - - if (is_array($argument)) { - $argument = var_export($argument, true); - } elseif (is_bool($argument)) { - $argument = $argument ? 'true' : 'false'; - } elseif (!is_numeric($argument)) { - $argument = "\"$argument\""; - } - - if (is_numeric($key)) { - $renderedArgs[] = $argument; - } else { - $renderedArgs[] = "$key: $argument"; - } - } - - $renderedArgs = implode(', ', $renderedArgs); - } catch (\Throwable $e) { - echo sprintf("!!! WARNING : %s in file (%s) line %d ; using previous notation.\n", $e->getMessage(), $info->getPathname(), $lineIdx + 1); - - $renderedArgs = str_replace(' => ', ': ', $args); - } - } else { - $name = substr($annotation, 1); - $renderedArgs = ""; - } - - $attr[] = $attribute = sprintf("%s#[%s%s]%s", str_repeat(" ", strlen($line) - strlen(ltrim($line)) >= 4 ? 4 : 0), $name, $renderedArgs ? "($renderedArgs)" : "", $renderedArgs ? ( isset($opt['old']) ? " # migrated from: $args" : "" ) : ""); - - $newContent[] = $attribute; - } - } else { - $newContent[] = $line; - } - } - } - - $newContent = implode(PHP_EOL, $newContent); - - if ($attr) { - if ( isset($opt['verbose']) || isset($opt['v']) ) { - echo $newContent; - } - - if ( isset($opt['confirm']) || isset($opt['c']) ) { - file_put_contents($info->getPathname(), $newContent); - - echo sprintf("\n### FILE CONVERSION COMPLETED %s\n", $info->getFilename()); - } - else { - echo sprintf("\n### FILE CONVERSION ANALYZED, NOTHING WRITTEN UNTIL --confirm or -c FLAG IS PROVIDED %s\n", $info->getFilename()); - } - } - else { - echo sprintf("\n### NOTHING TO DO ON FILE %s\n", $info->getFilename()); - } - -} \ No newline at end of file diff --git a/src/Common/Reflected.php b/src/Common/Reflected.php index 333a202..2d4f2a2 100644 --- a/src/Common/Reflected.php +++ b/src/Common/Reflected.php @@ -45,6 +45,8 @@ abstract class Reflected $type = $property->getType(); if ($type instanceof \ReflectionUnionType ) { + $this->type = []; + foreach($type->getTypes() as $item) { $this->type[] = new ReflectedPropertyType($item->getName(), $item->isBuiltIn(), $item->allowsNull()); } diff --git a/src/Security/SecurityHandler.php b/src/Security/SecurityHandler.php index 437cac2..5b07a46 100644 --- a/src/Security/SecurityHandler.php +++ b/src/Security/SecurityHandler.php @@ -40,29 +40,41 @@ class SecurityHandler { return true; } - public function taxus(string $className, string $methodName, object $user = null) : ? ResponseInterface + public function taxus(string $className, string $methodName, ... $arguments) : ? ResponseInterface { - $fromObject = $this->findAttributes(Attribute\Taxus::class, $className); - $fromMethod = $this->findAttributes(Attribute\Taxus::class, $className, $methodName); - - if ($fromMethod || $fromObject) { - if ( $this->taxusGrantPermission($fromMethod, $user) || $this->taxusGrantPermission($fromObject, $user) ) { - return null; - } + $granted = $this->hasGrantPermission($className , $methodName, ...$arguments); + if ($granted) { + return null; + } + else { if ($this->unauthorizeResponse) { if ($this->unauthorizeResponse instanceof ResponseInterface) { return $this->unauthorizeResponse; } - return call_user_func_array($this->unauthorizeResponse, [ $user, ['method' => $fromMethod, 'object' => $fromObject ], $className, $methodName ]); + return call_user_func_array($this->unauthorizeResponse, [ ...$arguments, ['method' => $methodName, 'object' => $className ], $className, $methodName ]); } else { throw new \ErrorException("Unauthorized response given."); } } + } - return null; + public function hasGrantPermission(string $className, string $methodName, ... $arguments) : bool + { + $fromObject = $this->findAttributes(Attribute\Taxus::class, $className); + $fromMethod = $this->findAttributes(Attribute\Taxus::class, $className, $methodName); + + if ($fromMethod || $fromObject) { + if ( $this->taxusGrantPermission($fromMethod, ... $arguments) || $this->taxusGrantPermission($fromObject, ... $arguments) ) { + return true; + } + + return false; + } + + return true; } protected function findAttributes(string $attribute, string $class, ? string $method = null) : array @@ -90,10 +102,10 @@ class SecurityHandler { return []; } - protected function taxusGrantPermission(array $attributeList, object $user = null) : bool + protected function taxusGrantPermission(array $attributeList, ...$arguments) : bool { foreach ($attributeList as $item) { - if ( $grant = $this->taxus->granted($item->privilege, $user, $item) ) { + if ( $grant = $this->taxus->granted($item->privilege, ... array_merge($arguments, [ $item ])) ) { if (is_bool($grant) ? $grant : $grant === TaxusGrantEnum::Authorized) { return true; }