@adminforth/two-factors-auth 4.3.1 → 4.3.3

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,17 +7,14 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge
7
7
  step((generator = generator.apply(thisArg, _arguments || [])).next());
8
8
  });
9
9
  };
10
- import { parseBody } from "adminforth";
11
10
  import { registrationOptionsBodySchema, finishRegistrationBodySchema, deletePasskeyBodySchema, renamePasskeyBodySchema, resolveVerifyAutoBodySchema, } from "./validation.js";
12
11
  export function registerPasskeyEndpoints(server, handlers) {
13
12
  server.endpoint({
14
13
  method: 'POST',
15
14
  path: `/plugin/passkeys/registrationOptions`,
16
15
  noAuth: false,
16
+ request_schema: registrationOptionsBodySchema,
17
17
  handler: (_a) => __awaiter(this, [_a], void 0, function* ({ body, adminUser, response, cookies, headers }) {
18
- const parsed = parseBody(registrationOptionsBodySchema, body, response);
19
- if ('error' in parsed)
20
- return parsed.error;
21
18
  return handlers.createRegistrationOptions({ body, adminUser, response, cookies, headers });
22
19
  }),
23
20
  });
@@ -25,10 +22,8 @@ export function registerPasskeyEndpoints(server, handlers) {
25
22
  method: 'POST',
26
23
  path: `/plugin/passkeys/finishRegistration`,
27
24
  noAuth: false,
28
- handler: (_a) => __awaiter(this, [_a], void 0, function* ({ body, adminUser, cookies, response }) {
29
- const parsed = parseBody(finishRegistrationBodySchema, body, response);
30
- if ('error' in parsed)
31
- return parsed.error;
25
+ request_schema: finishRegistrationBodySchema,
26
+ handler: (_a) => __awaiter(this, [_a], void 0, function* ({ body, adminUser, cookies }) {
32
27
  return handlers.finishRegistration({ body, adminUser, cookies });
33
28
  }),
34
29
  });
@@ -48,10 +43,8 @@ export function registerPasskeyEndpoints(server, handlers) {
48
43
  method: 'DELETE',
49
44
  path: `/plugin/passkeys/deletePasskey`,
50
45
  noAuth: false,
51
- handler: (_a) => __awaiter(this, [_a], void 0, function* ({ body, adminUser, response }) {
52
- const parsed = parseBody(deletePasskeyBodySchema, body, response);
53
- if ('error' in parsed)
54
- return parsed.error;
46
+ request_schema: deletePasskeyBodySchema,
47
+ handler: (_a) => __awaiter(this, [_a], void 0, function* ({ body, adminUser }) {
55
48
  return handlers.deletePasskey({ body, adminUser });
56
49
  }),
57
50
  });
@@ -59,10 +52,8 @@ export function registerPasskeyEndpoints(server, handlers) {
59
52
  method: 'POST',
60
53
  path: `/plugin/passkeys/renamePasskey`,
61
54
  noAuth: false,
62
- handler: (_a) => __awaiter(this, [_a], void 0, function* ({ body, adminUser, response }) {
63
- const parsed = parseBody(renamePasskeyBodySchema, body, response);
64
- if ('error' in parsed)
65
- return parsed.error;
55
+ request_schema: renamePasskeyBodySchema,
56
+ handler: (_a) => __awaiter(this, [_a], void 0, function* ({ body, adminUser }) {
66
57
  return handlers.renamePasskey({ body, adminUser });
67
58
  }),
68
59
  });
@@ -76,10 +67,8 @@ export function registerPasskeyEndpoints(server, handlers) {
76
67
  method: 'POST',
77
68
  path: `/plugin/passkeys/resolveVerifyAuto`,
78
69
  noAuth: false,
70
+ request_schema: resolveVerifyAutoBodySchema,
79
71
  handler: (_a) => __awaiter(this, [_a], void 0, function* ({ body, adminUser, response, cookies, headers }) {
80
- const parsed = parseBody(resolveVerifyAutoBodySchema, body, response);
81
- if ('error' in parsed)
82
- return parsed.error;
83
72
  return handlers.resolveVerifyAuto({ body, adminUser, response, cookies, headers });
84
73
  }),
85
74
  });
@@ -7,7 +7,6 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge
7
7
  step((generator = generator.apply(thisArg, _arguments || [])).next());
8
8
  });
9
9
  };
10
- import { parseBody } from "adminforth";
11
10
  import { confirmLoginBodySchema, confirmLoginWithPasskeyBodySchema, verifyTotpBodySchema, } from "./validation.js";
