strapi-plugin-oidc 1.1.2 → 1.2.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.
@@ -7,8 +7,7 @@ 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-Csm9fJS0.js");
11
- const en = require("./en-8UlbiAHW.js");
10
+ const index = require("./index-XREqyWao.js");
12
11
  const styled = require("styled-components");
13
12
  const _interopDefault = (e) => e && e.__esModule ? e : { default: e };
14
13
  const styled__default = /* @__PURE__ */ _interopDefault(styled);
@@ -16,7 +15,7 @@ function getTrad(id) {
16
15
  const pluginIdWithId = `${index.pluginId}.${id}`;
17
16
  return {
18
17
  id: pluginIdWithId,
19
- defaultMessage: en.default[id] || pluginIdWithId
18
+ defaultMessage: index.en[id] || pluginIdWithId
20
19
  };
21
20
  }
22
21
  function Role({ oidcRoles, roles, onChangeRole }) {
@@ -5,8 +5,7 @@ import { useState, useCallback, useEffect, memo } from "react";
5
5
  import { Typography, Flex, Box, MultiSelect, MultiSelectOption, Field, Button, Divider, Thead, Tr, Th, Tbody, Td, Dialog, IconButton, Pagination, PreviousLink, PageLink, NextLink, Table, Alert } from "@strapi/design-system";
6
6
  import { Plus, Trash, WarningCircle } from "@strapi/icons";
7
7
  import { useIntl } from "react-intl";
8
- import { p as pluginId } from "./index-DxsqJhUk.mjs";
9
- import en from "./en-DInn-mdh.mjs";
8
+ import { e as en, p as pluginId } from "./index-bfZQKCve.mjs";
10
9
  import styled from "styled-components";
11
10
  function getTrad(id) {
12
11
  const pluginIdWithId = `${pluginId}.${id}`;
@@ -0,0 +1,254 @@
1
+ "use strict";
2
+ const react = require("react");
3
+ const __variableDynamicImportRuntimeHelper = (glob, path, segs) => {
4
+ const v = glob[path];
5
+ if (v) {
6
+ return typeof v === "function" ? v() : Promise.resolve(v);
7
+ }
8
+ return new Promise((_, reject) => {
9
+ (typeof queueMicrotask === "function" ? queueMicrotask : setTimeout)(
10
+ reject.bind(
11
+ null,
12
+ new Error(
13
+ "Unknown variable dynamic import: " + path + (path.split("/").length !== segs ? ". Note that variables only represent file names one level deep." : "")
14
+ )
15
+ )
16
+ );
17
+ });
18
+ };
19
+ const name$1 = "strapi-plugin-oidc";
20
+ const strapi = { "displayName": "OIDC Plugin" };
21
+ const pluginPkg = {
22
+ name: name$1,
23
+ strapi
24
+ };
25
+ const pluginId = pluginPkg.name.replace(/^@strapi\/plugin-/i, "");
26
+ function getTranslation(id) {
27
+ return `${pluginId}.${id}`;
28
+ }
29
+ function Initializer({ setPlugin }) {
30
+ const ref = react.useRef();
31
+ ref.current = setPlugin;
32
+ react.useEffect(() => {
33
+ if (ref.current) {
34
+ ref.current(pluginId);
35
+ }
36
+ }, []);
37
+ return null;
38
+ }
39
+ const en = {
40
+ "global.plugins.strapi-plugin-oidc": "OIDC Plugin",
41
+ "page.title": "Configure OIDC default role(s) and access controls.",
42
+ "roles.notes": "Select the default role(s) assigned to new users upon their first login. This setting does not affect existing users.",
43
+ "page.save": "Save Changes",
44
+ "page.save.success": "Updated settings",
45
+ "page.save.error": "Update failed.",
46
+ "page.add": "Add",
47
+ "page.cancel": "Cancel",
48
+ "page.ok": "OK",
49
+ "roles.title": "Default Role(s)",
50
+ "roles.placeholder": "Select default role(s)",
51
+ "whitelist.title": "Whitelist",
52
+ "whitelist.error.unique": "Already registered email address.",
53
+ "whitelist.enabled": "Whitelist is currently enabled.",
54
+ "whitelist.disabled": "Whitelist is currently disabled.",
55
+ "whitelist.description": "Restrict OIDC authentication to specific email addresses and optionally assign them custom role(s).",
56
+ "whitelist.user_exists": "User already exists, matching existing role(s)",
57
+ "whitelist.users_exists": "Users already exist, matching existing role(s)",
58
+ "whitelist.table.no": "No.",
59
+ "whitelist.table.email": "Email",
60
+ "whitelist.table.created": "Created At",
61
+ "whitelist.delete.title": "Confirmation",
62
+ "whitelist.delete.description": "Are you sure you want to delete:",
63
+ "whitelist.delete.note": "This will not delete the user account in Strapi.",
64
+ "whitelist.toggle.enabled": "Enabled",
65
+ "whitelist.toggle.disabled": "Disabled",
66
+ "whitelist.email.placeholder": "Email address",
67
+ "whitelist.roles.placeholder": "Select specific role(s)",
68
+ "whitelist.table.roles": "Role(s)",
69
+ "whitelist.table.roles.default": "Default",
70
+ "whitelist.table.empty": "No email addresses",
71
+ "whitelist.delete.label": "Delete",
72
+ "page.title.oidc": "OIDC",
73
+ "enforce.title": "Enforce OIDC Login",
74
+ "enforce.toggle.enabled": "Enabled",
75
+ "enforce.toggle.disabled": "Disabled",
76
+ "enforce.warning": "Make sure OIDC is setup correctly before saving changes, you won't be able to login normally.",
77
+ "login.sso": "Login via SSO"
78
+ };
79
+ const en$1 = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({
80
+ __proto__: null,
81
+ default: en
82
+ }, Symbol.toStringTag, { value: "Module" }));
83
+ const name = pluginPkg.strapi.displayName;
84
+ const index = {
85
+ register(app) {
86
+ app.addSettingsLink(
87
+ {
88
+ id: "oidc",
89
+ intlLabel: {
90
+ id: `${pluginId}.settings.section`,
91
+ defaultMessage: "OIDC"
92
+ }
93
+ },
94
+ {
95
+ id: "configuration",
96
+ to: `/settings/${pluginId}`,
97
+ intlLabel: {
98
+ id: `${pluginId}.settings.configuration`,
99
+ defaultMessage: "Configuration"
100
+ },
101
+ Component: async () => {
102
+ return await Promise.resolve().then(() => require("./index-BzRgsk9F.js"));
103
+ },
104
+ permissions: [{ action: "plugin::strapi-plugin-oidc.read", subject: null }]
105
+ }
106
+ );
107
+ app.registerPlugin({
108
+ id: pluginId,
109
+ initializer: Initializer,
110
+ name
111
+ });
112
+ },
113
+ bootstrap() {
114
+ let isLogoutInProgress = false;
115
+ let historyPatched = false;
116
+ const ENFORCE_CACHE_KEY = "strapi_oidc_enforced";
117
+ const isAuthRoute = (path) => /\/auth\/(login|register|forgot-password|reset-password)/.test(path);
118
+ const patchHistory = () => {
119
+ if (historyPatched) return;
120
+ historyPatched = true;
121
+ const interceptHistory = (originalMethod) => {
122
+ return function(...args) {
123
+ const url = args[2];
124
+ if (url && typeof url === "string") {
125
+ const urlWithoutQuery = url.split("?")[0].split("#")[0];
126
+ if (isAuthRoute(urlWithoutQuery)) {
127
+ if (isLogoutInProgress) {
128
+ return;
129
+ }
130
+ window.location.href = "/strapi-plugin-oidc/oidc";
131
+ return;
132
+ }
133
+ }
134
+ return originalMethod.apply(window.history, args);
135
+ };
136
+ };
137
+ window.history.pushState = interceptHistory(window.history.pushState);
138
+ window.history.replaceState = interceptHistory(window.history.replaceState);
139
+ if (isAuthRoute(window.location.pathname)) {
140
+ window.location.replace("/strapi-plugin-oidc/oidc");
141
+ }
142
+ };
143
+ let ssoButtonInjected = false;
144
+ let ssoObserver = null;
145
+ const injectSSOButton = () => {
146
+ if (ssoButtonInjected) return;
147
+ if (!isAuthRoute(window.location.pathname)) return;
148
+ if (document.getElementById("strapi-oidc-sso-btn")) return;
149
+ const submitButton = document.querySelector('form button[type="submit"]');
150
+ if (!submitButton?.parentNode) return;
151
+ const btn = document.createElement("button");
152
+ btn.id = "strapi-oidc-sso-btn";
153
+ btn.type = "button";
154
+ btn.className = submitButton.className;
155
+ btn.style.marginTop = "8px";
156
+ btn.onclick = () => {
157
+ window.location.href = "/strapi-plugin-oidc/oidc";
158
+ };
159
+ const innerSpan = submitButton.querySelector("span");
160
+ const span = document.createElement("span");
161
+ if (innerSpan) span.className = innerSpan.className;
162
+ span.textContent = en["login.sso"];
163
+ btn.appendChild(span);
164
+ submitButton.parentNode.insertBefore(btn, submitButton.nextSibling);
165
+ ssoButtonInjected = true;
166
+ };
167
+ const startSSOButtonObserver = () => {
168
+ if (ssoObserver) return;
169
+ injectSSOButton();
170
+ ssoObserver = new MutationObserver(() => {
171
+ if (isAuthRoute(window.location.pathname)) injectSSOButton();
172
+ });
173
+ ssoObserver.observe(document.body, { childList: true, subtree: true });
174
+ };
175
+ const stopSSOButtonObserver = () => {
176
+ ssoObserver?.disconnect();
177
+ ssoObserver = null;
178
+ document.getElementById("strapi-oidc-sso-btn")?.remove();
179
+ ssoButtonInjected = false;
180
+ };
181
+ if (localStorage.getItem(ENFORCE_CACHE_KEY) === "1") {
182
+ patchHistory();
183
+ }
184
+ const checkEnforceOIDC = async () => {
185
+ try {
186
+ const response = await window.fetch("/strapi-plugin-oidc/settings/public");
187
+ if (response.ok) {
188
+ const data = await response.json();
189
+ if (data.enforceOIDC) {
190
+ localStorage.setItem(ENFORCE_CACHE_KEY, "1");
191
+ stopSSOButtonObserver();
192
+ patchHistory();
193
+ } else {
194
+ localStorage.removeItem(ENFORCE_CACHE_KEY);
195
+ startSSOButtonObserver();
196
+ }
197
+ }
198
+ } catch (error) {
199
+ console.error("Failed to check OIDC enforcement setting:", error);
200
+ }
201
+ };
202
+ checkEnforceOIDC();
203
+ const originalFetch = window.fetch;
204
+ window.fetch = async (...args) => {
205
+ const url = typeof args[0] === "string" ? args[0] : args[0].url;
206
+ const isLogout = url && url.endsWith("/admin/logout") && args[1]?.method?.toUpperCase() === "POST";
207
+ if (isLogout) {
208
+ isLogoutInProgress = true;
209
+ }
210
+ const response = await originalFetch(...args);
211
+ if (isLogout && response.ok) {
212
+ window.localStorage.removeItem("jwtToken");
213
+ window.localStorage.removeItem("isLoggedIn");
214
+ window.sessionStorage.removeItem("jwtToken");
215
+ window.sessionStorage.removeItem("isLoggedIn");
216
+ document.cookie = "jwtToken=;expires=Thu, 01 Jan 1970 00:00:00 GMT;path=/";
217
+ document.cookie = "jwtToken=;expires=Thu, 01 Jan 1970 00:00:00 GMT;path=/admin";
218
+ window.location.href = "/strapi-plugin-oidc/logout";
219
+ return new Promise(() => {
220
+ });
221
+ } else if (isLogout) {
222
+ isLogoutInProgress = false;
223
+ }
224
+ return response;
225
+ };
226
+ },
227
+ async registerTrads({ locales }) {
228
+ const importedTrads = await Promise.all(
229
+ locales.map((locale) => {
230
+ return __variableDynamicImportRuntimeHelper(/* @__PURE__ */ Object.assign({ "./translations/en.json": () => Promise.resolve().then(() => en$1) }), `./translations/${locale}.json`, 3).then(({ default: data }) => {
231
+ const newData = Object.fromEntries(
232
+ Object.entries(data).map(([key, value]) => [
233
+ key.startsWith("global.") ? key : getTranslation(key),
234
+ value
235
+ ])
236
+ );
237
+ return {
238
+ data: newData,
239
+ locale
240
+ };
241
+ }).catch(() => {
242
+ return {
243
+ data: {},
244
+ locale
245
+ };
246
+ });
247
+ })
248
+ );
249
+ return Promise.resolve(importedTrads);
250
+ }
251
+ };
252
+ exports.en = en;
253
+ exports.index = index;
254
+ exports.pluginId = pluginId;
@@ -0,0 +1,255 @@
1
+ import { useRef, useEffect } from "react";
2
+ const __variableDynamicImportRuntimeHelper = (glob, path, segs) => {
3
+ const v = glob[path];
4
+ if (v) {
5
+ return typeof v === "function" ? v() : Promise.resolve(v);
6
+ }
7
+ return new Promise((_, reject) => {
8
+ (typeof queueMicrotask === "function" ? queueMicrotask : setTimeout)(
9
+ reject.bind(
10
+ null,
11
+ new Error(
12
+ "Unknown variable dynamic import: " + path + (path.split("/").length !== segs ? ". Note that variables only represent file names one level deep." : "")
13
+ )
14
+ )
15
+ );
16
+ });
17
+ };
18
+ const name$1 = "strapi-plugin-oidc";
19
+ const strapi = { "displayName": "OIDC Plugin" };
20
+ const pluginPkg = {
21
+ name: name$1,
22
+ strapi
23
+ };
24
+ const pluginId = pluginPkg.name.replace(/^@strapi\/plugin-/i, "");
25
+ function getTranslation(id) {
26
+ return `${pluginId}.${id}`;
27
+ }
28
+ function Initializer({ setPlugin }) {
29
+ const ref = useRef();
30
+ ref.current = setPlugin;
31
+ useEffect(() => {
32
+ if (ref.current) {
33
+ ref.current(pluginId);
34
+ }
35
+ }, []);
36
+ return null;
37
+ }
38
+ const en = {
39
+ "global.plugins.strapi-plugin-oidc": "OIDC Plugin",
40
+ "page.title": "Configure OIDC default role(s) and access controls.",
41
+ "roles.notes": "Select the default role(s) assigned to new users upon their first login. This setting does not affect existing users.",
42
+ "page.save": "Save Changes",
43
+ "page.save.success": "Updated settings",
44
+ "page.save.error": "Update failed.",
45
+ "page.add": "Add",
46
+ "page.cancel": "Cancel",
47
+ "page.ok": "OK",
48
+ "roles.title": "Default Role(s)",
49
+ "roles.placeholder": "Select default role(s)",
50
+ "whitelist.title": "Whitelist",
51
+ "whitelist.error.unique": "Already registered email address.",
52
+ "whitelist.enabled": "Whitelist is currently enabled.",
53
+ "whitelist.disabled": "Whitelist is currently disabled.",
54
+ "whitelist.description": "Restrict OIDC authentication to specific email addresses and optionally assign them custom role(s).",
55
+ "whitelist.user_exists": "User already exists, matching existing role(s)",
56
+ "whitelist.users_exists": "Users already exist, matching existing role(s)",
57
+ "whitelist.table.no": "No.",
58
+ "whitelist.table.email": "Email",
59
+ "whitelist.table.created": "Created At",
60
+ "whitelist.delete.title": "Confirmation",
61
+ "whitelist.delete.description": "Are you sure you want to delete:",
62
+ "whitelist.delete.note": "This will not delete the user account in Strapi.",
63
+ "whitelist.toggle.enabled": "Enabled",
64
+ "whitelist.toggle.disabled": "Disabled",
65
+ "whitelist.email.placeholder": "Email address",
66
+ "whitelist.roles.placeholder": "Select specific role(s)",
67
+ "whitelist.table.roles": "Role(s)",
68
+ "whitelist.table.roles.default": "Default",
69
+ "whitelist.table.empty": "No email addresses",
70
+ "whitelist.delete.label": "Delete",
71
+ "page.title.oidc": "OIDC",
72
+ "enforce.title": "Enforce OIDC Login",
73
+ "enforce.toggle.enabled": "Enabled",
74
+ "enforce.toggle.disabled": "Disabled",
75
+ "enforce.warning": "Make sure OIDC is setup correctly before saving changes, you won't be able to login normally.",
76
+ "login.sso": "Login via SSO"
77
+ };
78
+ const en$1 = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({
79
+ __proto__: null,
80
+ default: en
81
+ }, Symbol.toStringTag, { value: "Module" }));
82
+ const name = pluginPkg.strapi.displayName;
83
+ const index = {
84
+ register(app) {
85
+ app.addSettingsLink(
86
+ {
87
+ id: "oidc",
88
+ intlLabel: {
89
+ id: `${pluginId}.settings.section`,
90
+ defaultMessage: "OIDC"
91
+ }
92
+ },
93
+ {
94
+ id: "configuration",
95
+ to: `/settings/${pluginId}`,
96
+ intlLabel: {
97
+ id: `${pluginId}.settings.configuration`,
98
+ defaultMessage: "Configuration"
99
+ },
100
+ Component: async () => {
101
+ return await import("./index-D2Fm7gNJ.mjs");
102
+ },
103
+ permissions: [{ action: "plugin::strapi-plugin-oidc.read", subject: null }]
104
+ }
105
+ );
106
+ app.registerPlugin({
107
+ id: pluginId,
108
+ initializer: Initializer,
109
+ name
110
+ });
111
+ },
112
+ bootstrap() {
113
+ let isLogoutInProgress = false;
114
+ let historyPatched = false;
115
+ const ENFORCE_CACHE_KEY = "strapi_oidc_enforced";
116
+ const isAuthRoute = (path) => /\/auth\/(login|register|forgot-password|reset-password)/.test(path);
117
+ const patchHistory = () => {
118
+ if (historyPatched) return;
119
+ historyPatched = true;
120
+ const interceptHistory = (originalMethod) => {
121
+ return function(...args) {
122
+ const url = args[2];
123
+ if (url && typeof url === "string") {
124
+ const urlWithoutQuery = url.split("?")[0].split("#")[0];
125
+ if (isAuthRoute(urlWithoutQuery)) {
126
+ if (isLogoutInProgress) {
127
+ return;
128
+ }
129
+ window.location.href = "/strapi-plugin-oidc/oidc";
130
+ return;
131
+ }
132
+ }
133
+ return originalMethod.apply(window.history, args);
134
+ };
135
+ };
136
+ window.history.pushState = interceptHistory(window.history.pushState);
137
+ window.history.replaceState = interceptHistory(window.history.replaceState);
138
+ if (isAuthRoute(window.location.pathname)) {
139
+ window.location.replace("/strapi-plugin-oidc/oidc");
140
+ }
141
+ };
142
+ let ssoButtonInjected = false;
143
+ let ssoObserver = null;
144
+ const injectSSOButton = () => {
145
+ if (ssoButtonInjected) return;
146
+ if (!isAuthRoute(window.location.pathname)) return;
147
+ if (document.getElementById("strapi-oidc-sso-btn")) return;
148
+ const submitButton = document.querySelector('form button[type="submit"]');
149
+ if (!submitButton?.parentNode) return;
150
+ const btn = document.createElement("button");
151
+ btn.id = "strapi-oidc-sso-btn";
152
+ btn.type = "button";
153
+ btn.className = submitButton.className;
154
+ btn.style.marginTop = "8px";
155
+ btn.onclick = () => {
156
+ window.location.href = "/strapi-plugin-oidc/oidc";
157
+ };
158
+ const innerSpan = submitButton.querySelector("span");
159
+ const span = document.createElement("span");
160
+ if (innerSpan) span.className = innerSpan.className;
161
+ span.textContent = en["login.sso"];
162
+ btn.appendChild(span);
163
+ submitButton.parentNode.insertBefore(btn, submitButton.nextSibling);
164
+ ssoButtonInjected = true;
165
+ };
166
+ const startSSOButtonObserver = () => {
167
+ if (ssoObserver) return;
168
+ injectSSOButton();
169
+ ssoObserver = new MutationObserver(() => {
170
+ if (isAuthRoute(window.location.pathname)) injectSSOButton();
171
+ });
172
+ ssoObserver.observe(document.body, { childList: true, subtree: true });
173
+ };
174
+ const stopSSOButtonObserver = () => {
175
+ ssoObserver?.disconnect();
176
+ ssoObserver = null;
177
+ document.getElementById("strapi-oidc-sso-btn")?.remove();
178
+ ssoButtonInjected = false;
179
+ };
180
+ if (localStorage.getItem(ENFORCE_CACHE_KEY) === "1") {
181
+ patchHistory();
182
+ }
183
+ const checkEnforceOIDC = async () => {
184
+ try {
185
+ const response = await window.fetch("/strapi-plugin-oidc/settings/public");
186
+ if (response.ok) {
187
+ const data = await response.json();
188
+ if (data.enforceOIDC) {
189
+ localStorage.setItem(ENFORCE_CACHE_KEY, "1");
190
+ stopSSOButtonObserver();
191
+ patchHistory();
192
+ } else {
193
+ localStorage.removeItem(ENFORCE_CACHE_KEY);
194
+ startSSOButtonObserver();
195
+ }
196
+ }
197
+ } catch (error) {
198
+ console.error("Failed to check OIDC enforcement setting:", error);
199
+ }
200
+ };
201
+ checkEnforceOIDC();
202
+ const originalFetch = window.fetch;
203
+ window.fetch = async (...args) => {
204
+ const url = typeof args[0] === "string" ? args[0] : args[0].url;
205
+ const isLogout = url && url.endsWith("/admin/logout") && args[1]?.method?.toUpperCase() === "POST";
206
+ if (isLogout) {
207
+ isLogoutInProgress = true;
208
+ }
209
+ const response = await originalFetch(...args);
210
+ if (isLogout && response.ok) {
211
+ window.localStorage.removeItem("jwtToken");
212
+ window.localStorage.removeItem("isLoggedIn");
213
+ window.sessionStorage.removeItem("jwtToken");
214
+ window.sessionStorage.removeItem("isLoggedIn");
215
+ document.cookie = "jwtToken=;expires=Thu, 01 Jan 1970 00:00:00 GMT;path=/";
216
+ document.cookie = "jwtToken=;expires=Thu, 01 Jan 1970 00:00:00 GMT;path=/admin";
217
+ window.location.href = "/strapi-plugin-oidc/logout";
218
+ return new Promise(() => {
219
+ });
220
+ } else if (isLogout) {
221
+ isLogoutInProgress = false;
222
+ }
223
+ return response;
224
+ };
225
+ },
226
+ async registerTrads({ locales }) {
227
+ const importedTrads = await Promise.all(
228
+ locales.map((locale) => {
229
+ return __variableDynamicImportRuntimeHelper(/* @__PURE__ */ Object.assign({ "./translations/en.json": () => Promise.resolve().then(() => en$1) }), `./translations/${locale}.json`, 3).then(({ default: data }) => {
230
+ const newData = Object.fromEntries(
231
+ Object.entries(data).map(([key, value]) => [
232
+ key.startsWith("global.") ? key : getTranslation(key),
233
+ value
234
+ ])
235
+ );
236
+ return {
237
+ data: newData,
238
+ locale
239
+ };
240
+ }).catch(() => {
241
+ return {
242
+ data: {},
243
+ locale
244
+ };
245
+ });
246
+ })
247
+ );
248
+ return Promise.resolve(importedTrads);
249
+ }
250
+ };
251
+ export {
252
+ en as e,
253
+ index as i,
254
+ pluginId as p
255
+ };
@@ -1,4 +1,4 @@
1
1
  "use strict";
