From d9707c2281087fa85812ab9c991e0a0f8aa4538b Mon Sep 17 00:00:00 2001
From: Maurits van der Schee <maurits@vdschee.nl>
Date: Sun, 18 Apr 2021 14:11:16 +0200
Subject: [PATCH 1/4] wip

---
 .../Middleware/QueryQuotaMiddleware.php       | 57 +++++++++++++++++++
 .../Middleware/RateLimitMiddleware copy.php   | 57 +++++++++++++++++++
 2 files changed, 114 insertions(+)
 create mode 100644 src/Tqdev/PhpCrudApi/Middleware/QueryQuotaMiddleware.php
 create mode 100644 src/Tqdev/PhpCrudApi/Middleware/RateLimitMiddleware copy.php

diff --git a/src/Tqdev/PhpCrudApi/Middleware/QueryQuotaMiddleware.php b/src/Tqdev/PhpCrudApi/Middleware/QueryQuotaMiddleware.php
new file mode 100644
index 00000000..0440c328
--- /dev/null
+++ b/src/Tqdev/PhpCrudApi/Middleware/QueryQuotaMiddleware.php
@@ -0,0 +1,57 @@
+<?php
+
+namespace Tqdev\PhpCrudApi\Middleware;
+
+use Psr\Http\Message\ResponseInterface;
+use Psr\Http\Message\ServerRequestInterface;
+use Psr\Http\Server\RequestHandlerInterface;
+use Tqdev\PhpCrudApi\Controller\Responder;
+use Tqdev\PhpCrudApi\Middleware\Base\Middleware;
+use Tqdev\PhpCrudApi\Record\ErrorCode;
+
+class QueryQuotaMiddleware extends Middleware
+{
+    private function ipMatch(string $ip, string $cidr): bool
+    {
+        if (strpos($cidr, '/') !== false) {
+            list($subnet, $mask) = explode('/', trim($cidr));
+            if ((ip2long($ip) & ~((1 << (32 - $mask)) - 1)) == ip2long($subnet)) {
+                return true;
+            }
+        } else {
+            if (ip2long($ip) == ip2long($cidr)) {
+                return true;
+            }
+        }
+        return false;
+    }
+
+    private function isIpAllowed(string $ipAddress, string $allowedIpAddresses): bool
+    {
+        foreach (explode(',', $allowedIpAddresses) as $allowedIp) {
+            if ($this->ipMatch($ipAddress, $allowedIp)) {
+                return true;
+            }
+        }
+        return false;
+    }
+
+    public function process(ServerRequestInterface $request, RequestHandlerInterface $next): ResponseInterface
+    {
+        $reverseProxy = $this->getProperty('reverseProxy', '');
+        if ($reverseProxy) {
+            $ipAddress = array_pop(explode(',', $request->getHeader('X-Forwarded-For')));
+        } elseif (isset($_SERVER['REMOTE_ADDR'])) {
+            $ipAddress = $_SERVER['REMOTE_ADDR'];
+        } else {
+            $ipAddress = '127.0.0.1';
+        }
+        $allowedIpAddresses = $this->getProperty('allowedIpAddresses', '');
+        if (!$this->isIpAllowed($ipAddress, $allowedIpAddresses)) {
+            $response = $this->responder->error(ErrorCode::TEMPORARY_OR_PERMANENTLY_BLOCKED, '');
+        } else {
+            $response = $next->handle($request);
+        }
+        return $response;
+    }
+}
diff --git a/src/Tqdev/PhpCrudApi/Middleware/RateLimitMiddleware copy.php b/src/Tqdev/PhpCrudApi/Middleware/RateLimitMiddleware copy.php
new file mode 100644
index 00000000..892e5d1d
--- /dev/null
+++ b/src/Tqdev/PhpCrudApi/Middleware/RateLimitMiddleware copy.php	
@@ -0,0 +1,57 @@
+<?php
+
+namespace Tqdev\PhpCrudApi\Middleware;
+
+use Psr\Http\Message\ResponseInterface;
+use Psr\Http\Message\ServerRequestInterface;
+use Psr\Http\Server\RequestHandlerInterface;
+use Tqdev\PhpCrudApi\Controller\Responder;
+use Tqdev\PhpCrudApi\Middleware\Base\Middleware;
+use Tqdev\PhpCrudApi\Record\ErrorCode;
+
+class RateLimitMiddleware extends Middleware
+{
+    private function ipMatch(string $ip, string $cidr): bool
+    {
+        if (strpos($cidr, '/') !== false) {
+            list($subnet, $mask) = explode('/', trim($cidr));
+            if ((ip2long($ip) & ~((1 << (32 - $mask)) - 1)) == ip2long($subnet)) {
+                return true;
+            }
+        } else {
+            if (ip2long($ip) == ip2long($cidr)) {
+                return true;
+            }
+        }
+        return false;
+    }
+
+    private function isIpAllowed(string $ipAddress, string $allowedIpAddresses): bool
+    {
+        foreach (explode(',', $allowedIpAddresses) as $allowedIp) {
+            if ($this->ipMatch($ipAddress, $allowedIp)) {
+                return true;
+            }
+        }
+        return false;
+    }
+
+    public function process(ServerRequestInterface $request, RequestHandlerInterface $next): ResponseInterface
+    {
+        $reverseProxy = $this->getProperty('reverseProxy', '');
+        if ($reverseProxy) {
+            $ipAddress = array_pop(explode(',', $request->getHeader('X-Forwarded-For')));
+        } elseif (isset($_SERVER['REMOTE_ADDR'])) {
+            $ipAddress = $_SERVER['REMOTE_ADDR'];
+        } else {
+            $ipAddress = '127.0.0.1';
+        }
+        $allowedIpAddresses = $this->getProperty('allowedIpAddresses', '');
+        if (!$this->isIpAllowed($ipAddress, $allowedIpAddresses)) {
+            $response = $this->responder->error(ErrorCode::TEMPORARY_OR_PERMANENTLY_BLOCKED, '');
+        } else {
+            $response = $next->handle($request);
+        }
+        return $response;
+    }
+}