12
11
  export function registerTwoFaEndpoints(server, handlers) {
13
12
  server.endpoint({
@@ -20,10 +19,8 @@ export function registerTwoFaEndpoints(server, handlers) {
20
19
  method: 'POST',
21
20
  path: `/plugin/twofa/confirmLogin`,
22
21
  noAuth: true,
22
+ request_schema: confirmLoginBodySchema,
23
23
  handler: (_a) => __awaiter(this, [_a], void 0, function* ({ body, response, cookies, headers }) {
24
- const parsed = parseBody(confirmLoginBodySchema, body, response);
25
- if ('error' in parsed)
26
- return parsed.error;
27
24
  return handlers.confirmLogin({ body, response, cookies, headers });
28
25
  }),
29
26
  });
@@ -31,10 +28,8 @@ export function registerTwoFaEndpoints(server, handlers) {
31
28
  method: 'POST',
32
29
  path: `/plugin/twofa/confirmLoginWithPasskey`,
33
30
  noAuth: true,
31
+ request_schema: confirmLoginWithPasskeyBodySchema,
34
32
  handler: (_a) => __awaiter(this, [_a], void 0, function* ({ body, response, cookies, headers, requestUrl, query }) {
35
- const parsed = parseBody(confirmLoginWithPasskeyBodySchema, body, response);
36
- if ('error' in parsed)
37
- return parsed.error;
38
33
  return handlers.confirmLoginWithPasskey({ body, response, cookies, headers, requestUrl, query });
39
34
  }),
40
35
  });
@@ -53,10 +48,8 @@ export function registerTwoFaEndpoints(server, handlers) {
53
48
  method: 'POST',
54
49
  path: `/plugin/twofa/verify`,
55
50
  noAuth: false,
56
- handler: (_a) => __awaiter(this, [_a], void 0, function* ({ adminUser, body, response }) {
57
- const parsed = parseBody(verifyTotpBodySchema, body, response);
58
- if ('error' in parsed)
59
- return parsed.error;
51
+ request_schema: verifyTotpBodySchema,
52
+ handler: (_a) => __awaiter(this, [_a], void 0, function* ({ adminUser, body }) {
60
53
  return handlers.verifyTotp({ adminUser, body });
61
54
  }),
62
55
  });
@@ -199,6 +199,10 @@ export class PasskeyService {
199
199
  const credentialID = credential.id;
200
200
  const base64CredentialID = credentialID;
201
201
  const base64PublicKey = isoBase64URL.fromBuffer(credentialPublicKey);
202
+ const existingPasskey = yield this.passkeyRepository.getByCredentialId(base64CredentialID);
203
+ if (existingPasskey) {
204
+ throw new Error('This passkey is already registered');
205
+ }
202
206
  yield this.passkeyRepository.create({
203
207
  [this.options.passkeys.credentialIdFieldName]: base64CredentialID,
204
208
  [this.options.passkeys.credentialUserIdFieldName]: adminUser.pk,
@@ -1,5 +1,4 @@
1
1
  import type { IHttpServer } from "adminforth";
2
- import { parseBody } from "adminforth";
3
2
  import {
4
3
  registrationOptionsBodySchema,
5
4
  finishRegistrationBodySchema,
@@ -13,9 +12,8 @@ export function registerPasskeyEndpoints(server: IHttpServer, handlers: any): vo
13
12
  method: 'POST',
14
13
  path: `/plugin/passkeys/registrationOptions`,
15
14
  noAuth: false,
15
+ request_schema: registrationOptionsBodySchema,
16
16
  handler: async ({ body, adminUser, response, cookies, headers }) => {
17
- const parsed = parseBody(registrationOptionsBodySchema, body, response);
18
- if ('error' in parsed) return parsed.error;
19
17
  return handlers.createRegistrationOptions({ body, adminUser, response, cookies, headers });
20
18
  },
21
19
  });
@@ -24,9 +22,8 @@ export function registerPasskeyEndpoints(server: IHttpServer, handlers: any): vo
24
22
  method: 'POST',
25
23
  path: `/plugin/passkeys/finishRegistration`,
26
24
  noAuth: false,
27
- handler: async ({ body, adminUser, cookies, response }) => {
28
- const parsed = parseBody(finishRegistrationBodySchema, body, response);
29
- if ('error' in parsed) return parsed.error;
25
+ request_schema: finishRegistrationBodySchema,
26
+ handler: async ({ body, adminUser, cookies }) => {
30
27
  return handlers.finishRegistration({ body, adminUser, cookies });
31
28
  },
32
29
  });
@@ -49,9 +46,8 @@ export function registerPasskeyEndpoints(server: IHttpServer, handlers: any): vo
49
46
  method: 'DELETE',
50
47
  path: `/plugin/passkeys/deletePasskey`,
51
48
  noAuth: false,
52
- handler: async ({ body, adminUser, response }) => {
53
- const parsed = parseBody(deletePasskeyBodySchema, body, response);
54
- if ('error' in parsed) return parsed.error;
49
+ request_schema: deletePasskeyBodySchema,
50
+ handler: async ({ body, adminUser }) => {
55
51
  return handlers.deletePasskey({ body, adminUser });
56
52
  },
57
53
  });
@@ -60,9 +56,8 @@ export function registerPasskeyEndpoints(server: IHttpServer, handlers: any): vo
60
56
  method: 'POST',
61
57
  path: `/plugin/passkeys/renamePasskey`,
62
58
  noAuth: false,
63
- handler: async ({ body, adminUser, response }) => {
64
- const parsed = parseBody(renamePasskeyBodySchema, body, response);
65
- if ('error' in parsed) return parsed.error;
59
+ request_schema: renamePasskeyBodySchema,
60
+ handler: async ({ body, adminUser }) => {
66
61
  return handlers.renamePasskey({ body, adminUser });
67
62
  },
68
63
  });
@@ -78,9 +73,8 @@ export function registerPasskeyEndpoints(server: IHttpServer, handlers: any): vo
78
73
  method: 'POST',
79
74
  path: `/plugin/passkeys/resolveVerifyAuto`,
80
75
  noAuth: false,
76
+ request_schema: resolveVerifyAutoBodySchema,
81
77
  handler: async ({ body, adminUser, response, cookies, headers }) => {
82
- const parsed = parseBody(resolveVerifyAutoBodySchema, body, response);
83
- if ('error' in parsed) return parsed.error;
84
78
  return handlers.resolveVerifyAuto({ body, adminUser, response, cookies, headers });
85
79
  },
86
80
  });
