mirror of
https://github.com/hashicorp/vault.git
synced 2025-08-25 16:41:08 +02:00
* UI: Move `wrapped_token` login functionality to route (#30465) * move token unwrap functionality to page component * update mfa test * remove wrapped_token logic from page component * more cleanup to relocate unwrap logic * move wrapped_token to route * move unwrap tests to acceptance * move mfa form back * add some padding * update mfa-form tests * get param from params * wait for auth form on back * run rests * UI: Add MFA support for SSO methods (#30489) * initial implementation of mfa validation for sso methods * update typescript interfaces * add stopgap changes to auth service * switch order backend is defined * update login form for tests even though it will be deleted * attempt to stabilize wrapped_query test * =update login form test why not * Update ui/app/components/auth/form/saml.ts Co-authored-by: lane-wetmore <lane.wetmore@hashicorp.com> --------- Co-authored-by: lane-wetmore <lane.wetmore@hashicorp.com> * Move CSP error to page component (#30492) * initial implementation of mfa validation for sso methods * update typescript interfaces * add stopgap changes to auth service * switch order backend is defined * update login form for tests even though it will be deleted * attempt to stabilize wrapped_query test * =update login form test why not * move csp error to page component * move csp error to page component * Move fetching unauthenticated mounts to the route (#30509) * rename namespace arg to namespaceQueryParam * move fetch mounts to route * add margin to sign in button spacing * update selectors for oidc provider test * add todo delete comments * fix arg typo in test * change method name * fix args handling tab click * remove tests that no longer relate to components functionality * add tests for preselectedAuthType functionality * move typescript interfaces, fix selector * add await * oops * move format method down, make private * move tab formatting to the route * move to page object * fix token unwrap aborting transition * not sure what that is doing there.. * add comments * rename to presetAuthType * use did-insert instead * UI: Implement `Auth::FormTemplate` (#30521) * replace Auth::LoginForm with Auth::FormTemplate * first round of test updates * return null if mounts object is empty * add comment and test for empty sys/internal/mounts data * more test updates * delete listing_visibility test, delete login-form component test * update divs to Hds::Card::Container * add overflow class * remove unused getters * move requesting stored auth type to page component * fix typo * Update ui/app/components/auth/form/oidc-jwt.ts make comment make more sense * small cleanup items, update imports * Delete old auth components (#30527) * delete old components * update codeowners * Update `with` query param functionality (#30537) * update path input to type=hidden * add test coverage * update page test * update auth route * delete login form * update ent test * consolidate logic in getter * add more comments * more comments.. * rename selector * refresh model as well * redirect for invalid query params * move unwrap to redirect * only redirect on invalid query params * add tests for query param * test selector updates * remove todos, update relevant ones with initials * add changelog --------- Co-authored-by: lane-wetmore <lane.wetmore@hashicorp.com>
153 lines
4.5 KiB
TypeScript
153 lines
4.5 KiB
TypeScript
/**
|
|
* Copyright (c) HashiCorp, Inc.
|
|
* SPDX-License-Identifier: BUSL-1.1
|
|
*/
|
|
|
|
import { click, fillIn, visit } from '@ember/test-helpers';
|
|
import VAULT_KEYS from 'vault/tests/helpers/vault-keys';
|
|
import { AUTH_FORM } from 'vault/tests/helpers/auth/auth-form-selectors';
|
|
import { GENERAL } from 'vault/tests/helpers/general-selectors';
|
|
import { Server } from 'miragejs';
|
|
|
|
import type { LoginFields } from 'vault/vault/auth/form';
|
|
|
|
export const { rootToken } = VAULT_KEYS;
|
|
|
|
// LOGOUT
|
|
export const logout = async () => {
|
|
// make sure we're always logged out and logged back in
|
|
await visit('/vault/logout');
|
|
// clear session storage to ensure we have a clean state
|
|
window.localStorage.clear();
|
|
return;
|
|
};
|
|
|
|
// LOGIN WITH TOKEN
|
|
export const login = async (token = rootToken) => {
|
|
// make sure we're always logged out and logged back in
|
|
await logout();
|
|
await visit('/vault/auth');
|
|
|
|
await fillIn(AUTH_FORM.selectMethod, 'token');
|
|
await fillIn(GENERAL.inputByAttr('token'), token);
|
|
return click(AUTH_FORM.login);
|
|
};
|
|
|
|
export const loginNs = async (ns: string, token = rootToken) => {
|
|
// make sure we're always logged out and logged back in
|
|
await logout();
|
|
await visit('/vault/auth');
|
|
|
|
await fillIn(GENERAL.inputByAttr('namespace'), ns);
|
|
|
|
await fillIn(AUTH_FORM.selectMethod, 'token');
|
|
await fillIn(GENERAL.inputByAttr('token'), token);
|
|
return click(AUTH_FORM.login);
|
|
};
|
|
|
|
// LOGIN WITH NON-TOKEN METHODS
|
|
export const loginMethod = async (
|
|
loginFields: LoginFields,
|
|
options: { authType?: string; toggleOptions?: boolean }
|
|
) => {
|
|
// make sure we're always logged out and logged back in
|
|
await logout();
|
|
const type = options?.authType || 'token';
|
|
|
|
await fillIn(AUTH_FORM.selectMethod, type);
|
|
|
|
await fillInLoginFields(loginFields, options);
|
|
return click(AUTH_FORM.login);
|
|
};
|
|
|
|
export const fillInLoginFields = async (loginFields: LoginFields, { toggleOptions = false } = {}) => {
|
|
if (toggleOptions) await click(AUTH_FORM.advancedSettings);
|
|
|
|
for (const [input, value] of Object.entries(loginFields)) {
|
|
if (value) {
|
|
await fillIn(GENERAL.inputByAttr(input), value);
|
|
}
|
|
}
|
|
};
|
|
|
|
// See AUTH_METHOD_MAP for how login data maps to method types,
|
|
// stubRequests are the requests made on submit for that method type
|
|
export const LOGIN_DATA = {
|
|
token: {
|
|
loginData: { token: 'mytoken' },
|
|
stubRequests: (server: Server, response: object) => server.get('/auth/token/lookup-self', () => response),
|
|
},
|
|
username: {
|
|
loginData: { username: 'matilda', password: 'password' },
|
|
stubRequests: (server: Server, path: string, response: object) =>
|
|
server.post(`/auth/${path}/login/matilda`, () => response),
|
|
},
|
|
github: {
|
|
loginData: { token: 'mysupersecuretoken' },
|
|
stubRequests: (server: Server, path: string, response: object) =>
|
|
server.post(`/auth/${path}/login`, () => response),
|
|
},
|
|
oidc: {
|
|
loginData: { role: 'some-dev' },
|
|
hasPopupWindow: true,
|
|
stubRequests: (server: Server, path: string, response: object) => {
|
|
server.get(`/auth/${path}/oidc/callback`, () => response);
|
|
server.post(`/auth/${path}/oidc/auth_url`, () => {
|
|
return { data: { auth_url: 'http://dev-foo-bar.com' } };
|
|
});
|
|
},
|
|
},
|
|
saml: {
|
|
loginData: { role: 'some-dev' },
|
|
hasPopupWindow: true,
|
|
stubRequests: (server: Server, path: string, response: object) => {
|
|
server.put(`/auth/${path}/token`, () => response);
|
|
server.put(`/auth/${path}/sso_service_url`, () => {
|
|
return { data: { sso_service_url: 'http://sso-url.hashicorp.com/service', token_poll_id: '1234' } };
|
|
});
|
|
},
|
|
},
|
|
};
|
|
|
|
// maps auth type to request data
|
|
export const AUTH_METHOD_MAP = [
|
|
{ authType: 'token', options: LOGIN_DATA.token },
|
|
{ authType: 'github', options: LOGIN_DATA.github },
|
|
|
|
// username and password methods
|
|
{ authType: 'userpass', options: LOGIN_DATA.username },
|
|
{ authType: 'ldap', options: LOGIN_DATA.username },
|
|
{ authType: 'okta', options: LOGIN_DATA.username },
|
|
{ authType: 'radius', options: LOGIN_DATA.username },
|
|
|
|
// oidc
|
|
{ authType: 'oidc', options: LOGIN_DATA.oidc },
|
|
{ authType: 'jwt', options: LOGIN_DATA.oidc },
|
|
|
|
// ENTERPRISE ONLY
|
|
{ authType: 'saml', options: LOGIN_DATA.saml },
|
|
];
|
|
|
|
export const VISIBLE_MOUNTS = {
|
|
'userpass/': {
|
|
description: '',
|
|
options: {},
|
|
type: 'userpass',
|
|
},
|
|
'userpass2/': {
|
|
description: '',
|
|
options: {},
|
|
type: 'userpass',
|
|
},
|
|
'my-oidc/': {
|
|
description: '',
|
|
options: {},
|
|
type: 'oidc',
|
|
},
|
|
'token/': {
|
|
description: 'token based credentials',
|
|
options: null,
|
|
type: 'token',
|
|
},
|
|
};
|