From 650c737f083dd51c074793efedbbe0664121feb2 Mon Sep 17 00:00:00 2001
From: Maurits van der Schee <maurits@vdschee.nl>
Date: Sat, 24 Apr 2021 15:25:15 +0200
Subject: [PATCH 2/4] update

---
 .../Middleware/RateLimitMiddleware copy.php   | 57 -------------------
 1 file changed, 57 deletions(-)
 delete mode 100644 src/Tqdev/PhpCrudApi/Middleware/RateLimitMiddleware copy.php

diff --git a/src/Tqdev/PhpCrudApi/Middleware/RateLimitMiddleware copy.php b/src/Tqdev/PhpCrudApi/Middleware/RateLimitMiddleware copy.php
deleted file mode 100644
index 892e5d1d..00000000
--- a/src/Tqdev/PhpCrudApi/Middleware/RateLimitMiddleware copy.php	
+++ /dev/null
@@ -1,57 +0,0 @@
-<?php
-
-namespace Tqdev\PhpCrudApi\Middleware;
-
-use Psr\Http\Message\ResponseInterface;
-use Psr\Http\Message\ServerRequestInterface;
-use Psr\Http\Server\RequestHandlerInterface;
-use Tqdev\PhpCrudApi\Controller\Responder;
-use Tqdev\PhpCrudApi\Middleware\Base\Middleware;
-use Tqdev\PhpCrudApi\Record\ErrorCode;
-
-class RateLimitMiddleware extends Middleware
-{
-    private function ipMatch(string $ip, string $cidr): bool
-    {
-        if (strpos($cidr, '/') !== false) {
-            list($subnet, $mask) = explode('/', trim($cidr));
-            if ((ip2long($ip) & ~((1 << (32 - $mask)) - 1)) == ip2long($subnet)) {
-                return true;
-            }
-        } else {
-            if (ip2long($ip) == ip2long($cidr)) {
-                return true;
-            }
-        }
-        return false;
-    }
-
-    private function isIpAllowed(string $ipAddress, string $allowedIpAddresses): bool
-    {
-        foreach (explode(',', $allowedIpAddresses) as $allowedIp) {
-            if ($this->ipMatch($ipAddress, $allowedIp)) {
-                return true;
-            }
-        }
-        return false;
-    }
-
-    public function process(ServerRequestInterface $request, RequestHandlerInterface $next): ResponseInterface
-    {
-        $reverseProxy = $this->getProperty('reverseProxy', '');
-        if ($reverseProxy) {
-            $ipAddress = array_pop(explode(',', $request->getHeader('X-Forwarded-For')));
-        } elseif (isset($_SERVER['REMOTE_ADDR'])) {
-            $ipAddress = $_SERVER['REMOTE_ADDR'];
-        } else {
-            $ipAddress = '127.0.0.1';
-        }
-        $allowedIpAddresses = $this->getProperty('allowedIpAddresses', '');
-        if (!$this->isIpAllowed($ipAddress, $allowedIpAddresses)) {
-            $response = $this->responder->error(ErrorCode::TEMPORARY_OR_PERMANENTLY_BLOCKED, '');
-        } else {
-            $response = $next->handle($request);
-        }
-        return $response;
-    }
-}