@@ -1,5 +1,4 @@
1
1
  import type { IHttpServer } from "adminforth";
2
- import { parseBody } from "adminforth";
3
2
  import {
4
3
  confirmLoginBodySchema,
5
4
  confirmLoginWithPasskeyBodySchema,
@@ -18,9 +17,8 @@ export function registerTwoFaEndpoints(server: IHttpServer, handlers: any): void
18
17
  method: 'POST',
19
18
  path: `/plugin/twofa/confirmLogin`,
20
19
  noAuth: true,
20
+ request_schema: confirmLoginBodySchema,
21
21
  handler: async ({ body, response, cookies, headers }) => {
22
- const parsed = parseBody(confirmLoginBodySchema, body, response);
23
- if ('error' in parsed) return parsed.error;
24
22
  return handlers.confirmLogin({ body, response, cookies, headers });
25
23
  },
26
24
  });
@@ -29,9 +27,8 @@ export function registerTwoFaEndpoints(server: IHttpServer, handlers: any): void
29
27
  method: 'POST',
30
28
  path: `/plugin/twofa/confirmLoginWithPasskey`,
31
29
  noAuth: true,
30
+ request_schema: confirmLoginWithPasskeyBodySchema,
32
31
  handler: async ({ body, response, cookies, headers, requestUrl, query }) => {
33
- const parsed = parseBody(confirmLoginWithPasskeyBodySchema, body, response);
34
- if ('error' in parsed) return parsed.error;
35
32
  return handlers.confirmLoginWithPasskey({ body, response, cookies, headers, requestUrl, query });
36
33
  },
37
34
  });
@@ -53,9 +50,8 @@ export function registerTwoFaEndpoints(server: IHttpServer, handlers: any): void
53
50
  method: 'POST',
54
51
  path: `/plugin/twofa/verify`,
55
52
  noAuth: false,
56
- handler: async ({ adminUser, body, response }) => {
57
- const parsed = parseBody(verifyTotpBodySchema, body, response);
58
- if ('error' in parsed) return parsed.error;
53
+ request_schema: verifyTotpBodySchema,
54
+ handler: async ({ adminUser, body }) => {
59
55
  return handlers.verifyTotp({ adminUser, body });
60
56
  },
61
57
  });
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@adminforth/two-factors-auth",
3
- "version": "4.3.1",
3
+ "version": "4.3.3",
4
4
  "description": "AdminForth plugin for two factors authentication",
5
5
  "main": "dist/index.js",
6
6
  "types": "dist/index.d.ts",
@@ -29,11 +29,11 @@
29
29
  "zod": "^4.3.6"
30
30
  },
31
31
  "peerDependencies": {
32
- "adminforth": "^3.7.1"
32
+ "adminforth": "^3.8.2"
33
33
  },
34
34
  "devDependencies": {
35
35
  "@types/node": "^22.10.7",
36
- "adminforth": "^3.7.1",
36
+ "adminforth": "^3.8.2",
37
37
  "semantic-release": "^24.2.1",
38
38
  "semantic-release-slack-bot": "^4.0.2",
39
39
  "typescript": "^5.7.3"
@@ -214,6 +214,11 @@ export class PasskeyService {
214
214
  const base64CredentialID = credentialID;
215
215
  const base64PublicKey = isoBase64URL.fromBuffer(credentialPublicKey);
216
216
 
217
+ const existingPasskey = await this.passkeyRepository.getByCredentialId(base64CredentialID);
218
+ if (existingPasskey) {
219
+ throw new Error('This passkey is already registered');
220
+ }
221
+
217
222
  await this.passkeyRepository.create({
218
223
  [this.options.passkeys.credentialIdFieldName] : base64CredentialID,
219
224
  [this.options.passkeys.credentialUserIdFieldName] : adminUser.pk,