strapi-plugin-oidc 1.0.5 → 1.0.7
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/README.md +16 -2
- package/dist/admin/{en-jFPbEFeK.js → en-8UlbiAHW.js} +1 -0
- package/dist/admin/{en-f0TxVfx7.mjs → en-DInn-mdh.mjs} +1 -0
- package/dist/admin/{index-B525UaV3.js → index-Bc2bQNhu.js} +2 -2
- package/dist/admin/{index-D3AvxXlB.mjs → index-Cz9Q6j4e.mjs} +2 -2
- package/dist/admin/{index-DlQ8NUBY.js → index-DNIqscJT.js} +172 -186
- package/dist/admin/{index-BbD-7Z4N.mjs → index-V4-lA3hu.mjs} +172 -186
- package/dist/admin/index.js +1 -1
- package/dist/admin/index.mjs +1 -1
- package/dist/server/index.js +225 -65
- package/dist/server/index.mjs +225 -65
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -2,8 +2,11 @@
|
|
|
2
2
|
<img src="https://raw.githubusercontent.com/edmogeor/strapi-plugin-oidc/main/assets/icon.png" width="140" alt="OIDC Login for Strapi Logo"/>
|
|
3
3
|
<h1>OIDC Login for Strapi</h1>
|
|
4
4
|
<p>
|
|
5
|
+
<a href="https://www.npmjs.com/package/strapi-plugin-oidc">
|
|
6
|
+
<img src="https://img.shields.io/npm/v/strapi-plugin-oidc.svg" alt="npm version">
|
|
7
|
+
</a>
|
|
5
8
|
<a href="https://github.com/edmogeor/strapi-plugin-oidc/actions/workflows/test.yml">
|
|
6
|
-
<img src="https://github.com/edmogeor/strapi-plugin-oidc/actions/workflows/test.yml/badge.svg" alt="Tests">
|
|
9
|
+
<img src="https://github.com/edmogeor/strapi-plugin-oidc/actions/workflows/test.yml/badge.svg?branch=main" alt="Tests">
|
|
7
10
|
</a>
|
|
8
11
|
</p>
|
|
9
12
|
</div>
|
|
@@ -67,13 +70,22 @@ module.exports = ({ env }) => ({
|
|
|
67
70
|
|
|
68
71
|
Make sure to replace the placeholder values (e.g., `[Client ID from OpenID Provider]`) with the actual connection details from your chosen OIDC identity provider.
|
|
69
72
|
|
|
73
|
+
## How to Login
|
|
74
|
+
|
|
75
|
+
Once configured, you can initiate the OIDC login flow by navigating to:
|
|
76
|
+
`http://<your-strapi-domain>/strapi-plugin-oidc/oidc`
|
|
77
|
+
|
|
78
|
+
(e.g., `http://localhost:1337/strapi-plugin-oidc/oidc` for local development).
|
|
79
|
+
|
|
80
|
+
When the **Enforce OIDC Login** option is enabled in the Admin Settings, the standard Strapi admin login page will be automatically redirected to this URL.
|
|
81
|
+
|
|
70
82
|
## Admin Settings
|
|
71
83
|
|
|
72
84
|
Once the plugin is installed and configured, you can manage the OIDC settings from the Strapi Admin Panel under **Settings** > **OIDC Plugin**.
|
|
73
85
|
|
|
74
86
|
- **Whitelist Management**: Restrict login to specific users by adding their email addresses to the whitelist. You can also whitelist entire email domains (e.g., `*@company.com`). If the whitelist is empty, any user who successfully authenticates via your OIDC provider will be able to log in and an account will be automatically created for them.
|
|
75
87
|
- **Default Role Assignment**: Select the default Strapi admin role that will be assigned to newly created users when they log in for the first time via OIDC.
|
|
76
|
-
- **Enforce OIDC Login**: When enabled, the default Strapi email and password login form will be disabled, forcing all administrators to log in using your OIDC provider. _(Note: This option is automatically disabled and grayed out if your whitelist is empty to prevent accidentally locking everyone out of the admin panel)._
|
|
88
|
+
- **Enforce OIDC Login**: When enabled, the default Strapi email and password login form will be disabled and the standard login will be redirected to the OIDC login URL, forcing all administrators to log in using your OIDC provider. _(Note: This option is automatically disabled and grayed out if your whitelist is empty to prevent accidentally locking everyone out of the admin panel)._
|
|
77
89
|
|
|
78
90
|
## Credits & Changes
|
|
79
91
|
|
|
@@ -85,7 +97,9 @@ This plugin is a hard fork of the original [`strapi-plugin-sso`](https://github.
|
|
|
85
97
|
- Redesigned the Whitelist and Role management UI (switched to native Strapi cards, added pagination, etc.).
|
|
86
98
|
- Added an OIDC logout redirect URL.
|
|
87
99
|
- Added an option to "Enforce OIDC login" with an admin toggle (automatically disabled if the whitelist is empty).
|
|
100
|
+
- Added configurable "Remember Me" duration for sessions (`REMEMBER_ME_DAYS`).
|
|
88
101
|
- Migrated the testing framework to Vitest and added comprehensive test coverage for controllers and services.
|
|
89
102
|
- Cleaned up dead code and unused dependencies to improve maintainability.
|
|
90
103
|
- Upgraded to use newer versions of Node.js.
|
|
104
|
+
- Added styled success and error pages.
|
|
91
105
|
- Added misc. quality of life improvements and bug fixes.
|
|
@@ -11,6 +11,7 @@ const en = {
|
|
|
11
11
|
"page.cancel": "Cancel",
|
|
12
12
|
"page.ok": "OK",
|
|
13
13
|
"roles.title": "Default Role(s)",
|
|
14
|
+
"roles.placeholder": "Select default role(s)",
|
|
14
15
|
"whitelist.title": "Whitelist",
|
|
15
16
|
"whitelist.error.unique": "Already registered email address.",
|
|
16
17
|
"whitelist.enabled": "Whitelist is currently enabled.",
|
|
@@ -9,6 +9,7 @@ const en = {
|
|
|
9
9
|
"page.cancel": "Cancel",
|
|
10
10
|
"page.ok": "OK",
|
|
11
11
|
"roles.title": "Default Role(s)",
|
|
12
|
+
"roles.placeholder": "Select default role(s)",
|
|
12
13
|
"whitelist.title": "Whitelist",
|
|
13
14
|
"whitelist.error.unique": "Already registered email address.",
|
|
14
15
|
"whitelist.enabled": "Whitelist is currently enabled.",
|
|
@@ -55,7 +55,7 @@ const index = {
|
|
|
55
55
|
defaultMessage: "Configuration"
|
|
56
56
|
},
|
|
57
57
|
Component: async () => {
|
|
58
|
-
return await Promise.resolve().then(() => require("./index-
|
|
58
|
+
return await Promise.resolve().then(() => require("./index-DNIqscJT.js"));
|
|
59
59
|
},
|
|
60
60
|
permissions: [{ action: "plugin::strapi-plugin-oidc.read", subject: null }]
|
|
61
61
|
}
|
|
@@ -110,7 +110,7 @@ const index = {
|
|
|
110
110
|
async registerTrads({ locales }) {
|
|
111
111
|
const importedTrads = await Promise.all(
|
|
112
112
|
locales.map((locale) => {
|
|
113
|
-
return __variableDynamicImportRuntimeHelper(/* @__PURE__ */ Object.assign({ "./translations/en.json": () => Promise.resolve().then(() => require("./en-
|
|
113
|
+
return __variableDynamicImportRuntimeHelper(/* @__PURE__ */ Object.assign({ "./translations/en.json": () => Promise.resolve().then(() => require("./en-8UlbiAHW.js")) }), `./translations/${locale}.json`, 3).then(({ default: data }) => {
|
|
114
114
|
const newData = Object.fromEntries(
|
|
115
115
|
Object.entries(data).map(([key, value]) => [
|
|
116
116
|
key.startsWith("global.") ? key : getTranslation(key),
|
|
@@ -54,7 +54,7 @@ const index = {
|
|
|
54
54
|
defaultMessage: "Configuration"
|
|
55
55
|
},
|
|
56
56
|
Component: async () => {
|
|
57
|
-
return await import("./index-
|
|
57
|
+
return await import("./index-V4-lA3hu.mjs");
|
|
58
58
|
},
|
|
59
59
|
permissions: [{ action: "plugin::strapi-plugin-oidc.read", subject: null }]
|
|
60
60
|
}
|
|
@@ -109,7 +109,7 @@ const index = {
|
|
|
109
109
|
async registerTrads({ locales }) {
|
|
110
110
|
const importedTrads = await Promise.all(
|
|
111
111
|
locales.map((locale) => {
|
|
112
|
-
return __variableDynamicImportRuntimeHelper(/* @__PURE__ */ Object.assign({ "./translations/en.json": () => import("./en-
|
|
112
|
+
return __variableDynamicImportRuntimeHelper(/* @__PURE__ */ Object.assign({ "./translations/en.json": () => import("./en-DInn-mdh.mjs") }), `./translations/${locale}.json`, 3).then(({ default: data }) => {
|
|
113
113
|
const newData = Object.fromEntries(
|
|
114
114
|
Object.entries(data).map(([key, value]) => [
|
|
115
115
|
key.startsWith("global.") ? key : getTranslation(key),
|
|
@@ -7,8 +7,8 @@ const react = require("react");
|
|
|
7
7
|
const designSystem = require("@strapi/design-system");
|
|
8
8
|
const icons = require("@strapi/icons");
|
|
9
9
|
const reactIntl = require("react-intl");
|
|
10
|
-
const index = require("./index-
|
|
11
|
-
const en = require("./en-
|
|
10
|
+
const index = require("./index-Bc2bQNhu.js");
|
|
11
|
+
const en = require("./en-8UlbiAHW.js");
|
|
12
12
|
const styled = require("styled-components");
|
|
13
13
|
const _interopDefault = (e) => e && e.__esModule ? e : { default: e };
|
|
14
14
|
const styled__default = /* @__PURE__ */ _interopDefault(styled);
|
|
@@ -89,199 +89,177 @@ function Whitelist({
|
|
|
89
89
|
}, [email]);
|
|
90
90
|
return /* @__PURE__ */ jsxRuntime.jsx(jsxRuntime.Fragment, { children: /* @__PURE__ */ jsxRuntime.jsxs(designSystem.Box, { children: [
|
|
91
91
|
/* @__PURE__ */ jsxRuntime.jsx(designSystem.Typography, { tag: "p", variant: "omega", textColor: "neutral600", marginBottom: 4, children: formatMessage(getTrad("whitelist.description")) }),
|
|
92
|
-
/* @__PURE__ */ jsxRuntime.jsxs(
|
|
93
|
-
/* @__PURE__ */ jsxRuntime.
|
|
94
|
-
designSystem.Field.
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
designSystem.
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
designSystem.
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
/* @__PURE__ */ jsxRuntime.
|
|
131
|
-
/* @__PURE__ */ jsxRuntime.jsx(designSystem.
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
const
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
/* @__PURE__ */ jsxRuntime.
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
designSystem.
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
/* @__PURE__ */ jsxRuntime.
|
|
163
|
-
designSystem.
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
/* @__PURE__ */ jsxRuntime.
|
|
172
|
-
|
|
173
|
-
/* @__PURE__ */ jsxRuntime.jsx(designSystem.
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
/* @__PURE__ */ jsxRuntime.
|
|
179
|
-
|
|
180
|
-
designSystem.
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
92
|
+
useWhitelist && /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
|
|
93
|
+
/* @__PURE__ */ jsxRuntime.jsxs(designSystem.Flex, { gap: 4, marginTop: 5, marginBottom: 5, alignItems: "flex-start", children: [
|
|
94
|
+
/* @__PURE__ */ jsxRuntime.jsx(designSystem.Box, { style: { flex: 1 }, children: /* @__PURE__ */ jsxRuntime.jsx(designSystem.Field.Root, { children: /* @__PURE__ */ jsxRuntime.jsx(
|
|
95
|
+
designSystem.Field.Input,
|
|
96
|
+
{
|
|
97
|
+
type: "text",
|
|
98
|
+
disabled: loading,
|
|
99
|
+
value: email,
|
|
100
|
+
hasError: Boolean(email && !isValidEmail()),
|
|
101
|
+
onChange: (e) => setEmail(e.currentTarget.value),
|
|
102
|
+
placeholder: formatMessage(getTrad("whitelist.email.placeholder"))
|
|
103
|
+
}
|
|
104
|
+
) }) }),
|
|
105
|
+
/* @__PURE__ */ jsxRuntime.jsx(designSystem.Box, { style: { flex: 1 }, children: /* @__PURE__ */ jsxRuntime.jsx(designSystem.Field.Root, { children: /* @__PURE__ */ jsxRuntime.jsx(
|
|
106
|
+
designSystem.MultiSelect,
|
|
107
|
+
{
|
|
108
|
+
withTags: true,
|
|
109
|
+
placeholder: formatMessage(getTrad("whitelist.roles.placeholder")),
|
|
110
|
+
value: selectedRoles,
|
|
111
|
+
onChange: (value) => {
|
|
112
|
+
setSelectedRoles(value || []);
|
|
113
|
+
},
|
|
114
|
+
children: roles.map((role) => /* @__PURE__ */ jsxRuntime.jsx(designSystem.MultiSelectOption, { value: role.id.toString(), children: role.name }, role.id))
|
|
115
|
+
}
|
|
116
|
+
) }) }),
|
|
117
|
+
/* @__PURE__ */ jsxRuntime.jsx(designSystem.Box, { children: /* @__PURE__ */ jsxRuntime.jsx(
|
|
118
|
+
designSystem.Button,
|
|
119
|
+
{
|
|
120
|
+
size: "L",
|
|
121
|
+
startIcon: /* @__PURE__ */ jsxRuntime.jsx(icons.Plus, {}),
|
|
122
|
+
disabled: loading || email.trim() === "" || !isValidEmail(),
|
|
123
|
+
loading,
|
|
124
|
+
onClick: onSaveEmail,
|
|
125
|
+
children: formatMessage(getTrad("page.add"))
|
|
126
|
+
}
|
|
127
|
+
) })
|
|
128
|
+
] }),
|
|
129
|
+
/* @__PURE__ */ jsxRuntime.jsx(designSystem.Divider, {}),
|
|
130
|
+
/* @__PURE__ */ jsxRuntime.jsxs(CustomTable, { colCount: 5, rowCount: users.length, children: [
|
|
131
|
+
/* @__PURE__ */ jsxRuntime.jsx(designSystem.Thead, { children: /* @__PURE__ */ jsxRuntime.jsxs(designSystem.Tr, { children: [
|
|
132
|
+
/* @__PURE__ */ jsxRuntime.jsx(designSystem.Th, { children: formatMessage(getTrad("whitelist.table.no")) }),
|
|
133
|
+
/* @__PURE__ */ jsxRuntime.jsx(designSystem.Th, { children: formatMessage(getTrad("whitelist.table.email")) }),
|
|
134
|
+
/* @__PURE__ */ jsxRuntime.jsx(designSystem.Th, { children: formatMessage(getTrad("whitelist.table.roles")) }),
|
|
135
|
+
/* @__PURE__ */ jsxRuntime.jsx(designSystem.Th, { children: formatMessage(getTrad("whitelist.table.created")) }),
|
|
136
|
+
/* @__PURE__ */ jsxRuntime.jsx(designSystem.Th, { style: { paddingRight: 0 }, children: " " })
|
|
137
|
+
] }) }),
|
|
138
|
+
/* @__PURE__ */ jsxRuntime.jsx(designSystem.Tbody, { children: users.length === 0 ? /* @__PURE__ */ jsxRuntime.jsx(designSystem.Tr, { children: /* @__PURE__ */ jsxRuntime.jsx(designSystem.Td, { colSpan: 5, children: /* @__PURE__ */ jsxRuntime.jsx(designSystem.Flex, { justifyContent: "center", padding: 4, children: /* @__PURE__ */ jsxRuntime.jsx(designSystem.Typography, { textColor: "neutral600", children: formatMessage(getTrad("whitelist.table.empty")) }) }) }) }) : paginatedUsers.map((user, index2) => {
|
|
139
|
+
const getRoleNames = (roleIds) => roleIds.map((roleId) => {
|
|
140
|
+
const r = roles.find((ro) => String(ro.id) === String(roleId));
|
|
141
|
+
return r ? r.name : roleId;
|
|
142
|
+
}).join(", ");
|
|
143
|
+
let userRolesNames = getRoleNames(user.roles || []);
|
|
144
|
+
if (!userRolesNames) {
|
|
145
|
+
const defaultRolesIds = oidcRoles.reduce((acc, oidc) => {
|
|
146
|
+
if (oidc.role) acc.push(...oidc.role);
|
|
147
|
+
return acc;
|
|
148
|
+
}, []);
|
|
149
|
+
userRolesNames = getRoleNames(defaultRolesIds);
|
|
150
|
+
}
|
|
151
|
+
return /* @__PURE__ */ jsxRuntime.jsxs(designSystem.Tr, { children: [
|
|
152
|
+
/* @__PURE__ */ jsxRuntime.jsx(designSystem.Td, { children: index2 + 1 + (page - 1) * PAGE_SIZE }),
|
|
153
|
+
/* @__PURE__ */ jsxRuntime.jsx(designSystem.Td, { children: user.email }),
|
|
154
|
+
/* @__PURE__ */ jsxRuntime.jsx(designSystem.Td, { children: userRolesNames || "-" }),
|
|
155
|
+
/* @__PURE__ */ jsxRuntime.jsx(designSystem.Td, { children: /* @__PURE__ */ jsxRuntime.jsx(LocalizedDate, { date: user.createdAt }) }),
|
|
156
|
+
/* @__PURE__ */ jsxRuntime.jsx(designSystem.Td, { style: { paddingRight: 0 }, children: /* @__PURE__ */ jsxRuntime.jsx(
|
|
157
|
+
designSystem.Flex,
|
|
158
|
+
{
|
|
159
|
+
justifyContent: "flex-end",
|
|
160
|
+
onClick: (e) => e.stopPropagation(),
|
|
161
|
+
style: { width: "100%" },
|
|
162
|
+
children: /* @__PURE__ */ jsxRuntime.jsxs(designSystem.Dialog.Root, { children: [
|
|
163
|
+
/* @__PURE__ */ jsxRuntime.jsx(designSystem.Dialog.Trigger, { children: /* @__PURE__ */ jsxRuntime.jsx(
|
|
164
|
+
designSystem.IconButton,
|
|
165
|
+
{
|
|
166
|
+
label: formatMessage(getTrad("whitelist.delete.label")),
|
|
167
|
+
withTooltip: false,
|
|
168
|
+
children: /* @__PURE__ */ jsxRuntime.jsx(icons.Trash, {})
|
|
169
|
+
}
|
|
170
|
+
) }),
|
|
171
|
+
/* @__PURE__ */ jsxRuntime.jsxs(designSystem.Dialog.Content, { children: [
|
|
172
|
+
/* @__PURE__ */ jsxRuntime.jsx(designSystem.Dialog.Header, { children: formatMessage(getTrad("whitelist.delete.title")) }),
|
|
173
|
+
/* @__PURE__ */ jsxRuntime.jsx(designSystem.Dialog.Body, { icon: /* @__PURE__ */ jsxRuntime.jsx(icons.WarningCircle, { fill: "danger600" }), children: /* @__PURE__ */ jsxRuntime.jsxs(designSystem.Flex, { direction: "column", alignItems: "center", gap: 2, children: [
|
|
174
|
+
/* @__PURE__ */ jsxRuntime.jsx(designSystem.Flex, { justifyContent: "center", children: /* @__PURE__ */ jsxRuntime.jsx(designSystem.Typography, { id: "confirm-description", children: formatMessage(getTrad("whitelist.delete.description")) }) }),
|
|
175
|
+
/* @__PURE__ */ jsxRuntime.jsx(designSystem.Flex, { justifyContent: "center", children: /* @__PURE__ */ jsxRuntime.jsx(designSystem.Typography, { variant: "omega", fontWeight: "bold", children: user.email }) }),
|
|
176
|
+
/* @__PURE__ */ jsxRuntime.jsx(designSystem.Flex, { justifyContent: "center", marginTop: 2, children: /* @__PURE__ */ jsxRuntime.jsx(designSystem.Typography, { variant: "pi", textColor: "neutral600", children: formatMessage(getTrad("whitelist.delete.note")) }) })
|
|
177
|
+
] }) }),
|
|
178
|
+
/* @__PURE__ */ jsxRuntime.jsxs(designSystem.Dialog.Footer, { children: [
|
|
179
|
+
/* @__PURE__ */ jsxRuntime.jsx(designSystem.Dialog.Cancel, { children: /* @__PURE__ */ jsxRuntime.jsx(designSystem.Button, { fullWidth: true, variant: "tertiary", children: formatMessage(getTrad("page.cancel")) }) }),
|
|
180
|
+
/* @__PURE__ */ jsxRuntime.jsx(designSystem.Dialog.Action, { children: /* @__PURE__ */ jsxRuntime.jsx(
|
|
181
|
+
designSystem.Button,
|
|
182
|
+
{
|
|
183
|
+
fullWidth: true,
|
|
184
|
+
variant: "danger-light",
|
|
185
|
+
onClick: () => onDelete(user.email),
|
|
186
|
+
children: formatMessage(getTrad("page.ok"))
|
|
187
|
+
}
|
|
188
|
+
) })
|
|
189
|
+
] })
|
|
188
190
|
] })
|
|
189
191
|
] })
|
|
190
|
-
|
|
191
|
-
}
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
]
|
|
221
|
-
},
|
|
222
|
-
i + 1
|
|
223
|
-
)),
|
|
224
|
-
/* @__PURE__ */ jsxRuntime.jsx(
|
|
225
|
-
designSystem.NextLink,
|
|
226
|
-
{
|
|
227
|
-
href: "#",
|
|
228
|
-
onClick: (e) => {
|
|
229
|
-
e.preventDefault();
|
|
230
|
-
setPage((p) => Math.min(pageCount, p + 1));
|
|
192
|
+
}
|
|
193
|
+
) })
|
|
194
|
+
] }, user.email);
|
|
195
|
+
}) })
|
|
196
|
+
] }),
|
|
197
|
+
pageCount > 1 && /* @__PURE__ */ jsxRuntime.jsx(designSystem.Box, { paddingTop: 4, children: /* @__PURE__ */ jsxRuntime.jsx(designSystem.Flex, { justifyContent: "flex-end", children: /* @__PURE__ */ jsxRuntime.jsxs(designSystem.Pagination, { activePage: page, pageCount, children: [
|
|
198
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
199
|
+
designSystem.PreviousLink,
|
|
200
|
+
{
|
|
201
|
+
href: "#",
|
|
202
|
+
onClick: (e) => {
|
|
203
|
+
e.preventDefault();
|
|
204
|
+
setPage((p) => Math.max(1, p - 1));
|
|
205
|
+
},
|
|
206
|
+
children: "Go to previous page"
|
|
207
|
+
}
|
|
208
|
+
),
|
|
209
|
+
Array.from({ length: pageCount }).map((_, i) => /* @__PURE__ */ jsxRuntime.jsxs(
|
|
210
|
+
designSystem.PageLink,
|
|
211
|
+
{
|
|
212
|
+
number: i + 1,
|
|
213
|
+
href: "#",
|
|
214
|
+
onClick: (e) => {
|
|
215
|
+
e.preventDefault();
|
|
216
|
+
setPage(i + 1);
|
|
217
|
+
},
|
|
218
|
+
children: [
|
|
219
|
+
"Go to page ",
|
|
220
|
+
i + 1
|
|
221
|
+
]
|
|
231
222
|
},
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
223
|
+
i + 1
|
|
224
|
+
)),
|
|
225
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
226
|
+
designSystem.NextLink,
|
|
227
|
+
{
|
|
228
|
+
href: "#",
|
|
229
|
+
onClick: (e) => {
|
|
230
|
+
e.preventDefault();
|
|
231
|
+
setPage((p) => Math.min(pageCount, p + 1));
|
|
232
|
+
},
|
|
233
|
+
children: "Go to next page"
|
|
234
|
+
}
|
|
235
|
+
)
|
|
236
|
+
] }) }) })
|
|
237
|
+
] })
|
|
236
238
|
] }) });
|
|
237
239
|
}
|
|
238
240
|
const AlertMessage = styled__default.default.div`
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
241
|
+
position: fixed;
|
|
242
|
+
left: 50%;
|
|
243
|
+
transform: translateX(-50%);
|
|
244
|
+
top: 2.875rem;
|
|
245
|
+
z-index: 10;
|
|
246
|
+
width: 31.25rem;
|
|
245
247
|
`;
|
|
246
248
|
function SuccessAlertMessage({ onClose }) {
|
|
247
249
|
const { formatMessage } = reactIntl.useIntl();
|
|
248
|
-
return /* @__PURE__ */ jsxRuntime.jsx(AlertMessage, { children: /* @__PURE__ */ jsxRuntime.jsx(
|
|
249
|
-
designSystem.Alert,
|
|
250
|
-
{
|
|
251
|
-
title: "Success",
|
|
252
|
-
variant: "success",
|
|
253
|
-
closeLabel: "",
|
|
254
|
-
onClose,
|
|
255
|
-
children: formatMessage(getTrad("page.save.success"))
|
|
256
|
-
}
|
|
257
|
-
) });
|
|
250
|
+
return /* @__PURE__ */ jsxRuntime.jsx(AlertMessage, { children: /* @__PURE__ */ jsxRuntime.jsx(designSystem.Alert, { title: "Success", variant: "success", closeLabel: "", onClose, children: formatMessage(getTrad("page.save.success")) }) });
|
|
258
251
|
}
|
|
259
252
|
function ErrorAlertMessage({ onClose }) {
|
|
260
253
|
const { formatMessage } = reactIntl.useIntl();
|
|
261
|
-
return /* @__PURE__ */ jsxRuntime.jsx(AlertMessage, { children: /* @__PURE__ */ jsxRuntime.jsx(
|
|
262
|
-
designSystem.Alert,
|
|
263
|
-
{
|
|
264
|
-
title: "Error",
|
|
265
|
-
variant: "danger",
|
|
266
|
-
closeLabel: "",
|
|
267
|
-
onClose,
|
|
268
|
-
children: formatMessage(getTrad("page.save.error"))
|
|
269
|
-
}
|
|
270
|
-
) });
|
|
254
|
+
return /* @__PURE__ */ jsxRuntime.jsx(AlertMessage, { children: /* @__PURE__ */ jsxRuntime.jsx(designSystem.Alert, { title: "Error", variant: "danger", closeLabel: "", onClose, children: formatMessage(getTrad("page.save.error")) }) });
|
|
271
255
|
}
|
|
272
|
-
function MatchedUserAlertMessage({
|
|
256
|
+
function MatchedUserAlertMessage({
|
|
257
|
+
onClose,
|
|
258
|
+
count
|
|
259
|
+
}) {
|
|
273
260
|
const { formatMessage } = reactIntl.useIntl();
|
|
274
|
-
const id = count > 1 ? "
|
|
275
|
-
return /* @__PURE__ */ jsxRuntime.jsx(AlertMessage, { children: /* @__PURE__ */ jsxRuntime.jsx(
|
|
276
|
-
designSystem.Alert,
|
|
277
|
-
{
|
|
278
|
-
title: "Info",
|
|
279
|
-
variant: "default",
|
|
280
|
-
closeLabel: "",
|
|
281
|
-
onClose,
|
|
282
|
-
children: formatMessage(getTrad(id))
|
|
283
|
-
}
|
|
284
|
-
) });
|
|
261
|
+
const id = count > 1 ? "whitelist.users_exists" : "whitelist.user_exists";
|
|
262
|
+
return /* @__PURE__ */ jsxRuntime.jsx(AlertMessage, { children: /* @__PURE__ */ jsxRuntime.jsx(designSystem.Alert, { title: "Info", variant: "default", closeLabel: "", onClose, children: formatMessage(getTrad(id)) }) });
|
|
285
263
|
}
|
|
286
264
|
const SwitchContainer = styled__default.default.label`
|
|
287
265
|
position: relative;
|
|
@@ -395,10 +373,18 @@ function useOidcSettings() {
|
|
|
395
373
|
setUsers([...users, newUser]);
|
|
396
374
|
};
|
|
397
375
|
const onDeleteWhitelist = async (email) => {
|
|
398
|
-
|
|
376
|
+
const updatedUsers = users.filter((u) => u.email !== email);
|
|
377
|
+
setUsers(updatedUsers);
|
|
378
|
+
if (useWhitelist && updatedUsers.length === 0) {
|
|
379
|
+
setEnforceOIDC(false);
|
|
380
|
+
}
|
|
399
381
|
};
|
|
400
382
|
const onToggleWhitelist = (e) => {
|
|
401
|
-
|
|
383
|
+
const checked = e.target.checked;
|
|
384
|
+
setUseWhitelist(checked);
|
|
385
|
+
if (checked && users.length === 0) {
|
|
386
|
+
setEnforceOIDC(false);
|
|
387
|
+
}
|
|
402
388
|
};
|
|
403
389
|
const onToggleEnforce = (e) => {
|
|
404
390
|
setEnforceOIDC(e.target.checked);
|
|
@@ -413,13 +399,13 @@ function useOidcSettings() {
|
|
|
413
399
|
role: role.role
|
|
414
400
|
}))
|
|
415
401
|
});
|
|
402
|
+
const syncResponse = await put("/strapi-plugin-oidc/whitelist/sync", {
|
|
403
|
+
users: users.map((u) => ({ email: u.email, roles: u.roles }))
|
|
404
|
+
});
|
|
416
405
|
await put("/strapi-plugin-oidc/whitelist/settings", {
|
|
417
406
|
useWhitelist,
|
|
418
407
|
enforceOIDC
|
|
419
408
|
});
|
|
420
|
-
const syncResponse = await put("/strapi-plugin-oidc/whitelist/sync", {
|
|
421
|
-
users: users.map((u) => ({ email: u.email, roles: u.roles }))
|
|
422
|
-
});
|
|
423
409
|
setInitialOIDCRoles(JSON.parse(JSON.stringify(oidcRoles)));
|
|
424
410
|
setInitialUseWhitelist(useWhitelist);
|
|
425
411
|
setInitialEnforceOIDC(enforceOIDC);
|