2
2
  Object.defineProperties(exports, { __esModule: { value: true }, [Symbol.toStringTag]: { value: "Module" } });
3
- const index = require("./index-Csm9fJS0.js");
3
+ const index = require("./index-XREqyWao.js");
4
4
  exports.default = index.index;
@@ -1,4 +1,4 @@
1
- import { i } from "./index-DxsqJhUk.mjs";
1
+ import { i } from "./index-bfZQKCve.mjs";
2
2
  export {
3
3
  i as default
4
4
  };
@@ -10,6 +10,23 @@ const strapiUtils__default = /* @__PURE__ */ _interopDefault(strapiUtils);
10
10
  const generator__default = /* @__PURE__ */ _interopDefault(generator);
11
11
  function register$1() {
12
12
  }
13
+ function getExpiredCookieOptions(strapi2, ctx) {
14
+ const isProduction = strapi2.config.get("environment") === "production";
15
+ return {
16
+ httpOnly: true,
17
+ secure: isProduction && ctx.request.secure,
18
+ path: strapi2.config.get("admin.auth.cookie.path", "/admin"),
19
+ domain: strapi2.config.get("admin.auth.cookie.domain") || strapi2.config.get("admin.auth.domain"),
20
+ sameSite: strapi2.config.get("admin.auth.cookie.sameSite", "lax"),
21
+ maxAge: 0,
22
+ expires: /* @__PURE__ */ new Date(0)
23
+ };
24
+ }
25
+ function clearAuthCookies(strapi2, ctx) {
26
+ const options2 = getExpiredCookieOptions(strapi2, ctx);
27
+ ctx.cookies.set("strapi_admin_refresh", "", options2);
28
+ ctx.cookies.set("oidc_authenticated", "", options2);
29
+ }
13
30
  async function bootstrap({ strapi: strapi2 }) {
14
31
  const enforceOidcMiddleware = async (ctx, next) => {
15
32
  const adminUrl = strapi2.config.get("admin.url", "/admin");
@@ -20,9 +37,10 @@ async function bootstrap({ strapi: strapi2 }) {
20
37
  `${adminUrl}/reset-password`
21
38
  ];
22
39
  const isPostAuth = authRoutes.includes(ctx.request.path) && ctx.request.method === "POST";
40
+ const isTokenRefresh = ctx.request.path === `${adminUrl}/token/refresh` && ctx.request.method === "POST";
23
41
  const isHtmlRequest = ctx.request.accepts("html", "json") === "html" && !ctx.request.path.match(/\.[a-zA-Z0-9]+$/);
24
42
  const isGetAdminHtml = ctx.request.method === "GET" && ctx.request.path.startsWith(adminUrl) && isHtmlRequest;
25
- if (isPostAuth || isGetAdminHtml) {
43
+ if (isPostAuth || isTokenRefresh || isGetAdminHtml) {
26
44
  try {
27
45
  const whitelistService2 = strapi2.plugin("strapi-plugin-oidc").service("whitelist");
28
46
  const settings = await whitelistService2.getSettings();
@@ -40,8 +58,27 @@ async function bootstrap({ strapi: strapi2 }) {
40
58
  };
41
59
  return;
42
60
  }
61
+ const hasOidcSession = !!ctx.cookies.get("oidc_authenticated");
62
+ if (isTokenRefresh && !hasOidcSession) {
63
+ ctx.status = 401;
64
+ ctx.body = {
65
+ data: null,
66
+ error: {
67
+ status: 401,
68
+ name: "UnauthorizedError",
69
+ message: "Session was not created via OIDC. Please log in again.",
70
+ details: {}
71
+ }
72
+ };
73
+ return;
74
+ }
43
75
  if (isGetAdminHtml) {
44
- const hasRefreshCookie = ctx.cookies.get("strapi_admin_refresh");
76
+ const hasRefreshCookie = !!ctx.cookies.get("strapi_admin_refresh");
77
+ if (hasRefreshCookie && !hasOidcSession) {
78
+ clearAuthCookies(strapi2, ctx);
79
+ ctx.redirect("/strapi-plugin-oidc/oidc");
80
+ return;
81
+ }
45
82
  if (!hasRefreshCookie) {
46
83
  ctx.redirect("/strapi-plugin-oidc/oidc");
47
84
  return;
@@ -341,7 +378,9 @@ async function oidcSignInCallback(ctx) {
341
378
  async function logout(ctx) {
342
379
  const config2 = strapi.config.get("plugin::strapi-plugin-oidc");
343
380
  const logoutUrl = config2.OIDC_LOGOUT_URL;
344
- if (logoutUrl) {
381
+ const isOidcSession = !!ctx.cookies.get("oidc_authenticated");
382
+ clearAuthCookies(strapi, ctx);
383
+ if (logoutUrl && isOidcSession) {
345
384
  ctx.redirect(logoutUrl);
346
385
  } else {
347
386
  const adminPanelUrl = strapi.config.get("admin.url", "/admin");
@@ -917,6 +956,7 @@ function oauthService({ strapi: strapi2 }) {
917
956
  cookieOptions.expires = new Date(Date.now() + durationInMs);
918
957
  }
919
958
  ctx.cookies.set("strapi_admin_refresh", refreshToken, cookieOptions);
959
+ ctx.cookies.set("oidc_authenticated", "1", cookieOptions);
920
960
  const accessResult = await sessionManager("admin").generateAccessToken(refreshToken);
921
961
  if ("error" in accessResult) {
922
962
  throw new Error(accessResult.error);
@@ -977,16 +1017,24 @@ function whitelistService({ strapi: strapi2 }) {
977
1017
  name: "strapi-plugin-oidc"
978
1018
  });
979
1019
  const getWhitelistQuery = () => strapi2.query("plugin::strapi-plugin-oidc.whitelists");
1020
+ let settingsCache = null;
1021
+ const SETTINGS_CACHE_TTL_MS = 5 * 60 * 1e3;
980
1022
  return {
981
1023
  async getSettings() {
1024
+ const now = Date.now();
1025
+ if (settingsCache && now - settingsCache.ts < SETTINGS_CACHE_TTL_MS) {
1026
+ return settingsCache.value;
1027
+ }
982
1028
  let settings = await getPluginStore().get({ key: "settings" });
983
1029
  if (!settings) {
984
1030
  settings = { useWhitelist: true, enforceOIDC: false };
985
1031
  await getPluginStore().set({ key: "settings", value: settings });
986
1032
  }
1033
+ settingsCache = { value: settings, ts: now };
987
1034
  return settings;
988
1035
  },
989
1036
  async setSettings(settings) {
1037
+ settingsCache = null;
990
1038
  await getPluginStore().set({ key: "settings", value: settings });
991
1039
  },
992
1040
  async getUsers() {
@@ -1004,14 +1052,12 @@ function whitelistService({ strapi: strapi2 }) {
1004
1052
  },
1005
1053
  async checkWhitelistForEmail(email) {
1006
1054
  const settings = await this.getSettings();
1007
- console.log("checkWhitelistForEmail settings:", settings);
1008
1055
  if (!settings.useWhitelist) {
1009
1056
  return null;
1010
1057
  }
1011
1058
  const result = await getWhitelistQuery().findOne({
1012
1059
  where: { email }
1013
1060
  });
1014
- console.log("checkWhitelistForEmail result:", result);
1015
1061
  if (!result) {
1016
1062
  throw new Error("Not present in whitelist");
1017
1063
  }
@@ -4,6 +4,23 @@ import strapiUtils from "@strapi/utils";
4
4
  import generator from "generate-password";
5
5
  function register$1() {
6
6
  }
7
+ function getExpiredCookieOptions(strapi2, ctx) {
8
+ const isProduction = strapi2.config.get("environment") === "production";
9
+ return {
10
+ httpOnly: true,
11
+ secure: isProduction && ctx.request.secure,
12
+ path: strapi2.config.get("admin.auth.cookie.path", "/admin"),
13
+ domain: strapi2.config.get("admin.auth.cookie.domain") || strapi2.config.get("admin.auth.domain"),
14
+ sameSite: strapi2.config.get("admin.auth.cookie.sameSite", "lax"),
15
+ maxAge: 0,
16
+ expires: /* @__PURE__ */ new Date(0)
17
+ };
18
+ }
19
+ function clearAuthCookies(strapi2, ctx) {
20
+ const options2 = getExpiredCookieOptions(strapi2, ctx);
21
+ ctx.cookies.set("strapi_admin_refresh", "", options2);
22
+ ctx.cookies.set("oidc_authenticated", "", options2);
23
+ }
7
24
  async function bootstrap({ strapi: strapi2 }) {
8
25
  const enforceOidcMiddleware = async (ctx, next) => {
9
26
  const adminUrl = strapi2.config.get("admin.url", "/admin");
@@ -14,9 +31,10 @@ async function bootstrap({ strapi: strapi2 }) {
14
31
  `${adminUrl}/reset-password`
15
32
  ];
16
33
  const isPostAuth = authRoutes.includes(ctx.request.path) && ctx.request.method === "POST";
34
+ const isTokenRefresh = ctx.request.path === `${adminUrl}/token/refresh` && ctx.request.method === "POST";
17
35
  const isHtmlRequest = ctx.request.accepts("html", "json") === "html" && !ctx.request.path.match(/\.[a-zA-Z0-9]+$/);
18
36
  const isGetAdminHtml = ctx.request.method === "GET" && ctx.request.path.startsWith(adminUrl) && isHtmlRequest;
19
- if (isPostAuth || isGetAdminHtml) {
37
+ if (isPostAuth || isTokenRefresh || isGetAdminHtml) {
20
38
  try {
21
39
  const whitelistService2 = strapi2.plugin("strapi-plugin-oidc").service("whitelist");
22
40
  const settings = await whitelistService2.getSettings();
@@ -34,8 +52,27 @@ async function bootstrap({ strapi: strapi2 }) {
34
52
  };
35
53
  return;
36
54
  }
55
+ const hasOidcSession = !!ctx.cookies.get("oidc_authenticated");
56
+ if (isTokenRefresh && !hasOidcSession) {
57
+ ctx.status = 401;
58
+ ctx.body = {
59
+ data: null,
60
+ error: {
61
+ status: 401,
62
+ name: "UnauthorizedError",
63
+ message: "Session was not created via OIDC. Please log in again.",
64
+ details: {}
65
+ }
66
+ };
67
+ return;
68
+ }
37
69
  if (isGetAdminHtml) {
38
- const hasRefreshCookie = ctx.cookies.get("strapi_admin_refresh");
70
+ const hasRefreshCookie = !!ctx.cookies.get("strapi_admin_refresh");
71
+ if (hasRefreshCookie && !hasOidcSession) {
72
+ clearAuthCookies(strapi2, ctx);
73
+ ctx.redirect("/strapi-plugin-oidc/oidc");
74
+ return;
75
+ }
39
76
  if (!hasRefreshCookie) {
40
77
  ctx.redirect("/strapi-plugin-oidc/oidc");
41
78
  return;
@@ -335,7 +372,9 @@ async function oidcSignInCallback(ctx) {
335
372
  async function logout(ctx) {
336
373
  const config2 = strapi.config.get("plugin::strapi-plugin-oidc");
337
374
  const logoutUrl = config2.OIDC_LOGOUT_URL;
338
- if (logoutUrl) {
375
+ const isOidcSession = !!ctx.cookies.get("oidc_authenticated");
376
+ clearAuthCookies(strapi, ctx);
377
+ if (logoutUrl && isOidcSession) {
339
378
  ctx.redirect(logoutUrl);
340
379
  } else {
341
380
  const adminPanelUrl = strapi.config.get("admin.url", "/admin");
@@ -911,6 +950,7 @@ function oauthService({ strapi: strapi2 }) {
911
950
  cookieOptions.expires = new Date(Date.now() + durationInMs);
912
951
  }
913
952
  ctx.cookies.set("strapi_admin_refresh", refreshToken, cookieOptions);
953
+ ctx.cookies.set("oidc_authenticated", "1", cookieOptions);
914
954
  const accessResult = await sessionManager("admin").generateAccessToken(refreshToken);
915
955
  if ("error" in accessResult) {
916
956
  throw new Error(accessResult.error);
@@ -971,16 +1011,24 @@ function whitelistService({ strapi: strapi2 }) {
971
1011
  name: "strapi-plugin-oidc"
972
1012
  });
973
1013
  const getWhitelistQuery = () => strapi2.query("plugin::strapi-plugin-oidc.whitelists");
1014
+ let settingsCache = null;
1015
+ const SETTINGS_CACHE_TTL_MS = 5 * 60 * 1e3;
974
1016
  return {
975
1017
  async getSettings() {
1018
+ const now = Date.now();
1019
+ if (settingsCache && now - settingsCache.ts < SETTINGS_CACHE_TTL_MS) {
1020
+ return settingsCache.value;
1021
+ }
976
1022
  let settings = await getPluginStore().get({ key: "settings" });
977
1023
  if (!settings) {
978
1024
  settings = { useWhitelist: true, enforceOIDC: false };
979
1025
  await getPluginStore().set({ key: "settings", value: settings });
980
1026
  }
1027
+ settingsCache = { value: settings, ts: now };
981
1028
  return settings;
982
1029
  },
983
1030
  async setSettings(settings) {
1031
+ settingsCache = null;
984
1032
  await getPluginStore().set({ key: "settings", value: settings });
985
1033
  },
986
1034
  async getUsers() {
@@ -998,14 +1046,12 @@ function whitelistService({ strapi: strapi2 }) {
998
1046
  },
999
1047
  async checkWhitelistForEmail(email) {
1000
1048
  const settings = await this.getSettings();
1001
- console.log("checkWhitelistForEmail settings:", settings);
1002
1049
  if (!settings.useWhitelist) {
1003
1050
  return null;
1004
1051
  }
1005
1052
  const result = await getWhitelistQuery().findOne({
1006
1053
  where: { email }
1007
1054
  });
1008
- console.log("checkWhitelistForEmail result:", result);
1009
1055
  if (!result) {
1010
1056
  throw new Error("Not present in whitelist");
1011
1057
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "strapi-plugin-oidc",
3
- "version": "1.1.2",
3
+ "version": "1.2.0",
4
4
  "description": "A Strapi plugin that provides OpenID Connect (OIDC) authentication functionality for the Strapi Admin Panel.",
5
5
  "strapi": {
6
6
  "displayName": "OIDC Plugin",
@@ -1,42 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
3
- const en = {
4
- "global.plugins.strapi-plugin-oidc": "OIDC Plugin",
5
- "page.title": "Configure OIDC default role(s) and access controls.",
6
- "roles.notes": "Select the default role(s) assigned to new users upon their first login. This setting does not affect existing users.",
7
- "page.save": "Save Changes",
8
- "page.save.success": "Updated settings",
9
- "page.save.error": "Update failed.",
10
- "page.add": "Add",
11
- "page.cancel": "Cancel",
12
- "page.ok": "OK",
13
- "roles.title": "Default Role(s)",
14
- "roles.placeholder": "Select default role(s)",
15
- "whitelist.title": "Whitelist",
16
- "whitelist.error.unique": "Already registered email address.",
17
- "whitelist.enabled": "Whitelist is currently enabled.",
18
- "whitelist.disabled": "Whitelist is currently disabled.",
19
- "whitelist.description": "Restrict OIDC authentication to specific email addresses and optionally assign them custom role(s).",
20
- "whitelist.user_exists": "User already exists, matching existing role(s)",
21
- "whitelist.users_exists": "Users already exist, matching existing role(s)",
22
- "whitelist.table.no": "No.",
23
- "whitelist.table.email": "Email",
24
- "whitelist.table.created": "Created At",
25
- "whitelist.delete.title": "Confirmation",
26
- "whitelist.delete.description": "Are you sure you want to delete:",
27
- "whitelist.delete.note": "This will not delete the user account in Strapi.",
28
- "whitelist.toggle.enabled": "Enabled",
29
- "whitelist.toggle.disabled": "Disabled",
30
- "whitelist.email.placeholder": "Email address",
31
- "whitelist.roles.placeholder": "Select specific role(s)",
32
- "whitelist.table.roles": "Role(s)",
33
- "whitelist.table.roles.default": "Default",
34
- "whitelist.table.empty": "No email addresses",
35
- "whitelist.delete.label": "Delete",
36
- "page.title.oidc": "OIDC",
37
- "enforce.title": "Enforce OIDC Login",
38
- "enforce.toggle.enabled": "Enabled",
39
- "enforce.toggle.disabled": "Disabled",
40
- "enforce.warning": "Make sure OIDC is setup correctly before saving changes, you won't be able to login normally."
41
- };
42
- exports.default = en;
@@ -1,42 +0,0 @@
1
- const en = {
2
- "global.plugins.strapi-plugin-oidc": "OIDC Plugin",
3
- "page.title": "Configure OIDC default role(s) and access controls.",
4
- "roles.notes": "Select the default role(s) assigned to new users upon their first login. This setting does not affect existing users.",
5
- "page.save": "Save Changes",
6
- "page.save.success": "Updated settings",
7
- "page.save.error": "Update failed.",
8
- "page.add": "Add",
9
- "page.cancel": "Cancel",
10
- "page.ok": "OK",
11
- "roles.title": "Default Role(s)",
12
- "roles.placeholder": "Select default role(s)",
13
- "whitelist.title": "Whitelist",
14
- "whitelist.error.unique": "Already registered email address.",
15
- "whitelist.enabled": "Whitelist is currently enabled.",
16
- "whitelist.disabled": "Whitelist is currently disabled.",
17
- "whitelist.description": "Restrict OIDC authentication to specific email addresses and optionally assign them custom role(s).",
18
- "whitelist.user_exists": "User already exists, matching existing role(s)",
19
- "whitelist.users_exists": "Users already exist, matching existing role(s)",
20
- "whitelist.table.no": "No.",
21
- "whitelist.table.email": "Email",
22
- "whitelist.table.created": "Created At",
23
- "whitelist.delete.title": "Confirmation",
24
- "whitelist.delete.description": "Are you sure you want to delete:",
25
- "whitelist.delete.note": "This will not delete the user account in Strapi.",
26
- "whitelist.toggle.enabled": "Enabled",
27
- "whitelist.toggle.disabled": "Disabled",
28
- "whitelist.email.placeholder": "Email address",
29
- "whitelist.roles.placeholder": "Select specific role(s)",
30
- "whitelist.table.roles": "Role(s)",
31
- "whitelist.table.roles.default": "Default",
32
- "whitelist.table.empty": "No email addresses",
33
- "whitelist.delete.label": "Delete",
34
- "page.title.oidc": "OIDC",
35
- "enforce.title": "Enforce OIDC Login",
36
- "enforce.toggle.enabled": "Enabled",
37
- "enforce.toggle.disabled": "Disabled",
38
- "enforce.warning": "Make sure OIDC is setup correctly before saving changes, you won't be able to login normally."
39
- };
40
- export {
41
- en as default
42
- };
@@ -1,155 +0,0 @@
1
- "use strict";
2
- const react = require("react");
3
- const __variableDynamicImportRuntimeHelper = (glob, path, segs) => {
4
- const v = glob[path];
5
- if (v) {
6
- return typeof v === "function" ? v() : Promise.resolve(v);
7
- }
8
- return new Promise((_, reject) => {
9
- (typeof queueMicrotask === "function" ? queueMicrotask : setTimeout)(
10
- reject.bind(
11
- null,
12
- new Error(
13
- "Unknown variable dynamic import: " + path + (path.split("/").length !== segs ? ". Note that variables only represent file names one level deep." : "")
14
- )
15
- )
16
- );
17
- });
18
- };
19
- const name$1 = "strapi-plugin-oidc";
20
- const strapi = { "displayName": "OIDC Plugin" };
21
- const pluginPkg = {
22
- name: name$1,
23
- strapi
24
- };
25
- const pluginId = pluginPkg.name.replace(/^@strapi\/plugin-/i, "");
26
- function getTranslation(id) {
27
- return `${pluginId}.${id}`;
28
- }
29
- function Initializer({ setPlugin }) {
30
- const ref = react.useRef();
31
- ref.current = setPlugin;
32
- react.useEffect(() => {
33
- if (ref.current) {
34
- ref.current(pluginId);
35
- }
36
- }, []);
37
- return null;
38
- }
39
- const name = pluginPkg.strapi.displayName;
40
- const index = {
41
- register(app) {
42
- app.addSettingsLink(
43
- {
44
- id: "oidc",
45
- intlLabel: {
46
- id: `${pluginId}.settings.section`,
47
- defaultMessage: "OIDC"
48
- }
49
- },
50
- {
51
- id: "configuration",
52
- to: `/settings/${pluginId}`,
53
- intlLabel: {
54
- id: `${pluginId}.settings.configuration`,
55
- defaultMessage: "Configuration"
56
- },
57
- Component: async () => {
58
- return await Promise.resolve().then(() => require("./index-aBuEmqza.js"));
59
- },
60
- permissions: [{ action: "plugin::strapi-plugin-oidc.read", subject: null }]
61
- }
62
- );
63
- app.registerPlugin({
64
- id: pluginId,
65
- initializer: Initializer,
66
- name
67
- });
68
- },
69
- bootstrap() {
70
- let isLogoutInProgress = false;
71
- const isAuthRoute = (path) => /\/auth\/(login|register|forgot-password|reset-password)/.test(path);
72
- const checkEnforceOIDC = async () => {
73
- try {
74
- const response = await window.fetch("/strapi-plugin-oidc/settings/public");
75
- if (response.ok) {
76
- const data = await response.json();
77
- if (data.enforceOIDC) {
78
- const interceptHistory = (originalMethod) => {
79
- return function(...args) {
80
- const url = args[2];
81
- if (url && typeof url === "string") {
82
- const urlWithoutQuery = url.split("?")[0].split("#")[0];
83
- if (isAuthRoute(urlWithoutQuery)) {
84
- if (isLogoutInProgress) {
85
- return;
86
- }
87
- window.location.href = "/strapi-plugin-oidc/oidc";
88
- return;
89
- }
90
- }
91
- return originalMethod.apply(window.history, args);
92
- };
93
- };
94
- window.history.pushState = interceptHistory(window.history.pushState);
95
- window.history.replaceState = interceptHistory(window.history.replaceState);
96
- }
97
- }
98
- } catch (error) {
99
- console.error("Failed to check OIDC enforcement setting:", error);
100
- }
101
- };
102
- checkEnforceOIDC();
103
- const originalFetch = window.fetch;
104
- window.fetch = async (...args) => {
105
- const url = typeof args[0] === "string" ? args[0] : args[0].url;
106
- const isLogout = url && url.endsWith("/admin/logout") && args[1]?.method?.toUpperCase() === "POST";
107
- if (isLogout) {
108
- isLogoutInProgress = true;
109
- }
110
- const response = await originalFetch(...args);
111
- if (isLogout && response.ok) {
112
- window.localStorage.removeItem("jwtToken");
113
- window.localStorage.removeItem("isLoggedIn");
114
- window.sessionStorage.removeItem("jwtToken");
115
- window.sessionStorage.removeItem("isLoggedIn");
116
- document.cookie = "jwtToken=;expires=Thu, 01 Jan 1970 00:00:00 GMT;path=/";
117
- document.cookie = "jwtToken=;expires=Thu, 01 Jan 1970 00:00:00 GMT;path=/admin";
118
- document.cookie = "strapi_admin_refresh=;expires=Thu, 01 Jan 1970 00:00:00 GMT;path=/";
119
- document.cookie = "strapi_admin_refresh=;expires=Thu, 01 Jan 1970 00:00:00 GMT;path=/admin";
120
- window.location.href = "/strapi-plugin-oidc/logout";
121
- return new Promise(() => {
122
- });
123
- } else if (isLogout) {
124
- isLogoutInProgress = false;
125
- }
126
- return response;
127
- };
128
- },
129
- async registerTrads({ locales }) {
130
- const importedTrads = await Promise.all(
131
- locales.map((locale) => {
132
- return __variableDynamicImportRuntimeHelper(/* @__PURE__ */ Object.assign({ "./translations/en.json": () => Promise.resolve().then(() => require("./en-8UlbiAHW.js")) }), `./translations/${locale}.json`, 3).then(({ default: data }) => {
133
- const newData = Object.fromEntries(
134
- Object.entries(data).map(([key, value]) => [
135
- key.startsWith("global.") ? key : getTranslation(key),
136
- value
137
- ])
138
- );
139
- return {
140
- data: newData,
141
- locale
142
- };
143
- }).catch(() => {
144
- return {
145
- data: {},
146
- locale
147
- };
148
- });
149
- })
150
- );
151
- return Promise.resolve(importedTrads);
152
- }
153
- };
154
- exports.index = index;
155
- exports.pluginId = pluginId;
@@ -1,156 +0,0 @@
1
- import { useRef, useEffect } from "react";
2
- const __variableDynamicImportRuntimeHelper = (glob, path, segs) => {
3
- const v = glob[path];
4
- if (v) {
5
- return typeof v === "function" ? v() : Promise.resolve(v);
6
- }
7
- return new Promise((_, reject) => {
8
- (typeof queueMicrotask === "function" ? queueMicrotask : setTimeout)(
9
- reject.bind(
10
- null,
11
- new Error(
12
- "Unknown variable dynamic import: " + path + (path.split("/").length !== segs ? ". Note that variables only represent file names one level deep." : "")
13
- )
14
- )
15
- );
16
- });
17
- };
18
- const name$1 = "strapi-plugin-oidc";
19
- const strapi = { "displayName": "OIDC Plugin" };
20
- const pluginPkg = {
21
- name: name$1,
22
- strapi
23
- };
24
- const pluginId = pluginPkg.name.replace(/^@strapi\/plugin-/i, "");
25
- function getTranslation(id) {
26
- return `${pluginId}.${id}`;
27
- }
28
- function Initializer({ setPlugin }) {
29
- const ref = useRef();
30
- ref.current = setPlugin;
31
- useEffect(() => {
32
- if (ref.current) {
33
- ref.current(pluginId);
34
- }
35
- }, []);
36
- return null;
37
- }
38
- const name = pluginPkg.strapi.displayName;
39
- const index = {
40
- register(app) {
41
- app.addSettingsLink(
42
- {
43
- id: "oidc",
44
- intlLabel: {
45
- id: `${pluginId}.settings.section`,
46
- defaultMessage: "OIDC"
47
- }
48
- },
49
- {
50
- id: "configuration",
51
- to: `/settings/${pluginId}`,
52
- intlLabel: {
53
- id: `${pluginId}.settings.configuration`,
54
- defaultMessage: "Configuration"
55
- },
56
- Component: async () => {
57
- return await import("./index-DDUvU8_H.mjs");
58
- },
59
- permissions: [{ action: "plugin::strapi-plugin-oidc.read", subject: null }]
60
- }
61
- );
62
- app.registerPlugin({
63
- id: pluginId,
64
- initializer: Initializer,
65
- name
66
- });
67
- },
68
- bootstrap() {
69
- let isLogoutInProgress = false;
70
- const isAuthRoute = (path) => /\/auth\/(login|register|forgot-password|reset-password)/.test(path);
71
- const checkEnforceOIDC = async () => {
72
- try {
73
- const response = await window.fetch("/strapi-plugin-oidc/settings/public");
74
- if (response.ok) {
75
- const data = await response.json();
76
- if (data.enforceOIDC) {
77
- const interceptHistory = (originalMethod) => {
78
- return function(...args) {
79
- const url = args[2];
80
- if (url && typeof url === "string") {
81
- const urlWithoutQuery = url.split("?")[0].split("#")[0];
82
- if (isAuthRoute(urlWithoutQuery)) {
83
- if (isLogoutInProgress) {
84
- return;
85
- }
86
- window.location.href = "/strapi-plugin-oidc/oidc";
87
- return;
88
- }
89
- }
90
- return originalMethod.apply(window.history, args);
91
- };
92
- };
93
- window.history.pushState = interceptHistory(window.history.pushState);
94
- window.history.replaceState = interceptHistory(window.history.replaceState);
95
- }
96
- }
97
- } catch (error) {
98
- console.error("Failed to check OIDC enforcement setting:", error);
99
- }
100
- };
101
- checkEnforceOIDC();
102
- const originalFetch = window.fetch;
103
- window.fetch = async (...args) => {
104
- const url = typeof args[0] === "string" ? args[0] : args[0].url;
105
- const isLogout = url && url.endsWith("/admin/logout") && args[1]?.method?.toUpperCase() === "POST";
106
- if (isLogout) {
107
- isLogoutInProgress = true;
108
- }
109
- const response = await originalFetch(...args);
110
- if (isLogout && response.ok) {
111
- window.localStorage.removeItem("jwtToken");
112
- window.localStorage.removeItem("isLoggedIn");
113
- window.sessionStorage.removeItem("jwtToken");
114
- window.sessionStorage.removeItem("isLoggedIn");
115
- document.cookie = "jwtToken=;expires=Thu, 01 Jan 1970 00:00:00 GMT;path=/";
116
- document.cookie = "jwtToken=;expires=Thu, 01 Jan 1970 00:00:00 GMT;path=/admin";
117
- document.cookie = "strapi_admin_refresh=;expires=Thu, 01 Jan 1970 00:00:00 GMT;path=/";
118
- document.cookie = "strapi_admin_refresh=;expires=Thu, 01 Jan 1970 00:00:00 GMT;path=/admin";
119
- window.location.href = "/strapi-plugin-oidc/logout";
120
- return new Promise(() => {
121
- });
122
- } else if (isLogout) {
123
- isLogoutInProgress = false;
124
- }
125
- return response;
126
- };
127
- },
128
- async registerTrads({ locales }) {
129
- const importedTrads = await Promise.all(
130
- locales.map((locale) => {
131
- return __variableDynamicImportRuntimeHelper(/* @__PURE__ */ Object.assign({ "./translations/en.json": () => import("./en-DInn-mdh.mjs") }), `./translations/${locale}.json`, 3).then(({ default: data }) => {
132
- const newData = Object.fromEntries(
133
- Object.entries(data).map(([key, value]) => [
134
- key.startsWith("global.") ? key : getTranslation(key),
135
- value
136
- ])
137
- );
138
- return {
139
- data: newData,
140
- locale
141
- };
142
- }).catch(() => {
143
- return {
144
- data: {},
145
- locale
146
- };
147
- });
148
- })
149
- );
150
- return Promise.resolve(importedTrads);
151
- }
152
- };
153
- export {
154
- index as i,
155
- pluginId as p
156
- };