diff --git a/app/config/collections.php b/app/config/collections.php index 62c1d5cf1..76009ec75 100644 --- a/app/config/collections.php +++ b/app/config/collections.php @@ -825,10 +825,10 @@ $collections = [ ], [ '$id' => 'updated', - 'type' => Database::VAR_DATETIME, // ok! + 'type' => Database::VAR_DATETIME, 'format' => '', 'size' => 0, - 'signed' => true, + 'signed' => false, 'required' => false, 'default' => null, 'array' => false, @@ -968,7 +968,7 @@ $collections = [ 'size' => 0, 'signed' => false, 'required' => false, - 'default' => 0, + 'default' => null, 'array' => false, 'filters' => [], ], @@ -1165,7 +1165,7 @@ $collections = [ 'type' => Database::VAR_DATETIME, 'format' => '', 'size' => 0, - 'signed' => true, + 'signed' => false, 'required' => false, 'default' => null, 'array' => false, @@ -1187,7 +1187,7 @@ $collections = [ 'type' => Database::VAR_DATETIME, 'format' => '', 'size' => 0, - 'signed' => true, + 'signed' => false, 'required' => false, 'default' => null, 'array' => false, @@ -1350,7 +1350,7 @@ $collections = [ 'type' => Database::VAR_DATETIME, 'format' => '', 'size' => 0, - 'signed' => true, + 'signed' => false, 'required' => false, 'default' => null, 'array' => false, @@ -1455,7 +1455,7 @@ $collections = [ 'type' => Database::VAR_DATETIME, 'format' => '', 'size' => 0, - 'signed' => true, + 'signed' => false, 'required' => false, 'default' => null, 'array' => false, @@ -1488,7 +1488,7 @@ $collections = [ 'type' => Database::VAR_DATETIME, 'format' => '', 'size' => 0, - 'signed' => true, + 'signed' => false, 'required' => false, 'default' => null, 'array' => false, @@ -2459,10 +2459,10 @@ $collections = [ ], [ '$id' => 'issueDate', - 'type' => Database::VAR_DATETIME, // ok! + 'type' => Database::VAR_DATETIME, 'format' => '', 'size' => 0, - 'signed' => true, + 'signed' => false, 'required' => false, 'default' => null, 'array' => false, @@ -2470,10 +2470,10 @@ $collections = [ ], [ '$id' => 'renewDate', - 'type' => Database::VAR_INTEGER, // cert.pem is time stamp? + 'type' => Database::VAR_DATETIME, 'format' => '', 'size' => 0, - 'signed' => true, + 'signed' => false, 'required' => false, 'default' => null, 'array' => false, @@ -2506,7 +2506,7 @@ $collections = [ 'type' => Database::VAR_DATETIME, 'format' => '', 'size' => 0, - 'signed' => true, + 'signed' => false, 'required' => false, 'default' => null, 'array' => false, diff --git a/app/controllers/api/projects.php b/app/controllers/api/projects.php index 01fe4c84c..eceeeb7ba 100644 --- a/app/controllers/api/projects.php +++ b/app/controllers/api/projects.php @@ -19,6 +19,7 @@ use Utopia\Database\Database; use Utopia\Database\Document; use Utopia\Database\Query; use Utopia\Database\Validator\Authorization; +use Utopia\Database\Validator\DatetimeValidation; use Utopia\Database\Validator\UID; use Utopia\Domains\Domain; use Utopia\Registry\Registry; @@ -819,10 +820,10 @@ App::post('/v1/projects/:projectId/keys') ->param('projectId', null, new UID(), 'Project unique ID.') ->param('name', null, new Text(128), 'Key name. Max length: 128 chars.') ->param('scopes', null, new ArrayList(new WhiteList(array_keys(Config::getParam('scopes')), true), APP_LIMIT_ARRAY_PARAMS_SIZE), 'Key scopes list. Maximum of ' . APP_LIMIT_ARRAY_PARAMS_SIZE . ' scopes are allowed.') - ->param('expire', 0, new Integer(), 'Key expiration time in Unix timestamp. Use 0 for unlimited expiration.', true) + ->param('expire', null, new DatetimeValidation(), 'Expiration time in DateTime. Use null for unlimited expiration.', true) ->inject('response') ->inject('dbForConsole') - ->action(function (string $projectId, string $name, array $scopes, int $expire, Response $response, Database $dbForConsole) { + ->action(function (string $projectId, string $name, array $scopes, string $expire, Response $response, Database $dbForConsole) { $project = $dbForConsole->getDocument('projects', $projectId); @@ -929,10 +930,10 @@ App::put('/v1/projects/:projectId/keys/:keyId') ->param('keyId', null, new UID(), 'Key unique ID.') ->param('name', null, new Text(128), 'Key name. Max length: 128 chars.') ->param('scopes', null, new ArrayList(new WhiteList(array_keys(Config::getParam('scopes')), true), APP_LIMIT_ARRAY_PARAMS_SIZE), 'Key scopes list. Maximum of ' . APP_LIMIT_ARRAY_PARAMS_SIZE . ' events are allowed.') - ->param('expire', 0, new Integer(), 'Key expiration time in Unix timestamp. Use 0 for unlimited expiration.', true) + ->param('expire', null, new DatetimeValidation(), 'Expiration time in DateTime. Use null for unlimited expiration.', true) ->inject('response') ->inject('dbForConsole') - ->action(function (string $projectId, string $keyId, string $name, array $scopes, int $expire, Response $response, Database $dbForConsole) { + ->action(function (string $projectId, string $keyId, string $name, array $scopes, string $expire, Response $response, Database $dbForConsole) { $project = $dbForConsole->getDocument('projects', $projectId); diff --git a/app/workers/certificates.php b/app/workers/certificates.php index 4fbf688f9..06317fbb4 100644 --- a/app/workers/certificates.php +++ b/app/workers/certificates.php @@ -296,10 +296,9 @@ class CertificatesV1 extends Worker { $certPath = APP_STORAGE_CERTIFICATES . '/' . $domain . '/cert.pem'; $certData = openssl_x509_parse(file_get_contents($certPath)); - $validTo = $certData['validTo_time_t'] ?? 0; - $expiryInAdvance = (60 * 60 * 24 * 30); // 30 days - - return $validTo - $expiryInAdvance; + $validTo = $certData['validTo_time_t'] ?? null; + $dt = (new \DateTime())->setTimestamp($validTo); + return Database::dateAddSeconds($dt, -60 * 60 * 24 * 30); // -30 days } /** diff --git a/src/Appwrite/Utopia/Response/Model/Token.php b/src/Appwrite/Utopia/Response/Model/Token.php index b8b6517cf..b4fa5041c 100644 --- a/src/Appwrite/Utopia/Response/Model/Token.php +++ b/src/Appwrite/Utopia/Response/Model/Token.php @@ -35,10 +35,10 @@ class Token extends Model 'example' => '', ]) ->addRule('expire', [ - 'type' => self::TYPE_INTEGER, + 'type' => self::TYPE_DATETIME, 'description' => 'Token expiration date in Unix timestamp.', - 'default' => 0, - 'example' => 1592981250, + 'default' => '', + 'example' => '1975-12-06 13:30:59', ]) ; } diff --git a/tests/e2e/Services/Account/AccountCustomClientTest.php b/tests/e2e/Services/Account/AccountCustomClientTest.php index b035419df..5d2df8232 100644 --- a/tests/e2e/Services/Account/AccountCustomClientTest.php +++ b/tests/e2e/Services/Account/AccountCustomClientTest.php @@ -8,6 +8,7 @@ use Tests\E2E\Scopes\Scope; use Tests\E2E\Scopes\ProjectCustom; use Tests\E2E\Scopes\SideClient; +use Utopia\Database\Database; use function sleep; class AccountCustomClientTest extends Scope @@ -538,7 +539,7 @@ class AccountCustomClientTest extends Scope $this->assertEquals(200, $response['headers']['status-code']); $this->assertEquals('123456', $response['body']['providerAccessToken']); $this->assertEquals('tuvwxyz', $response['body']['providerRefreshToken']); - $this->assertGreaterThan(\time() + 14400 - 5, $response['body']['providerAccessTokenExpiry']); // 5 seconds allowed networking delay + $this->assertGreaterThan(Database::dateAddSeconds(new \DateTime(), 14400 - 5), $response['body']['providerAccessTokenExpiry']); // 5 seconds allowed networking delay $initialExpiry = $response['body']['providerAccessTokenExpiry'];