@atlasauth/angular 0.11.0 → 0.13.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +8 -0
- package/dist/esm2022/lib/atlas.ui.mjs +3 -1
- package/dist/esm2022/lib/components/attempt-flow.component.mjs +5 -2
- package/dist/esm2022/lib/components/flow-controller.mjs +37 -2
- package/dist/esm2022/lib/components/manage-ciba.component.mjs +150 -0
- package/dist/esm2022/lib/components/sign-in.component.mjs +58 -5
- package/dist/esm2022/lib/components/user-profile.component.mjs +8 -2
- package/dist/esm2022/lib/i18n.mjs +4 -1
- package/dist/esm2022/lib/provide-atlas.mjs +4 -3
- package/dist/esm2022/lib/version.mjs +2 -2
- package/dist/esm2022/public-api.mjs +2 -1
- package/dist/fesm2022/atlasauth-angular.mjs +253 -8
- package/dist/fesm2022/atlasauth-angular.mjs.map +1 -1
- package/dist/lib/atlas.ui.d.ts +2 -1
- package/dist/lib/components/attempt-flow.component.d.ts +1 -0
- package/dist/lib/components/flow-controller.d.ts +17 -1
- package/dist/lib/components/manage-ciba.component.d.ts +28 -0
- package/dist/lib/components/sign-in.component.d.ts +5 -0
- package/dist/lib/provide-atlas.d.ts +3 -2
- package/dist/lib/version.d.ts +1 -1
- package/dist/public-api.d.ts +1 -0
- package/package.json +4 -4
|
@@ -21,6 +21,7 @@ export { UserButtonComponent } from './lib/components/user-button.component';
|
|
|
21
21
|
export { OrganizationSwitcherComponent } from './lib/components/organization-switcher.component';
|
|
22
22
|
export { UserProfileComponent } from './lib/components/user-profile.component';
|
|
23
23
|
export { OrganizationProfileComponent } from './lib/components/organization-profile.component';
|
|
24
|
+
export { ManageCibaComponent } from './lib/components/manage-ciba.component';
|
|
24
25
|
export { OrganizationAuditLogComponent } from './lib/components/organization-audit-log.component';
|
|
25
26
|
export { AtlasOrganizationAuditLog } from './lib/components/organization-audit-log';
|
|
26
27
|
export { ImpersonationBannerComponent } from './lib/components/impersonation-banner.component';
|
|
@@ -45,4 +46,4 @@ export { SignOutError } from '@atlasauth/js';
|
|
|
45
46
|
// `onSignOut({ reason })` event types + the `atlas:signout` window event; this SDK's version.
|
|
46
47
|
export { SIGN_OUT_EVENT, onAtlasSignOut } from '@atlasauth/js';
|
|
47
48
|
export { ATLAS_ANGULAR_SDK, ATLAS_ANGULAR_VERSION } from './lib/version';
|
|
48
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
49
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHVibGljLWFwaS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9wdWJsaWMtYXBpLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7R0FHRztBQUVILHFCQUFxQjtBQUNyQixPQUFPLEVBQUUsYUFBYSxFQUFxQixNQUFNLG9CQUFvQixDQUFDO0FBQ3RFLE9BQU8sRUFBRSxZQUFZLEVBQUUsV0FBVyxFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFFaEUsc0RBQXNEO0FBQ3RELE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUVuRCxxREFBcUQ7QUFDckQsT0FBTyxFQUFFLHNCQUFzQixFQUFFLE1BQU0sc0NBQXNDLENBQUM7QUFDOUUsT0FBTyxFQUFFLHVCQUF1QixFQUFFLE1BQU0sdUNBQXVDLENBQUM7QUFDaEYsT0FBTyxFQUFFLHFCQUFxQixFQUFFLE1BQU0sb0NBQW9DLENBQUM7QUFDM0UsT0FBTyxFQUFFLG9CQUFvQixFQUFFLE1BQU0sbUNBQW1DLENBQUM7QUFDekUsT0FBTyxFQUFFLHFCQUFxQixFQUFFLE1BQU0sb0NBQW9DLENBQUM7QUFDM0UsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sdUNBQXVDLENBQUM7QUFFM0UsYUFBYTtBQUNiLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxvQ0FBb0MsQ0FBQztBQUNyRSxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sb0NBQW9DLENBQUM7QUFDckUsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sd0NBQXdDLENBQUM7QUFDN0UsT0FBTyxFQUFFLDZCQUE2QixFQUFFLE1BQU0sa0RBQWtELENBQUM7QUFDakcsT0FBTyxFQUFFLG9CQUFvQixFQUFFLE1BQU0seUNBQXlDLENBQUM7QUFDL0UsT0FBTyxFQUFFLDRCQUE0QixFQUFFLE1BQU0saURBQWlELENBQUM7QUFDL0YsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sd0NBQXdDLENBQUM7QUFDN0UsT0FBTyxFQUFFLDZCQUE2QixFQUFFLE1BQU0sbURBQW1ELENBQUM7QUFDbEcsT0FBTyxFQUFFLHlCQUF5QixFQUFFLE1BQU0seUNBQXlDLENBQUM7QUFFcEYsT0FBTyxFQUFFLDRCQUE0QixFQUFFLE1BQU0saURBQWlELENBQUM7QUFDL0YsT0FBTyxFQUFFLG9CQUFvQixFQUFFLE1BQU0seUNBQXlDLENBQUM7QUFDL0UsT0FBTyxFQUNMLG1CQUFtQixHQUVwQixNQUFNLHlDQUF5QyxDQUFDO0FBQ2pELE9BQU8sRUFBRSx5QkFBeUIsRUFBRSxNQUFNLHlDQUF5QyxDQUFDO0FBQ3BGLDZHQUE2RztBQUM3RyxPQUFPLEVBQUUsc0JBQXNCLEVBQUUseUJBQXlCLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSw4QkFBOEIsQ0FBQztBQUN0SCxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSxrQ0FBa0MsQ0FBQztBQUN2RSxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFFMUMsZUFBZTtBQUNmLE9BQU8sRUFDTCxVQUFVLEVBQ1YsZUFBZSxHQUVoQixNQUFNLDBCQUEwQixDQUFDO0FBRWxDLDZEQUE2RDtBQUM3RCxjQUFjLGtCQUFrQixDQUFDO0FBQ2pDLGNBQWMsWUFBWSxDQUFDO0FBQzNCLGNBQWMsZUFBZSxDQUFDO0FBQzlCLGNBQWMsYUFBYSxDQUFDO0FBQzVCLGNBQWMsWUFBWSxDQUFDO0FBZ0IzQiwwRUFBMEU7QUFDMUUscUVBQXFFO0FBQ3JFLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFFN0MsOEZBQThGO0FBQzlGLE9BQU8sRUFBRSxjQUFjLEVBQUUsY0FBYyxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBRS9ELE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxxQkFBcUIsRUFBRSxNQUFNLGVBQWUsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogYEBhdGxhc2F1dGgvYW5ndWxhcmAg4oCUIHRoZSBvZmZpY2lhbCBBbmd1bGFyIFNESyBmb3IgQXRsYXMsIHRoZSBBbmd1bGFyIHBlZXIgb2ZcbiAqIGBAYXRsYXNhdXRoL3JlYWN0YC4gUHVibGljIHN1cmZhY2UuXG4gKi9cblxuLy8gQ29uZmlndXJhdGlvbiArIERJXG5leHBvcnQgeyBBVExBU19PUFRJT05TLCB0eXBlIEF0bGFzT3B0aW9ucyB9IGZyb20gJy4vbGliL2F0bGFzLmNvbmZpZyc7XG5leHBvcnQgeyBwcm92aWRlQXRsYXMsIEF0bGFzTW9kdWxlIH0gZnJvbSAnLi9saWIvcHJvdmlkZS1hdGxhcyc7XG5cbi8vIENvcmUgc2VydmljZSAodGhlIEF0bGFzUHJvdmlkZXIgKyBob29rcyBlcXVpdmFsZW50KVxuZXhwb3J0IHsgQXRsYXNTZXJ2aWNlIH0gZnJvbSAnLi9saWIvYXRsYXMuc2VydmljZSc7XG5cbi8vIFN0cnVjdHVyYWwgZGlyZWN0aXZlcyArIHRoZSB0aGVtaW5nIGhvc3QgZGlyZWN0aXZlXG5leHBvcnQgeyBBdGxhc1NpZ25lZEluRGlyZWN0aXZlIH0gZnJvbSAnLi9saWIvZGlyZWN0aXZlcy9zaWduZWQtaW4uZGlyZWN0aXZlJztcbmV4cG9ydCB7IEF0bGFzU2lnbmVkT3V0RGlyZWN0aXZlIH0gZnJvbSAnLi9saWIvZGlyZWN0aXZlcy9zaWduZWQtb3V0LmRpcmVjdGl2ZSc7XG5leHBvcnQgeyBBdGxhc0xvYWRpbmdEaXJlY3RpdmUgfSBmcm9tICcuL2xpYi9kaXJlY3RpdmVzL2xvYWRpbmcuZGlyZWN0aXZlJztcbmV4cG9ydCB7IEF0bGFzTG9hZGVkRGlyZWN0aXZlIH0gZnJvbSAnLi9saWIvZGlyZWN0aXZlcy9sb2FkZWQuZGlyZWN0aXZlJztcbmV4cG9ydCB7IEF0bGFzUHJvdGVjdERpcmVjdGl2ZSB9IGZyb20gJy4vbGliL2RpcmVjdGl2ZXMvcHJvdGVjdC5kaXJlY3RpdmUnO1xuZXhwb3J0IHsgQXRsYXNSb290RGlyZWN0aXZlIH0gZnJvbSAnLi9saWIvZGlyZWN0aXZlcy9hdGxhcy1yb290LmRpcmVjdGl2ZSc7XG5cbi8vIENvbXBvbmVudHNcbmV4cG9ydCB7IFNpZ25JbkNvbXBvbmVudCB9IGZyb20gJy4vbGliL2NvbXBvbmVudHMvc2lnbi1pbi5jb21wb25lbnQnO1xuZXhwb3J0IHsgU2lnblVwQ29tcG9uZW50IH0gZnJvbSAnLi9saWIvY29tcG9uZW50cy9zaWduLXVwLmNvbXBvbmVudCc7XG5leHBvcnQgeyBVc2VyQnV0dG9uQ29tcG9uZW50IH0gZnJvbSAnLi9saWIvY29tcG9uZW50cy91c2VyLWJ1dHRvbi5jb21wb25lbnQnO1xuZXhwb3J0IHsgT3JnYW5pemF0aW9uU3dpdGNoZXJDb21wb25lbnQgfSBmcm9tICcuL2xpYi9jb21wb25lbnRzL29yZ2FuaXphdGlvbi1zd2l0Y2hlci5jb21wb25lbnQnO1xuZXhwb3J0IHsgVXNlclByb2ZpbGVDb21wb25lbnQgfSBmcm9tICcuL2xpYi9jb21wb25lbnRzL3VzZXItcHJvZmlsZS5jb21wb25lbnQnO1xuZXhwb3J0IHsgT3JnYW5pemF0aW9uUHJvZmlsZUNvbXBvbmVudCB9IGZyb20gJy4vbGliL2NvbXBvbmVudHMvb3JnYW5pemF0aW9uLXByb2ZpbGUuY29tcG9uZW50JztcbmV4cG9ydCB7IE1hbmFnZUNpYmFDb21wb25lbnQgfSBmcm9tICcuL2xpYi9jb21wb25lbnRzL21hbmFnZS1jaWJhLmNvbXBvbmVudCc7XG5leHBvcnQgeyBPcmdhbml6YXRpb25BdWRpdExvZ0NvbXBvbmVudCB9IGZyb20gJy4vbGliL2NvbXBvbmVudHMvb3JnYW5pemF0aW9uLWF1ZGl0LWxvZy5jb21wb25lbnQnO1xuZXhwb3J0IHsgQXRsYXNPcmdhbml6YXRpb25BdWRpdExvZyB9IGZyb20gJy4vbGliL2NvbXBvbmVudHMvb3JnYW5pemF0aW9uLWF1ZGl0LWxvZyc7XG5leHBvcnQgdHlwZSB7IE9yZ2FuaXphdGlvbkF1ZGl0TG9nRW50cnksIE9yZ2FuaXphdGlvbkF1ZGl0TG9nU3RhdGUsIE9yZ2FuaXphdGlvbkF1ZGl0TG9nT3B0aW9ucyB9IGZyb20gJ0BhdGxhc2F1dGgvanMnO1xuZXhwb3J0IHsgSW1wZXJzb25hdGlvbkJhbm5lckNvbXBvbmVudCB9IGZyb20gJy4vbGliL2NvbXBvbmVudHMvaW1wZXJzb25hdGlvbi1iYW5uZXIuY29tcG9uZW50JztcbmV4cG9ydCB7IEF0dGVtcHRGbG93Q29tcG9uZW50IH0gZnJvbSAnLi9saWIvY29tcG9uZW50cy9hdHRlbXB0LWZsb3cuY29tcG9uZW50JztcbmV4cG9ydCB7XG4gIFNpZ25VcEZvcm1Db21wb25lbnQsXG4gIHR5cGUgU2lnblVwRm9ybVN1Ym1pdCxcbn0gZnJvbSAnLi9saWIvY29tcG9uZW50cy9zaWduLXVwLWZvcm0uY29tcG9uZW50JztcbmV4cG9ydCB7IEF0bGFzQ2FwdGNoYVNsb3REaXJlY3RpdmUgfSBmcm9tICcuL2xpYi9kaXJlY3RpdmVzL2NhcHRjaGEtc2xvdC5kaXJlY3RpdmUnO1xuLy8gUG9saWN5IGFjY2VwdGFuY2UgKHRlcm1zLCBwcml2YWN5LCBhbnkgcG9saWN5KTogY29uc2VudCBibG9jayAvIGNsaWNrd3JhcCBob3N0LCBzaWduLWluIHN0ZXAsIGluLWFwcCBnYXRlLlxuZXhwb3J0IHsgQXRsYXNQb2xpY2llc0RpcmVjdGl2ZSwgUG9saWN5QWNjZXB0U3RlcENvbXBvbmVudCwgUG9saWN5R2F0ZUNvbXBvbmVudCB9IGZyb20gJy4vbGliL2NvbXBvbmVudHMvcG9saWN5LWhvc3QnO1xuZXhwb3J0IHsgQXRsYXNGbG93Q29udHJvbGxlciB9IGZyb20gJy4vbGliL2NvbXBvbmVudHMvZmxvdy1jb250cm9sbGVyJztcbmV4cG9ydCB7IEFUTEFTX1VJIH0gZnJvbSAnLi9saWIvYXRsYXMudWknO1xuXG4vLyBSb3V0ZSBndWFyZHNcbmV4cG9ydCB7XG4gIGF0bGFzR3VhcmQsXG4gIGF0bGFzQ2hpbGRHdWFyZCxcbiAgdHlwZSBBdGxhc0d1YXJkT3B0aW9ucyxcbn0gZnJvbSAnLi9saWIvZ3VhcmRzL2F0bGFzLmd1YXJkJztcblxuLy8gVGhlbWluZywgaTE4biwgYXV0aG9yaXphdGlvbiwgZGF0YSBzaGFwZXMsIEZBUEkgcmUtZXhwb3J0c1xuZXhwb3J0ICogZnJvbSAnLi9saWIvYXBwZWFyYW5jZSc7XG5leHBvcnQgKiBmcm9tICcuL2xpYi9pMThuJztcbmV4cG9ydCAqIGZyb20gJy4vbGliL3Byb3RlY3QnO1xuZXhwb3J0ICogZnJvbSAnLi9saWIvdHlwZXMnO1xuZXhwb3J0ICogZnJvbSAnLi9saWIvZmFwaSc7XG5cbi8vIFRoZSBpbnN0YW5jZSdzIHB1YmxpYyBzaWduLWluIC8gc2lnbi11cCBzZXR0aW5ncyB0aGUgcHJlYnVpbHQgZm9ybXMgcmVhZFxuLy8gKGBBdGxhc0Zsb3dDb250cm9sbGVyLnNldHRpbmdzYCksIGFuZCB0aGUgY2FwdGNoYSB0eXBlcyB0aGV5IHJlbmRlci5cbmV4cG9ydCB0eXBlIHtcbiAgSW5zdGFuY2VTZXR0aW5ncyxcbiAgUHVibGljU2lnblVwRmllbGQsXG4gIENhcHRjaGFDb250cm9sbGVyLFxuICBDYXB0Y2hhRmxvd0tleSxcbiAgQ2FwdGNoYVdpZGdldE1vZGUsXG4gIEZsb3dDYXB0Y2hhLFxuICBFbWFpbERlbGl2ZXJ5LFxuICBTaWduT3V0T3B0aW9ucyxcbiAgU2lnbk91dFJlc3VsdCxcbn0gZnJvbSAnQGF0bGFzYXV0aC9qcyc7XG5cbi8vIGBBdGxhc1NlcnZpY2Uuc2lnbk91dCgpYCByZXNvbHZlcyBhIGBTaWduT3V0UmVzdWx0YDsgYHsgc3RyaWN0OiB0cnVlIH1gXG4vLyByZWplY3RzIHdpdGggYSBgU2lnbk91dEVycm9yYCB3aGVuIHRoZSByZXZva2Ugd2FzIG5ldmVyIGNvbmZpcm1lZC5cbmV4cG9ydCB7IFNpZ25PdXRFcnJvciB9IGZyb20gJ0BhdGxhc2F1dGgvanMnO1xuXG4vLyBgb25TaWduT3V0KHsgcmVhc29uIH0pYCBldmVudCB0eXBlcyArIHRoZSBgYXRsYXM6c2lnbm91dGAgd2luZG93IGV2ZW50OyB0aGlzIFNESydzIHZlcnNpb24uXG5leHBvcnQgeyBTSUdOX09VVF9FVkVOVCwgb25BdGxhc1NpZ25PdXQgfSBmcm9tICdAYXRsYXNhdXRoL2pzJztcbmV4cG9ydCB0eXBlIHsgU2lnbk91dEV2ZW50LCBTaWduT3V0UmVhc29uIH0gZnJvbSAnQGF0bGFzYXV0aC9qcyc7XG5leHBvcnQgeyBBVExBU19BTkdVTEFSX1NESywgQVRMQVNfQU5HVUxBUl9WRVJTSU9OIH0gZnJvbSAnLi9saWIvdmVyc2lvbic7XG4iXX0=
|
|
@@ -4,7 +4,7 @@ import { isPlatformBrowser, DOCUMENT } from '@angular/common';
|
|
|
4
4
|
import { toSignal } from '@angular/core/rxjs-interop';
|
|
5
5
|
import { BehaviorSubject, Subject, combineLatest, firstValueFrom } from 'rxjs';
|
|
6
6
|
import { map, distinctUntilChanged, filter, take } from 'rxjs/operators';
|
|
7
|
-
import { createOrganizationAuditLog, POLICY_STRINGS, TokenCache, SignOutNotifier, resolveFrontendApi, withDevBrowser, catalogLocale, configureReferralCapture, FapiClient, SignOutGuard, localizedErrorMessage, reauthenticate, getTemplateToken, getProviderToken, signOutReasonFromClient, readRedirectResult, completeOAuthPopupLanding, mapOAuthPopupPayload, stripRedirectParams, closeOAuthPopupAfterSignIn, SDK_HEADER, sdkHeaderValue, reportSdkAdvisory, readExpiry, msUntilRefresh, policyTranslator, injectPolicyStyles, mountPolicyClickwrap, mountPolicyConsent, controllerForPending, mountPolicyAcceptStep, joinTitles, formatPolicyDate, PolicyGateController, groupSetupKey, enrollmentSubmitKey, nextStep, awaitingSignUpLink, canDownloadRecoveryCodes, copyRecoveryCodes, downloadRecoveryCodes, createCaptchaController, atlasCaptchaLabels, PolicyAcceptanceController, flowFromPending, initialFlow, createMfaEnrollment, mfaChoicesFrom, fetchInstanceSettings, fetchLastSignInMethod, offeredFirstFactors, prepareFactor, signInCaptchaOptions, flowNeedsCaptcha, planFirstFactor, advanceWithCaptcha, loadPolicies, createSignUp, prepareSecondFactorCode, resendSignUpVerification, createPasskeySignUp, finishPasskeySignUp, pendingRecoveryCodes, acknowledgeRecoveryCodes, shouldKeepPolling, pollAttempt, lastUsedMethodLabel, signUp,
|
|
7
|
+
import { createOrganizationAuditLog, POLICY_STRINGS, TokenCache, SignOutNotifier, resolveFrontendApi, withDevBrowser, catalogLocale, configureReferralCapture, FapiClient, SignOutGuard, localizedErrorMessage, reauthenticate, getTemplateToken, getProviderToken, signOutReasonFromClient, readRedirectResult, completeOAuthPopupLanding, mapOAuthPopupPayload, stripRedirectParams, closeOAuthPopupAfterSignIn, SDK_HEADER, sdkHeaderValue, reportSdkAdvisory, readExpiry, msUntilRefresh, policyTranslator, injectPolicyStyles, mountPolicyClickwrap, mountPolicyConsent, controllerForPending, mountPolicyAcceptStep, joinTitles, formatPolicyDate, PolicyGateController, groupSetupKey, enrollmentSubmitKey, nextStep, awaitingSignUpLink, canDownloadRecoveryCodes, copyRecoveryCodes, downloadRecoveryCodes, createCaptchaController, atlasCaptchaLabels, PolicyAcceptanceController, flowFromPending, initialFlow, createMfaEnrollment, createPasskeySignInController, startSignInWithAtlas, mfaChoicesFrom, fetchInstanceSettings, fetchLastSignInMethod, offeredFirstFactors, prepareFactor, signInCaptchaOptions, flowNeedsCaptcha, planFirstFactor, advanceWithCaptcha, loadPolicies, createSignUp, prepareSecondFactorCode, resendSignUpVerification, createPasskeySignUp, finishPasskeySignUp, pendingRecoveryCodes, acknowledgeRecoveryCodes, shouldKeepPolling, pollAttempt, lastUsedMethodLabel, signUp, passkeysSupported, confirmPolicies, awaitingPasskey, listCibaRequests, getCibaPin, decideCibaRequest, setCibaPin, clearCibaPin, OrganizationProfileController, describeAuditAction, actorFromClaims } from '@atlasauth/js';
|
|
8
8
|
export { FapiClient, SIGN_OUT_EVENT, SignOutError, advance, flowFromPending, getProviderToken, initialFlow, onAtlasSignOut, pollAttempt, prepareFactor, requestForStep, shouldKeepPolling } from '@atlasauth/js';
|
|
9
9
|
import { evaluate } from '@atlasauth/authz';
|
|
10
10
|
export { evaluate, hasFromClaims } from '@atlasauth/authz';
|
|
@@ -204,12 +204,15 @@ const EN_US = {
|
|
|
204
204
|
'signIn.signUpLink': 'Sign up',
|
|
205
205
|
'signIn.orDivider': 'or',
|
|
206
206
|
'signIn.socialButton': 'Continue with {provider}',
|
|
207
|
+
'signIn.continueWithAtlas': 'Continue with Atlas',
|
|
207
208
|
'signIn.emailCodeLabel': 'Verification code',
|
|
208
209
|
'signIn.useEmailCode': 'Email me a code',
|
|
209
210
|
'signIn.codeSentTo': 'We sent a code to {email}. Enter it below.',
|
|
210
211
|
'signIn.resendCode': 'Resend code',
|
|
211
212
|
'signIn.sending': 'Sending…',
|
|
212
213
|
'signIn.emailCodeOption': 'Email me a code instead',
|
|
214
|
+
'signIn.passkeyButton': 'Sign in with a passkey',
|
|
215
|
+
'signIn.passkeyCancelled': "Passkey sign-in didn't finish. Try again, or use another way to sign in.",
|
|
213
216
|
'signIn.magicLinkSent': 'Check your email for a sign-in link.',
|
|
214
217
|
'signIn.signedIn': 'You\'re signed in.',
|
|
215
218
|
'signIn.sessionNotKept': 'You signed in, but this browser didn\'t keep the session. If it blocks third-party cookies, allow cookies for this site and try again.',
|
|
@@ -389,7 +392,7 @@ function withFallback(locale) {
|
|
|
389
392
|
}
|
|
390
393
|
|
|
391
394
|
/** This package's version, sent as `X-Atlas-SDK` (kept in step with package.json by a test). */
|
|
392
|
-
const ATLAS_ANGULAR_VERSION = '0.
|
|
395
|
+
const ATLAS_ANGULAR_VERSION = '0.13.0';
|
|
393
396
|
const ATLAS_ANGULAR_SDK = { name: '@atlasauth/angular', version: ATLAS_ANGULAR_VERSION };
|
|
394
397
|
|
|
395
398
|
/**
|
|
@@ -1639,7 +1642,8 @@ class AttemptFlowComponent {
|
|
|
1639
1642
|
const step = this.step();
|
|
1640
1643
|
switch (step.kind) {
|
|
1641
1644
|
case 'collect_identifier':
|
|
1642
|
-
|
|
1645
|
+
// `webauthn`: saved passkeys appear in this field's autofill while <atlas-sign-in> holds a conditional request.
|
|
1646
|
+
return [{ kind: 'input', name: 'identifier', labelKey: 'signIn.identifierLabel', type: 'email', autocomplete: 'username webauthn' }];
|
|
1643
1647
|
case 'collect_first_factor': {
|
|
1644
1648
|
if (this.preparedFactor === 'email_code') {
|
|
1645
1649
|
return [{ kind: 'input', name: 'code', labelKey: 'signIn.emailCodeLabel', type: 'text' }];
|
|
@@ -1805,6 +1809,7 @@ class AttemptFlowComponent {
|
|
|
1805
1809
|
[class]="cls('formFieldInput', 'atlas-input')"
|
|
1806
1810
|
[type]="f.type"
|
|
1807
1811
|
[attr.name]="f.name"
|
|
1812
|
+
[attr.autocomplete]="f.autocomplete ?? null"
|
|
1808
1813
|
[value]="values[f.name] ?? ''"
|
|
1809
1814
|
(input)="setValue(f.name, $any($event.target).value)"
|
|
1810
1815
|
/>
|
|
@@ -2016,6 +2021,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImpo
|
|
|
2016
2021
|
[class]="cls('formFieldInput', 'atlas-input')"
|
|
2017
2022
|
[type]="f.type"
|
|
2018
2023
|
[attr.name]="f.name"
|
|
2024
|
+
[attr.autocomplete]="f.autocomplete ?? null"
|
|
2019
2025
|
[value]="values[f.name] ?? ''"
|
|
2020
2026
|
(input)="setValue(f.name, $any($event.target).value)"
|
|
2021
2027
|
/>
|
|
@@ -2341,6 +2347,13 @@ class AtlasFlowController {
|
|
|
2341
2347
|
* {@link create} sends their acceptances and reloads them after a refusal.
|
|
2342
2348
|
*/
|
|
2343
2349
|
policies = new PolicyAcceptanceController([]);
|
|
2350
|
+
/**
|
|
2351
|
+
* Passkey sign-in (the "Sign in with a passkey" button and passkey autofill on
|
|
2352
|
+
* the identifier field). The outcome goes through the same completion as every sign-in.
|
|
2353
|
+
*/
|
|
2354
|
+
passkey;
|
|
2355
|
+
/** Whether this browser can run WebAuthn; `<atlas-sign-in>` sets it after it is created in a browser. */
|
|
2356
|
+
passkeySupported = signal(false);
|
|
2344
2357
|
pollTimer = null;
|
|
2345
2358
|
identifier = '';
|
|
2346
2359
|
constructor(client, reload, pending,
|
|
@@ -2355,9 +2368,36 @@ class AtlasFlowController {
|
|
|
2355
2368
|
this.enrollment = createMfaEnrollment(this.client, () => this.mfaChoices());
|
|
2356
2369
|
this.enrollmentState = signal(this.enrollment.state);
|
|
2357
2370
|
this.enrollment.subscribe((next) => this.enrollmentState.set(next));
|
|
2371
|
+
this.passkey = createPasskeySignInController({
|
|
2372
|
+
client: this.client,
|
|
2373
|
+
onStart: () => this.state.update((current) => ({ ...current, busy: true, errors: [] })),
|
|
2374
|
+
onResult: (next) => this.finish(next),
|
|
2375
|
+
captcha: () => this.captcha,
|
|
2376
|
+
cancelledMessage: () => this.t('signIn.passkeyCancelled'),
|
|
2377
|
+
});
|
|
2358
2378
|
this.syncCaptcha();
|
|
2359
2379
|
this.syncEnrollment();
|
|
2360
2380
|
}
|
|
2381
|
+
/** Why "Continue with Atlas" could not start (the server's message); null otherwise. */
|
|
2382
|
+
signInWithAtlasError = signal(null);
|
|
2383
|
+
/**
|
|
2384
|
+
* "Continue with Atlas" (when `settings().signInWithAtlas` is set): starts the
|
|
2385
|
+
* SSO sign-in and sends the browser to Atlas.
|
|
2386
|
+
*/
|
|
2387
|
+
async signInWithAtlas(connectionId) {
|
|
2388
|
+
if (typeof window === 'undefined')
|
|
2389
|
+
return;
|
|
2390
|
+
this.signInWithAtlasError.set(null);
|
|
2391
|
+
const started = await startSignInWithAtlas(this.client, connectionId, window.location.href);
|
|
2392
|
+
if ('url' in started)
|
|
2393
|
+
window.location.assign(started.url);
|
|
2394
|
+
else
|
|
2395
|
+
this.signInWithAtlasError.set(started.error);
|
|
2396
|
+
}
|
|
2397
|
+
/** "Sign in with a passkey" is offered: the first step, the instance turned passkey sign-in on, and the browser can. */
|
|
2398
|
+
passkeyOffered() {
|
|
2399
|
+
return this.passkeySupported() && !this.state().attempt && this.settings()?.passkeySignIn === true;
|
|
2400
|
+
}
|
|
2361
2401
|
/** What the app lets the MFA steps offer (from {@link settings}). */
|
|
2362
2402
|
mfaChoices() {
|
|
2363
2403
|
return mfaChoicesFrom(this.settings()?.account);
|
|
@@ -2632,6 +2672,7 @@ class AtlasFlowController {
|
|
|
2632
2672
|
}
|
|
2633
2673
|
/** Release the poll timer and the captcha widgets — call from the component's `ngOnDestroy`. */
|
|
2634
2674
|
destroy() {
|
|
2675
|
+
this.passkey.stopAutofill();
|
|
2635
2676
|
this.stopPolling();
|
|
2636
2677
|
this.captcha.destroy();
|
|
2637
2678
|
this.signUpCaptcha.destroy();
|
|
@@ -2667,6 +2708,12 @@ class SignInComponent {
|
|
|
2667
2708
|
return null;
|
|
2668
2709
|
return lastUsedMethodLabel(this.flow.lastMethod(), (key) => this.t(key));
|
|
2669
2710
|
}
|
|
2711
|
+
/** The "Sign in with Atlas" connection, on the first step, when the instance has it on. */
|
|
2712
|
+
atlasConnection() {
|
|
2713
|
+
if (this.flow.state().attempt || this.flow.recoveryCodes())
|
|
2714
|
+
return null;
|
|
2715
|
+
return this.flow.settings()?.signInWithAtlas?.connectionId ?? null;
|
|
2716
|
+
}
|
|
2670
2717
|
signUpHref() {
|
|
2671
2718
|
if (this.signUpUrl === null)
|
|
2672
2719
|
return null;
|
|
@@ -2686,7 +2733,16 @@ class SignInComponent {
|
|
|
2686
2733
|
flow = new AtlasFlowController(this.atlas.createFapiClient(), () => this.atlas.reload(),
|
|
2687
2734
|
// Resume mid-flow if an OAuth redirect came back owing a second factor.
|
|
2688
2735
|
this.atlas.pendingAttempt, (key) => translate(this.atlas.localization, key));
|
|
2736
|
+
// Passkey autofill runs while the first step offers passkeys (a computed, so it re-arms only when that changes).
|
|
2737
|
+
passkeyOffered = computed(() => this.flow.passkeyOffered());
|
|
2738
|
+
passkeyAutofill = effect(() => (this.passkeyOffered() ? this.flow.passkey.armAutofill() : this.flow.passkey.stopAutofill()));
|
|
2739
|
+
submitIdentifier(values) {
|
|
2740
|
+
this.flow.passkey.stopAutofill();
|
|
2741
|
+
void this.flow.submit(values);
|
|
2742
|
+
}
|
|
2689
2743
|
ngOnInit() {
|
|
2744
|
+
if (typeof window !== 'undefined')
|
|
2745
|
+
this.flow.passkeySupported.set(passkeysSupported());
|
|
2690
2746
|
// If seeded from a pending attempt that is already pollable, start polling.
|
|
2691
2747
|
this.flow.syncPolling();
|
|
2692
2748
|
// §5 the instance's captcha settings (switching captcha on in the dashboard
|
|
@@ -2705,6 +2761,14 @@ class SignInComponent {
|
|
|
2705
2761
|
{{ t('signIn.lastUsed') }}: {{ label }}
|
|
2706
2762
|
</p>
|
|
2707
2763
|
}
|
|
2764
|
+
@if (atlasConnection(); as connectionId) {
|
|
2765
|
+
<button type="button" class="atlas-social-button" data-atlas-provider="atlas" (click)="flow.signInWithAtlas(connectionId)">
|
|
2766
|
+
{{ t('signIn.continueWithAtlas') }}
|
|
2767
|
+
</button>
|
|
2768
|
+
@if (flow.signInWithAtlasError(); as message) {
|
|
2769
|
+
<p class="atlas-error" role="alert">{{ message }}</p>
|
|
2770
|
+
}
|
|
2771
|
+
}
|
|
2708
2772
|
@if (flow.recoveryCodes(); as codes) {
|
|
2709
2773
|
<atlas-recovery-codes [codes]="codes" [busy]="flow.state().busy" (saved)="flow.saveRecoveryCodes()"></atlas-recovery-codes>
|
|
2710
2774
|
} @else {
|
|
@@ -2719,7 +2783,7 @@ class SignInComponent {
|
|
|
2719
2783
|
[preparedFactor]="flow.preparedFactor()"
|
|
2720
2784
|
[offerEmailSecondFactor]="flow.settings()?.account?.emailSecondFactor === true"
|
|
2721
2785
|
[emailedSecondFactor]="flow.emailSecondFactor()"
|
|
2722
|
-
(submitFlow)="
|
|
2786
|
+
(submitFlow)="submitIdentifier($event)"
|
|
2723
2787
|
(chooseFactor)="flow.prepare($event)"
|
|
2724
2788
|
[offerSmsSecondFactor]="flow.settings() !== null && flow.mfaChoices().sms"
|
|
2725
2789
|
[textedSecondFactor]="flow.smsSecondFactor()"
|
|
@@ -2730,6 +2794,17 @@ class SignInComponent {
|
|
|
2730
2794
|
(policyDeclined)="flow.declinePolicy($event)"
|
|
2731
2795
|
></atlas-attempt-flow>
|
|
2732
2796
|
}
|
|
2797
|
+
@if (flow.passkeyOffered() && !flow.recoveryCodes()) {
|
|
2798
|
+
<button
|
|
2799
|
+
type="button"
|
|
2800
|
+
class="atlas-social-button atlas-passkey-button"
|
|
2801
|
+
data-atlas-passkey-sign-in=""
|
|
2802
|
+
[disabled]="flow.state().busy"
|
|
2803
|
+
(click)="flow.passkey.signIn()"
|
|
2804
|
+
>
|
|
2805
|
+
{{ t('signIn.passkeyButton') }}
|
|
2806
|
+
</button>
|
|
2807
|
+
}
|
|
2733
2808
|
@if (flow.state().attempt?.status !== 'complete' && signUpHref(); as href) {
|
|
2734
2809
|
<p class="atlas-footer" data-atlas-sign-up-prompt="">
|
|
2735
2810
|
{{ t('signIn.noAccount') }} <a class="atlas-link" [href]="href">{{ t('signIn.signUpLink') }}</a>
|
|
@@ -2750,6 +2825,14 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImpo
|
|
|
2750
2825
|
{{ t('signIn.lastUsed') }}: {{ label }}
|
|
2751
2826
|
</p>
|
|
2752
2827
|
}
|
|
2828
|
+
@if (atlasConnection(); as connectionId) {
|
|
2829
|
+
<button type="button" class="atlas-social-button" data-atlas-provider="atlas" (click)="flow.signInWithAtlas(connectionId)">
|
|
2830
|
+
{{ t('signIn.continueWithAtlas') }}
|
|
2831
|
+
</button>
|
|
2832
|
+
@if (flow.signInWithAtlasError(); as message) {
|
|
2833
|
+
<p class="atlas-error" role="alert">{{ message }}</p>
|
|
2834
|
+
}
|
|
2835
|
+
}
|
|
2753
2836
|
@if (flow.recoveryCodes(); as codes) {
|
|
2754
2837
|
<atlas-recovery-codes [codes]="codes" [busy]="flow.state().busy" (saved)="flow.saveRecoveryCodes()"></atlas-recovery-codes>
|
|
2755
2838
|
} @else {
|
|
@@ -2764,7 +2847,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImpo
|
|
|
2764
2847
|
[preparedFactor]="flow.preparedFactor()"
|
|
2765
2848
|
[offerEmailSecondFactor]="flow.settings()?.account?.emailSecondFactor === true"
|
|
2766
2849
|
[emailedSecondFactor]="flow.emailSecondFactor()"
|
|
2767
|
-
(submitFlow)="
|
|
2850
|
+
(submitFlow)="submitIdentifier($event)"
|
|
2768
2851
|
(chooseFactor)="flow.prepare($event)"
|
|
2769
2852
|
[offerSmsSecondFactor]="flow.settings() !== null && flow.mfaChoices().sms"
|
|
2770
2853
|
[textedSecondFactor]="flow.smsSecondFactor()"
|
|
@@ -2775,6 +2858,17 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImpo
|
|
|
2775
2858
|
(policyDeclined)="flow.declinePolicy($event)"
|
|
2776
2859
|
></atlas-attempt-flow>
|
|
2777
2860
|
}
|
|
2861
|
+
@if (flow.passkeyOffered() && !flow.recoveryCodes()) {
|
|
2862
|
+
<button
|
|
2863
|
+
type="button"
|
|
2864
|
+
class="atlas-social-button atlas-passkey-button"
|
|
2865
|
+
data-atlas-passkey-sign-in=""
|
|
2866
|
+
[disabled]="flow.state().busy"
|
|
2867
|
+
(click)="flow.passkey.signIn()"
|
|
2868
|
+
>
|
|
2869
|
+
{{ t('signIn.passkeyButton') }}
|
|
2870
|
+
</button>
|
|
2871
|
+
}
|
|
2778
2872
|
@if (flow.state().attempt?.status !== 'complete' && signUpHref(); as href) {
|
|
2779
2873
|
<p class="atlas-footer" data-atlas-sign-up-prompt="">
|
|
2780
2874
|
{{ t('signIn.noAccount') }} <a class="atlas-link" [href]="href">{{ t('signIn.signUpLink') }}</a>
|
|
@@ -3647,6 +3741,151 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImpo
|
|
|
3647
3741
|
}]
|
|
3648
3742
|
}] });
|
|
3649
3743
|
|
|
3744
|
+
/**
|
|
3745
|
+
* `<atlas-manage-ciba>` — sign-in requests apps start on the user's behalf (CIBA), with approve and deny, and
|
|
3746
|
+
* the optional CIBA PIN apps must send as the user code. The Angular peer of React's `<ManageCiba/>`. Renders
|
|
3747
|
+
* nothing when there is no request, no PIN and no app that could ask.
|
|
3748
|
+
*/
|
|
3749
|
+
class ManageCibaComponent {
|
|
3750
|
+
atlas = inject(AtlasService);
|
|
3751
|
+
requests = signal([]);
|
|
3752
|
+
pin = signal(null);
|
|
3753
|
+
newPin = signal('');
|
|
3754
|
+
password = signal('');
|
|
3755
|
+
message = signal(null);
|
|
3756
|
+
client = this.atlas.createFapiClient();
|
|
3757
|
+
ngOnInit() {
|
|
3758
|
+
void this.load();
|
|
3759
|
+
}
|
|
3760
|
+
async load() {
|
|
3761
|
+
const [r, p] = await Promise.all([listCibaRequests(this.client).catch(() => []), getCibaPin(this.client).catch(() => null)]);
|
|
3762
|
+
this.requests.set(r);
|
|
3763
|
+
this.pin.set(p);
|
|
3764
|
+
}
|
|
3765
|
+
async run(fn, fallback) {
|
|
3766
|
+
this.message.set(null);
|
|
3767
|
+
try {
|
|
3768
|
+
await fn();
|
|
3769
|
+
this.newPin.set('');
|
|
3770
|
+
this.password.set('');
|
|
3771
|
+
await this.load();
|
|
3772
|
+
}
|
|
3773
|
+
catch (e) {
|
|
3774
|
+
this.message.set(e instanceof Error && e.message ? e.message : fallback);
|
|
3775
|
+
}
|
|
3776
|
+
}
|
|
3777
|
+
decide(id, decision) {
|
|
3778
|
+
return this.run(() => decideCibaRequest(this.client, id, decision), decision === 'approve' ? 'Could not approve.' : 'Could not deny.');
|
|
3779
|
+
}
|
|
3780
|
+
save(event) {
|
|
3781
|
+
event.preventDefault();
|
|
3782
|
+
return this.run(() => setCibaPin(this.client, { pin: this.newPin(), currentPassword: this.password() }), 'Could not save the PIN.');
|
|
3783
|
+
}
|
|
3784
|
+
remove() {
|
|
3785
|
+
return this.run(() => clearCibaPin(this.client, { currentPassword: this.password() }), 'Could not remove the PIN.');
|
|
3786
|
+
}
|
|
3787
|
+
cls(key, base) {
|
|
3788
|
+
return classFor(key, this.atlas.appearance, base);
|
|
3789
|
+
}
|
|
3790
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: ManageCibaComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
3791
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "17.3.12", type: ManageCibaComponent, isStandalone: true, selector: "atlas-manage-ciba", ngImport: i0, template: `
|
|
3792
|
+
@if (requests().length || (pin() && (pin()!.set || pin()!.available))) {
|
|
3793
|
+
<section [class]="cls('card', 'atlas-card')" data-atlas="manage-ciba">
|
|
3794
|
+
@if (requests().length) {
|
|
3795
|
+
<h2>Sign-in requests from apps</h2>
|
|
3796
|
+
<ul>
|
|
3797
|
+
@for (r of requests(); track r.id) {
|
|
3798
|
+
<li>
|
|
3799
|
+
<strong>{{ r.client_name }}</strong>
|
|
3800
|
+
@if (r.binding_message) {
|
|
3801
|
+
<div>{{ r.binding_message }}</div>
|
|
3802
|
+
}
|
|
3803
|
+
<small>{{ r.scope.join(', ') }}</small>
|
|
3804
|
+
<button [class]="cls('formButtonSecondary', 'atlas-button-secondary')" type="button" (click)="decide(r.id, 'approve')">Approve</button>
|
|
3805
|
+
<button [class]="cls('formButtonSecondary', 'atlas-button-secondary')" type="button" (click)="decide(r.id, 'deny')">Deny</button>
|
|
3806
|
+
</li>
|
|
3807
|
+
}
|
|
3808
|
+
</ul>
|
|
3809
|
+
}
|
|
3810
|
+
@if (pin(); as p) {
|
|
3811
|
+
@if (p.set || p.available) {
|
|
3812
|
+
<form (submit)="save($event)">
|
|
3813
|
+
<h2>CIBA PIN</h2>
|
|
3814
|
+
<p>{{ p.set ? 'You have a CIBA PIN.' : 'You have not set a CIBA PIN.' }} Apps that start a sign-in request for you must send it.</p>
|
|
3815
|
+
<input type="password" autocomplete="current-password" placeholder="Current password" aria-label="Current password" [value]="password()" (input)="password.set($any($event.target).value)" />
|
|
3816
|
+
<input type="password" inputmode="numeric" autocomplete="off" placeholder="6 to 12 digits" aria-label="New CIBA PIN" [value]="newPin()" (input)="newPin.set($any($event.target).value)" />
|
|
3817
|
+
<button [class]="cls('formButtonSecondary', 'atlas-button-secondary')" type="submit">{{ p.set ? 'Change PIN' : 'Set PIN' }}</button>
|
|
3818
|
+
@if (p.set) {
|
|
3819
|
+
<button [class]="cls('formButtonSecondary', 'atlas-button-secondary')" type="button" (click)="remove()">Remove PIN</button>
|
|
3820
|
+
}
|
|
3821
|
+
@if (message(); as m) {
|
|
3822
|
+
<small role="status">{{ m }}</small>
|
|
3823
|
+
}
|
|
3824
|
+
</form>
|
|
3825
|
+
}
|
|
3826
|
+
}
|
|
3827
|
+
@if (message(); as m) {
|
|
3828
|
+
@if (!pin() || !(pin()!.set || pin()!.available)) {
|
|
3829
|
+
<small role="status">{{ m }}</small>
|
|
3830
|
+
}
|
|
3831
|
+
}
|
|
3832
|
+
</section>
|
|
3833
|
+
}
|
|
3834
|
+
`, isInline: true, changeDetection: i0.ChangeDetectionStrategy.OnPush });
|
|
3835
|
+
}
|
|
3836
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: ManageCibaComponent, decorators: [{
|
|
3837
|
+
type: Component,
|
|
3838
|
+
args: [{
|
|
3839
|
+
selector: 'atlas-manage-ciba',
|
|
3840
|
+
standalone: true,
|
|
3841
|
+
changeDetection: ChangeDetectionStrategy.OnPush,
|
|
3842
|
+
template: `
|
|
3843
|
+
@if (requests().length || (pin() && (pin()!.set || pin()!.available))) {
|
|
3844
|
+
<section [class]="cls('card', 'atlas-card')" data-atlas="manage-ciba">
|
|
3845
|
+
@if (requests().length) {
|
|
3846
|
+
<h2>Sign-in requests from apps</h2>
|
|
3847
|
+
<ul>
|
|
3848
|
+
@for (r of requests(); track r.id) {
|
|
3849
|
+
<li>
|
|
3850
|
+
<strong>{{ r.client_name }}</strong>
|
|
3851
|
+
@if (r.binding_message) {
|
|
3852
|
+
<div>{{ r.binding_message }}</div>
|
|
3853
|
+
}
|
|
3854
|
+
<small>{{ r.scope.join(', ') }}</small>
|
|
3855
|
+
<button [class]="cls('formButtonSecondary', 'atlas-button-secondary')" type="button" (click)="decide(r.id, 'approve')">Approve</button>
|
|
3856
|
+
<button [class]="cls('formButtonSecondary', 'atlas-button-secondary')" type="button" (click)="decide(r.id, 'deny')">Deny</button>
|
|
3857
|
+
</li>
|
|
3858
|
+
}
|
|
3859
|
+
</ul>
|
|
3860
|
+
}
|
|
3861
|
+
@if (pin(); as p) {
|
|
3862
|
+
@if (p.set || p.available) {
|
|
3863
|
+
<form (submit)="save($event)">
|
|
3864
|
+
<h2>CIBA PIN</h2>
|
|
3865
|
+
<p>{{ p.set ? 'You have a CIBA PIN.' : 'You have not set a CIBA PIN.' }} Apps that start a sign-in request for you must send it.</p>
|
|
3866
|
+
<input type="password" autocomplete="current-password" placeholder="Current password" aria-label="Current password" [value]="password()" (input)="password.set($any($event.target).value)" />
|
|
3867
|
+
<input type="password" inputmode="numeric" autocomplete="off" placeholder="6 to 12 digits" aria-label="New CIBA PIN" [value]="newPin()" (input)="newPin.set($any($event.target).value)" />
|
|
3868
|
+
<button [class]="cls('formButtonSecondary', 'atlas-button-secondary')" type="submit">{{ p.set ? 'Change PIN' : 'Set PIN' }}</button>
|
|
3869
|
+
@if (p.set) {
|
|
3870
|
+
<button [class]="cls('formButtonSecondary', 'atlas-button-secondary')" type="button" (click)="remove()">Remove PIN</button>
|
|
3871
|
+
}
|
|
3872
|
+
@if (message(); as m) {
|
|
3873
|
+
<small role="status">{{ m }}</small>
|
|
3874
|
+
}
|
|
3875
|
+
</form>
|
|
3876
|
+
}
|
|
3877
|
+
}
|
|
3878
|
+
@if (message(); as m) {
|
|
3879
|
+
@if (!pin() || !(pin()!.set || pin()!.available)) {
|
|
3880
|
+
<small role="status">{{ m }}</small>
|
|
3881
|
+
}
|
|
3882
|
+
}
|
|
3883
|
+
</section>
|
|
3884
|
+
}
|
|
3885
|
+
`,
|
|
3886
|
+
}]
|
|
3887
|
+
}] });
|
|
3888
|
+
|
|
3650
3889
|
/**
|
|
3651
3890
|
* `<atlas-user-profile>` — the signed-in user's account surface (emails,
|
|
3652
3891
|
* security). The Angular peer of React's `<UserProfile/>`. Renders nothing when
|
|
@@ -3753,15 +3992,18 @@ class UserProfileComponent {
|
|
|
3753
3992
|
<h2>{{ t('userProfile.securitySection') }}</h2>
|
|
3754
3993
|
<p>{{ user.mfa_enabled ? '2FA on' : '2FA off' }}</p>
|
|
3755
3994
|
</section>
|
|
3995
|
+
|
|
3996
|
+
<atlas-manage-ciba />
|
|
3756
3997
|
</div>
|
|
3757
3998
|
}
|
|
3758
|
-
`, isInline: true, changeDetection: i0.ChangeDetectionStrategy.OnPush });
|
|
3999
|
+
`, isInline: true, dependencies: [{ kind: "component", type: ManageCibaComponent, selector: "atlas-manage-ciba" }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
|
|
3759
4000
|
}
|
|
3760
4001
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: UserProfileComponent, decorators: [{
|
|
3761
4002
|
type: Component,
|
|
3762
4003
|
args: [{
|
|
3763
4004
|
selector: 'atlas-user-profile',
|
|
3764
4005
|
standalone: true,
|
|
4006
|
+
imports: [ManageCibaComponent],
|
|
3765
4007
|
changeDetection: ChangeDetectionStrategy.OnPush,
|
|
3766
4008
|
template: `
|
|
3767
4009
|
@if (atlas.user(); as user) {
|
|
@@ -3818,6 +4060,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImpo
|
|
|
3818
4060
|
<h2>{{ t('userProfile.securitySection') }}</h2>
|
|
3819
4061
|
<p>{{ user.mfa_enabled ? '2FA on' : '2FA off' }}</p>
|
|
3820
4062
|
</section>
|
|
4063
|
+
|
|
4064
|
+
<atlas-manage-ciba />
|
|
3821
4065
|
</div>
|
|
3822
4066
|
}
|
|
3823
4067
|
`,
|
|
@@ -4582,6 +4826,7 @@ const ATLAS_UI = [
|
|
|
4582
4826
|
UserProfileComponent,
|
|
4583
4827
|
OrganizationProfileComponent,
|
|
4584
4828
|
OrganizationAuditLogComponent,
|
|
4829
|
+
ManageCibaComponent,
|
|
4585
4830
|
AtlasPoliciesDirective,
|
|
4586
4831
|
PolicyAcceptStepComponent,
|
|
4587
4832
|
PolicyGateComponent,
|
|
@@ -4642,7 +4887,7 @@ class AtlasModule {
|
|
|
4642
4887
|
return { ngModule: AtlasModule, providers };
|
|
4643
4888
|
}
|
|
4644
4889
|
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: AtlasModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule });
|
|
4645
|
-
static ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "17.3.12", ngImport: i0, type: AtlasModule, imports: [AtlasSignedInDirective, AtlasSignedOutDirective, AtlasLoadingDirective, AtlasLoadedDirective, AtlasProtectDirective, AtlasRootDirective, SignInComponent, SignUpComponent, UserButtonComponent, OrganizationSwitcherComponent, UserProfileComponent, OrganizationProfileComponent, OrganizationAuditLogComponent, AtlasPoliciesDirective, PolicyAcceptStepComponent, PolicyGateComponent], exports: [AtlasSignedInDirective, AtlasSignedOutDirective, AtlasLoadingDirective, AtlasLoadedDirective, AtlasProtectDirective, AtlasRootDirective, SignInComponent, SignUpComponent, UserButtonComponent, OrganizationSwitcherComponent, UserProfileComponent, OrganizationProfileComponent, OrganizationAuditLogComponent, AtlasPoliciesDirective, PolicyAcceptStepComponent, PolicyGateComponent] });
|
|
4890
|
+
static ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "17.3.12", ngImport: i0, type: AtlasModule, imports: [AtlasSignedInDirective, AtlasSignedOutDirective, AtlasLoadingDirective, AtlasLoadedDirective, AtlasProtectDirective, AtlasRootDirective, SignInComponent, SignUpComponent, UserButtonComponent, OrganizationSwitcherComponent, UserProfileComponent, OrganizationProfileComponent, OrganizationAuditLogComponent, ManageCibaComponent, AtlasPoliciesDirective, PolicyAcceptStepComponent, PolicyGateComponent], exports: [AtlasSignedInDirective, AtlasSignedOutDirective, AtlasLoadingDirective, AtlasLoadedDirective, AtlasProtectDirective, AtlasRootDirective, SignInComponent, SignUpComponent, UserButtonComponent, OrganizationSwitcherComponent, UserProfileComponent, OrganizationProfileComponent, OrganizationAuditLogComponent, ManageCibaComponent, AtlasPoliciesDirective, PolicyAcceptStepComponent, PolicyGateComponent] });
|
|
4646
4891
|
static ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: AtlasModule });
|
|
4647
4892
|
}
|
|
4648
4893
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: AtlasModule, decorators: [{
|
|
@@ -4803,5 +5048,5 @@ function atlasChildGuard(options = {}) {
|
|
|
4803
5048
|
* Generated bundle index. Do not edit.
|
|
4804
5049
|
*/
|
|
4805
5050
|
|
|
4806
|
-
export { ATLAS_ANGULAR_SDK, ATLAS_ANGULAR_VERSION, ATLAS_OPTIONS, ATLAS_UI, AtlasCaptchaSlotDirective, AtlasFlowController, AtlasLoadedDirective, AtlasLoadingDirective, AtlasModule, AtlasOrganizationAuditLog, AtlasPoliciesDirective, AtlasProtectDirective, AtlasRootDirective, AtlasService, AtlasSignedInDirective, AtlasSignedOutDirective, AttemptFlowComponent, DEFAULT_TOKENS, EN_US, ImpersonationBannerComponent, OrganizationAuditLogComponent, OrganizationProfileComponent, OrganizationSwitcherComponent, PolicyAcceptStepComponent, PolicyGateComponent, SignInComponent, SignUpComponent, SignUpFormComponent, THEMES, UserButtonComponent, UserProfileComponent, atlasChildGuard, atlasGuard, classFor, cssVariables, explicitTokens, provideAtlas, renderAppearance, resolveTokens, translate, withFallback };
|
|
5051
|
+
export { ATLAS_ANGULAR_SDK, ATLAS_ANGULAR_VERSION, ATLAS_OPTIONS, ATLAS_UI, AtlasCaptchaSlotDirective, AtlasFlowController, AtlasLoadedDirective, AtlasLoadingDirective, AtlasModule, AtlasOrganizationAuditLog, AtlasPoliciesDirective, AtlasProtectDirective, AtlasRootDirective, AtlasService, AtlasSignedInDirective, AtlasSignedOutDirective, AttemptFlowComponent, DEFAULT_TOKENS, EN_US, ImpersonationBannerComponent, ManageCibaComponent, OrganizationAuditLogComponent, OrganizationProfileComponent, OrganizationSwitcherComponent, PolicyAcceptStepComponent, PolicyGateComponent, SignInComponent, SignUpComponent, SignUpFormComponent, THEMES, UserButtonComponent, UserProfileComponent, atlasChildGuard, atlasGuard, classFor, cssVariables, explicitTokens, provideAtlas, renderAppearance, resolveTokens, translate, withFallback };
|
|
4807
5052
|
//# sourceMappingURL=atlasauth-angular.mjs.map
|