1
0
Fork 0
mirror of synced 2024-09-29 08:51:28 +13:00

fix: code review

This commit is contained in:
Torsten Dittmann 2024-02-02 13:42:15 +01:00
parent 75fc59931a
commit db321db0fb
5 changed files with 24 additions and 32 deletions

View file

@ -239,7 +239,7 @@ return [
], ],
Exception::USER_MORE_FACTORS_REQUIRED => [ Exception::USER_MORE_FACTORS_REQUIRED => [
'name' => Exception::USER_MORE_FACTORS_REQUIRED, 'name' => Exception::USER_MORE_FACTORS_REQUIRED,
'description' => null, 'description' => 'More factors are required to complete the sign in process.',
'code' => 400, 'code' => 400,
], ],
Exception::USER_OAUTH2_BAD_REQUEST => [ Exception::USER_OAUTH2_BAD_REQUEST => [

View file

@ -3437,7 +3437,6 @@ App::patch('/v1/account/mfa')
->label('audits.event', 'user.update') ->label('audits.event', 'user.update')
->label('audits.resource', 'user/{response.$id}') ->label('audits.resource', 'user/{response.$id}')
->label('audits.userId', '{response.$id}') ->label('audits.userId', '{response.$id}')
->label('usage.metric', 'users.{scope}.requests.update')
->label('sdk.auth', [APP_AUTH_TYPE_SESSION, APP_AUTH_TYPE_JWT]) ->label('sdk.auth', [APP_AUTH_TYPE_SESSION, APP_AUTH_TYPE_JWT])
->label('sdk.namespace', 'account') ->label('sdk.namespace', 'account')
->label('sdk.method', 'updateMFA') ->label('sdk.method', 'updateMFA')
@ -3464,14 +3463,13 @@ App::patch('/v1/account/mfa')
$response->dynamic($user, Response::MODEL_ACCOUNT); $response->dynamic($user, Response::MODEL_ACCOUNT);
}); });
App::get('/v1/account/mfa/providers') App::get('/v1/account/mfa/factors')
->desc('List Providers') ->desc('List Factors')
->groups(['api', 'account', 'mfa']) ->groups(['api', 'account', 'mfa'])
->label('scope', 'accounts.read') ->label('scope', 'accounts.read')
->label('usage.metric', 'users.{scope}.requests.read')
->label('sdk.auth', [APP_AUTH_TYPE_SESSION, APP_AUTH_TYPE_JWT]) ->label('sdk.auth', [APP_AUTH_TYPE_SESSION, APP_AUTH_TYPE_JWT])
->label('sdk.namespace', 'account') ->label('sdk.namespace', 'account')
->label('sdk.method', 'listProviders') ->label('sdk.method', 'listFactors')
->label('sdk.description', '/docs/references/account/get.md') ->label('sdk.description', '/docs/references/account/get.md')
->label('sdk.response.code', Response::STATUS_CODE_OK) ->label('sdk.response.code', Response::STATUS_CODE_OK)
->label('sdk.response.type', Response::CONTENT_TYPE_JSON) ->label('sdk.response.type', Response::CONTENT_TYPE_JSON)
@ -3491,7 +3489,7 @@ App::get('/v1/account/mfa/providers')
$response->dynamic($providers, Response::MODEL_MFA_PROVIDERS); $response->dynamic($providers, Response::MODEL_MFA_PROVIDERS);
}); });
App::post('/v1/account/mfa/:provider') App::post('/v1/account/mfa/:factor')
->desc('Add Authenticator') ->desc('Add Authenticator')
->groups(['api', 'account']) ->groups(['api', 'account'])
->label('event', 'users.[userId].update.mfa') ->label('event', 'users.[userId].update.mfa')
@ -3499,7 +3497,6 @@ App::post('/v1/account/mfa/:provider')
->label('audits.event', 'user.update') ->label('audits.event', 'user.update')
->label('audits.resource', 'user/{response.$id}') ->label('audits.resource', 'user/{response.$id}')
->label('audits.userId', '{response.$id}') ->label('audits.userId', '{response.$id}')
->label('usage.metric', 'users.{scope}.requests.update')
->label('sdk.auth', [APP_AUTH_TYPE_SESSION, APP_AUTH_TYPE_JWT]) ->label('sdk.auth', [APP_AUTH_TYPE_SESSION, APP_AUTH_TYPE_JWT])
->label('sdk.namespace', 'account') ->label('sdk.namespace', 'account')
->label('sdk.method', 'addAuthenticator') ->label('sdk.method', 'addAuthenticator')
@ -3509,16 +3506,16 @@ App::post('/v1/account/mfa/:provider')
->label('sdk.response.model', Response::MODEL_MFA_PROVIDER) ->label('sdk.response.model', Response::MODEL_MFA_PROVIDER)
->label('sdk.offline.model', '/account') ->label('sdk.offline.model', '/account')
->label('sdk.offline.key', 'current') ->label('sdk.offline.key', 'current')
->param('provider', null, new WhiteList(['totp']), 'Provider.') ->param('factor', null, new WhiteList(['totp']), 'Factor.')
->inject('requestTimestamp') ->inject('requestTimestamp')
->inject('response') ->inject('response')
->inject('project') ->inject('project')
->inject('user') ->inject('user')
->inject('dbForProject') ->inject('dbForProject')
->inject('queueForEvents') ->inject('queueForEvents')
->action(function (string $provider, ?\DateTime $requestTimestamp, Response $response, Document $project, Document $user, Database $dbForProject, Event $queueForEvents) { ->action(function (string $factor, ?\DateTime $requestTimestamp, Response $response, Document $project, Document $user, Database $dbForProject, Event $queueForEvents) {
$otp = match ($provider) { $otp = match ($factor) {
'totp' => new TOTP(), 'totp' => new TOTP(),
default => throw new Exception(Exception::GENERAL_UNKNOWN, 'Unknown provider.') default => throw new Exception(Exception::GENERAL_UNKNOWN, 'Unknown provider.')
}; };
@ -3551,7 +3548,7 @@ App::post('/v1/account/mfa/:provider')
$response->dynamic($model, Response::MODEL_MFA_PROVIDER); $response->dynamic($model, Response::MODEL_MFA_PROVIDER);
}); });
App::put('/v1/account/mfa/:provider') App::put('/v1/account/mfa/:factor')
->desc('Verify Authenticator') ->desc('Verify Authenticator')
->groups(['api', 'account']) ->groups(['api', 'account'])
->label('event', 'users.[userId].update.mfa') ->label('event', 'users.[userId].update.mfa')
@ -3559,7 +3556,6 @@ App::put('/v1/account/mfa/:provider')
->label('audits.event', 'user.update') ->label('audits.event', 'user.update')
->label('audits.resource', 'user/{response.$id}') ->label('audits.resource', 'user/{response.$id}')
->label('audits.userId', '{response.$id}') ->label('audits.userId', '{response.$id}')
->label('usage.metric', 'users.{scope}.requests.update')
->label('sdk.auth', [APP_AUTH_TYPE_SESSION, APP_AUTH_TYPE_JWT]) ->label('sdk.auth', [APP_AUTH_TYPE_SESSION, APP_AUTH_TYPE_JWT])
->label('sdk.namespace', 'account') ->label('sdk.namespace', 'account')
->label('sdk.method', 'verifyAuthenticator') ->label('sdk.method', 'verifyAuthenticator')
@ -3569,7 +3565,7 @@ App::put('/v1/account/mfa/:provider')
->label('sdk.response.model', Response::MODEL_USER) ->label('sdk.response.model', Response::MODEL_USER)
->label('sdk.offline.model', '/account') ->label('sdk.offline.model', '/account')
->label('sdk.offline.key', 'current') ->label('sdk.offline.key', 'current')
->param('provider', null, new WhiteList(['totp']), 'Provider.') ->param('factor', null, new WhiteList(['totp']), 'Factor.')
->param('otp', '', new Text(256), 'Valid verification token.') ->param('otp', '', new Text(256), 'Valid verification token.')
->inject('requestTimestamp') ->inject('requestTimestamp')
->inject('response') ->inject('response')
@ -3577,9 +3573,9 @@ App::put('/v1/account/mfa/:provider')
->inject('project') ->inject('project')
->inject('dbForProject') ->inject('dbForProject')
->inject('queueForEvents') ->inject('queueForEvents')
->action(function (string $provider, string $otp, ?\DateTime $requestTimestamp, Response $response, Document $user, Document $project, Database $dbForProject, Event $queueForEvents) { ->action(function (string $factor, string $otp, ?\DateTime $requestTimestamp, Response $response, Document $user, Document $project, Database $dbForProject, Event $queueForEvents) {
$success = match ($provider) { $success = match ($factor) {
'totp' => Challenge\TOTP::verify($user, $otp), 'totp' => Challenge\TOTP::verify($user, $otp),
default => false default => false
}; };
@ -3616,7 +3612,6 @@ App::delete('/v1/account/mfa/:provider')
->label('audits.event', 'user.update') ->label('audits.event', 'user.update')
->label('audits.resource', 'user/{response.$id}') ->label('audits.resource', 'user/{response.$id}')
->label('audits.userId', '{response.$id}') ->label('audits.userId', '{response.$id}')
->label('usage.metric', 'users.{scope}.requests.update')
->label('sdk.auth', [APP_AUTH_TYPE_SESSION, APP_AUTH_TYPE_JWT]) ->label('sdk.auth', [APP_AUTH_TYPE_SESSION, APP_AUTH_TYPE_JWT])
->label('sdk.namespace', 'account') ->label('sdk.namespace', 'account')
->label('sdk.method', 'deleteAuthenticator') ->label('sdk.method', 'deleteAuthenticator')
@ -3624,8 +3619,6 @@ App::delete('/v1/account/mfa/:provider')
->label('sdk.response.code', Response::STATUS_CODE_OK) ->label('sdk.response.code', Response::STATUS_CODE_OK)
->label('sdk.response.type', Response::CONTENT_TYPE_JSON) ->label('sdk.response.type', Response::CONTENT_TYPE_JSON)
->label('sdk.response.model', Response::MODEL_USER) ->label('sdk.response.model', Response::MODEL_USER)
->label('sdk.offline.model', '/account')
->label('sdk.offline.key', 'current')
->param('provider', null, new WhiteList(['totp']), 'Provider.') ->param('provider', null, new WhiteList(['totp']), 'Provider.')
->param('otp', '', new Text(256), 'Valid verification token.') ->param('otp', '', new Text(256), 'Valid verification token.')
->inject('requestTimestamp') ->inject('requestTimestamp')
@ -3764,7 +3757,6 @@ App::put('/v1/account/mfa/challenge')
->label('audits.event', 'challenges.update') ->label('audits.event', 'challenges.update')
->label('audits.resource', 'user/{response.userId}') ->label('audits.resource', 'user/{response.userId}')
->label('audits.userId', '{response.userId}') ->label('audits.userId', '{response.userId}')
->label('usage.metric', 'users.{scope}.requests.update')
->label('sdk.auth', [APP_AUTH_TYPE_SESSION, APP_AUTH_TYPE_JWT]) ->label('sdk.auth', [APP_AUTH_TYPE_SESSION, APP_AUTH_TYPE_JWT])
->label('sdk.namespace', 'account') ->label('sdk.namespace', 'account')
->label('sdk.method', 'updateChallenge') ->label('sdk.method', 'updateChallenge')
@ -3784,7 +3776,7 @@ App::put('/v1/account/mfa/challenge')
$challenge = $dbForProject->getDocument('challenges', $challengeId); $challenge = $dbForProject->getDocument('challenges', $challengeId);
if (!$challenge) { if ($challenge->isEmpty()) {
throw new Exception(Exception::USER_INVALID_TOKEN); throw new Exception(Exception::USER_INVALID_TOKEN);
} }
@ -3801,7 +3793,7 @@ App::put('/v1/account/mfa/challenge')
} }
$dbForProject->deleteDocument('challenges', $challengeId); $dbForProject->deleteDocument('challenges', $challengeId);
$dbForProject->deleteCachedDocument('users', $user->getId()); $dbForProject->purgeCachedDocument('users', $user->getId());
$authDuration = $project->getAttribute('auths', [])['duration'] ?? Auth::TOKEN_EXPIRATION_LOGIN_LONG; $authDuration = $project->getAttribute('auths', [])['duration'] ?? Auth::TOKEN_EXPIRATION_LOGIN_LONG;
$sessionId = Auth::sessionVerify($user->getAttribute('sessions', []), Auth::$secret, $authDuration); $sessionId = Auth::sessionVerify($user->getAttribute('sessions', []), Auth::$secret, $authDuration);

12
composer.lock generated
View file

@ -1543,16 +1543,16 @@
}, },
{ {
"name": "utopia-php/database", "name": "utopia-php/database",
"version": "0.48.0", "version": "0.48.1",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/utopia-php/database.git", "url": "https://github.com/utopia-php/database.git",
"reference": "2651f41b9d3909dc123d26becfb6a3a44fb63077" "reference": "52abe057180a76fe354a516300344b33f268f6ea"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/utopia-php/database/zipball/2651f41b9d3909dc123d26becfb6a3a44fb63077", "url": "https://api.github.com/repos/utopia-php/database/zipball/52abe057180a76fe354a516300344b33f268f6ea",
"reference": "2651f41b9d3909dc123d26becfb6a3a44fb63077", "reference": "52abe057180a76fe354a516300344b33f268f6ea",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
@ -1593,9 +1593,9 @@
], ],
"support": { "support": {
"issues": "https://github.com/utopia-php/database/issues", "issues": "https://github.com/utopia-php/database/issues",
"source": "https://github.com/utopia-php/database/tree/0.48.0" "source": "https://github.com/utopia-php/database/tree/0.48.1"
}, },
"time": "2024-01-19T08:17:22+00:00" "time": "2024-02-02T04:54:13+00:00"
}, },
{ {
"name": "utopia-php/domains", "name": "utopia-php/domains",

View file

@ -12,20 +12,20 @@ class MFAProvider extends Model
$this $this
->addRule('backups', [ ->addRule('backups', [
'type' => self::TYPE_STRING, 'type' => self::TYPE_STRING,
'description' => 'backup codes', 'description' => 'Backup codes.',
'array' => true, 'array' => true,
'default' => [], 'default' => [],
'example' => true 'example' => true
]) ])
->addRule('secret', [ ->addRule('secret', [
'type' => self::TYPE_STRING, 'type' => self::TYPE_STRING,
'description' => 'secret used for top auth', 'description' => 'Secret token used for TOTP factor.',
'default' => '', 'default' => '',
'example' => true 'example' => true
]) ])
->addRule('uri', [ ->addRule('uri', [
'type' => self::TYPE_STRING, 'type' => self::TYPE_STRING,
'description' => 'uri for otp app', 'description' => 'URI for authenticator apps.',
'default' => '', 'default' => '',
'example' => true 'example' => true
]) ])

View file

@ -162,7 +162,7 @@ class Session extends Model
]) ])
->addRule('factors', [ ->addRule('factors', [
'type' => self::TYPE_INTEGER, 'type' => self::TYPE_INTEGER,
'description' => 'Returns true if this the current user session.', 'description' => 'Returns a list of active session factors.',
'default' => 1, 'default' => 1,
'example' => 1, 'example' => 1,
]) ])