@crossauth/fastify 0.0.7 → 0.0.9

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/dist/index.js CHANGED
@@ -7,11 +7,11 @@ import be from "@fastify/formbody";
7
7
  import ye from "@fastify/cors";
8
8
  import xe from "@fastify/cookie";
9
9
  import ue from "nunjucks";
10
- import { setParameter as S, ParamType as C, Crypto as A, TokenEmailer as _e, OAuthClientManager as G, SessionManager as Ae, ApiKeyManager as Y, KeyStorage as Ne, OAuthAuthorizationServer as Fe, DoubleSubmitCsrfToken as Ue, OAuthClientBackend as Oe, OAuthResourceServer as Ie, OAuthTokenConsumer as Me } from "@crossauth/backend";
10
+ import { setParameter as S, ParamType as C, Crypto as A, TokenEmailer as _e, OAuthClientManager as G, SessionManager as Ae, ApiKeyManager as Y, KeyStorage as Fe, OAuthAuthorizationServer as Ne, DoubleSubmitCsrfToken as Ue, OAuthClientBackend as Oe, OAuthResourceServer as Ie, OAuthTokenConsumer as Me } from "@crossauth/backend";
11
11
  import { CrossauthLogger as d, j as c, CrossauthError as l, ErrorCode as g, UserState as U, OAuthFlows as E } from "@crossauth/common";
12
12
  import { jwtDecode as W } from "jwt-decode";
13
13
  import Re from "qrcode";
