@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.
@@ -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;
@@ -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
- * contains the same functions in reducers and actions
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[];
@@ -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 generateCodeChallenge(codeVerifier) {
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
@@ -1,4 +1,4 @@
1
- /** @license Frontegg v6.85.0
1
+ /** @license Frontegg v6.87.0
2
2
  *
3
3
  * This source code is licensed under the MIT license found in the
4
4
  * LICENSE file in the root directory of this source tree.
@@ -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
- * contains the same functions in reducers and actions
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 generateCodeChallenge(codeVerifier) {
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
@@ -1,4 +1,4 @@
1
- /** @license Frontegg v6.85.0
1
+ /** @license Frontegg v6.87.0
2
2
  *
3
3
  * This source code is licensed under the MIT license found in the
4
4
  * LICENSE file in the root directory of this source tree.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@frontegg/redux-store",
3
- "version": "6.85.0",
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
  },