From c31f7327401655e4c7f462f756dca632f16ac8f9 Mon Sep 17 00:00:00 2001
From: Maurits van der Schee <maurits@vdschee.nl>
Date: Sat, 24 Apr 2021 15:25:45 +0200
Subject: [PATCH 3/4] update

---
 .../Middleware/RateLimitMiddleware.php        | 57 +++++++++++++++++++
 1 file changed, 57 insertions(+)
 create mode 100644 src/Tqdev/PhpCrudApi/Middleware/RateLimitMiddleware.php

diff --git a/src/Tqdev/PhpCrudApi/Middleware/RateLimitMiddleware.php b/src/Tqdev/PhpCrudApi/Middleware/RateLimitMiddleware.php
new file mode 100644
index 00000000..892e5d1d
--- /dev/null
+++ b/src/Tqdev/PhpCrudApi/Middleware/RateLimitMiddleware.php
@@ -0,0 +1,57 @@
+<?php
+
+namespace Tqdev\PhpCrudApi\Middleware;
+
+use Psr\Http\Message\ResponseInterface;
+use Psr\Http\Message\ServerRequestInterface;
+use Psr\Http\Server\RequestHandlerInterface;
+use Tqdev\PhpCrudApi\Controller\Responder;
+use Tqdev\PhpCrudApi\Middleware\Base\Middleware;
+use Tqdev\PhpCrudApi\Record\ErrorCode;
+
+class RateLimitMiddleware extends Middleware
+{
+    private function ipMatch(string $ip, string $cidr): bool
+    {
+        if (strpos($cidr, '/') !== false) {
+            list($subnet, $mask) = explode('/', trim($cidr));
+            if ((ip2long($ip) & ~((1 << (32 - $mask)) - 1)) == ip2long($subnet)) {
+                return true;
+            }
+        } else {
+            if (ip2long($ip) == ip2long($cidr)) {
+                return true;
+            }
+        }
+        return false;
+    }
+
+    private function isIpAllowed(string $ipAddress, string $allowedIpAddresses): bool
+    {
+        foreach (explode(',', $allowedIpAddresses) as $allowedIp) {
+            if ($this->ipMatch($ipAddress, $allowedIp)) {
+                return true;
+            }
+        }
+        return false;
+    }
+
+    public function process(ServerRequestInterface $request, RequestHandlerInterface $next): ResponseInterface
+    {
+        $reverseProxy = $this->getProperty('reverseProxy', '');
+        if ($reverseProxy) {
+            $ipAddress = array_pop(explode(',', $request->getHeader('X-Forwarded-For')));
+        } elseif (isset($_SERVER['REMOTE_ADDR'])) {
+            $ipAddress = $_SERVER['REMOTE_ADDR'];
+        } else {
+            $ipAddress = '127.0.0.1';
+        }
+        $allowedIpAddresses = $this->getProperty('allowedIpAddresses', '');
+        if (!$this->isIpAllowed($ipAddress, $allowedIpAddresses)) {
+            $response = $this->responder->error(ErrorCode::TEMPORARY_OR_PERMANENTLY_BLOCKED, '');
+        } else {
+            $response = $next->handle($request);
+        }
+        return $response;
+    }
+}

From 347bd8908ec814293132de89deb6e85b240e03f0 Mon Sep 17 00:00:00 2001
From: jaleonardo <32501234+apps-caraga@users.noreply.github.com>
Date: Fri, 19 Jan 2024 09:27:01 +0800
Subject: [PATCH 4/4] Update DbAuthMiddleware.php

Updated middleware to trim leading and/or trailing spaces in username.
---
 src/Tqdev/PhpCrudApi/Middleware/DbAuthMiddleware.php | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/src/Tqdev/PhpCrudApi/Middleware/DbAuthMiddleware.php b/src/Tqdev/PhpCrudApi/Middleware/DbAuthMiddleware.php
index 49b6263f..7bc0abb4 100644
--- a/src/Tqdev/PhpCrudApi/Middleware/DbAuthMiddleware.php
+++ b/src/Tqdev/PhpCrudApi/Middleware/DbAuthMiddleware.php
@@ -44,7 +44,7 @@ public function process(ServerRequestInterface $request, RequestHandlerInterface
         $method = $request->getMethod();
         if ($method == 'POST' && in_array($path, ['login', 'register', 'password'])) {
             $body = $request->getParsedBody();
-            $username = isset($body->username) ? $body->username : '';
+            $username = trim(isset($body->username) ? $body->username : '');
             $password = isset($body->password) ? $body->password : '';
             $newPassword = isset($body->newPassword) ? $body->newPassword : '';
             $tableName = $this->getProperty('usersTable', 'users');