Add headers validator

This commit is contained in:
Khushboo Verma
2024-08-06 13:49:28 +05:30
parent 6c6ef78238
commit 6691c985dd
2 changed files with 92 additions and 1 deletions
+2 -1
View File
@@ -10,6 +10,7 @@ use Appwrite\Event\Usage;
use Appwrite\Event\Validator\FunctionEvent;
use Appwrite\Extend\Exception;
use Appwrite\Extend\Exception as AppwriteException;
use Appwrite\Functions\Validator\Headers;
use Appwrite\Messaging\Adapter\Realtime;
use Appwrite\Platform\Tasks\ScheduleExecutions;
use Appwrite\Task\Validator\Cron;
@@ -1628,7 +1629,7 @@ App::post('/v1/functions/:functionId/executions')
}
// 'headers' validator
$validator = new Assoc();
$validator = new Headers();
if (!$validator->isValid($headers)) {
throw new Exception($validator->getDescription(), 400);
}
@@ -0,0 +1,90 @@
<?php
namespace Appwrite\Functions\Validator;
use Utopia\Validator;
/**
* Headers.
*
* Validates user provided headers
*/
class Headers extends Validator
{
protected bool $allowEmpty;
public function __construct(bool $allowEmpty = true)
{
$this->allowEmpty = $allowEmpty;
}
/**
* Get Description.
*
* Returns validator description
*
* @return string
*/
public function getDescription(): string
{
return 'Invalid header format. Header keys can only contain alphanumeric characters, underscores, and hyphens. Header keys cannot start with "x-appwrite-" prefix.';
}
/**
* Is valid.
*
* @param mixed $value
*
* @return bool
*/
public function isValid($value): bool
{
if ($this->allowEmpty && empty($value)) {
return true;
}
if (\is_string($value)) {
$value = \json_decode($value, true);
}
if (\json_last_error() == JSON_ERROR_NONE) {
if (\is_array($value)) {
foreach ($value as $key => $val) {
// Check for invalid characters in key and value
if (!preg_match('/^[a-zA-Z0-9_-]+$/', $key)) {
return false;
}
// Check for x-appwrite- prefix
if (0 === strpos($key, 'x-appwrite-')) {
return false;
}
}
}
}
return \json_last_error() == JSON_ERROR_NONE;
}
/**
* Is array
*
* Function will return true if object is array.
*
* @return bool
*/
public function isArray(): bool
{
return false;
}
/**
* Get Type
*
* Returns validator type.
*
* @return string
*/
public function getType(): string
{
return self::TYPE_OBJECT;
}
}