diff options
author | Lukas Reschke <lukas@statuscode.ch> | 2017-04-12 20:32:48 +0200 |
---|---|---|
committer | Lukas Reschke <lukas@statuscode.ch> | 2017-04-13 12:00:16 +0200 |
commit | 66835476b59b8be7593d4cfa03a51c4f265d7e26 (patch) | |
tree | 91770c8fe403da25af50e6336727ab55fe57cd27 /lib/private/AppFramework/Utility/ControllerMethodReflector.php | |
parent | 5505faa3d7b6f5a95f18fe5027355d700d69f396 (diff) | |
download | nextcloud-server-66835476b59b8be7593d4cfa03a51c4f265d7e26.tar.gz nextcloud-server-66835476b59b8be7593d4cfa03a51c4f265d7e26.zip |
Add support for ratelimiting via annotations
This allows adding rate limiting via annotations to controllers, as one example:
```
@UserRateThrottle(limit=5, period=100)
@AnonRateThrottle(limit=1, period=100)
```
Would mean that logged-in users can access the page 5 times within 100 seconds, and anonymous users 1 time within 100 seconds. If only an AnonRateThrottle is specified that one will also be applied to logged-in users.
Signed-off-by: Lukas Reschke <lukas@statuscode.ch>
Diffstat (limited to 'lib/private/AppFramework/Utility/ControllerMethodReflector.php')
-rw-r--r-- | lib/private/AppFramework/Utility/ControllerMethodReflector.php | 55 |
1 files changed, 26 insertions, 29 deletions
diff --git a/lib/private/AppFramework/Utility/ControllerMethodReflector.php b/lib/private/AppFramework/Utility/ControllerMethodReflector.php index 034fc3a1759..19eafdb25ac 100644 --- a/lib/private/AppFramework/Utility/ControllerMethodReflector.php +++ b/lib/private/AppFramework/Utility/ControllerMethodReflector.php @@ -24,27 +24,17 @@ * */ - namespace OC\AppFramework\Utility; use \OCP\AppFramework\Utility\IControllerMethodReflector; - /** * Reads and parses annotations from doc comments */ -class ControllerMethodReflector implements IControllerMethodReflector{ - - private $annotations; - private $types; - private $parameters; - - public function __construct() { - $this->types = array(); - $this->parameters = array(); - $this->annotations = array(); - } - +class ControllerMethodReflector implements IControllerMethodReflector { + public $annotations = []; + private $types = []; + private $parameters = []; /** * @param object $object an object or classname @@ -55,9 +45,21 @@ class ControllerMethodReflector implements IControllerMethodReflector{ $docs = $reflection->getDocComment(); // extract everything prefixed by @ and first letter uppercase - preg_match_all('/^\h+\*\h+@(?P<annotation>[A-Z]\w+)(\h+(?P<parameter>\w+))?$/m', $docs, $matches); + preg_match_all('/^\h+\*\h+@(?P<annotation>[A-Z]\w+)((?P<parameter>.*))?$/m', $docs, $matches); foreach($matches['annotation'] as $key => $annontation) { - $this->annotations[$annontation] = $matches['parameter'][$key]; + $annotationValue = $matches['parameter'][$key]; + if($annotationValue[0] === '(' && $annotationValue[strlen($annotationValue) - 1] === ')') { + $cutString = substr($annotationValue, 1, -1); + $cutString = str_replace(' ', '', $cutString); + $splittedArray = explode(',', $cutString); + foreach($splittedArray as $annotationValues) { + list($key, $value) = explode('=', $annotationValues); + $this->annotations[$annontation][$key] = $value; + } + continue; + } + + $this->annotations[$annontation] = [$annotationValue]; } // extract type parameter information @@ -83,7 +85,6 @@ class ControllerMethodReflector implements IControllerMethodReflector{ } } - /** * Inspects the PHPDoc parameters for types * @param string $parameter the parameter whose type comments should be @@ -99,7 +100,6 @@ class ControllerMethodReflector implements IControllerMethodReflector{ } } - /** * @return array the arguments of the method with key => default value */ @@ -107,30 +107,27 @@ class ControllerMethodReflector implements IControllerMethodReflector{ return $this->parameters; } - /** * Check if a method contains an annotation * @param string $name the name of the annotation * @return bool true if the annotation is found */ - public function hasAnnotation($name){ + public function hasAnnotation($name) { return array_key_exists($name, $this->annotations); } - /** - * Get optional annotation parameter + * Get optional annotation parameter by key + * * @param string $name the name of the annotation + * @param string $key the string of the annotation * @return string */ - public function getAnnotationParameter($name){ - $parameter = ''; - if($this->hasAnnotation($name)) { - $parameter = $this->annotations[$name]; + public function getAnnotationParameter($name, $key) { + if(isset($this->annotations[$name][$key])) { + return $this->annotations[$name][$key]; } - return $parameter; + return ''; } - - } |