@adminforth/open-signup 1.3.1 → 2.0.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.
package/build.log CHANGED
@@ -8,5 +8,5 @@ custom/SignupPage.vue
8
8
  custom/SignupUnderLogin.vue
9
9
  custom/tsconfig.json
10
10
 
11
- sent 14,167 bytes received 77 bytes 28,488.00 bytes/sec
11
+ sent 14,163 bytes received 77 bytes 28,480.00 bytes/sec
12
12
  total size is 13,884 speedup is 0.97
package/dist/index.d.ts CHANGED
@@ -10,6 +10,7 @@ export default class OpenSignupPlugin extends AdminForthPlugin {
10
10
  adminforth: IAdminForth;
11
11
  constructor(options: PluginOptions);
12
12
  modifyResourceConfig(adminforth: IAdminForth, resourceConfig: AdminForthResource): Promise<void>;
13
+ getAllowedOrigins(): string[];
13
14
  validateConfigAfterDiscover(adminforth: IAdminForth, resourceConfig: AdminForthResource): void;
14
15
  instanceUniqueRepresentation(pluginOptions: any): string;
15
16
  doLogin(email: string, response: any, extra: HttpExtra): Promise<{
package/dist/index.js CHANGED
@@ -94,8 +94,27 @@ export default class OpenSignupPlugin extends AdminForthPlugin {
94
94
  adminforth.config.auth.beforeLoginConfirmation = [];
95
95
  }
96
96
  }
97
+ const rawOrigins = this.options.expectedOrigin;
98
+ const originList = Array.isArray(rawOrigins) ? rawOrigins : [rawOrigins];
99
+ if (!rawOrigins || originList.length === 0 || originList.some(o => !o)) {
100
+ throw new Error('EmailPasswordReset: expectedOrigin is required. Set it to the admin panel origin(s) ' +
101
+ '(e.g. "https://admin.example.com") so reset links can only point to a trusted host.');
102
+ }
103
+ for (const origin of originList) {
104
+ try {
105
+ new URL(origin);
106
+ }
107
+ catch (_a) {
108
+ throw new Error(`EmailPasswordReset: expectedOrigin "${origin}" is not a valid absolute URL/origin.`);
109
+ }
110
+ }
97
111
  });
98
112
  }
113
+ getAllowedOrigins() {
114
+ const rawOrigins = this.options.expectedOrigin;
115
+ const originList = Array.isArray(rawOrigins) ? rawOrigins : [rawOrigins];
116
+ return originList.map(o => new URL(o).origin);
117
+ }
99
118
  validateConfigAfterDiscover(adminforth, resourceConfig) {
100
119
  if (this.options.confirmEmails) {
101
120
  this.options.confirmEmails.adapter.validate();
@@ -203,6 +222,18 @@ export default class OpenSignupPlugin extends AdminForthPlugin {
203
222
  if (!this.options.confirmEmails && !password) {
204
223
  return { error: yield tr('Password is required', 'opensignup'), ok: false };
205
224
  }
225
+ let resetLink;
226
+ try {
227
+ const parsedUrl = new URL(url);
228
+ if (!this.getAllowedOrigins().includes(parsedUrl.origin)) {
229
+ return { error: 'Invalid reset url', ok: false };
230
+ }
231
+ parsedUrl.hash = '';
232
+ resetLink = parsedUrl.toString();
233
+ }
234
+ catch (_d) {
235
+ return { error: 'Invalid reset url', ok: false };
236
+ }
206
237
  const extra = { body, headers, query, cookies, requestUrl: url };
207
238
  // validate email
208
239
  if (this.emailField.validation) {
package/dist/types.d.ts CHANGED
@@ -54,4 +54,9 @@ export interface PluginOptions extends PluginsCommonOptions {
54
54
  * Signup component order inder login button
55
55
  */
56
56
  loginPageComponentOrder?: number;
57
+ /**
58
+ * The origin(s) (scheme + host + optional port) of the admin panel that are
59
+ * allowed to appear in password reset links, e.g. "https://admin.example.com".
60
+ */
61
+ expectedOrigin: string | string[];
57
62
  }
package/index.ts CHANGED
@@ -106,6 +106,28 @@ export default class OpenSignupPlugin extends AdminForthPlugin {
106
106
  adminforth.config.auth.beforeLoginConfirmation = [];
107
107
  }
108
108
  }
109
+
110
+ const rawOrigins = this.options.expectedOrigin;
111
+ const originList = Array.isArray(rawOrigins) ? rawOrigins : [rawOrigins];
112
+ if (!rawOrigins || originList.length === 0 || originList.some(o => !o)) {
113
+ throw new Error(
114
+ 'EmailPasswordReset: expectedOrigin is required. Set it to the admin panel origin(s) ' +
115
+ '(e.g. "https://admin.example.com") so reset links can only point to a trusted host.'
116
+ );
117
+ }
118
+ for (const origin of originList) {
119
+ try {
120
+ new URL(origin);
121
+ } catch {
122
+ throw new Error(`EmailPasswordReset: expectedOrigin "${origin}" is not a valid absolute URL/origin.`);
123
+ }
124
+ }
125
+ }
126
+
127
+ getAllowedOrigins(): string[] {
128
+ const rawOrigins = this.options.expectedOrigin;
129
+ const originList = Array.isArray(rawOrigins) ? rawOrigins : [rawOrigins];
130
+ return originList.map(o => new URL(o).origin);
109
131
  }
110
132
 
111
133
  validateConfigAfterDiscover(adminforth: IAdminForth, resourceConfig: AdminForthResource) {
@@ -232,6 +254,19 @@ export default class OpenSignupPlugin extends AdminForthPlugin {
232
254
  if (!this.options.confirmEmails && !password) {
233
255
  return { error: await tr('Password is required', 'opensignup'), ok: false };
234
256
  }
257
+
258
+ let resetLink: string;
259
+ try {
260
+ const parsedUrl = new URL(url);
261
+ if (!this.getAllowedOrigins().includes(parsedUrl.origin)) {
262
+ return { error: 'Invalid reset url', ok: false };
263
+ }
264
+ parsedUrl.hash = '';
265
+ resetLink = parsedUrl.toString();
266
+ } catch {
267
+ return { error: 'Invalid reset url', ok: false };
268
+ }
269
+
235
270
  const extra = { body, headers, query, cookies, requestUrl: url };
236
271
  // validate email
237
272
  if (this.emailField.validation) {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@adminforth/open-signup",
3
- "version": "1.3.1",
3
+ "version": "2.0.0",
4
4
  "main": "dist/index.js",
5
5
  "types": "dist/index.d.ts",
6
6
  "type": "module",
package/types.ts CHANGED
@@ -70,4 +70,11 @@ export interface PluginOptions extends PluginsCommonOptions {
70
70
  * Signup component order inder login button
71
71
  */
72
72
  loginPageComponentOrder?: number;
73
+
74
+ /**
75
+ * The origin(s) (scheme + host + optional port) of the admin panel that are
76
+ * allowed to appear in password reset links, e.g. "https://admin.example.com".
77
+ */
78
+ expectedOrigin: string | string[];
79
+
73
80
  }