diff --git a/ui/app/adapters/mfa-method.js b/ui/app/adapters/mfa-method.js index 5c465ec87313e..0f5a8fc83cca4 100644 --- a/ui/app/adapters/mfa-method.js +++ b/ui/app/adapters/mfa-method.js @@ -3,24 +3,26 @@ import ApplicationAdapter from './application'; export default class MfaMethodAdapter extends ApplicationAdapter { namespace = 'v1'; - urlForQuery(methodType) { - let baseUrl = this.buildURL() + '/identity/mfa/method'; - if (methodType) { - return `${baseUrl}/${methodType}`; - } - return baseUrl; + pathForType() { + return 'identity/mfa/method'; } - queryRecord(type, id) { - return this.ajax(this.urlForQuery(type), 'POST', { + queryRecord(store, type, query) { + const { id } = query; + if (!id) { + throw new Error('MFA method ID is required to fetch the details.'); + } + const url = this.urlForQuery(query, type.modelName); + return this.ajax(url, 'POST', { data: { id, }, }); } - query() { - return this.ajax(this.urlForQuery(), 'GET', { + query(store, type, query) { + const url = this.urlForQuery(query, type.modelName); + return this.ajax(url, 'GET', { data: { list: true, }, diff --git a/ui/app/controllers/vault/cluster/access/mfa/enforcements.js b/ui/app/controllers/vault/cluster/access/mfa/enforcements.js new file mode 100644 index 0000000000000..81488ac7f6c9d --- /dev/null +++ b/ui/app/controllers/vault/cluster/access/mfa/enforcements.js @@ -0,0 +1,9 @@ +import Controller from '@ember/controller'; + +export default class MfaEnforcementListController extends Controller { + queryParams = { + page: 'page', + }; + + page = 1; +} diff --git a/ui/app/controllers/vault/cluster/access/mfa/index.js b/ui/app/controllers/vault/cluster/access/mfa/index.js deleted file mode 100644 index b6b14ac823ac5..0000000000000 --- a/ui/app/controllers/vault/cluster/access/mfa/index.js +++ /dev/null @@ -1,3 +0,0 @@ -import Controller from '@ember/controller'; - -export default class MfaListController extends Controller {} diff --git a/ui/app/controllers/vault/cluster/access/mfa/methods.js b/ui/app/controllers/vault/cluster/access/mfa/methods.js new file mode 100644 index 0000000000000..b24fe242eb6fc --- /dev/null +++ b/ui/app/controllers/vault/cluster/access/mfa/methods.js @@ -0,0 +1,9 @@ +import Controller from '@ember/controller'; + +export default class MfaMethodsListController extends Controller { + queryParams = { + page: 'page', + }; + + page = 1; +} diff --git a/ui/app/router.js b/ui/app/router.js index 8ba886c3d9dcd..91c9115b9aa3b 100644 --- a/ui/app/router.js +++ b/ui/app/router.js @@ -59,9 +59,13 @@ Router.map(function () { this.route('section', { path: '/:section_name' }); }); this.route('mfa', function () { - // lookup - this.route('index', { path: '/' }); this.route('configure', { path: '/landing' }); + this.route('methods', { path: '/' }); + this.route('method', { path: '/method/:method_id' }, function () { + this.route('index', { path: '/' }); + }); + this.route('enforcements', { path: '/enforcement-list' }); + this.route('enforcement', { path: '/enforcement/:id' }); }); this.route('leases', function () { // lookup diff --git a/ui/app/routes/vault/cluster/access/mfa/configure.js b/ui/app/routes/vault/cluster/access/mfa/configure.js index 3bf8a3ce31737..a1986fd4e7463 100644 --- a/ui/app/routes/vault/cluster/access/mfa/configure.js +++ b/ui/app/routes/vault/cluster/access/mfa/configure.js @@ -1,6 +1,6 @@ import Route from '@ember/routing/route'; -export default class ConfigureRoute extends Route { +export default class MfaConfigureRoute extends Route { model() { return {}; } diff --git a/ui/app/routes/vault/cluster/access/mfa/enforcements.js b/ui/app/routes/vault/cluster/access/mfa/enforcements.js new file mode 100644 index 0000000000000..158c41753a0bc --- /dev/null +++ b/ui/app/routes/vault/cluster/access/mfa/enforcements.js @@ -0,0 +1,27 @@ +import Route from '@ember/routing/route'; + +export default class MfaEnforcementsRoute extends Route { + queryParams = { + page: { + refreshModel: true, + }, + }; + + model(params) { + return this.store + .lazyPaginatedQuery('mfa-login-enforcement', { + responsePath: 'data.keys', + page: params.page || 1, + }) + .catch((err) => { + if (err.httpStatus === 404) { + return []; + } else { + throw err; + } + }); + } + setupController(controller, model) { + controller.set('model', model); + } +} diff --git a/ui/app/routes/vault/cluster/access/mfa/method.js b/ui/app/routes/vault/cluster/access/mfa/method.js new file mode 100644 index 0000000000000..a7671c8453a07 --- /dev/null +++ b/ui/app/routes/vault/cluster/access/mfa/method.js @@ -0,0 +1,10 @@ +import Route from '@ember/routing/route'; + +export default class MfaMethodRoute extends Route { + model(params) { + return this.store.findRecord('mfa-method', params['method_id']); + } + setupController(controller, model) { + controller.set('model', model); + } +} diff --git a/ui/app/routes/vault/cluster/access/mfa/index.js b/ui/app/routes/vault/cluster/access/mfa/methods.js similarity index 92% rename from ui/app/routes/vault/cluster/access/mfa/index.js rename to ui/app/routes/vault/cluster/access/mfa/methods.js index a7db06b280e2e..eb3d6b89f73c5 100644 --- a/ui/app/routes/vault/cluster/access/mfa/index.js +++ b/ui/app/routes/vault/cluster/access/mfa/methods.js @@ -1,7 +1,7 @@ import Route from '@ember/routing/route'; import { inject as service } from '@ember/service'; -export default class MfaRoute extends Route { +export default class MfaMethodsRoute extends Route { @service router; queryParams = { diff --git a/ui/app/templates/components/mfa/nav.hbs b/ui/app/templates/components/mfa/nav.hbs new file mode 100644 index 0000000000000..33dde0a660ff8 --- /dev/null +++ b/ui/app/templates/components/mfa/nav.hbs @@ -0,0 +1,12 @@ +
+ +
\ No newline at end of file diff --git a/ui/app/templates/vault/cluster/access/mfa/enforcements.hbs b/ui/app/templates/vault/cluster/access/mfa/enforcements.hbs new file mode 100644 index 0000000000000..cd32e175f7514 --- /dev/null +++ b/ui/app/templates/vault/cluster/access/mfa/enforcements.hbs @@ -0,0 +1,40 @@ + + +

+ Multi-factor Authentication +

+
+
+ + + + + + + New enforcement + + + + +{{#if this.model.meta.total}} + {{#each this.model as |item|}} + +
+
+
+ + {{item.name}} + +
+
+
+
+ {{/each}} +{{/if}} +{{#if (gt this.model.meta.lastPage 1)}} + +{{/if}} \ No newline at end of file diff --git a/ui/app/templates/vault/cluster/access/mfa/index.hbs b/ui/app/templates/vault/cluster/access/mfa/method/index.hbs similarity index 55% rename from ui/app/templates/vault/cluster/access/mfa/index.hbs rename to ui/app/templates/vault/cluster/access/mfa/method/index.hbs index 02d6a610f9885..58cc37ae4b3ce 100644 --- a/ui/app/templates/vault/cluster/access/mfa/index.hbs +++ b/ui/app/templates/vault/cluster/access/mfa/method/index.hbs @@ -1,9 +1,13 @@

- Multi-factor Authentication + {{this.model.type}}

-List view \ No newline at end of file + + + + +{{this.model.id}} \ No newline at end of file diff --git a/ui/app/templates/vault/cluster/access/mfa/methods.hbs b/ui/app/templates/vault/cluster/access/mfa/methods.hbs new file mode 100644 index 0000000000000..b9147019b2698 --- /dev/null +++ b/ui/app/templates/vault/cluster/access/mfa/methods.hbs @@ -0,0 +1,45 @@ + + +

+ Multi-factor Authentication +

+
+
+ + + + + + + New MFA method + + + + +{{#if this.model.meta.total}} + {{#each this.model as |item|}} + +
+
+
+ + + {{item.type}} + +
+ + {{item.id}} + +
+
+
+
+ {{/each}} +{{/if}} +{{#if (gt this.model.meta.lastPage 1)}} + +{{/if}} \ No newline at end of file diff --git a/ui/lib/core/icon-mappings.js b/ui/lib/core/icon-mappings.js index 021cbb30b7e83..3d11821f42e56 100644 --- a/ui/lib/core/icon-mappings.js +++ b/ui/lib/core/icon-mappings.js @@ -21,6 +21,8 @@ export const localIconMap = { radius: 'user', ssh: 'terminal-screen', totp: 'history', + duo: null, + pingid: null, transit: 'swap-horizontal', userpass: 'identity-user', stopwatch: 'clock', diff --git a/ui/public/duo.svg b/ui/public/duo.svg new file mode 100644 index 0000000000000..72a97e5d139ff --- /dev/null +++ b/ui/public/duo.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/ui/public/okta.svg b/ui/public/okta.svg new file mode 100644 index 0000000000000..6b6e8906e4759 --- /dev/null +++ b/ui/public/okta.svg @@ -0,0 +1,3 @@ + + + diff --git a/ui/public/pingid.svg b/ui/public/pingid.svg new file mode 100644 index 0000000000000..99b33fefc3dcb --- /dev/null +++ b/ui/public/pingid.svg @@ -0,0 +1,11 @@ + + + + + + + + + + +