@frontegg/redux-store 6.85.0 → 6.87.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/auth/SSOState/index.d.ts +19 -1
- package/auth/SSOState/index.js +7 -1
- package/auth/SSOState/interfaces.d.ts +9 -0
- package/auth/SSOState/saga.v2.js +87 -2
- package/auth/index.d.ts +16 -0
- package/auth/reducer.d.ts +16 -0
- package/helpers.d.ts +3 -2
- package/helpers.js +17 -3
- package/index.js +1 -1
- package/node/auth/SSOState/index.js +7 -1
- package/node/auth/SSOState/saga.v2.js +86 -1
- package/node/helpers.js +19 -3
- package/node/index.js +1 -1
- package/package.json +2 -1
package/auth/SSOState/index.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { CreateSamlGroupPayload, DeleteSamlGroupPayload, SaveSSOConfigurationFilePayload, SaveSSOConfigurationPayload, ValidateSSODomainPayload, SSOState, SSOStateIndicator, UpdateSSOAuthorizationRolesPayload, SaveSSODomainPayload, UpdateSSOConfigurationPayload, DeleteSSOConfigurationPayload, SaveSSOConfigurationPayloadV2, UpdateSSODefaultRolesPayload, SetSSOGroupsPayload, SaveSSOConfigurationByMetadataPayload, UpdateSSOConfigurationByMetadataPayload, UpdateSSOGroupsPayload } from './interfaces';
|
|
1
|
+
import { CreateSamlGroupPayload, DeleteSamlGroupPayload, SaveSSOConfigurationFilePayload, SaveSSOConfigurationPayload, ValidateSSODomainPayload, SSOState, SSOStateIndicator, UpdateSSOAuthorizationRolesPayload, SaveSSODomainPayload, UpdateSSOConfigurationPayload, DeleteSSOConfigurationPayload, SaveSSOConfigurationPayloadV2, UpdateSSODefaultRolesPayload, SetSSOGroupsPayload, SaveSSOConfigurationByMetadataPayload, UpdateSSOConfigurationByMetadataPayload, UpdateSSOGroupsPayload, SaveSSOConfigurationByUrlPayload, SaveSSOConfigurationByDataPayload } from './interfaces';
|
|
2
2
|
import { WithCallback } from '../../interfaces';
|
|
3
3
|
import { IOidcPostLogin } from '@frontegg/rest-api';
|
|
4
4
|
declare const ssoState: SSOState;
|
|
@@ -187,6 +187,22 @@ declare const actions: {
|
|
|
187
187
|
samlVendor: import("./interfaces").SamlVendors;
|
|
188
188
|
}>, boolean>, string, never, never>;
|
|
189
189
|
saveSSOConfigurationsFile: import("@reduxjs/toolkit").ActionCreatorWithPreparedPayload<[File[]], File[], string, never, never>;
|
|
190
|
+
saveSSOConfigurationByData: import("@reduxjs/toolkit").ActionCreatorWithPreparedPayload<[WithCallback<Partial<import("@frontegg/rest-api").ISSOConfiguration> & {
|
|
191
|
+
ssoConfigId?: string | undefined;
|
|
192
|
+
configMetadata?: Record<string, string> | undefined;
|
|
193
|
+
}, import("@frontegg/rest-api").ISSOConfiguration>], WithCallback<Partial<import("@frontegg/rest-api").ISSOConfiguration> & {
|
|
194
|
+
ssoConfigId?: string | undefined;
|
|
195
|
+
configMetadata?: Record<string, string> | undefined;
|
|
196
|
+
}, import("@frontegg/rest-api").ISSOConfiguration>, string, never, never>;
|
|
197
|
+
saveSSOConfigurationByUrl: import("@reduxjs/toolkit").ActionCreatorWithPreparedPayload<[WithCallback<{
|
|
198
|
+
ssoConfigId?: string | undefined;
|
|
199
|
+
configMetadata?: Record<string, string> | undefined;
|
|
200
|
+
metadataUrl: string;
|
|
201
|
+
}, import("@frontegg/rest-api").ISSOConfiguration>], WithCallback<{
|
|
202
|
+
ssoConfigId?: string | undefined;
|
|
203
|
+
configMetadata?: Record<string, string> | undefined;
|
|
204
|
+
metadataUrl: string;
|
|
205
|
+
}, import("@frontegg/rest-api").ISSOConfiguration>, string, never, never>;
|
|
190
206
|
saveSSOConfigurationsFileWithCallback: import("@reduxjs/toolkit").ActionCreatorWithPreparedPayload<[WithCallback<{
|
|
191
207
|
configFile: File;
|
|
192
208
|
}, boolean>], WithCallback<{
|
|
@@ -229,6 +245,8 @@ declare type DispatchedActions = {
|
|
|
229
245
|
updateSSOGroups: (payload: UpdateSSOGroupsPayload) => void;
|
|
230
246
|
saveSSOConfigurationByMetadata: (payload: SaveSSOConfigurationByMetadataPayload) => void;
|
|
231
247
|
updateSSOConfigurationByMetadata: (payload: UpdateSSOConfigurationByMetadataPayload) => void;
|
|
248
|
+
saveSSOConfigurationByData: (payload: SaveSSOConfigurationByDataPayload) => void;
|
|
249
|
+
saveSSOConfigurationByUrl: (payload: SaveSSOConfigurationByUrlPayload) => void;
|
|
232
250
|
setSSOLoader: (payload: SSOStateIndicator) => void;
|
|
233
251
|
setSSOError: (payload: SSOStateIndicator) => void;
|
|
234
252
|
setSSOState: (state: Partial<SSOState>) => void;
|
package/auth/SSOState/index.js
CHANGED
|
@@ -61,6 +61,12 @@ const actions = {
|
|
|
61
61
|
saveSSOConfigurationsFile: createAction(`${authStoreName}/saveSSOConfigurationsFile`, payload => ({
|
|
62
62
|
payload
|
|
63
63
|
})),
|
|
64
|
+
saveSSOConfigurationByData: createAction(`${authStoreName}/saveSSOConfigurationByData`, payload => ({
|
|
65
|
+
payload
|
|
66
|
+
})),
|
|
67
|
+
saveSSOConfigurationByUrl: createAction(`${authStoreName}/saveSSOConfigurationByUrl`, payload => ({
|
|
68
|
+
payload
|
|
69
|
+
})),
|
|
64
70
|
saveSSOConfigurationsFileWithCallback: createAction(`${authStoreName}/saveSSOConfigurationsFileWithCallback`, payload => ({
|
|
65
71
|
payload
|
|
66
72
|
})),
|
|
@@ -89,7 +95,7 @@ const actions = {
|
|
|
89
95
|
// noinspection JSUnusedLocalSymbols
|
|
90
96
|
/**
|
|
91
97
|
* if you see error in matcher that's mean the DispatchAction does not
|
|
92
|
-
*
|
|
98
|
+
* contain the same functions in reducers and actions
|
|
93
99
|
*/
|
|
94
100
|
const Matcher = {};
|
|
95
101
|
export { ssoState, reducers as ssoReducers, actions as ssoActions };
|
|
@@ -82,6 +82,15 @@ export declare type DeleteSSOConfigurationPayload = WithCallback<{
|
|
|
82
82
|
export declare type SaveSSOConfigurationFilePayload = WithCallback<{
|
|
83
83
|
configFile: File;
|
|
84
84
|
}>;
|
|
85
|
+
export declare type SaveSSOConfigurationByDataPayload = WithCallback<Partial<ISSOConfiguration> & {
|
|
86
|
+
ssoConfigId?: string;
|
|
87
|
+
configMetadata?: Record<string, string>;
|
|
88
|
+
}, ISSOConfiguration>;
|
|
89
|
+
export declare type SaveSSOConfigurationByUrlPayload = WithCallback<{
|
|
90
|
+
ssoConfigId?: string;
|
|
91
|
+
configMetadata?: Record<string, string>;
|
|
92
|
+
metadataUrl: string;
|
|
93
|
+
}, ISSOConfiguration>;
|
|
85
94
|
export declare type UpdateSSOAuthorizationRolesPayload = WithCallback<{
|
|
86
95
|
authorizationRoles: string[];
|
|
87
96
|
groups?: ISamlRolesGroup[];
|
package/auth/SSOState/saga.v2.js
CHANGED
|
@@ -2,9 +2,10 @@ import _extends from "@babel/runtime/helpers/esm/extends";
|
|
|
2
2
|
import _objectWithoutPropertiesLoose from "@babel/runtime/helpers/esm/objectWithoutPropertiesLoose";
|
|
3
3
|
const _excluded = ["callback"],
|
|
4
4
|
_excluded2 = ["callback", "ssoConfigId"],
|
|
5
|
-
_excluded3 = ["callback", "ssoConfigId"]
|
|
5
|
+
_excluded3 = ["callback", "ssoConfigId"],
|
|
6
|
+
_excluded4 = ["callback", "ssoConfigId"];
|
|
6
7
|
import { all, call, put, select, takeEvery } from 'redux-saga/effects';
|
|
7
|
-
import { api } from '@frontegg/rest-api';
|
|
8
|
+
import { api, fetch } from '@frontegg/rest-api';
|
|
8
9
|
import { actions } from '../reducer';
|
|
9
10
|
import { SSOStateKeys } from './interfaces';
|
|
10
11
|
import { readFileAsText } from '../../helpers';
|
|
@@ -449,6 +450,88 @@ function* updateSSOGroups({
|
|
|
449
450
|
}));
|
|
450
451
|
}
|
|
451
452
|
}
|
|
453
|
+
function* saveSSOConfigurationByUrl({
|
|
454
|
+
payload
|
|
455
|
+
}) {
|
|
456
|
+
yield put(actions.setSSOLoader({
|
|
457
|
+
key: SSOStateKeys.SAVE_SSO_CONFIGURATION_BY_METADATA,
|
|
458
|
+
value: true
|
|
459
|
+
}));
|
|
460
|
+
const {
|
|
461
|
+
metadataUrl,
|
|
462
|
+
configMetadata,
|
|
463
|
+
ssoConfigId,
|
|
464
|
+
callback
|
|
465
|
+
} = payload;
|
|
466
|
+
const ssoConfigurations = yield select(state => state.auth.ssoState.ssoConfigurations);
|
|
467
|
+
try {
|
|
468
|
+
const metadata = yield call(fetch.Get, metadataUrl, undefined, {
|
|
469
|
+
responseType: 'plain'
|
|
470
|
+
});
|
|
471
|
+
|
|
472
|
+
// TODO: remove any after adding configMetadata for @frontegg/rest-api
|
|
473
|
+
const body = {
|
|
474
|
+
metadata,
|
|
475
|
+
configMetadata
|
|
476
|
+
};
|
|
477
|
+
let newSsoConfiguration;
|
|
478
|
+
let newSsoConfigurations;
|
|
479
|
+
if (ssoConfigId) {
|
|
480
|
+
newSsoConfiguration = yield call(api.auth.updateSSOConfigurationByMetadata, ssoConfigId, body);
|
|
481
|
+
newSsoConfigurations = ssoConfigurations.map(ssoConfig => ssoConfig.id === ssoConfigId ? newSsoConfiguration : ssoConfig);
|
|
482
|
+
} else {
|
|
483
|
+
newSsoConfiguration = yield call(api.auth.createSSOConfigurationByMetadata, body);
|
|
484
|
+
newSsoConfigurations = [newSsoConfiguration, ...ssoConfigurations];
|
|
485
|
+
}
|
|
486
|
+
yield put(actions.setSSOState({
|
|
487
|
+
ssoConfigurations: newSsoConfigurations
|
|
488
|
+
}));
|
|
489
|
+
callback == null ? void 0 : callback(newSsoConfiguration);
|
|
490
|
+
} catch (error) {
|
|
491
|
+
callback == null ? void 0 : callback(null, error);
|
|
492
|
+
} finally {
|
|
493
|
+
yield put(actions.setSSOLoader({
|
|
494
|
+
key: SSOStateKeys.SAVE_SSO_CONFIGURATION_BY_METADATA,
|
|
495
|
+
value: false
|
|
496
|
+
}));
|
|
497
|
+
}
|
|
498
|
+
}
|
|
499
|
+
function* saveSSOConfigurationByData({
|
|
500
|
+
payload
|
|
501
|
+
}) {
|
|
502
|
+
yield put(actions.setSSOLoader({
|
|
503
|
+
key: SSOStateKeys.SAVE_SSO_CONFIGURATION,
|
|
504
|
+
value: true
|
|
505
|
+
}));
|
|
506
|
+
const {
|
|
507
|
+
callback,
|
|
508
|
+
ssoConfigId
|
|
509
|
+
} = payload,
|
|
510
|
+
body = _objectWithoutPropertiesLoose(payload, _excluded4);
|
|
511
|
+
const ssoConfigurations = yield select(state => state.auth.ssoState.ssoConfigurations);
|
|
512
|
+
try {
|
|
513
|
+
let newSsoConfiguration;
|
|
514
|
+
let newSsoConfigurations;
|
|
515
|
+
if (ssoConfigId) {
|
|
516
|
+
newSsoConfiguration = yield call(api.auth.updateSSOConfiguration, ssoConfigId, body);
|
|
517
|
+
newSsoConfigurations = ssoConfigurations.map(ssoConfig => ssoConfig.id === ssoConfigId ? newSsoConfiguration : ssoConfig);
|
|
518
|
+
} else {
|
|
519
|
+
newSsoConfiguration = yield call(api.auth.createSSOConfiguration, body);
|
|
520
|
+
newSsoConfigurations = [newSsoConfiguration, ...ssoConfigurations];
|
|
521
|
+
}
|
|
522
|
+
yield put(actions.setSSOState({
|
|
523
|
+
ssoConfigurations: newSsoConfigurations
|
|
524
|
+
}));
|
|
525
|
+
callback == null ? void 0 : callback(newSsoConfiguration);
|
|
526
|
+
} catch (error) {
|
|
527
|
+
callback == null ? void 0 : callback(null, error);
|
|
528
|
+
} finally {
|
|
529
|
+
yield put(actions.setSSOLoader({
|
|
530
|
+
key: SSOStateKeys.SAVE_SSO_CONFIGURATION_BY_METADATA,
|
|
531
|
+
value: false
|
|
532
|
+
}));
|
|
533
|
+
}
|
|
534
|
+
}
|
|
452
535
|
export function* ssoSagas() {
|
|
453
536
|
yield takeEvery(actions.loadSSOConfigurationsV2, loadSSOConfigurationsV2);
|
|
454
537
|
yield takeEvery(actions.saveSSOConfigurationV2, saveSSOConfigurationV2);
|
|
@@ -462,4 +545,6 @@ export function* ssoSagas() {
|
|
|
462
545
|
yield takeEvery(actions.setSSODefaultRoles, setSSODefaultRoles);
|
|
463
546
|
yield takeEvery(actions.saveSSOConfigurationByMetadata, saveSSOConfigurationByMetadata);
|
|
464
547
|
yield takeEvery(actions.updateSSOConfigurationByMetadata, updateSSOConfigurationByMetadata);
|
|
548
|
+
yield takeEvery(actions.saveSSOConfigurationByUrl, saveSSOConfigurationByUrl);
|
|
549
|
+
yield takeEvery(actions.saveSSOConfigurationByData, saveSSOConfigurationByData);
|
|
465
550
|
}
|
package/auth/index.d.ts
CHANGED
|
@@ -356,6 +356,22 @@ declare const _default: {
|
|
|
356
356
|
samlVendor: import("./SSOState/interfaces").SamlVendors;
|
|
357
357
|
}>, boolean>, string, never, never>;
|
|
358
358
|
saveSSOConfigurationsFile: import("@reduxjs/toolkit").ActionCreatorWithPreparedPayload<[File[]], File[], string, never, never>;
|
|
359
|
+
saveSSOConfigurationByData: import("@reduxjs/toolkit").ActionCreatorWithPreparedPayload<[import("..").WithCallback<Partial<import("@frontegg/rest-api/auth/interfaces").ISSOConfiguration> & {
|
|
360
|
+
ssoConfigId?: string | undefined;
|
|
361
|
+
configMetadata?: Record<string, string> | undefined;
|
|
362
|
+
}, import("@frontegg/rest-api/auth/interfaces").ISSOConfiguration>], import("..").WithCallback<Partial<import("@frontegg/rest-api/auth/interfaces").ISSOConfiguration> & {
|
|
363
|
+
ssoConfigId?: string | undefined;
|
|
364
|
+
configMetadata?: Record<string, string> | undefined;
|
|
365
|
+
}, import("@frontegg/rest-api/auth/interfaces").ISSOConfiguration>, string, never, never>;
|
|
366
|
+
saveSSOConfigurationByUrl: import("@reduxjs/toolkit").ActionCreatorWithPreparedPayload<[import("..").WithCallback<{
|
|
367
|
+
ssoConfigId?: string | undefined;
|
|
368
|
+
configMetadata?: Record<string, string> | undefined;
|
|
369
|
+
metadataUrl: string;
|
|
370
|
+
}, import("@frontegg/rest-api/auth/interfaces").ISSOConfiguration>], import("..").WithCallback<{
|
|
371
|
+
ssoConfigId?: string | undefined;
|
|
372
|
+
configMetadata?: Record<string, string> | undefined;
|
|
373
|
+
metadataUrl: string;
|
|
374
|
+
}, import("@frontegg/rest-api/auth/interfaces").ISSOConfiguration>, string, never, never>;
|
|
359
375
|
saveSSOConfigurationsFileWithCallback: import("@reduxjs/toolkit").ActionCreatorWithPreparedPayload<[import("..").WithCallback<{
|
|
360
376
|
configFile: File;
|
|
361
377
|
}, boolean>], import("..").WithCallback<{
|
package/auth/reducer.d.ts
CHANGED
|
@@ -321,6 +321,22 @@ declare const actions: {
|
|
|
321
321
|
samlVendor: import(".").SamlVendors;
|
|
322
322
|
}>, boolean>, string, never, never>;
|
|
323
323
|
saveSSOConfigurationsFile: import("@reduxjs/toolkit").ActionCreatorWithPreparedPayload<[File[]], File[], string, never, never>;
|
|
324
|
+
saveSSOConfigurationByData: import("@reduxjs/toolkit").ActionCreatorWithPreparedPayload<[import("..").WithCallback<Partial<import("@frontegg/rest-api").ISSOConfiguration> & {
|
|
325
|
+
ssoConfigId?: string | undefined;
|
|
326
|
+
configMetadata?: Record<string, string> | undefined;
|
|
327
|
+
}, import("@frontegg/rest-api").ISSOConfiguration>], import("..").WithCallback<Partial<import("@frontegg/rest-api").ISSOConfiguration> & {
|
|
328
|
+
ssoConfigId?: string | undefined;
|
|
329
|
+
configMetadata?: Record<string, string> | undefined;
|
|
330
|
+
}, import("@frontegg/rest-api").ISSOConfiguration>, string, never, never>;
|
|
331
|
+
saveSSOConfigurationByUrl: import("@reduxjs/toolkit").ActionCreatorWithPreparedPayload<[import("..").WithCallback<{
|
|
332
|
+
ssoConfigId?: string | undefined;
|
|
333
|
+
configMetadata?: Record<string, string> | undefined;
|
|
334
|
+
metadataUrl: string;
|
|
335
|
+
}, import("@frontegg/rest-api").ISSOConfiguration>], import("..").WithCallback<{
|
|
336
|
+
ssoConfigId?: string | undefined;
|
|
337
|
+
configMetadata?: Record<string, string> | undefined;
|
|
338
|
+
metadataUrl: string;
|
|
339
|
+
}, import("@frontegg/rest-api").ISSOConfiguration>, string, never, never>;
|
|
324
340
|
saveSSOConfigurationsFileWithCallback: import("@reduxjs/toolkit").ActionCreatorWithPreparedPayload<[import("..").WithCallback<{
|
|
325
341
|
configFile: File;
|
|
326
342
|
}, boolean>], import("..").WithCallback<{
|
package/helpers.d.ts
CHANGED
|
@@ -1,7 +1,8 @@
|
|
|
1
|
-
import { SelectEffect } from 'redux-saga/effects';
|
|
2
1
|
export declare function omitProps<T>(props: any, keys: string[]): T;
|
|
3
2
|
export declare function generateActionCreator(storeName: string): <Payload>(key: string, withPayload?: boolean | undefined) => import("@reduxjs/toolkit").ActionCreatorWithoutPayload<string> | import("@reduxjs/toolkit").ActionCreatorWithPreparedPayload<[Payload], Payload, string, never, never>;
|
|
3
|
+
export declare function generateCodeChallengePureJs(codeVerifier: string): Promise<string>;
|
|
4
|
+
export declare function generateCodeChallengeNative(codeVerifier: string): Promise<string>;
|
|
4
5
|
export declare function generateCodeChallenge(codeVerifier: string): Promise<string>;
|
|
5
6
|
export declare function createRandomString(length?: number): string;
|
|
6
7
|
export declare const readFileAsText: (file: File) => Promise<string>;
|
|
7
|
-
export declare function getFeatureFlags(flags: string[]): Generator<SelectEffect, boolean[], string>;
|
|
8
|
+
export declare function getFeatureFlags(flags: string[]): Generator<import("redux-saga/effects").SelectEffect, boolean[], string>;
|
package/helpers.js
CHANGED
|
@@ -2,6 +2,7 @@ import _extends from "@babel/runtime/helpers/esm/extends";
|
|
|
2
2
|
import { FeatureFlags } from '@frontegg/rest-api';
|
|
3
3
|
import { createAction } from '@reduxjs/toolkit';
|
|
4
4
|
import { select } from 'redux-saga/effects';
|
|
5
|
+
import { sha256 } from 'js-sha256';
|
|
5
6
|
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
6
7
|
export function omitProps(props, keys) {
|
|
7
8
|
const newProps = _extends({}, props);
|
|
@@ -15,12 +16,25 @@ export function generateActionCreator(storeName) {
|
|
|
15
16
|
payload
|
|
16
17
|
})) : createAction(`${storeName}/${key}`);
|
|
17
18
|
}
|
|
18
|
-
export async function
|
|
19
|
+
export async function generateCodeChallengePureJs(codeVerifier) {
|
|
20
|
+
// noinspection TypeScriptValidateJSTypes pure sha256 recevie single params alg name
|
|
21
|
+
const digest = sha256.digest(new TextEncoder().encode(codeVerifier));
|
|
22
|
+
return btoa(String.fromCharCode(...new Uint8Array(digest))).replace(/=/g, '').replace(/\+/g, '-').replace(/\//g, '_');
|
|
23
|
+
}
|
|
24
|
+
export async function generateCodeChallengeNative(codeVerifier) {
|
|
19
25
|
const digest = await crypto.subtle.digest('SHA-256', new TextEncoder().encode(codeVerifier));
|
|
20
|
-
|
|
21
|
-
// @ts-ignore
|
|
22
26
|
return btoa(String.fromCharCode(...new Uint8Array(digest))).replace(/=/g, '').replace(/\+/g, '-').replace(/\//g, '_');
|
|
23
27
|
}
|
|
28
|
+
export async function generateCodeChallenge(codeVerifier) {
|
|
29
|
+
var _window$crypto, _window$crypto$subtle;
|
|
30
|
+
// @ts-expect-error Crypto.subtle not available in non-secure domains
|
|
31
|
+
if ((_window$crypto = window.crypto) != null && (_window$crypto$subtle = _window$crypto.subtle) != null && _window$crypto$subtle.digest) {
|
|
32
|
+
return generateCodeChallengeNative(codeVerifier);
|
|
33
|
+
} else {
|
|
34
|
+
console.warn('Generating CodeChallenge in non-secure domain:', window.location.origin);
|
|
35
|
+
return generateCodeChallengePureJs(codeVerifier);
|
|
36
|
+
}
|
|
37
|
+
}
|
|
24
38
|
export function createRandomString(length = 16) {
|
|
25
39
|
let text = '';
|
|
26
40
|
const possible = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789';
|
package/index.js
CHANGED
|
@@ -69,6 +69,12 @@ const actions = {
|
|
|
69
69
|
saveSSOConfigurationsFile: (0, _toolkit.createAction)(`${_constants.authStoreName}/saveSSOConfigurationsFile`, payload => ({
|
|
70
70
|
payload
|
|
71
71
|
})),
|
|
72
|
+
saveSSOConfigurationByData: (0, _toolkit.createAction)(`${_constants.authStoreName}/saveSSOConfigurationByData`, payload => ({
|
|
73
|
+
payload
|
|
74
|
+
})),
|
|
75
|
+
saveSSOConfigurationByUrl: (0, _toolkit.createAction)(`${_constants.authStoreName}/saveSSOConfigurationByUrl`, payload => ({
|
|
76
|
+
payload
|
|
77
|
+
})),
|
|
72
78
|
saveSSOConfigurationsFileWithCallback: (0, _toolkit.createAction)(`${_constants.authStoreName}/saveSSOConfigurationsFileWithCallback`, payload => ({
|
|
73
79
|
payload
|
|
74
80
|
})),
|
|
@@ -97,6 +103,6 @@ exports.ssoActions = actions;
|
|
|
97
103
|
// noinspection JSUnusedLocalSymbols
|
|
98
104
|
/**
|
|
99
105
|
* if you see error in matcher that's mean the DispatchAction does not
|
|
100
|
-
*
|
|
106
|
+
* contain the same functions in reducers and actions
|
|
101
107
|
*/
|
|
102
108
|
const Matcher = {};
|
|
@@ -14,7 +14,8 @@ var _interfaces = require("./interfaces");
|
|
|
14
14
|
var _helpers = require("../../helpers");
|
|
15
15
|
const _excluded = ["callback"],
|
|
16
16
|
_excluded2 = ["callback", "ssoConfigId"],
|
|
17
|
-
_excluded3 = ["callback", "ssoConfigId"]
|
|
17
|
+
_excluded3 = ["callback", "ssoConfigId"],
|
|
18
|
+
_excluded4 = ["callback", "ssoConfigId"];
|
|
18
19
|
function* loadOidc() {
|
|
19
20
|
try {
|
|
20
21
|
const oidcConfiguration = yield (0, _effects.call)(_restApi.api.auth.getOidcConfiguration);
|
|
@@ -456,6 +457,88 @@ function* updateSSOGroups({
|
|
|
456
457
|
}));
|
|
457
458
|
}
|
|
458
459
|
}
|
|
460
|
+
function* saveSSOConfigurationByUrl({
|
|
461
|
+
payload
|
|
462
|
+
}) {
|
|
463
|
+
yield (0, _effects.put)(_reducer.actions.setSSOLoader({
|
|
464
|
+
key: _interfaces.SSOStateKeys.SAVE_SSO_CONFIGURATION_BY_METADATA,
|
|
465
|
+
value: true
|
|
466
|
+
}));
|
|
467
|
+
const {
|
|
468
|
+
metadataUrl,
|
|
469
|
+
configMetadata,
|
|
470
|
+
ssoConfigId,
|
|
471
|
+
callback
|
|
472
|
+
} = payload;
|
|
473
|
+
const ssoConfigurations = yield (0, _effects.select)(state => state.auth.ssoState.ssoConfigurations);
|
|
474
|
+
try {
|
|
475
|
+
const metadata = yield (0, _effects.call)(_restApi.fetch.Get, metadataUrl, undefined, {
|
|
476
|
+
responseType: 'plain'
|
|
477
|
+
});
|
|
478
|
+
|
|
479
|
+
// TODO: remove any after adding configMetadata for @frontegg/rest-api
|
|
480
|
+
const body = {
|
|
481
|
+
metadata,
|
|
482
|
+
configMetadata
|
|
483
|
+
};
|
|
484
|
+
let newSsoConfiguration;
|
|
485
|
+
let newSsoConfigurations;
|
|
486
|
+
if (ssoConfigId) {
|
|
487
|
+
newSsoConfiguration = yield (0, _effects.call)(_restApi.api.auth.updateSSOConfigurationByMetadata, ssoConfigId, body);
|
|
488
|
+
newSsoConfigurations = ssoConfigurations.map(ssoConfig => ssoConfig.id === ssoConfigId ? newSsoConfiguration : ssoConfig);
|
|
489
|
+
} else {
|
|
490
|
+
newSsoConfiguration = yield (0, _effects.call)(_restApi.api.auth.createSSOConfigurationByMetadata, body);
|
|
491
|
+
newSsoConfigurations = [newSsoConfiguration, ...ssoConfigurations];
|
|
492
|
+
}
|
|
493
|
+
yield (0, _effects.put)(_reducer.actions.setSSOState({
|
|
494
|
+
ssoConfigurations: newSsoConfigurations
|
|
495
|
+
}));
|
|
496
|
+
callback == null ? void 0 : callback(newSsoConfiguration);
|
|
497
|
+
} catch (error) {
|
|
498
|
+
callback == null ? void 0 : callback(null, error);
|
|
499
|
+
} finally {
|
|
500
|
+
yield (0, _effects.put)(_reducer.actions.setSSOLoader({
|
|
501
|
+
key: _interfaces.SSOStateKeys.SAVE_SSO_CONFIGURATION_BY_METADATA,
|
|
502
|
+
value: false
|
|
503
|
+
}));
|
|
504
|
+
}
|
|
505
|
+
}
|
|
506
|
+
function* saveSSOConfigurationByData({
|
|
507
|
+
payload
|
|
508
|
+
}) {
|
|
509
|
+
yield (0, _effects.put)(_reducer.actions.setSSOLoader({
|
|
510
|
+
key: _interfaces.SSOStateKeys.SAVE_SSO_CONFIGURATION,
|
|
511
|
+
value: true
|
|
512
|
+
}));
|
|
513
|
+
const {
|
|
514
|
+
callback,
|
|
515
|
+
ssoConfigId
|
|
516
|
+
} = payload,
|
|
517
|
+
body = (0, _objectWithoutPropertiesLoose2.default)(payload, _excluded4);
|
|
518
|
+
const ssoConfigurations = yield (0, _effects.select)(state => state.auth.ssoState.ssoConfigurations);
|
|
519
|
+
try {
|
|
520
|
+
let newSsoConfiguration;
|
|
521
|
+
let newSsoConfigurations;
|
|
522
|
+
if (ssoConfigId) {
|
|
523
|
+
newSsoConfiguration = yield (0, _effects.call)(_restApi.api.auth.updateSSOConfiguration, ssoConfigId, body);
|
|
524
|
+
newSsoConfigurations = ssoConfigurations.map(ssoConfig => ssoConfig.id === ssoConfigId ? newSsoConfiguration : ssoConfig);
|
|
525
|
+
} else {
|
|
526
|
+
newSsoConfiguration = yield (0, _effects.call)(_restApi.api.auth.createSSOConfiguration, body);
|
|
527
|
+
newSsoConfigurations = [newSsoConfiguration, ...ssoConfigurations];
|
|
528
|
+
}
|
|
529
|
+
yield (0, _effects.put)(_reducer.actions.setSSOState({
|
|
530
|
+
ssoConfigurations: newSsoConfigurations
|
|
531
|
+
}));
|
|
532
|
+
callback == null ? void 0 : callback(newSsoConfiguration);
|
|
533
|
+
} catch (error) {
|
|
534
|
+
callback == null ? void 0 : callback(null, error);
|
|
535
|
+
} finally {
|
|
536
|
+
yield (0, _effects.put)(_reducer.actions.setSSOLoader({
|
|
537
|
+
key: _interfaces.SSOStateKeys.SAVE_SSO_CONFIGURATION_BY_METADATA,
|
|
538
|
+
value: false
|
|
539
|
+
}));
|
|
540
|
+
}
|
|
541
|
+
}
|
|
459
542
|
function* ssoSagas() {
|
|
460
543
|
yield (0, _effects.takeEvery)(_reducer.actions.loadSSOConfigurationsV2, loadSSOConfigurationsV2);
|
|
461
544
|
yield (0, _effects.takeEvery)(_reducer.actions.saveSSOConfigurationV2, saveSSOConfigurationV2);
|
|
@@ -469,4 +552,6 @@ function* ssoSagas() {
|
|
|
469
552
|
yield (0, _effects.takeEvery)(_reducer.actions.setSSODefaultRoles, setSSODefaultRoles);
|
|
470
553
|
yield (0, _effects.takeEvery)(_reducer.actions.saveSSOConfigurationByMetadata, saveSSOConfigurationByMetadata);
|
|
471
554
|
yield (0, _effects.takeEvery)(_reducer.actions.updateSSOConfigurationByMetadata, updateSSOConfigurationByMetadata);
|
|
555
|
+
yield (0, _effects.takeEvery)(_reducer.actions.saveSSOConfigurationByUrl, saveSSOConfigurationByUrl);
|
|
556
|
+
yield (0, _effects.takeEvery)(_reducer.actions.saveSSOConfigurationByData, saveSSOConfigurationByData);
|
|
472
557
|
}
|
package/node/helpers.js
CHANGED
|
@@ -7,6 +7,8 @@ Object.defineProperty(exports, "__esModule", {
|
|
|
7
7
|
exports.createRandomString = createRandomString;
|
|
8
8
|
exports.generateActionCreator = generateActionCreator;
|
|
9
9
|
exports.generateCodeChallenge = generateCodeChallenge;
|
|
10
|
+
exports.generateCodeChallengeNative = generateCodeChallengeNative;
|
|
11
|
+
exports.generateCodeChallengePureJs = generateCodeChallengePureJs;
|
|
10
12
|
exports.getFeatureFlags = getFeatureFlags;
|
|
11
13
|
exports.omitProps = omitProps;
|
|
12
14
|
exports.readFileAsText = void 0;
|
|
@@ -14,6 +16,7 @@ var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends")
|
|
|
14
16
|
var _restApi = require("@frontegg/rest-api");
|
|
15
17
|
var _toolkit = require("@reduxjs/toolkit");
|
|
16
18
|
var _effects = require("redux-saga/effects");
|
|
19
|
+
var _jsSha = require("js-sha256");
|
|
17
20
|
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
18
21
|
function omitProps(props, keys) {
|
|
19
22
|
const newProps = (0, _extends2.default)({}, props);
|
|
@@ -27,12 +30,25 @@ function generateActionCreator(storeName) {
|
|
|
27
30
|
payload
|
|
28
31
|
})) : (0, _toolkit.createAction)(`${storeName}/${key}`);
|
|
29
32
|
}
|
|
30
|
-
async function
|
|
33
|
+
async function generateCodeChallengePureJs(codeVerifier) {
|
|
34
|
+
// noinspection TypeScriptValidateJSTypes pure sha256 recevie single params alg name
|
|
35
|
+
const digest = _jsSha.sha256.digest(new TextEncoder().encode(codeVerifier));
|
|
36
|
+
return btoa(String.fromCharCode(...new Uint8Array(digest))).replace(/=/g, '').replace(/\+/g, '-').replace(/\//g, '_');
|
|
37
|
+
}
|
|
38
|
+
async function generateCodeChallengeNative(codeVerifier) {
|
|
31
39
|
const digest = await crypto.subtle.digest('SHA-256', new TextEncoder().encode(codeVerifier));
|
|
32
|
-
|
|
33
|
-
// @ts-ignore
|
|
34
40
|
return btoa(String.fromCharCode(...new Uint8Array(digest))).replace(/=/g, '').replace(/\+/g, '-').replace(/\//g, '_');
|
|
35
41
|
}
|
|
42
|
+
async function generateCodeChallenge(codeVerifier) {
|
|
43
|
+
var _window$crypto, _window$crypto$subtle;
|
|
44
|
+
// @ts-expect-error Crypto.subtle not available in non-secure domains
|
|
45
|
+
if ((_window$crypto = window.crypto) != null && (_window$crypto$subtle = _window$crypto.subtle) != null && _window$crypto$subtle.digest) {
|
|
46
|
+
return generateCodeChallengeNative(codeVerifier);
|
|
47
|
+
} else {
|
|
48
|
+
console.warn('Generating CodeChallenge in non-secure domain:', window.location.origin);
|
|
49
|
+
return generateCodeChallengePureJs(codeVerifier);
|
|
50
|
+
}
|
|
51
|
+
}
|
|
36
52
|
function createRandomString(length = 16) {
|
|
37
53
|
let text = '';
|
|
38
54
|
const possible = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789';
|
package/node/index.js
CHANGED
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@frontegg/redux-store",
|
|
3
|
-
"version": "6.
|
|
3
|
+
"version": "6.87.0",
|
|
4
4
|
"main": "./node/index.js",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"author": "Frontegg LTD",
|
|
@@ -8,6 +8,7 @@
|
|
|
8
8
|
"@babel/runtime": "^7.18.6",
|
|
9
9
|
"@frontegg/rest-api": "^3.0.95",
|
|
10
10
|
"@reduxjs/toolkit": "^1.8.5",
|
|
11
|
+
"js-sha256": "0.9.0",
|
|
11
12
|
"redux-saga": "^1.2.1",
|
|
12
13
|
"uuid": "^8.3.2"
|
|
13
14
|
},
|