@truedat/auth 7.5.9 → 7.5.10
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/package.json +40 -64
- package/src/groups/components/EditGroup.js +0 -1
- package/src/groups/components/Group.js +0 -1
- package/src/groups/components/GroupBreadcrumbs.js +1 -2
- package/src/groups/components/GroupCard.js +3 -3
- package/src/groups/components/GroupCards.js +2 -3
- package/src/groups/components/GroupForm.js +0 -1
- package/src/groups/components/GroupLoader.js +19 -51
- package/src/groups/components/GroupUsers.js +4 -3
- package/src/groups/components/GroupUsersTable.js +4 -4
- package/src/groups/components/GroupsLoader.js +2 -2
- package/src/groups/components/GroupsSearchLoader.js +1 -1
- package/src/groups/components/NewGroup.js +0 -1
- package/src/groups/components/__tests__/Group.spec.js +0 -1
- package/src/groups/components/__tests__/GroupCard.spec.js +23 -7
- package/src/groups/components/__tests__/GroupCards.spec.js +9 -6
- package/src/groups/components/__tests__/GroupLoader.spec.js +71 -0
- package/src/groups/components/__tests__/GroupUsers.spec.js +8 -12
- package/src/groups/components/__tests__/GroupUsersTable.spec.js +34 -42
- package/src/groups/components/__tests__/GroupsSearchLoader.spec.js +0 -1
- package/src/groups/components/__tests__/__snapshots__/Group.spec.js.snap +1 -2
- package/src/groups/components/__tests__/__snapshots__/GroupCard.spec.js.snap +43 -94
- package/src/groups/components/__tests__/__snapshots__/GroupCards.spec.js.snap +118 -53
- package/src/groups/components/__tests__/__snapshots__/GroupLoader.spec.js.snap +11 -0
- package/src/groups/components/__tests__/__snapshots__/GroupUsers.spec.js.snap +38 -45
- package/src/groups/components/__tests__/__snapshots__/GroupUsersTable.spec.js.snap +121 -213
- package/src/groups/components/index.js +1 -1
- package/src/groups/sagas/__tests__/deleteGroupUser.spec.js +6 -6
- package/src/groups/sagas/deleteGroup.js +1 -1
- package/src/groups/sagas/deleteGroupUser.js +2 -2
- package/src/groups/sagas/fetchGroup.js +1 -1
- package/src/groups/sagas/updateGroup.js +1 -1
- package/src/roles/components/NewRole.js +0 -1
- package/src/roles/components/PermissionGroup.js +0 -1
- package/src/roles/components/Role.js +8 -3
- package/src/roles/components/RoleCards.js +2 -3
- package/src/roles/components/RoleForm.js +1 -1
- package/src/roles/components/RoleLoader.js +26 -39
- package/src/roles/components/RoleRoutes.js +29 -32
- package/src/roles/components/RoleSelector.js +0 -1
- package/src/roles/components/Roles.js +1 -3
- package/src/roles/components/RolesLoader.js +2 -2
- package/src/roles/components/__tests__/PermissionGroup.spec.js +7 -17
- package/src/roles/components/__tests__/Role.spec.js +0 -1
- package/src/roles/components/__tests__/RoleCards.spec.js +11 -10
- package/src/roles/components/__tests__/RoleRoutes.spec.js +53 -7
- package/src/roles/components/__tests__/RoleSelector.spec.js +0 -1
- package/src/roles/components/__tests__/Roles.spec.js +2 -3
- package/src/roles/components/__tests__/__snapshots__/PermissionGroup.spec.js.snap +3 -5
- package/src/roles/components/__tests__/__snapshots__/Role.spec.js.snap +4 -4
- package/src/roles/components/__tests__/__snapshots__/RoleCards.spec.js.snap +57 -127
- package/src/roles/components/__tests__/__snapshots__/RoleRoutes.spec.js.snap +38 -5
- package/src/roles/components/__tests__/__snapshots__/RoleSelector.spec.js.snap +1 -1
- package/src/roles/components/__tests__/__snapshots__/Roles.spec.js.snap +6 -3
- package/src/roles/components/index.js +1 -1
- package/src/roles/reducers/rolePermissions.js +1 -1
- package/src/roles/reducers/roleRedirect.js +1 -1
- package/src/roles/sagas/deleteRole.js +1 -1
- package/src/roles/sagas/fetchRole.js +1 -1
- package/src/roles/sagas/fetchRolePermissions.js +1 -1
- package/src/roles/sagas/updateRole.js +1 -1
- package/src/roles/sagas/updateRolePermissions.js +1 -1
- package/src/sessions/components/Auth0Callback.js +5 -4
- package/src/sessions/components/Auth0LoginButton.js +2 -2
- package/src/sessions/components/AuthMethodsLoader.js +10 -19
- package/src/sessions/components/LoginButtons.js +4 -4
- package/src/sessions/components/NonceCallback.js +21 -38
- package/src/sessions/components/OidcLoginButton.js +0 -1
- package/src/sessions/components/OpenIDConnect.js +5 -4
- package/src/sessions/components/PrivateRoute.js +25 -57
- package/src/sessions/components/ProxyLoginCallback.js +0 -2
- package/src/sessions/components/SamlCallback.js +0 -2
- package/src/sessions/components/UnauthorizedRoute.js +28 -31
- package/src/sessions/components/__tests__/Auth0LoginButton.spec.js +12 -12
- package/src/sessions/components/__tests__/AuthMethodsLoader.spec.js +15 -12
- package/src/sessions/components/__tests__/NonceCallback.spec.js +84 -0
- package/src/sessions/components/__tests__/OidcLoginButton.spec.js +10 -10
- package/src/sessions/components/__tests__/OpenIDConnect.spec.js +7 -8
- package/src/sessions/components/__tests__/PrivateRoute.spec.js +90 -0
- package/src/sessions/components/__tests__/UnauthorizedRoute.spec.js +88 -0
- package/src/sessions/components/__tests__/__snapshots__/Auth0LoginButton.spec.js.snap +22 -24
- package/src/sessions/components/__tests__/__snapshots__/NonceCallback.spec.js.snap +18 -0
- package/src/sessions/components/__tests__/__snapshots__/OidcLoginButton.spec.js.snap +18 -18
- package/src/sessions/components/__tests__/__snapshots__/PrivateRoute.spec.js.snap +9 -0
- package/src/sessions/components/__tests__/__snapshots__/UnauthorizedRoute.spec.js.snap +9 -0
- package/src/sessions/components/index.js +1 -1
- package/src/sessions/sagas/__tests__/login.spec.js +4 -4
- package/src/sessions/sagas/__tests__/refresh.spec.js +2 -2
- package/src/sessions/sagas/__tests__/token.spec.js +4 -4
- package/src/sessions/sagas/login.js +5 -5
- package/src/sessions/sagas/refresh.js +2 -2
- package/src/sessions/sagas/token.js +2 -2
- package/src/users/components/AdminUserRoutes.js +35 -51
- package/src/users/components/EditUser.js +0 -1
- package/src/users/components/GroupUserCrumbs.js +8 -8
- package/src/users/components/InitialUser.js +0 -1
- package/src/users/components/NewUser.js +0 -1
- package/src/users/components/Password.js +0 -1
- package/src/users/components/User.js +2 -2
- package/src/users/components/UserAclRow.js +1 -2
- package/src/users/components/UserAcls.js +0 -1
- package/src/users/components/UserActions.js +1 -2
- package/src/users/components/UserBreadcrumbs.js +2 -3
- package/src/users/components/UserCard.js +3 -3
- package/src/users/components/UserCards.js +5 -4
- package/src/users/components/UserDomainsFilter.js +2 -5
- package/src/users/components/UserForm.js +8 -33
- package/src/users/components/UserGroupAclRow.js +1 -2
- package/src/users/components/UserGroupAcls.js +0 -1
- package/src/users/components/UserLoader.js +21 -48
- package/src/users/components/UserPassword.js +0 -1
- package/src/users/components/UserRoutes.js +73 -7
- package/src/users/components/UserSelector.js +0 -1
- package/src/users/components/UserTabs.js +1 -2
- package/src/users/components/UsersAndGroups.js +6 -6
- package/src/users/components/UsersLoader.js +2 -2
- package/src/users/components/UsersSearchLoader.js +2 -1
- package/src/users/components/__tests__/CanInitLoader.spec.js +6 -13
- package/src/users/components/__tests__/EditUser.spec.js +4 -33
- package/src/users/components/__tests__/InitialUser.spec.js +4 -34
- package/src/users/components/__tests__/NewUser.spec.js +4 -35
- package/src/users/components/__tests__/Password.spec.js +59 -69
- package/src/users/components/__tests__/User.spec.js +1 -2
- package/src/users/components/__tests__/UserAclRow.spec.js +5 -7
- package/src/users/components/__tests__/UserAcls.spec.js +8 -9
- package/src/users/components/__tests__/UserActions.spec.js +4 -5
- package/src/users/components/__tests__/UserCard.spec.js +11 -11
- package/src/users/components/__tests__/UserCards.spec.js +39 -31
- package/src/users/components/__tests__/UserDomainsFilter.spec.js +12 -22
- package/src/users/components/__tests__/UserForm.spec.js +24 -44
- package/src/users/components/__tests__/UserGroupAclRow.spec.js +1 -2
- package/src/users/components/__tests__/UserGroupAcls.spec.js +8 -9
- package/src/users/components/__tests__/UserLoader.spec.js +85 -0
- package/src/users/components/__tests__/UserPassword.spec.js +8 -21
- package/src/users/components/__tests__/UserRoutes.spec.js +129 -4
- package/src/users/components/__tests__/UserSelector.spec.js +0 -1
- package/src/users/components/__tests__/UsersAndGroups.spec.js +45 -5
- package/src/users/components/__tests__/UsersSearchLoader.spec.js +0 -1
- package/src/users/components/__tests__/__snapshots__/EditUser.spec.js.snap +23 -21
- package/src/users/components/__tests__/__snapshots__/InitialUser.spec.js.snap +22 -21
- package/src/users/components/__tests__/__snapshots__/NewUser.spec.js.snap +25 -23
- package/src/users/components/__tests__/__snapshots__/Password.spec.js.snap +8 -7
- package/src/users/components/__tests__/__snapshots__/User.spec.js.snap +7 -6
- package/src/users/components/__tests__/__snapshots__/UserAclRow.spec.js.snap +12 -11
- package/src/users/components/__tests__/__snapshots__/UserActions.spec.js.snap +56 -67
- package/src/users/components/__tests__/__snapshots__/UserCard.spec.js.snap +56 -70
- package/src/users/components/__tests__/__snapshots__/UserCards.spec.js.snap +117 -83
- package/src/users/components/__tests__/__snapshots__/UserDomainsFilter.spec.js.snap +2 -2
- package/src/users/components/__tests__/__snapshots__/UserForm.spec.js.snap +21 -20
- package/src/users/components/__tests__/__snapshots__/UserLoader.spec.js.snap +3 -0
- package/src/users/components/__tests__/__snapshots__/UserPassword.spec.js.snap +9 -7
- package/src/users/components/__tests__/__snapshots__/UserRoutes.spec.js.snap +170 -16
- package/src/users/components/__tests__/__snapshots__/UserSelector.spec.js.snap +1 -1
- package/src/users/components/__tests__/__snapshots__/UsersAndGroups.spec.js.snap +75 -14
- package/src/users/sagas/__tests__/fetchUser.spec.js +3 -5
- package/src/users/sagas/__tests__/updateUser.spec.js +1 -1
- package/src/users/sagas/deleteUser.js +1 -1
- package/src/users/sagas/fetchUser.js +1 -1
- package/src/users/sagas/updateUser.js +1 -1
- package/src/users/components/__tests__/__snapshots__/CanInitLoader.spec.js.snap +0 -3
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
import React from "react";
|
|
2
|
+
import { render, waitForLoad } from "@truedat/test/render";
|
|
3
|
+
import { LOGIN, UNAUTHORIZED } from "@truedat/core/routes";
|
|
4
|
+
import PrivateRoute from "../PrivateRoute";
|
|
5
|
+
|
|
6
|
+
jest.mock("react-router", () => ({
|
|
7
|
+
...jest.requireActual("react-router"),
|
|
8
|
+
useLocation: jest.fn().mockReturnValue({ pathname: "/current" }),
|
|
9
|
+
Navigate: ({ to: { pathname } }) => <div>Navigate to {pathname}</div>,
|
|
10
|
+
}));
|
|
11
|
+
|
|
12
|
+
describe("<PrivateRoute />", () => {
|
|
13
|
+
const TestComponent = () => <div>Test Component</div>;
|
|
14
|
+
|
|
15
|
+
it("matches the latest snapshot", async () => {
|
|
16
|
+
const rendered = render(<PrivateRoute component={TestComponent} />, {
|
|
17
|
+
state: {
|
|
18
|
+
authentication: {
|
|
19
|
+
token: "valid-token",
|
|
20
|
+
entitlements: { some: "permission" },
|
|
21
|
+
},
|
|
22
|
+
},
|
|
23
|
+
});
|
|
24
|
+
await waitForLoad(rendered);
|
|
25
|
+
expect(rendered.container).toMatchSnapshot();
|
|
26
|
+
});
|
|
27
|
+
|
|
28
|
+
it("redirects to login when no token", async () => {
|
|
29
|
+
const rendered = render(<PrivateRoute component={TestComponent} />, {
|
|
30
|
+
state: {
|
|
31
|
+
authentication: {
|
|
32
|
+
token: null,
|
|
33
|
+
entitlements: {},
|
|
34
|
+
},
|
|
35
|
+
},
|
|
36
|
+
});
|
|
37
|
+
await waitForLoad(rendered);
|
|
38
|
+
|
|
39
|
+
expect(rendered.getByText(`Navigate to ${LOGIN}`)).toBeInTheDocument();
|
|
40
|
+
});
|
|
41
|
+
|
|
42
|
+
it("redirects to unauthorized when token but no permissions", async () => {
|
|
43
|
+
const rendered = render(<PrivateRoute component={TestComponent} />, {
|
|
44
|
+
state: {
|
|
45
|
+
authentication: {
|
|
46
|
+
token: "valid-token",
|
|
47
|
+
entitlements: {},
|
|
48
|
+
},
|
|
49
|
+
},
|
|
50
|
+
});
|
|
51
|
+
await waitForLoad(rendered);
|
|
52
|
+
|
|
53
|
+
expect(
|
|
54
|
+
rendered.getByText(`Navigate to ${UNAUTHORIZED}`)
|
|
55
|
+
).toBeInTheDocument();
|
|
56
|
+
});
|
|
57
|
+
|
|
58
|
+
it("renders component when token and permissions exist", async () => {
|
|
59
|
+
const rendered = render(<PrivateRoute component={TestComponent} />, {
|
|
60
|
+
state: {
|
|
61
|
+
authentication: {
|
|
62
|
+
token: "valid-token",
|
|
63
|
+
entitlements: { some: "permission" },
|
|
64
|
+
},
|
|
65
|
+
},
|
|
66
|
+
});
|
|
67
|
+
await waitForLoad(rendered);
|
|
68
|
+
|
|
69
|
+
expect(rendered.getByText(/test component/i)).toBeInTheDocument();
|
|
70
|
+
});
|
|
71
|
+
|
|
72
|
+
it("dispatches retrieveToken when token is undefined", async () => {
|
|
73
|
+
const mockDispatch = jest.fn();
|
|
74
|
+
const rendered = render(
|
|
75
|
+
<PrivateRoute component={TestComponent} path="/" />,
|
|
76
|
+
{
|
|
77
|
+
state: {
|
|
78
|
+
authentication: {
|
|
79
|
+
token: undefined,
|
|
80
|
+
entitlements: {},
|
|
81
|
+
},
|
|
82
|
+
},
|
|
83
|
+
dispatch: mockDispatch,
|
|
84
|
+
}
|
|
85
|
+
);
|
|
86
|
+
await waitForLoad(rendered);
|
|
87
|
+
|
|
88
|
+
expect(mockDispatch).toHaveBeenCalled();
|
|
89
|
+
});
|
|
90
|
+
});
|
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
import React from "react";
|
|
2
|
+
import { render, waitForLoad } from "@truedat/test/render";
|
|
3
|
+
import { LOGIN } from "@truedat/core/routes";
|
|
4
|
+
import UnauthorizedRoute from "../UnauthorizedRoute";
|
|
5
|
+
|
|
6
|
+
jest.mock("react-router", () => ({
|
|
7
|
+
...jest.requireActual("react-router"),
|
|
8
|
+
useLocation: jest.fn().mockReturnValue({ pathname: "/current" }),
|
|
9
|
+
Navigate: ({ to: { pathname } }) => <div>Navigate to {pathname}</div>,
|
|
10
|
+
}));
|
|
11
|
+
|
|
12
|
+
describe("<UnauthorizedRoute />", () => {
|
|
13
|
+
const TestComponent = () => <div>Test Component</div>;
|
|
14
|
+
|
|
15
|
+
it("matches the latest snapshot", async () => {
|
|
16
|
+
const rendered = render(<UnauthorizedRoute component={TestComponent} />, {
|
|
17
|
+
state: {
|
|
18
|
+
authentication: {
|
|
19
|
+
token: "valid-token",
|
|
20
|
+
entitlements: {},
|
|
21
|
+
},
|
|
22
|
+
},
|
|
23
|
+
});
|
|
24
|
+
await waitForLoad(rendered);
|
|
25
|
+
expect(rendered.container).toMatchSnapshot();
|
|
26
|
+
});
|
|
27
|
+
|
|
28
|
+
it("redirects to login when no token", async () => {
|
|
29
|
+
const rendered = render(<UnauthorizedRoute component={TestComponent} />, {
|
|
30
|
+
state: {
|
|
31
|
+
authentication: {
|
|
32
|
+
token: null,
|
|
33
|
+
entitlements: {},
|
|
34
|
+
},
|
|
35
|
+
},
|
|
36
|
+
});
|
|
37
|
+
await waitForLoad(rendered);
|
|
38
|
+
|
|
39
|
+
expect(rendered.getByText(`Navigate to ${LOGIN}`)).toBeInTheDocument();
|
|
40
|
+
});
|
|
41
|
+
|
|
42
|
+
it("redirects to login when token and permissions exist", async () => {
|
|
43
|
+
const rendered = render(<UnauthorizedRoute component={TestComponent} />, {
|
|
44
|
+
state: {
|
|
45
|
+
authentication: {
|
|
46
|
+
token: "valid-token",
|
|
47
|
+
entitlements: { some: "permission" },
|
|
48
|
+
},
|
|
49
|
+
},
|
|
50
|
+
});
|
|
51
|
+
await waitForLoad(rendered);
|
|
52
|
+
|
|
53
|
+
expect(rendered.getByText(`Navigate to ${LOGIN}`)).toBeInTheDocument();
|
|
54
|
+
});
|
|
55
|
+
|
|
56
|
+
it("renders component when token exists but no permissions", async () => {
|
|
57
|
+
const rendered = render(<UnauthorizedRoute component={TestComponent} />, {
|
|
58
|
+
state: {
|
|
59
|
+
authentication: {
|
|
60
|
+
token: "valid-token",
|
|
61
|
+
entitlements: {},
|
|
62
|
+
},
|
|
63
|
+
},
|
|
64
|
+
});
|
|
65
|
+
await waitForLoad(rendered);
|
|
66
|
+
|
|
67
|
+
expect(rendered.getByText(/test component/i)).toBeInTheDocument();
|
|
68
|
+
});
|
|
69
|
+
|
|
70
|
+
it("dispatches retrieveToken when token is undefined", async () => {
|
|
71
|
+
const mockDispatch = jest.fn();
|
|
72
|
+
const rendered = render(
|
|
73
|
+
<UnauthorizedRoute component={TestComponent} path="/" />,
|
|
74
|
+
{
|
|
75
|
+
state: {
|
|
76
|
+
authentication: {
|
|
77
|
+
token: undefined,
|
|
78
|
+
entitlements: {},
|
|
79
|
+
},
|
|
80
|
+
},
|
|
81
|
+
dispatch: mockDispatch,
|
|
82
|
+
}
|
|
83
|
+
);
|
|
84
|
+
await waitForLoad(rendered);
|
|
85
|
+
|
|
86
|
+
expect(mockDispatch).toHaveBeenCalled();
|
|
87
|
+
});
|
|
88
|
+
});
|
|
@@ -1,29 +1,27 @@
|
|
|
1
1
|
// Jest Snapshot v1, https://goo.gl/fbAQLP
|
|
2
2
|
|
|
3
|
-
exports[`<Auth0LoginButton /> matches the latest snapshot 1`] = `
|
|
4
|
-
<
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
>
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
</a>
|
|
3
|
+
exports[`<Auth0LoginButton /> matches the latest snapshot with a default icon 1`] = `
|
|
4
|
+
<div>
|
|
5
|
+
<a
|
|
6
|
+
class="ui button yellow fluid"
|
|
7
|
+
>
|
|
8
|
+
<i
|
|
9
|
+
class="sign-in icon"
|
|
10
|
+
/>
|
|
11
|
+
login.form.actions.auth0
|
|
12
|
+
</a>
|
|
13
|
+
</div>
|
|
15
14
|
`;
|
|
16
15
|
|
|
17
|
-
exports[`<Auth0LoginButton /> matches the latest snapshot with
|
|
18
|
-
<
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
>
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
</a>
|
|
16
|
+
exports[`<Auth0LoginButton /> matches the latest snapshot with custom icon 1`] = `
|
|
17
|
+
<div>
|
|
18
|
+
<a
|
|
19
|
+
class="ui button yellow fluid"
|
|
20
|
+
>
|
|
21
|
+
<i
|
|
22
|
+
class="user icon"
|
|
23
|
+
/>
|
|
24
|
+
login.form.actions.auth0
|
|
25
|
+
</a>
|
|
26
|
+
</div>
|
|
29
27
|
`;
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
// Jest Snapshot v1, https://goo.gl/fbAQLP
|
|
2
|
+
|
|
3
|
+
exports[`<NonceCallback /> matches the latest snapshot 1`] = `
|
|
4
|
+
<div>
|
|
5
|
+
<div>
|
|
6
|
+
Navigate to
|
|
7
|
+
/
|
|
8
|
+
</div>
|
|
9
|
+
</div>
|
|
10
|
+
`;
|
|
11
|
+
|
|
12
|
+
exports[`<NonceCallback /> shows loading when no token or redirect exists 1`] = `
|
|
13
|
+
<div>
|
|
14
|
+
<div
|
|
15
|
+
class="ui active loader"
|
|
16
|
+
/>
|
|
17
|
+
</div>
|
|
18
|
+
`;
|
|
@@ -1,23 +1,23 @@
|
|
|
1
1
|
// Jest Snapshot v1, https://goo.gl/fbAQLP
|
|
2
2
|
|
|
3
|
-
exports[`<OidcLoginButton /> matches the latest snapshot 1`] = `
|
|
4
|
-
<
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
</
|
|
3
|
+
exports[`<OidcLoginButton /> matches the latest snapshot with a default icon 1`] = `
|
|
4
|
+
<div>
|
|
5
|
+
<a
|
|
6
|
+
class="ui secondary button yellow"
|
|
7
|
+
href="https://auth.oidc.org/authorize?foo=bar"
|
|
8
|
+
>
|
|
9
|
+
login.form.actions.oidc
|
|
10
|
+
</a>
|
|
11
|
+
</div>
|
|
12
12
|
`;
|
|
13
13
|
|
|
14
|
-
exports[`<OidcLoginButton /> matches the latest snapshot with
|
|
15
|
-
<
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
</
|
|
14
|
+
exports[`<OidcLoginButton /> matches the latest snapshot with custom icon 1`] = `
|
|
15
|
+
<div>
|
|
16
|
+
<a
|
|
17
|
+
class="ui secondary button yellow"
|
|
18
|
+
href="https://auth.oidc.org/authorize?foo=bar"
|
|
19
|
+
>
|
|
20
|
+
login.form.actions.oidc
|
|
21
|
+
</a>
|
|
22
|
+
</div>
|
|
23
23
|
`;
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import
|
|
1
|
+
import { jwtDecode } from "jwt-decode";
|
|
2
2
|
import { takeLatest } from "redux-saga/effects";
|
|
3
3
|
import { testSaga } from "redux-saga-test-plan";
|
|
4
4
|
import {
|
|
@@ -59,7 +59,7 @@ describe("sagas: post login", () => {
|
|
|
59
59
|
.next({ data })
|
|
60
60
|
.call(saveToken, token)
|
|
61
61
|
.next()
|
|
62
|
-
.call(
|
|
62
|
+
.call(jwtDecode, token)
|
|
63
63
|
.next({
|
|
64
64
|
amr,
|
|
65
65
|
entitlements,
|
|
@@ -136,7 +136,7 @@ describe("sagas: openIdLogin", () => {
|
|
|
136
136
|
.next({ data })
|
|
137
137
|
.call(saveToken, token)
|
|
138
138
|
.next()
|
|
139
|
-
.call(
|
|
139
|
+
.call(jwtDecode, token)
|
|
140
140
|
.next({
|
|
141
141
|
amr,
|
|
142
142
|
entitlements,
|
|
@@ -192,7 +192,7 @@ describe("sagas: openIdLogin", () => {
|
|
|
192
192
|
.next({ data })
|
|
193
193
|
.call(saveToken, token)
|
|
194
194
|
.next()
|
|
195
|
-
.call(
|
|
195
|
+
.call(jwtDecode, token)
|
|
196
196
|
.next({
|
|
197
197
|
amr,
|
|
198
198
|
entitlements,
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import
|
|
1
|
+
import { jwtDecode } from "jwt-decode";
|
|
2
2
|
import { testSaga } from "redux-saga-test-plan";
|
|
3
3
|
import { takeLatest } from "redux-saga/effects";
|
|
4
4
|
import { apiJsonPost, JSON_OPTS } from "@truedat/core/services/api";
|
|
@@ -65,7 +65,7 @@ describe("sagas: refreshSaga", () => {
|
|
|
65
65
|
.next({ data })
|
|
66
66
|
.call(saveToken, token)
|
|
67
67
|
.next()
|
|
68
|
-
.call(
|
|
68
|
+
.call(jwtDecode, token)
|
|
69
69
|
.next({ amr, entitlements, exp, groups, role, user_name })
|
|
70
70
|
.put(
|
|
71
71
|
refreshSession.success({
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import _ from "lodash/fp";
|
|
2
|
-
import
|
|
2
|
+
import { jwtDecode } from "jwt-decode";
|
|
3
3
|
import { testSaga } from "redux-saga-test-plan";
|
|
4
4
|
import { readToken as readTokenFromStorage } from "@truedat/core/services/storage";
|
|
5
5
|
import { tokenRequestSaga, checkExpired, readToken } from "../token";
|
|
@@ -36,13 +36,13 @@ describe("sagas: read token", () => {
|
|
|
36
36
|
const groups = ["business_glossary"];
|
|
37
37
|
const entitlements = ["p"];
|
|
38
38
|
|
|
39
|
-
it("should call readTokenFromStorage,
|
|
39
|
+
it("should call readTokenFromStorage, jwtDecode and checkExpired", () => {
|
|
40
40
|
expect(() => {
|
|
41
41
|
testSaga(readToken)
|
|
42
42
|
.next()
|
|
43
43
|
.call(readTokenFromStorage)
|
|
44
44
|
.next(token)
|
|
45
|
-
.call(
|
|
45
|
+
.call(jwtDecode, token)
|
|
46
46
|
.next({ user_name, entitlements, exp, role, groups })
|
|
47
47
|
.call(checkExpired, exp)
|
|
48
48
|
.next(false)
|
|
@@ -68,7 +68,7 @@ describe("sagas: read token", () => {
|
|
|
68
68
|
.next()
|
|
69
69
|
.call(readTokenFromStorage)
|
|
70
70
|
.next(token)
|
|
71
|
-
.call(
|
|
71
|
+
.call(jwtDecode, token)
|
|
72
72
|
.next({ user_name, exp })
|
|
73
73
|
.call(checkExpired, exp)
|
|
74
74
|
.next(true)
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import _ from "lodash/fp";
|
|
2
|
-
import
|
|
2
|
+
import { jwtDecode } from "jwt-decode";
|
|
3
3
|
import { all, call, put, takeLatest } from "redux-saga/effects";
|
|
4
4
|
import {
|
|
5
5
|
apiJsonPost,
|
|
@@ -24,7 +24,7 @@ export function* auth0LoginSaga({ payload }) {
|
|
|
24
24
|
const { token } = data;
|
|
25
25
|
yield call(saveToken, token);
|
|
26
26
|
const { amr, entitlements, exp, groups, role, user_name } = yield call(
|
|
27
|
-
|
|
27
|
+
jwtDecode,
|
|
28
28
|
token
|
|
29
29
|
);
|
|
30
30
|
yield put(
|
|
@@ -59,7 +59,7 @@ export function* openIdLoginSaga({ payload }) {
|
|
|
59
59
|
const { token } = data;
|
|
60
60
|
yield call(saveToken, token);
|
|
61
61
|
const { amr, entitlements, exp, groups, role, user_name } = yield call(
|
|
62
|
-
|
|
62
|
+
jwtDecode,
|
|
63
63
|
token
|
|
64
64
|
);
|
|
65
65
|
yield put(
|
|
@@ -90,7 +90,7 @@ export function* nonceLoginSaga({ payload }) {
|
|
|
90
90
|
const { token } = data;
|
|
91
91
|
yield call(saveToken, token);
|
|
92
92
|
const { amr, entitlements, exp, groups, role, user_name } = yield call(
|
|
93
|
-
|
|
93
|
+
jwtDecode,
|
|
94
94
|
token
|
|
95
95
|
);
|
|
96
96
|
yield put(
|
|
@@ -124,7 +124,7 @@ export function* postLoginSaga({ payload }) {
|
|
|
124
124
|
const { token } = data;
|
|
125
125
|
yield call(saveToken, token);
|
|
126
126
|
const { amr, entitlements, exp, groups, role, user_name } = yield call(
|
|
127
|
-
|
|
127
|
+
jwtDecode,
|
|
128
128
|
token
|
|
129
129
|
);
|
|
130
130
|
yield put(
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import
|
|
1
|
+
import { jwtDecode } from "jwt-decode";
|
|
2
2
|
import { all, call, put, takeLatest, delay } from "redux-saga/effects";
|
|
3
3
|
import { apiJsonPost, JSON_OPTS } from "@truedat/core/services/api";
|
|
4
4
|
import { saveToken } from "@truedat/core/services/storage";
|
|
@@ -33,7 +33,7 @@ export function* refreshSaga({ payload }) {
|
|
|
33
33
|
const { token } = data;
|
|
34
34
|
yield call(saveToken, token);
|
|
35
35
|
const { amr, entitlements, exp, groups, role, user_name } = yield call(
|
|
36
|
-
|
|
36
|
+
jwtDecode,
|
|
37
37
|
token
|
|
38
38
|
);
|
|
39
39
|
yield put(
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import
|
|
1
|
+
import { jwtDecode } from "jwt-decode";
|
|
2
2
|
import { call, put, takeLatest } from "redux-saga/effects";
|
|
3
3
|
import { readToken as readTokenFromStorage } from "@truedat/core/services/storage";
|
|
4
4
|
import { retrieveToken } from "../routines";
|
|
@@ -16,7 +16,7 @@ export function* readToken() {
|
|
|
16
16
|
const token = yield call(readTokenFromStorage);
|
|
17
17
|
if (token) {
|
|
18
18
|
const { amr, entitlements, exp, groups, role, user_name } = yield call(
|
|
19
|
-
|
|
19
|
+
jwtDecode,
|
|
20
20
|
token
|
|
21
21
|
);
|
|
22
22
|
const isExpired = yield call(checkExpired, exp);
|
|
@@ -1,8 +1,9 @@
|
|
|
1
1
|
import React from "react";
|
|
2
|
-
import { Route,
|
|
2
|
+
import { Route, Routes } from "react-router";
|
|
3
3
|
import { Divider, Segment } from "semantic-ui-react";
|
|
4
4
|
import { Unauthorized } from "@truedat/core/components";
|
|
5
5
|
import { useActiveRoute, useAuthorized } from "@truedat/core/hooks";
|
|
6
|
+
import { ProtectedRoute, Loader } from "@truedat/core/router";
|
|
6
7
|
import {
|
|
7
8
|
GROUP,
|
|
8
9
|
GROUP_CREATE,
|
|
@@ -31,65 +32,38 @@ import UserPassword from "./UserPassword";
|
|
|
31
32
|
|
|
32
33
|
const UsersGroupsLoader = () => (
|
|
33
34
|
<>
|
|
34
|
-
<
|
|
35
|
-
<
|
|
35
|
+
<UsersLoader />
|
|
36
|
+
<GroupsLoader />
|
|
36
37
|
</>
|
|
37
38
|
);
|
|
38
39
|
|
|
39
40
|
const UserRoutes = () => (
|
|
40
|
-
<
|
|
41
|
-
<Route
|
|
42
|
-
<Route
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
</>
|
|
50
|
-
)}
|
|
51
|
-
/>
|
|
52
|
-
<Route
|
|
53
|
-
exact
|
|
54
|
-
path={USER_EDIT}
|
|
55
|
-
render={() => (
|
|
56
|
-
<>
|
|
57
|
-
<UserLoader />
|
|
58
|
-
<EditUser />
|
|
59
|
-
</>
|
|
60
|
-
)}
|
|
61
|
-
/>
|
|
62
|
-
<Route exact path={USERS} component={UsersAndGroups} />
|
|
63
|
-
<Route
|
|
64
|
-
exact
|
|
65
|
-
path={USER_EDIT_PASSWORD}
|
|
66
|
-
render={() => (
|
|
67
|
-
<>
|
|
68
|
-
<UserLoader />
|
|
69
|
-
<UserPassword />
|
|
70
|
-
</>
|
|
71
|
-
)}
|
|
72
|
-
/>
|
|
73
|
-
</Switch>
|
|
41
|
+
<Routes>
|
|
42
|
+
<Route index element={<UsersAndGroups />} />
|
|
43
|
+
<Route path="new" element={<NewUser />} />
|
|
44
|
+
<Route path=":id" element={<Loader loaders={<UserLoader />} />}>
|
|
45
|
+
<Route index element={<User />} />
|
|
46
|
+
<Route path="edit" element={<EditUser />} />
|
|
47
|
+
<Route path="password" element={<UserPassword />} />
|
|
48
|
+
</Route>
|
|
49
|
+
</Routes>
|
|
74
50
|
);
|
|
75
51
|
|
|
76
52
|
const GroupRoutes = () => (
|
|
77
|
-
<
|
|
78
|
-
<Route
|
|
53
|
+
<Routes>
|
|
54
|
+
<Route path={GROUP_CREATE} element={<NewGroup />} />
|
|
79
55
|
<Route
|
|
80
|
-
exact
|
|
81
56
|
path={GROUP_EDIT}
|
|
82
|
-
|
|
57
|
+
element={
|
|
83
58
|
<>
|
|
84
59
|
<GroupLoader />
|
|
85
60
|
<EditGroup />
|
|
86
61
|
</>
|
|
87
|
-
|
|
62
|
+
}
|
|
88
63
|
/>
|
|
89
64
|
<Route
|
|
90
|
-
exact
|
|
91
65
|
path={GROUP}
|
|
92
|
-
|
|
66
|
+
element={
|
|
93
67
|
<>
|
|
94
68
|
<GroupUserCrumbs action="show" />
|
|
95
69
|
<Segment>
|
|
@@ -99,10 +73,11 @@ const GroupRoutes = () => (
|
|
|
99
73
|
<GroupUsers />
|
|
100
74
|
</Segment>
|
|
101
75
|
</>
|
|
102
|
-
|
|
76
|
+
}
|
|
103
77
|
/>
|
|
104
|
-
<Route
|
|
105
|
-
|
|
78
|
+
<Route path={GROUPS} element={<UsersAndGroups />} />
|
|
79
|
+
<Route path="*" element={null} />
|
|
80
|
+
</Routes>
|
|
106
81
|
);
|
|
107
82
|
|
|
108
83
|
export const AdminUserRoutes = () => {
|
|
@@ -113,16 +88,25 @@ export const AdminUserRoutes = () => {
|
|
|
113
88
|
return (
|
|
114
89
|
<>
|
|
115
90
|
{authorized && active && <UsersGroupsLoader />}
|
|
116
|
-
<
|
|
91
|
+
<Routes>
|
|
117
92
|
<Route
|
|
118
93
|
path={USERS}
|
|
119
|
-
|
|
94
|
+
element={
|
|
95
|
+
<ProtectedRoute>
|
|
96
|
+
<UserRoutes />
|
|
97
|
+
</ProtectedRoute>
|
|
98
|
+
}
|
|
120
99
|
/>
|
|
121
100
|
<Route
|
|
122
101
|
path={GROUPS}
|
|
123
|
-
|
|
102
|
+
element={
|
|
103
|
+
<ProtectedRoute>
|
|
104
|
+
<GroupRoutes />
|
|
105
|
+
</ProtectedRoute>
|
|
106
|
+
}
|
|
124
107
|
/>
|
|
125
|
-
|
|
108
|
+
<Route path="*" element={null} />
|
|
109
|
+
</Routes>
|
|
126
110
|
</>
|
|
127
111
|
);
|
|
128
112
|
};
|
|
@@ -1,8 +1,7 @@
|
|
|
1
|
-
import React from "react";
|
|
2
1
|
import PropTypes from "prop-types";
|
|
3
2
|
import { Breadcrumb } from "semantic-ui-react";
|
|
4
3
|
import { connect } from "react-redux";
|
|
5
|
-
import { Link } from "react-router
|
|
4
|
+
import { Link } from "react-router";
|
|
6
5
|
import { FormattedMessage } from "react-intl";
|
|
7
6
|
import { GROUPS, linkTo } from "@truedat/core/routes";
|
|
8
7
|
|
|
@@ -13,20 +12,19 @@ export const GroupUserCrumbs = ({ group, groupLoading, action }) => {
|
|
|
13
12
|
<Breadcrumb.Section as={Link} to={GROUPS} active={false}>
|
|
14
13
|
<FormattedMessage id="groups.crumbs.top" />
|
|
15
14
|
</Breadcrumb.Section>
|
|
16
|
-
|
|
17
|
-
{action == "show" && (
|
|
15
|
+
{action === "show" && (
|
|
18
16
|
<>
|
|
19
17
|
<Breadcrumb.Divider icon="right angle" />
|
|
20
18
|
{group.name}
|
|
21
19
|
</>
|
|
22
20
|
)}
|
|
23
|
-
{action
|
|
21
|
+
{action === "add" && (
|
|
24
22
|
<>
|
|
25
23
|
<Breadcrumb.Divider icon="right angle" />
|
|
26
24
|
<Breadcrumb.Section
|
|
27
25
|
as={Link}
|
|
28
26
|
to={linkTo.GROUP({ id: group.id })}
|
|
29
|
-
active={action
|
|
27
|
+
active={action === "show"}
|
|
30
28
|
>
|
|
31
29
|
{group.name}
|
|
32
30
|
</Breadcrumb.Section>
|
|
@@ -40,11 +38,13 @@ export const GroupUserCrumbs = ({ group, groupLoading, action }) => {
|
|
|
40
38
|
|
|
41
39
|
GroupUserCrumbs.propTypes = {
|
|
42
40
|
group: PropTypes.object,
|
|
43
|
-
groupLoading: PropTypes.bool
|
|
41
|
+
groupLoading: PropTypes.bool,
|
|
42
|
+
action: PropTypes.string,
|
|
44
43
|
};
|
|
45
44
|
|
|
46
45
|
const mapStateToProps = ({ group, groupLoading }) => ({
|
|
47
46
|
group,
|
|
48
|
-
groupLoading
|
|
47
|
+
groupLoading,
|
|
49
48
|
});
|
|
49
|
+
|
|
50
50
|
export default connect(mapStateToProps)(GroupUserCrumbs);
|