14
- const F = ["Content-Type", "application/json; charset=utf-8"];
14
+ const N = ["Content-Type", "application/json; charset=utf-8"];
15
15
  class De {
16
16
  /**
17
17
  * Constructor.
@@ -144,7 +144,7 @@ class De {
144
144
  return await this.updateUser(
145
145
  e,
146
146
  o,
147
- (i, n, t) => i.header(...F).send({
147
+ (i, n, t) => i.header(...N).send({
148
148
  ok: !0,
149
149
  emailVerificationRequired: t
150
150
  })
@@ -157,7 +157,7 @@ class De {
157
157
  errorCodeName: n.codeName,
158
158
  errorCode: n.code
159
159
  })), d.logger.debug(c({ err: i })), this.sessionServer.handleError(i, e, o, (t, a) => {
160
- t.status(this.sessionServer.errorStatus(i)).header(...F).send({
160
+ t.status(this.sessionServer.errorStatus(i)).header(...N).send({
161
161
  ok: !1,
162
162
  errorMessage: a.message,
163
163
  errorMessages: a.messages,
@@ -280,7 +280,7 @@ class De {
280
280
  return await this.changeFactor2(
281
281
  e,
282
282
  o,
283
- (i, n, t) => i.header(...F).send({
283
+ (i, n, t) => i.header(...N).send({
284
284
  ok: !0,
285
285
  ...n.userData
286
286
  })
@@ -292,7 +292,7 @@ class De {
292
292
  user: (r = e.user) == null ? void 0 : r.username,
293
293
  errorCodeName: n.codeName,
294
294
  errorCode: n.code
295
- })), d.logger.debug(c({ err: i })), this.sessionServer.handleError(i, e, o, (t, a) => t.status(this.sessionServer.errorStatus(i)).header(...F).send({
295
+ })), d.logger.debug(c({ err: i })), this.sessionServer.handleError(i, e, o, (t, a) => t.status(this.sessionServer.errorStatus(i)).header(...N).send({
296
296
  ok: !1,
297
297
  errorMessage: a.message,
298
298
  errorMessages: a.messages,
@@ -397,7 +397,7 @@ class De {
397
397
  return await this.changePassword(
398
398
  e,
399
399
  o,
400
- (i, n) => i.header(...F).send({
400
+ (i, n) => i.header(...N).send({
401
401
  ok: !0
402
402
  })
403
403
  );
@@ -408,7 +408,7 @@ class De {
408
408
  user: (r = e.user) == null ? void 0 : r.username,
409
409
  errorCodeName: n.codeName,
410
410
  errorCode: n.code
411
- })), d.logger.debug(c({ err: i })), this.sessionServer.handleError(i, e, o, (t, a) => t.status(this.sessionServer.errorStatus(i)).header(...F).send({
411
+ })), d.logger.debug(c({ err: i })), this.sessionServer.handleError(i, e, o, (t, a) => t.status(this.sessionServer.errorStatus(i)).header(...N).send({
412
412
  ok: !1,
413
413
  errorMessage: a.message,
414
414
  errorMessages: a.messages,
@@ -542,7 +542,7 @@ class De {
542
542
  return await this.reconfigureFactor2(
543
543
  o,
544
544
  s,
545
- (i, n, t) => i.header(...F).send({
545
+ (i, n, t) => i.header(...N).send({
546
546
  ok: !0,
547
547
  ...n
548
548
  })
@@ -555,7 +555,7 @@ class De {
555
555
  errorCodeName: n.codeName,
556
556
  errorCode: n.code
557
557
  })), d.logger.debug(c({ err: i })), this.sessionServer.handleError(i, o, s, (t, a) => {
558
- t.status(this.sessionServer.errorStatus(i)).header(...F).send({
558
+ t.status(this.sessionServer.errorStatus(i)).header(...N).send({
559
559
  ok: !1,
560
560
  errorMessage: a.message,
561
561
  errorMessages: a.messages,
@@ -584,7 +584,7 @@ class De {
584
584
  ok: !0,
585
585
  user: n
586
586
  };
587
- return this.sessionServer.isSessionUser(o) || (t.emailVerificationNeeded = this.enableEmailVerification), i.header(...F).send(t);
587
+ return this.sessionServer.isSessionUser(o) || (t.emailVerificationNeeded = this.enableEmailVerification), i.header(...N).send(t);
588
588
  }
589
589
  );
590
590
  } catch (i) {
@@ -595,7 +595,7 @@ class De {
595
595
  errorCodeName: n.codeName,
596
596
  errorCode: n.code
597
597
  })), d.logger.debug(c({ err: i })), this.sessionServer.handleError(i, o, s, (t, a) => {
598
- t.status(this.sessionServer.errorStatus(i)).header(...F).send({
598
+ t.status(this.sessionServer.errorStatus(i)).header(...N).send({
599
599
  ok: !1,
600
600
  errorMessage: a.message,
601
601
  errorMessages: a.messages,
@@ -686,7 +686,7 @@ class De {
686
686
  return await this.requestPasswordReset(
687
687
  e,
688
688
  o,
689
- (s, r) => s.header(...F).send({
689
+ (s, r) => s.header(...N).send({
690
690
  ok: !0
691
691
  })
692
692
  );
@@ -698,7 +698,7 @@ class De {
698
698
  errorCodeName: r.codeName,
699
699
  errorCode: r.code
700
700
  })), d.logger.debug(c({ err: s })), this.sessionServer.handleError(s, e, o, (i, n) => {
701
- i.status(this.sessionServer.errorStatus(s)).header(...F).send({
701
+ i.status(this.sessionServer.errorStatus(s)).header(...N).send({
702
702
  ok: !1,
703
703
  errorMessage: n.message,
704
704
  errorMessages: n.messages,
@@ -794,7 +794,7 @@ class De {
794
794
  return await this.resetPassword(
795
795
  e,
796
796
  o,
797
- (s, r) => s.header(...F).send({
797
+ (s, r) => s.header(...N).send({
798
798
  ok: !0
799
799
  })
800
800
  );
@@ -806,7 +806,7 @@ class De {
806
806
  errorCodeName: r.codeName,
807
807
  errorCode: r.code
808
808
  })), d.logger.debug(c({ err: s })), this.sessionServer.handleError(s, e, o, (i, n) => {
809
- i.status(this.sessionServer.errorStatus(s)).header(...F).send({
809
+ i.status(this.sessionServer.errorStatus(s)).header(...N).send({
810
810
  ok: !1,
811
811
  errorMessage: n.message,
812
812
  errorMessages: n.messages,
@@ -875,7 +875,7 @@ class De {
875
875
  return await this.verifyEmail(
876
876
  e,
877
877
  o,
878
- (s, r) => s.header(...F).send({
878
+ (s, r) => s.header(...N).send({
879
879
  ok: !0,
880
880
  user: r
881
881
  })
@@ -888,7 +888,7 @@ class De {
888
888
  errorCodeName: r.codeName,
889
889
  errorCode: r.code
890
890
  })), d.logger.debug(c({ err: s })), this.sessionServer.handleError(s, e, o, (i, n) => {
891
- i.status(this.sessionServer.errorStatus(s)).header(...F).send({
891
+ i.status(this.sessionServer.errorStatus(s)).header(...N).send({
892
892
  ok: !1,
893
893
  errorMessage: n.message,
894
894
  errorMessages: n.messages,
@@ -1008,14 +1008,14 @@ class De {
1008
1008
  ip: e.ip,
1009
1009
  user: (s = e.user) == null ? void 0 : s.username
1010
1010
  })), !e.user)
1011
- return o.status(401).header(...F).send({ ok: !1 });
1011
+ return o.status(401).header(...N).send({ ok: !1 });
1012
1012
  try {
1013
1013
  return await this.deleteUser(
1014
1014
  e,
1015
1015
  o,
1016
1016
  (i) => {
1017
1017
  var n;
1018
- return i.header(...F).send({
1018
+ return i.header(...N).send({
1019
1019
  ok: !0,
1020
1020
  userid: (n = e.user) == null ? void 0 : n.id
1021
1021
  });
@@ -1029,7 +1029,7 @@ class De {
1029
1029
  errorCodeName: n.codeName,
1030
1030
  errorCode: n.code
1031
1031
  })), d.logger.debug(c({ err: i })), this.sessionServer.handleError(i, e, o, (t, a) => {
1032
- t.status(this.sessionServer.errorStatus(i)).header(...F).send({
1032
+ t.status(this.sessionServer.errorStatus(i)).header(...N).send({
1033
1033
  ok: !1,
1034
1034
  errorMessage: a.message,
1035
1035
  errorMessages: a.messages,
@@ -1061,7 +1061,7 @@ class De {
1061
1061
  if (i.length > 0)
1062
1062
  throw new l(g.FormEntry, i);
1063
1063
  let n = await this.sessionServer.sessionManager.updateUser(e.user, r);
1064
- return s(o, e.user, n);
1064
+ return s(o, e.user, n.emailVerificationTokenSent);
1065
1065
  }
1066
1066
  async changeFactor2(e, o, s) {
1067
1067
  if (!this.sessionServer.userStorage) throw new l(g.Configuration, "Cannot call changeFactor2 unless a user storage is provided");
@@ -1509,11 +1509,11 @@ class He {
1509
1509
  s,
1510
1510
  e,
1511
1511
  o,
1512
- (n, t, a) => {
1513
- const h = a ? "Please click on the link in your email to verify your email address." : "User's details have been updated";
1514
- return n.view(this.adminUpdateUserPage, {
1512
+ (n, t, a, h) => {
1513
+ let f = "User's details have been updated.";
1514
+ return a ? f = "User's details have been updated and sent and an email verification link." : h && (f = "User's details have been updated and sent and a password reset token sent."), n.view(this.adminUpdateUserPage, {
1515
1515
  csrfToken: e.csrfToken,
1516
- message: h,
1516
+ message: f,
1517
1517
  urlPrefix: this.adminPrefix,
1518
1518
  allowedFactor2: this.sessionServer.allowedFactor2Details()
1519
1519
  });
@@ -1957,7 +1957,7 @@ class He {
1957
1957
  //await this.sessionServer.sessionManager.updateUser(request.user, user,);
1958
1958
  await this.sessionServer.sessionManager.updateUser(e, e, !0)
1959
1959
  );
1960
- return r(s, o.user, h);
1960
+ return r(s, o.user, h.emailVerificationTokenSent, h.passwordResetTokenSent);
1961
1961
  }
1962
1962
  async changePassword(e, o, s, r) {
1963
1963
  if (!this.sessionServer.userStorage) throw new l(g.Configuration, "Cannot call updateUser unless a user storage is provided");
@@ -3568,22 +3568,22 @@ class Ke {
3568
3568
  let M = {};
3569
3569
  for (let I in t.body)
3570
3570
  T.includes(I) && (M[I] = t.body[I]);
3571
- let N;
3571
+ let F;
3572
3572
  try {
3573
3573
  await this.sessionManager.completeTwoFactorPageVisit(M, w);
3574
3574
  } catch (I) {
3575
- N = l.asCrossauthError(I), d.logger.debug(c({ err: I }));
3575
+ F = l.asCrossauthError(I), d.logger.debug(c({ err: I }));
3576
3576
  const O = l.asCrossauthError(I);
3577
3577
  d.logger.error(c({
3578
- msg: N.message,
3578
+ msg: F.message,
3579
3579
  cerr: I,
3580
3580
  user: t.body.username,
3581
3581
  errorCode: O.code,
3582
3582
  errorCodeName: O.codeName
3583
3583
  }));
3584
3584
  }
3585
- if (t.body = m.pre2fa.body, N)
3586
- if (N.code == g.Expired) {
3585
+ if (t.body = m.pre2fa.body, F)
3586
+ if (F.code == g.Expired) {
3587
3587
  d.logger.debug("Error - cancelling 2FA");
3588
3588
  try {
3589
3589
  await this.sessionManager.cancelTwoFactorPageVisit(w);
@@ -3592,18 +3592,18 @@ class Ke {
3592
3592
  }
3593
3593
  t.body = {
3594
3594
  ...t.body,
3595
- errorMessage: N.message,
3596
- errorMessages: N.message,
3597
- errorCode: "" + N.code,
3598
- errorCodeName: g[N.code]
3595
+ errorMessage: F.message,
3596
+ errorMessages: F.message,
3597
+ errorCode: "" + F.code,
3598
+ errorCodeName: g[F.code]
3599
3599
  };
3600
3600
  } else
3601
- return this.factor2ProtectedPageEndpoints.includes(t.url) ? a.redirect(this.prefix + "factor2?error=" + g[N.code]) : a.status(N.httpStatus).send(JSON.stringify({
3601
+ return this.factor2ProtectedPageEndpoints.includes(t.url) ? a.redirect(this.prefix + "factor2?error=" + g[F.code]) : a.status(F.httpStatus).send(JSON.stringify({
3602
3602
  ok: !1,
3603
- errorMessage: N.message,
3604
- errorMessages: N.messages,
3605
- errorCode: N.code,
3606
- errorCodeName: g[N.code]
3603
+ errorMessage: F.message,
3604
+ errorMessages: F.messages,
3605
+ errorCode: F.code,
3606
+ errorCodeName: g[F.code]
3607
3607
  }));
3608
3608
  } else
3609
3609
  return this.validateCsrfToken(t), d.logger.debug("Starting 2FA"), this.sessionManager.initiateTwoFactorPageVisit(t.user, w, t.body, t.url.replace(/\?.*$/, "")), this.factor2ProtectedPageEndpoints.includes(t.url) ? a.redirect(this.prefix + "factor2") : a.send(JSON.stringify({
@@ -3692,22 +3692,19 @@ class Ke {
3692
3692
  }));
3693
3693
  }
3694
3694
  } else if (i.state == U.passwordResetNeeded || i.state == U.passwordAndFactor2ResetNeeded) {
3695
- if (this.endpoints.includes("requestpasswordreset"))
3696
- return d.logger.debug(c({ msg: "Password reset needed - sending redirect" })), r.redirect("/requestpasswordreset?required=true&next=" + encodeURIComponent("login?next=" + s));
3697
- {
3698
- const n = new l(g.PasswordResetNeeded);
3699
- return this.handleError(n, e, r, (t, a) => t.view(this.loginPage, {
3700
- errorMessage: a.message,
3701
- errorMessages: a.messages,
3702
- errorCode: a.code,
3703
- errorCodeName: g[a.code],
3704
- next: s,
3705
- persist: e.body.persist,
3706
- username: e.body.username,
3707
- csrfToken: e.csrfToken,
3708
- urlPrefix: this.prefix
3709
- }));
3710
- }
3695
+ d.logger.debug(c({ msg: "Password reset needed - sending error" }));
3696
+ const n = new l(g.PasswordResetNeeded);
3697
+ return this.handleError(n, e, r, (t, a) => t.view(this.loginPage, {
3698
+ errorMessage: a.message,
3699
+ errorMessages: a.messages,
3700
+ errorCode: a.code,
3701
+ errorCodeName: g[a.code],
3702
+ next: s,
3703
+ persist: e.body.persist,
3704
+ username: e.body.username,
3705
+ csrfToken: e.csrfToken,
3706
+ urlPrefix: this.prefix
3707
+ }));
3711
3708
  } else if (this.allowedFactor2.length > 0 && (i.state == U.factor2ResetNeeded || !this.allowedFactor2.includes(i.factor2 ? i.factor2 : "none"))) {
3712
3709
  if (d.logger.debug(c({
3713
3710
  msg: `Factor2 reset needed. Factor2 is ${i.factor2}, state is ${i.state}, allowed factor2 is [${this.allowedFactor2.join(", ")}]`,
@@ -4752,7 +4749,7 @@ class Ye {
4752
4749
  msg: "Valid API key",
4753
4750
  hahedApiKey: Y.hashSignedApiKeyValue(t.value)
4754
4751
  }));
4755
- const a = Ne.decodeData(t.data);
4752
+ const a = Fe.decodeData(t.data);
4756
4753
  if (i.apiKey = { ...t, ...a }, "scope" in a && Array.isArray(a.scope)) {
4757
4754
  let h = [];
4758
4755
  for (let f of a.scope)
@@ -4807,7 +4804,7 @@ class $e {
4807
4804
  p(this, "refreshTokenCookieSameSite", "strict");
4808
4805
  p(this, "csrfTokens");
4809
4806
  p(this, "createGetCsrfTokenEndpoint", !1);
4810
- this.app = e, this.fastifyServer = o, this.clientStorage = s, this.authServer = new Fe(
4807
+ this.app = e, this.fastifyServer = o, this.clientStorage = s, this.authServer = new Ne(
4811
4808
  this.clientStorage,
4812
4809
  r,
4813
4810
  i,
@@ -4906,8 +4903,8 @@ class $e {
4906
4903
  let m, P;
4907
4904
  const T = t.headers.authorization.split(" ");
4908
4905
  if (T.length == 2 && T[0].toLocaleLowerCase() == "basic") {
4909
- const N = A.base64Decode(T[1]).split(":", 2);
4910
- N.length == 2 && (m = N[0], P = N[1]);
4906
+ const F = A.base64Decode(T[1]).split(":", 2);
4907
+ F.length == 2 && (m = F[0], P = F[1]);
4911
4908
  }
4912
4909
  m == null || P == null ? d.logger.warn(c({
4913
4910
  msg: "Ignoring malform authenization header " + t.headers.authorization
@@ -6372,13 +6369,13 @@ class we extends Oe {
6372
6369
  method: f[w],
6373
6370
  url: this.prefix + this.bffEndpointName + h,
6374
6371
  handler: async (m, P) => {
6375
- var N, I;
6372
+ var F, I;
6376
6373
  d.logger.info(c({
6377
6374
  msg: "Page visit",
6378
6375
  method: m.method,
6379
6376
  url: m.url,
6380
6377
  ip: m.ip,
6381
- user: (N = m.user) == null ? void 0 : N.username
6378
+ user: (F = m.user) == null ? void 0 : F.username
6382
6379
  }));
6383
6380
  const T = m.url.substring(this.prefix.length + this.bffEndpointName.length);
6384
6381
  d.logger.debug(c({ msg: "Resource server URL " + T }));
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@crossauth/fastify",
3
3
  "private": false,
4
- "version": "0.0.7",
4
+ "version": "0.0.9",
5
5
  "license": "Apache-2.0",
6
6
  "type": "module",
7
7
  "main": "./dist/index.cjs",
@@ -59,8 +59,8 @@
59
59
  "prisma": "^5.9.1",
60
60
  "qrcode": "^1.5.3",
61
61
  "sonic-boom": "^3.7.0",
62
- "@crossauth/backend": "^0.0.7",
63
- "@crossauth/common": "^0.0.7"
62
+ "@crossauth/backend": "^0.0.9",
63
+ "@crossauth/common": "^0.0.9"
64
64
  },
65
65
  "scripts": {
66
66
  "dev": "vite",