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 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-DlQ8NUBY.js"));
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-jFPbEFeK.js")) }), `./translations/${locale}.json`, 3).then(({ default: data }) => {
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-BbD-7Z4N.mjs");
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-f0TxVfx7.mjs") }), `./translations/${locale}.json`, 3).then(({ default: data }) => {
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-B525UaV3.js");
11
- const en = require("./en-jFPbEFeK.js");
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(designSystem.Flex, { gap: 4, marginTop: 5, marginBottom: 5, alignItems: "flex-start", children: [
93
- /* @__PURE__ */ jsxRuntime.jsx(designSystem.Box, { style: { flex: 1 }, children: /* @__PURE__ */ jsxRuntime.jsx(designSystem.Field.Root, { children: /* @__PURE__ */ jsxRuntime.jsx(
94
- designSystem.Field.Input,
95
- {
96
- type: "text",
97
- disabled: loading,
98
- value: email,
99
- hasError: Boolean(email && !isValidEmail()),
100
- onChange: (e) => setEmail(e.currentTarget.value),
101
- placeholder: formatMessage(getTrad("whitelist.email.placeholder"))
102
- }
103
- ) }) }),
104
- /* @__PURE__ */ jsxRuntime.jsx(designSystem.Box, { style: { flex: 1 }, children: /* @__PURE__ */ jsxRuntime.jsx(designSystem.Field.Root, { children: /* @__PURE__ */ jsxRuntime.jsx(
105
- designSystem.MultiSelect,
106
- {
107
- withTags: true,
108
- placeholder: formatMessage(getTrad("whitelist.roles.placeholder")),
109
- value: selectedRoles,
110
- onChange: (value) => {
111
- setSelectedRoles(value || []);
112
- },
113
- children: roles.map((role) => /* @__PURE__ */ jsxRuntime.jsx(designSystem.MultiSelectOption, { value: role.id.toString(), children: role.name }, role.id))
114
- }
115
- ) }) }),
116
- /* @__PURE__ */ jsxRuntime.jsx(designSystem.Box, { children: /* @__PURE__ */ jsxRuntime.jsx(
117
- designSystem.Button,
118
- {
119
- size: "L",
120
- startIcon: /* @__PURE__ */ jsxRuntime.jsx(icons.Plus, {}),
121
- disabled: loading || email.trim() === "" || !isValidEmail(),
122
- loading,
123
- onClick: onSaveEmail,
124
- children: formatMessage(getTrad("page.add"))
125
- }
126
- ) })
127
- ] }),
128
- /* @__PURE__ */ jsxRuntime.jsx(designSystem.Divider, {}),
129
- /* @__PURE__ */ jsxRuntime.jsxs(CustomTable, { colCount: 5, rowCount: users.length, children: [
130
- /* @__PURE__ */ jsxRuntime.jsx(designSystem.Thead, { children: /* @__PURE__ */ jsxRuntime.jsxs(designSystem.Tr, { children: [
131
- /* @__PURE__ */ jsxRuntime.jsx(designSystem.Th, { children: formatMessage(getTrad("whitelist.table.no")) }),
132
- /* @__PURE__ */ jsxRuntime.jsx(designSystem.Th, { children: formatMessage(getTrad("whitelist.table.email")) }),
133
- /* @__PURE__ */ jsxRuntime.jsx(designSystem.Th, { children: formatMessage(getTrad("whitelist.table.roles")) }),
134
- /* @__PURE__ */ jsxRuntime.jsx(designSystem.Th, { children: formatMessage(getTrad("whitelist.table.created")) }),
135
- /* @__PURE__ */ jsxRuntime.jsx(designSystem.Th, { style: { paddingRight: 0 }, children: " " })
136
- ] }) }),
137
- /* @__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) => {
138
- const getRoleNames = (roleIds) => roleIds.map((roleId) => {
139
- const r = roles.find((ro) => String(ro.id) === String(roleId));
140
- return r ? r.name : roleId;
141
- }).join(", ");
142
- let userRolesNames = getRoleNames(user.roles || []);
143
- if (!userRolesNames) {
144
- const defaultRolesIds = oidcRoles.reduce((acc, oidc) => {
145
- if (oidc.role) acc.push(...oidc.role);
146
- return acc;
147
- }, []);
148
- userRolesNames = getRoleNames(defaultRolesIds);
149
- }
150
- return /* @__PURE__ */ jsxRuntime.jsxs(designSystem.Tr, { children: [
151
- /* @__PURE__ */ jsxRuntime.jsx(designSystem.Td, { children: index2 + 1 + (page - 1) * PAGE_SIZE }),
152
- /* @__PURE__ */ jsxRuntime.jsx(designSystem.Td, { children: user.email }),
153
- /* @__PURE__ */ jsxRuntime.jsx(designSystem.Td, { children: userRolesNames || "-" }),
154
- /* @__PURE__ */ jsxRuntime.jsx(designSystem.Td, { children: /* @__PURE__ */ jsxRuntime.jsx(LocalizedDate, { date: user.createdAt }) }),
155
- /* @__PURE__ */ jsxRuntime.jsx(designSystem.Td, { style: { paddingRight: 0 }, children: /* @__PURE__ */ jsxRuntime.jsx(
156
- designSystem.Flex,
157
- {
158
- justifyContent: "flex-end",
159
- onClick: (e) => e.stopPropagation(),
160
- style: { width: "100%" },
161
- children: /* @__PURE__ */ jsxRuntime.jsxs(designSystem.Dialog.Root, { children: [
162
- /* @__PURE__ */ jsxRuntime.jsx(designSystem.Dialog.Trigger, { children: /* @__PURE__ */ jsxRuntime.jsx(
163
- designSystem.IconButton,
164
- {
165
- label: formatMessage(getTrad("whitelist.delete.label")),
166
- withTooltip: false,
167
- children: /* @__PURE__ */ jsxRuntime.jsx(icons.Trash, {})
168
- }
169
- ) }),
170
- /* @__PURE__ */ jsxRuntime.jsxs(designSystem.Dialog.Content, { children: [
171
- /* @__PURE__ */ jsxRuntime.jsx(designSystem.Dialog.Header, { children: formatMessage(getTrad("whitelist.delete.title")) }),
172
- /* @__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: [
173
- /* @__PURE__ */ jsxRuntime.jsx(designSystem.Flex, { justifyContent: "center", children: /* @__PURE__ */ jsxRuntime.jsx(designSystem.Typography, { id: "confirm-description", children: formatMessage(getTrad("whitelist.delete.description")) }) }),
174
- /* @__PURE__ */ jsxRuntime.jsx(designSystem.Flex, { justifyContent: "center", children: /* @__PURE__ */ jsxRuntime.jsx(designSystem.Typography, { variant: "omega", fontWeight: "bold", children: user.email }) }),
175
- /* @__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")) }) })
176
- ] }) }),
177
- /* @__PURE__ */ jsxRuntime.jsxs(designSystem.Dialog.Footer, { children: [
178
- /* @__PURE__ */ jsxRuntime.jsx(designSystem.Dialog.Cancel, { children: /* @__PURE__ */ jsxRuntime.jsx(designSystem.Button, { fullWidth: true, variant: "tertiary", children: formatMessage(getTrad("page.cancel")) }) }),
179
- /* @__PURE__ */ jsxRuntime.jsx(designSystem.Dialog.Action, { children: /* @__PURE__ */ jsxRuntime.jsx(
180
- designSystem.Button,
181
- {
182
- fullWidth: true,
183
- variant: "danger-light",
184
- onClick: () => onDelete(user.email),
185
- children: formatMessage(getTrad("page.ok"))
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
- ] }, user.email);
194
- }) })
195
- ] }),
196
- 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: [
197
- /* @__PURE__ */ jsxRuntime.jsx(
198
- designSystem.PreviousLink,
199
- {
200
- href: "#",
201
- onClick: (e) => {
202
- e.preventDefault();
203
- setPage((p) => Math.max(1, p - 1));
204
- },
205
- children: "Go to previous page"
206
- }
207
- ),
208
- Array.from({ length: pageCount }).map((_, i) => /* @__PURE__ */ jsxRuntime.jsxs(
209
- designSystem.PageLink,
210
- {
211
- number: i + 1,
212
- href: "#",
213
- onClick: (e) => {
214
- e.preventDefault();
215
- setPage(i + 1);
216
- },
217
- children: [
218
- "Go to page ",
219
- i + 1
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
- children: "Go to next page"
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
- position: fixed;
240
- left: 50%;
241
- transform: translateX(-50%);
242
- top: 2.875rem;
243
- z-index: 10;
244
- width: 31.25rem;
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({ onClose, count }) {
256
+ function MatchedUserAlertMessage({
257
+ onClose,
258
+ count
259
+ }) {
273
260
  const { formatMessage } = reactIntl.useIntl();
274
- const id = count > 1 ? "tab.whitelist.users_exists" : "tab.whitelist.user_exists";
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
- setUsers(users.filter((u) => u.email !== email));
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
- setUseWhitelist(e.target.checked);
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);