diff --git a/app/controllers/api/projects.php b/app/controllers/api/projects.php index 300d9c180e..b8a24fa7ca 100644 --- a/app/controllers/api/projects.php +++ b/app/controllers/api/projects.php @@ -85,7 +85,7 @@ App::post('/v1/projects') } $auth = Config::getParam('auth', []); - $auths = ['limit' => 0, 'maxSessions' => APP_LIMIT_USER_SESSIONS_DEFAULT, 'passwordHistory' => 0, 'passwordDictionary' => false, 'duration' => Auth::TOKEN_EXPIRATION_LOGIN_LONG, 'personalDataCheck' => false]; + $auths = ['limit' => 0, 'maxSessions' => APP_LIMIT_USER_SESSIONS_DEFAULT, 'passwordHistory' => 0, 'passwordDictionary' => false, 'passwordDictionaryLength' => '10k', 'duration' => Auth::TOKEN_EXPIRATION_LOGIN_LONG, 'personalDataCheck' => false]; foreach ($auth as $index => $method) { $auths[$method['key'] ?? ''] = true; } @@ -790,7 +790,7 @@ App::patch('/v1/projects/:projectId/auth/password-history') }); App::patch('/v1/projects/:projectId/auth/password-dictionary') - ->desc('Update authentication password dictionary status. Use this endpoint to enable or disable the dicitonary check for user password') + ->desc('Update authentication password dictionary status. Use this endpoint to enable or disable the dictionary check for user password') ->groups(['api', 'projects']) ->label('scope', 'projects.write') ->label('sdk.auth', [APP_AUTH_TYPE_ADMIN]) @@ -801,9 +801,10 @@ App::patch('/v1/projects/:projectId/auth/password-dictionary') ->label('sdk.response.model', Response::MODEL_PROJECT) ->param('projectId', '', new UID(), 'Project unique ID.') ->param('enabled', false, new Boolean(false), 'Set whether or not to enable checking user\'s password against most commonly used passwords. Default is false.') + ->param('length', '10k', new WhiteList(['10k, 100k, 1m, 10m'], true), 'Set the length of the password dictionary to use', true) ->inject('response') ->inject('dbForConsole') - ->action(function (string $projectId, bool $enabled, Response $response, Database $dbForConsole) { + ->action(function (string $projectId, bool $enabled, string $length, Response $response, Database $dbForConsole) { $project = $dbForConsole->getDocument('projects', $projectId); @@ -813,6 +814,7 @@ App::patch('/v1/projects/:projectId/auth/password-dictionary') $auths = $project->getAttribute('auths', []); $auths['passwordDictionary'] = $enabled; + $auths['passwordDictionaryLength'] = $length; $dbForConsole->updateDocument('projects', $project->getId(), $project ->setAttribute('auths', $auths)); diff --git a/app/init.php b/app/init.php index 4dfdcaf108..bca38bedab 100644 --- a/app/init.php +++ b/app/init.php @@ -925,12 +925,26 @@ $register->set('smtp', function () { $register->set('geodb', function () { return new Reader(__DIR__ . '/assets/dbip/dbip-country-lite-2023-01.mmdb'); }); -$register->set('passwordsDictionary', function () { +$register->set('passwordsDictionary10k', function () { $content = \file_get_contents(__DIR__ . '/assets/security/10k-common-passwords'); $content = explode("\n", $content); $content = array_flip($content); return $content; }); + +$register->set('passwordsDictionary100k', function () { + $content = \file_get_contents(__DIR__ . '/assets/security/100k-common-passwords'); + $content = explode("\n", $content); + $content = array_flip($content); + return $content; +}); + +$register->set('passwordsDictionary1m', function () { + $content = \file_get_contents(__DIR__ . '/assets/security/1m-common-passwords'); + $content = explode("\n", $content); + $content = array_flip($content); + return $content; +}); $register->set('promiseAdapter', function () { return new Swoole(); }); @@ -1424,12 +1438,22 @@ App::setResource('geodb', function ($register) { return $register->get('geodb'); }, ['register']); -App::setResource('passwordsDictionary', function ($register) { +App::setResource('passwordsDictionary10k', function ($register) { /** @var Utopia\Registry\Registry $register */ - return $register->get('passwordsDictionary'); + return $register->get('passwordsDictionary10k'); }, ['register']); +App::setResource('passwordsDictionary100k', function ($register) { + /** @var Utopia\Registry\Registry $register */ + return $register->get('passwordsDictionary100k'); +}, ['register']); + +App::setResource('passwordsDictionary1m', function ($register) { + /** @var Utopia\Registry\Registry $register */ + return $register->get('passwordsDictionary1m'); +}, ['register']); + App::setResource('servers', function () { $platforms = Config::getParam('platforms'); $server = $platforms[APP_PLATFORM_SERVER];