@social-mail/social-mail-web-server 1.7.60 → 1.7.63

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.
Files changed (51) hide show
  1. package/content/json/bad-names.json +591 -0
  2. package/dist/common/globalEnv.d.ts +1 -0
  3. package/dist/common/globalEnv.d.ts.map +1 -1
  4. package/dist/common/globalEnv.js +1 -0
  5. package/dist/common/globalEnv.js.map +1 -1
  6. package/dist/server/model/entities/User.d.ts +2 -0
  7. package/dist/server/model/entities/User.d.ts.map +1 -1
  8. package/dist/server/model/entities/User.js +13 -0
  9. package/dist/server/model/entities/User.js.map +1 -1
  10. package/dist/server/model/events/DomainEvents.d.ts +1 -0
  11. package/dist/server/model/events/DomainEvents.d.ts.map +1 -1
  12. package/dist/server/model/events/DomainEvents.js +22 -0
  13. package/dist/server/model/events/DomainEvents.js.map +1 -1
  14. package/dist/server/model/events/HostedDomainEvents.d.ts.map +1 -1
  15. package/dist/server/model/events/HostedDomainEvents.js.map +1 -1
  16. package/dist/server/model/events/UserEvents.d.ts.map +1 -1
  17. package/dist/server/model/events/UserEvents.js +5 -0
  18. package/dist/server/model/events/UserEvents.js.map +1 -1
  19. package/dist/server/seed/ui/seed-ui.js +1 -1
  20. package/dist/server/services/EmailAddressService.d.ts +1 -0
  21. package/dist/server/services/EmailAddressService.d.ts.map +1 -1
  22. package/dist/server/services/EmailAddressService.js +81 -58
  23. package/dist/server/services/EmailAddressService.js.map +1 -1
  24. package/dist/server/services/ui/renderUIClient.d.ts.map +1 -1
  25. package/dist/server/services/ui/renderUIClient.js +1 -0
  26. package/dist/server/services/ui/renderUIClient.js.map +1 -1
  27. package/dist/tsconfig.tsbuildinfo +1 -1
  28. package/dist/wwwroot/routes/social-mail/user/password/reset/post.d.ts +24 -0
  29. package/dist/wwwroot/routes/social-mail/user/password/reset/post.d.ts.map +1 -0
  30. package/dist/wwwroot/routes/social-mail/user/password/reset/post.js +109 -0
  31. package/dist/wwwroot/routes/social-mail/user/password/reset/post.js.map +1 -0
  32. package/dist/wwwroot/routes/social-mail/user/signup/get.d.ts +5 -0
  33. package/dist/wwwroot/routes/social-mail/user/signup/get.d.ts.map +1 -0
  34. package/dist/wwwroot/routes/social-mail/user/signup/get.js +8 -0
  35. package/dist/wwwroot/routes/social-mail/user/signup/get.js.map +1 -0
  36. package/dist/wwwroot/routes/social-mail/user/signup/post.d.ts +4 -12
  37. package/dist/wwwroot/routes/social-mail/user/signup/post.d.ts.map +1 -1
  38. package/dist/wwwroot/routes/social-mail/user/signup/post.js +86 -97
  39. package/dist/wwwroot/routes/social-mail/user/signup/post.js.map +1 -1
  40. package/package.json +2 -2
  41. package/src/common/globalEnv.ts +1 -0
  42. package/src/server/model/entities/User.ts +13 -0
  43. package/src/server/model/events/DomainEvents.ts +10 -1
  44. package/src/server/model/events/HostedDomainEvents.ts +1 -0
  45. package/src/server/model/events/UserEvents.ts +5 -0
  46. package/src/server/seed/ui/seed-ui.ts +1 -1
  47. package/src/server/services/EmailAddressService.ts +9 -0
  48. package/src/server/services/ui/renderUIClient.tsx +1 -0
  49. package/src/wwwroot/routes/social-mail/user/password/reset/post.tsx +128 -0
  50. package/src/wwwroot/routes/social-mail/user/signup/get.tsx +9 -0
  51. package/src/wwwroot/routes/social-mail/user/signup/post.tsx +88 -103
@@ -0,0 +1,24 @@
1
+ import Page from "@entity-access/server-pages/dist/Page.js";
2
+ import SocialMailContext from "../../../../../../server/model/SocialMailContext.js";
3
+ import CryptoService from "../../../../../../server/services/CryptoService.js";
4
+ import EmailAddressService from "../../../../../../server/services/EmailAddressService.js";
5
+ import CaptchaService from "../../../../../../server/services/captcha/CaptchaService.js";
6
+ import { IVerification } from "../../../../../../server/services/captcha/IVerification.js";
7
+ import ExternalOtpInService from "../../../../../../server/services/external-otp-in/ExternalOtpInService.js";
8
+ export interface ISignup {
9
+ username: string;
10
+ userID: number;
11
+ phoneNumber: string;
12
+ captcha: IVerification;
13
+ phone: IVerification;
14
+ password: string;
15
+ }
16
+ export default class extends Page {
17
+ captchaService: CaptchaService;
18
+ cryptoService: CryptoService;
19
+ emailAddressService: EmailAddressService;
20
+ ois: ExternalOtpInService;
21
+ db: SocialMailContext;
22
+ run(): Promise<import("@entity-access/server-pages/dist/Content.js").default>;
23
+ }
24
+ //# sourceMappingURL=post.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"post.d.ts","sourceRoot":"","sources":["../../../../../../../src/wwwroot/routes/social-mail/user/password/reset/post.tsx"],"names":[],"mappings":"AAEA,OAAO,IAAI,MAAM,0CAA0C,CAAC;AAE5D,OAAO,iBAAiB,MAAM,qDAAqD,CAAC;AACpF,OAAO,aAAa,MAAM,oDAAoD,CAAC;AAC/E,OAAO,mBAAmB,MAAM,0DAA0D,CAAC;AAC3F,OAAO,cAAc,MAAM,6DAA6D,CAAC;AACzF,OAAO,EAAE,aAAa,EAAE,MAAM,4DAA4D,CAAC;AAC3F,OAAO,oBAAoB,MAAM,2EAA2E,CAAC;AAE7G,MAAM,WAAW,OAAO;IACpB,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;IACf,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,EAAE,aAAa,CAAC;IACvB,KAAK,EAAE,aAAa,CAAC;IACrB,QAAQ,EAAE,MAAM,CAAC;CACpB;AAGD,MAAM,CAAC,OAAO,MAAO,SAAQ,IAAI;IAG7B,cAAc,EAAE,cAAc,CAAC;IAG/B,aAAa,EAAE,aAAa,CAAC;IAG7B,mBAAmB,EAAE,mBAAmB,CAAC;IAGzC,GAAG,EAAE,oBAAoB,CAAC;IAI1B,EAAE,EAAE,iBAAiB,CAAC;IAEhB,GAAG;CAwFZ"}
@@ -0,0 +1,109 @@
1
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
2
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
3
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
4
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
5
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
6
+ };
7
+ var __metadata = (this && this.__metadata) || function (k, v) {
8
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
9
+ };
10
+ import EntityAccessError from "@entity-access/entity-access/dist/common/EntityAccessError.js";
11
+ import Inject from "@entity-access/entity-access/dist/di/di.js";
12
+ import Page from "@entity-access/server-pages/dist/Page.js";
13
+ import { Prepare } from "@entity-access/server-pages/dist/decorators/Prepare.js";
14
+ import SocialMailContext from "../../../../../../server/model/SocialMailContext.js";
15
+ import CryptoService from "../../../../../../server/services/CryptoService.js";
16
+ import EmailAddressService from "../../../../../../server/services/EmailAddressService.js";
17
+ import CaptchaService from "../../../../../../server/services/captcha/CaptchaService.js";
18
+ import ExternalOtpInService from "../../../../../../server/services/external-otp-in/ExternalOtpInService.js";
19
+ let default_1 = class extends Page {
20
+ async run() {
21
+ const { db } = this;
22
+ db.verifyFilters = false;
23
+ db.raiseEvents = false;
24
+ const model = this.body;
25
+ model.username = model.username?.trim();
26
+ if (!model.username) {
27
+ throw new EntityAccessError("Username is required");
28
+ }
29
+ const [username, domain] = model.username.split("@");
30
+ model.username = username?.trim()?.toLocaleLowerCase()?.replace(/[\.\-]/g, "") + "@" + domain;
31
+ model.phoneNumber = `+${model.phoneNumber.replace(/[^0-9]/g, "")}`;
32
+ // console.log(model);
33
+ // verify captcha...
34
+ await this.captchaService.verify(model.captcha);
35
+ const user = await db.users.where(model, (p) => (x) => x.userName === p.username)
36
+ .first();
37
+ if (!user) {
38
+ throw new EntityAccessError(`Username ${model.username} not found, make sure it is complete email address.`);
39
+ }
40
+ if (!model.phone.id) {
41
+ // check if phone exists...
42
+ const phone = await db.userAuthFactors
43
+ .where(model, (p) => (x) => x.user.userName === p.username
44
+ && x.phoneNumber === p.phoneNumber)
45
+ .first();
46
+ if (!phone) {
47
+ throw new EntityAccessError(`No phone number is associated with this user, please contact us at support@neurospeech.com .`);
48
+ }
49
+ if (!model.phone.id) {
50
+ const v = await this.ois.create([model.phoneNumber]);
51
+ model.phone.id = v.verificationID;
52
+ model.phone.code = v.accessCode;
53
+ model.phone.smsConfig = v.externalConfig;
54
+ return this.json(model);
55
+ }
56
+ }
57
+ if (model.phone.id) {
58
+ // verify...
59
+ const v = await db.verificationTokens.statements.select({}, { verificationID: model.phone.id });
60
+ if (!v.verified) {
61
+ return this.json(model);
62
+ }
63
+ model.phone.verified = "true";
64
+ }
65
+ if (!model.password) {
66
+ return this.json(model);
67
+ }
68
+ if (model.password.length < 7) {
69
+ throw new EntityAccessError("Password is cannot be less than 7 characters");
70
+ }
71
+ if (/\s/i.test(model.password)) {
72
+ throw new EntityAccessError("Password must not any whitespace characters");
73
+ }
74
+ const passwordSalt = this.cryptoService.generateSalt();
75
+ const passwordHash = this.cryptoService.hash(passwordSalt, model.password);
76
+ model.userID = user.userID;
77
+ await db.users.where(user, (p) => (x) => x.userID === p.userID)
78
+ .update({ passwordSalt, passwordHash }, (p) => (x) => ({
79
+ passwordHash: p.passwordHash,
80
+ passwordSalt: p.passwordSalt
81
+ }));
82
+ return this.json(model);
83
+ }
84
+ };
85
+ __decorate([
86
+ Inject,
87
+ __metadata("design:type", CaptchaService)
88
+ ], default_1.prototype, "captchaService", void 0);
89
+ __decorate([
90
+ Inject,
91
+ __metadata("design:type", CryptoService)
92
+ ], default_1.prototype, "cryptoService", void 0);
93
+ __decorate([
94
+ Inject,
95
+ __metadata("design:type", EmailAddressService)
96
+ ], default_1.prototype, "emailAddressService", void 0);
97
+ __decorate([
98
+ Inject,
99
+ __metadata("design:type", ExternalOtpInService)
100
+ ], default_1.prototype, "ois", void 0);
101
+ __decorate([
102
+ Inject,
103
+ __metadata("design:type", SocialMailContext)
104
+ ], default_1.prototype, "db", void 0);
105
+ default_1 = __decorate([
106
+ Prepare.parseJsonBody
107
+ ], default_1);
108
+ export default default_1;
109
+ //# sourceMappingURL=post.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"post.js","sourceRoot":"","sources":["../../../../../../../src/wwwroot/routes/social-mail/user/password/reset/post.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ import Page from "@entity-access/server-pages/dist/Page.js";
2
+ export default class extends Page {
3
+ run(): Promise<import("@entity-access/server-pages/dist/Content.js").default>;
4
+ }
5
+ //# sourceMappingURL=get.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"get.d.ts","sourceRoot":"","sources":["../../../../../../src/wwwroot/routes/social-mail/user/signup/get.tsx"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,0CAA0C,CAAC;AAG5D,MAAM,CAAC,OAAO,MAAO,SAAQ,IAAI;IAEvB,GAAG;CAGZ"}
@@ -0,0 +1,8 @@
1
+ import Page from "@entity-access/server-pages/dist/Page.js";
2
+ import { renderUIClient } from "../../../../../server/services/ui/renderUIClient.js";
3
+ export default class extends Page {
4
+ async run() {
5
+ return renderUIClient(this, "dist/public/users/signup/SignupPage");
6
+ }
7
+ }
8
+ //# sourceMappingURL=get.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"get.js","sourceRoot":"","sources":["../../../../../../src/wwwroot/routes/social-mail/user/signup/get.tsx"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,0CAA0C,CAAC;AAC5D,OAAO,EAAE,cAAc,EAAE,MAAM,qDAAqD,CAAC;AAErF,MAAM,CAAC,OAAO,MAAO,SAAQ,IAAI;IAE7B,KAAK,CAAC,GAAG;QACL,OAAO,cAAc,CAAC,IAAI,EAAE,qCAAqC,CAAC,CAAC;IACvE,CAAC;CACJ"}
@@ -1,36 +1,28 @@
1
1
  import Page from "@entity-access/server-pages/dist/Page.js";
2
2
  import SocialMailContext from "../../../../../server/model/SocialMailContext.js";
3
+ import VerificationToken from "../../../../../server/model/entities/VerificationToken.js";
3
4
  import CryptoService from "../../../../../server/services/CryptoService.js";
4
5
  import EmailAddressService from "../../../../../server/services/EmailAddressService.js";
5
6
  import CaptchaService from "../../../../../server/services/captcha/CaptchaService.js";
6
7
  import ExternalOtpInService from "../../../../../server/services/external-otp-in/ExternalOtpInService.js";
7
- import WebSiteService from "../../../../../server/services/files/WebSiteService.js";
8
- import { StoreAccountAddress } from "../../../../../server/model/entities/StoreAddress.js";
9
- import VerificationToken from "../../../../../server/model/entities/VerificationToken.js";
10
8
  export interface ISignup {
11
9
  userID: number;
10
+ username: string;
11
+ emailAddress: string;
12
12
  password: string;
13
13
  name: string;
14
14
  phoneNumber: string;
15
- emailAddress: string;
16
15
  isdCode?: string;
17
16
  country: string;
18
17
  captcha: Partial<VerificationToken>;
19
18
  phone: Partial<VerificationToken>;
20
- email: Partial<VerificationToken>;
21
- billing?: Partial<StoreAccountAddress>;
22
- shipping?: Partial<StoreAccountAddress>;
23
19
  }
24
- /**
25
- * External Signup is used for signing up for Blog or Store.
26
- */
27
- export default class ExternalSignup extends Page {
20
+ export default class extends Page {
28
21
  captchaService: CaptchaService;
29
22
  cryptoService: CryptoService;
30
23
  emailAddressService: EmailAddressService;
31
24
  ois: ExternalOtpInService;
32
25
  db: SocialMailContext;
33
- websiteService: WebSiteService;
34
26
  run(): Promise<import("@entity-access/server-pages/dist/Content.js").default>;
35
27
  }
36
28
  //# sourceMappingURL=post.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"post.d.ts","sourceRoot":"","sources":["../../../../../../src/wwwroot/routes/social-mail/user/signup/post.tsx"],"names":[],"mappings":"AAGA,OAAO,IAAI,MAAM,0CAA0C,CAAC;AAE5D,OAAO,iBAAiB,MAAM,kDAAkD,CAAC;AACjF,OAAO,aAAa,MAAM,iDAAiD,CAAC;AAC5E,OAAO,mBAAmB,MAAM,uDAAuD,CAAC;AACxF,OAAO,cAAc,MAAM,0DAA0D,CAAC;AAEtF,OAAO,oBAAoB,MAAM,wEAAwE,CAAC;AAG1G,OAAO,cAAc,MAAM,wDAAwD,CAAC;AACpF,OAAO,EAAE,mBAAmB,EAAE,MAAM,sDAAsD,CAAC;AAC3F,OAAO,iBAAiB,MAAM,2DAA2D,CAAC;AAE1F,MAAM,WAAW,OAAO;IACpB,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE,MAAM,CAAC;IACrB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,OAAO,CAAC,iBAAiB,CAAC,CAAC;IACpC,KAAK,EAAE,OAAO,CAAC,iBAAiB,CAAC,CAAC;IAClC,KAAK,EAAE,OAAO,CAAC,iBAAiB,CAAC,CAAC;IAClC,OAAO,CAAC,EAAE,OAAO,CAAC,mBAAmB,CAAC,CAAC;IACvC,QAAQ,CAAC,EAAE,OAAO,CAAC,mBAAmB,CAAC,CAAC;CAC3C;AAED;;GAEG;AAIH,MAAM,CAAC,OAAO,OAAO,cAAe,SAAQ,IAAI;IAG5C,cAAc,EAAE,cAAc,CAAC;IAG/B,aAAa,EAAE,aAAa,CAAC;IAG7B,mBAAmB,EAAE,mBAAmB,CAAC;IAGzC,GAAG,EAAE,oBAAoB,CAAC;IAG1B,EAAE,EAAE,iBAAiB,CAAC;IAGtB,cAAc,EAAE,cAAc,CAAC;IAEzB,GAAG;CAgKZ"}
1
+ {"version":3,"file":"post.d.ts","sourceRoot":"","sources":["../../../../../../src/wwwroot/routes/social-mail/user/signup/post.tsx"],"names":[],"mappings":"AACA,OAAO,IAAI,MAAM,0CAA0C,CAAC;AAK5D,OAAO,iBAAiB,MAAM,kDAAkD,CAAC;AACjF,OAAO,iBAAiB,MAAM,2DAA2D,CAAC;AAC1F,OAAO,aAAa,MAAM,iDAAiD,CAAC;AAC5E,OAAO,mBAAmB,MAAM,uDAAuD,CAAC;AACxF,OAAO,cAAc,MAAM,0DAA0D,CAAC;AACtF,OAAO,oBAAoB,MAAM,wEAAwE,CAAC;AAE1G,MAAM,WAAW,OAAO;IACpB,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;IACjB,YAAY,EAAE,MAAM,CAAC;IACrB,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,OAAO,CAAC,iBAAiB,CAAC,CAAC;IACpC,KAAK,EAAE,OAAO,CAAC,iBAAiB,CAAC,CAAC;CACrC;AAiBD,MAAM,CAAC,OAAO,MAAO,SAAQ,IAAI;IAG7B,cAAc,EAAE,cAAc,CAAC;IAG/B,aAAa,EAAE,aAAa,CAAC;IAG7B,mBAAmB,EAAE,mBAAmB,CAAC;IAGzC,GAAG,EAAE,oBAAoB,CAAC;IAG1B,EAAE,EAAE,iBAAiB,CAAC;IAEhB,GAAG;CAiJZ"}
@@ -7,89 +7,103 @@ var __decorate = (this && this.__decorate) || function (decorators, target, key,
7
7
  var __metadata = (this && this.__metadata) || function (k, v) {
8
8
  if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
9
9
  };
10
- import EntityAccessError from "@entity-access/entity-access/dist/common/EntityAccessError.js";
11
10
  import Inject from "@entity-access/entity-access/dist/di/di.js";
12
- import DateTime from "@entity-access/entity-access/dist/types/DateTime.js";
13
11
  import Page from "@entity-access/server-pages/dist/Page.js";
14
12
  import { Prepare } from "@entity-access/server-pages/dist/decorators/Prepare.js";
13
+ import EntityAccessError from "@entity-access/entity-access/dist/common/EntityAccessError.js";
14
+ import DateTime from "@entity-access/entity-access/dist/types/DateTime.js";
15
+ import { readFileSync } from "fs";
15
16
  import SocialMailContext from "../../../../../server/model/SocialMailContext.js";
16
17
  import CryptoService from "../../../../../server/services/CryptoService.js";
17
18
  import EmailAddressService from "../../../../../server/services/EmailAddressService.js";
18
19
  import CaptchaService from "../../../../../server/services/captcha/CaptchaService.js";
19
20
  import ExternalOtpInService from "../../../../../server/services/external-otp-in/ExternalOtpInService.js";
20
- import { randomUUID } from "crypto";
21
- import WebSiteService from "../../../../../server/services/files/WebSiteService.js";
22
- /**
23
- * External Signup is used for signing up for Blog or Store.
24
- */
25
- let ExternalSignup = class ExternalSignup extends Page {
21
+ const ensureUsername = (name) => {
22
+ const json = JSON.parse(readFileSync("./content/json/bad-names.json", "utf8"));
23
+ if (json.reserved.includes(name)) {
24
+ throw new EntityAccessError("Username is reserved.");
25
+ }
26
+ for (const iterator of json.partial) {
27
+ if (name.includes(iterator)) {
28
+ throw new EntityAccessError("Username is not acceptable.");
29
+ }
30
+ }
31
+ };
32
+ let default_1 = class extends Page {
26
33
  async run() {
27
34
  const { db } = this;
28
35
  db.verifyFilters = false;
29
36
  db.raiseEvents = false;
30
37
  const model = this.body;
31
- model.emailAddress = model.email.verifyAddresses;
32
- model.phoneNumber = model.phone.verifyAddresses;
33
- const w = await this.websiteService.get(this.request.hostName);
34
- const storeID = w.folderID;
35
- if (!storeID) {
36
- throw new EntityAccessError(`Signup not allowed`);
38
+ model.emailAddress = model.emailAddress.trim().toLowerCase();
39
+ const [username, domain] = model.emailAddress.split("@", 2);
40
+ model.username = username;
41
+ if (!/\p{Letter}[\p{Letter}\.\-0-9]{0,50}/iu.test(username)) {
42
+ throw new EntityAccessError(`Invalid email address`);
37
43
  }
38
44
  model.password = model.password?.trim();
39
- if (!model.emailAddress) {
40
- throw new EntityAccessError("Email is required");
45
+ model.username = model.username?.trim()?.toLowerCase();
46
+ if (!model.username) {
47
+ throw new EntityAccessError("Username is required");
48
+ }
49
+ ensureUsername(model.username);
50
+ if (!model.password) {
51
+ throw new EntityAccessError("Password is required");
52
+ }
53
+ if (model.password.length < 7) {
54
+ throw new EntityAccessError("Password is cannot be less than 7 characters");
55
+ }
56
+ if (/\s/i.test(model.password)) {
57
+ throw new EntityAccessError("Password must not any whitespace characters");
41
58
  }
42
59
  model.phoneNumber = `+${model.phoneNumber.replace(/[^0-9]/g, "")}`;
60
+ // console.log(model);
43
61
  // check if phone number already exists...
44
- for (const v1 of [model.captcha, model.email, model.phone]) {
62
+ for (const v1 of [model.captcha, model.phone]) {
45
63
  const { verificationID, accessCode } = v1;
46
64
  const vr = await db.verificationTokens.statements.select({}, { verificationID, accessCode });
47
65
  if (!vr.verified) {
48
66
  throw new EntityAccessError(`Verification ${vr?.type} ${verificationID} is incomplete`);
49
67
  }
50
68
  }
51
- const { emailAddress, phoneNumber } = model;
52
- const emailExists = await db.storeAccountEmails.where({ emailAddress, storeID }, (p) => (x) => x.emailAddress.emailAddress === p.emailAddress
53
- && x.storeAccount.storeID === p.storeID)
69
+ const hostedDomain = await this.emailAddressService.getHostedDomain(domain);
70
+ if (!hostedDomain || !hostedDomain.allowSignup) {
71
+ throw new EntityAccessError(`Signup for email address ${model.emailAddress} not allowed for domain ${domain}`);
72
+ }
73
+ const emailAddress = model.emailAddress;
74
+ const user = await db.mailboxes.where({ emailAddress }, (p) => (x) => x.emailAddress.emailAddress === p.emailAddress)
54
75
  .some();
55
- if (emailExists) {
76
+ if (user) {
56
77
  throw new EntityAccessError(`Email address already exists.`);
57
78
  }
58
79
  // check if phone exists...
59
- const exists = await db.storeAccountPhones
60
- .where({ phoneNumber, storeID }, (p) => (x) => x.phoneNumberE64 === p.phoneNumber
61
- && x.storeAccount.storeID === p.storeID).some();
80
+ const exists = await db.users
81
+ .where(model, (p) => (x) => x.uniquePhoneNumber === p.phoneNumber)
82
+ .some();
62
83
  if (exists) {
63
84
  throw new EntityAccessError(`Phone number is already registered.`);
64
85
  }
65
- model.password = randomUUID();
66
86
  const passwordSalt = this.cryptoService.generateSalt();
67
87
  const passwordHash = this.cryptoService.hash(passwordSalt, model.password);
68
88
  const dateCreated = DateTime.now;
69
89
  const phoneNumberE64 = model.phoneNumber;
70
90
  const name = model.name;
71
- let billingAddress;
72
- let shippingAddress;
73
- const addresses = [];
74
- if (model.billing?.title) {
75
- billingAddress = db.storeAccountAddresses.add(model.billing);
76
- addresses.push(billingAddress);
77
- }
78
- if (model.shipping?.title) {
79
- shippingAddress = db.storeAccountAddresses.add(model.shipping);
80
- addresses.push(shippingAddress);
81
- }
82
- const emailAddressID = await this.emailAddressService.getId(model.emailAddress, model.name);
91
+ const mailboxID = await this.emailAddressService.getId(emailAddress, name);
92
+ const { domainID } = hostedDomain;
83
93
  // create user...
84
94
  const account = db.users.add({
85
- /** This is to make customer user unique per store */
86
- userName: storeID + ":" + model.emailAddress,
95
+ userName: model.emailAddress,
87
96
  displayName: name,
88
97
  passwordSalt,
89
98
  passwordHash,
90
99
  multiFactor: false,
91
100
  dateUpdated: dateCreated,
92
- isExternal: true,
101
+ uniquePhoneNumber: phoneNumberE64,
102
+ roles: [
103
+ db.userRoles.add({
104
+ roleName: "User"
105
+ })
106
+ ],
93
107
  authFactors: [
94
108
  db.userAuthFactors.add({
95
109
  phoneNumber: phoneNumberE64,
@@ -97,57 +111,37 @@ let ExternalSignup = class ExternalSignup extends Page {
97
111
  method: "otp-in",
98
112
  dateUpdated: dateCreated
99
113
  })
100
- ]
101
- });
102
- const contact = db.storeAccounts.add({
103
- dateCreated,
104
- user: account,
105
- storeID,
106
- /** This is important as name must be unique in the ledger */
107
- name: `${model.name}(${emailAddressID})`,
108
- head: "Customer",
109
- emails: [
110
- db.storeAccountEmails.add({
111
- emailAddressID
112
- })
113
114
  ],
114
- phones: [
115
- db.storeAccountPhones.add({
116
- phoneNumberE64
115
+ userMailboxes: [
116
+ db.userMailboxes.add({
117
+ mailbox: db.mailboxes.add({
118
+ mailboxID,
119
+ domainID,
120
+ uniqueAddress: model.username.replace(/[\-\.]/g, "") + "@" + hostedDomain.domain.name,
121
+ maxStorage: 1024 * 1024 * 1024
122
+ })
117
123
  })
118
- ],
119
- addresses
124
+ ]
120
125
  });
121
126
  await db.saveChanges();
122
- if (billingAddress) {
123
- contact.billingAddressID = billingAddress.addressID;
124
- }
125
- if (shippingAddress) {
126
- contact.shippingAddressID = shippingAddress.addressID;
127
- }
128
- if (addresses.length) {
129
- await db.saveChanges();
130
- }
131
- // Todo: delete captcha
132
- const userID = model.userID = account.userID;
133
- // lets login here...
134
- const dateUpdated = DateTime.now;
135
- const start = dateUpdated;
136
- const expiry = dateUpdated.addDays(30);
137
- // create login session...
138
- const loginSession = await db.loginSessions.statements.insert({
139
- userID,
140
- dateUpdated,
127
+ // todo pending delete
128
+ // await this.captchaService.delete(model.captcha as any);
129
+ model.userID = account.userID;
130
+ const start = DateTime.now;
131
+ // add login cookie..
132
+ const expiry = start.addDays(30);
133
+ model.userID = account.userID;
134
+ const session = await db.loginSessions.statements.insert({
135
+ userID: account.userID,
141
136
  start,
142
137
  expiry,
143
- invalid: false,
144
- verificationID: model.phone.verificationID,
145
- status: "created"
138
+ status: "created",
139
+ invalid: false
146
140
  });
147
141
  await this.sessionUser.setAuthCookie({
148
- userID: loginSession.userID,
149
- id: loginSession.sessionID,
150
- expiry: expiry.asJSDate,
142
+ userID: session.userID,
143
+ id: session.sessionID,
144
+ expiry: session.expiry.asJSDate,
151
145
  version: "1.1",
152
146
  active: true
153
147
  });
@@ -157,30 +151,25 @@ let ExternalSignup = class ExternalSignup extends Page {
157
151
  __decorate([
158
152
  Inject,
159
153
  __metadata("design:type", CaptchaService)
160
- ], ExternalSignup.prototype, "captchaService", void 0);
154
+ ], default_1.prototype, "captchaService", void 0);
161
155
  __decorate([
162
156
  Inject,
163
157
  __metadata("design:type", CryptoService)
164
- ], ExternalSignup.prototype, "cryptoService", void 0);
158
+ ], default_1.prototype, "cryptoService", void 0);
165
159
  __decorate([
166
160
  Inject,
167
161
  __metadata("design:type", EmailAddressService)
168
- ], ExternalSignup.prototype, "emailAddressService", void 0);
162
+ ], default_1.prototype, "emailAddressService", void 0);
169
163
  __decorate([
170
164
  Inject,
171
165
  __metadata("design:type", ExternalOtpInService)
172
- ], ExternalSignup.prototype, "ois", void 0);
166
+ ], default_1.prototype, "ois", void 0);
173
167
  __decorate([
174
168
  Inject,
175
169
  __metadata("design:type", SocialMailContext)
176
- ], ExternalSignup.prototype, "db", void 0);
177
- __decorate([
178
- Inject,
179
- __metadata("design:type", WebSiteService)
180
- ], ExternalSignup.prototype, "websiteService", void 0);
181
- ExternalSignup = __decorate([
182
- Prepare.parseJsonBody,
183
- Prepare.authorize
184
- ], ExternalSignup);
185
- export default ExternalSignup;
170
+ ], default_1.prototype, "db", void 0);
171
+ default_1 = __decorate([
172
+ Prepare.parseJsonBody
173
+ ], default_1);
174
+ export default default_1;
186
175
  //# sourceMappingURL=post.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"post.js","sourceRoot":"","sources":["../../../../../../src/wwwroot/routes/social-mail/user/signup/post.tsx"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"post.js","sourceRoot":"","sources":["../../../../../../src/wwwroot/routes/social-mail/user/signup/post.tsx"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@social-mail/social-mail-web-server",
3
- "version": "1.7.60",
3
+ "version": "1.7.63",
4
4
  "description": "## Phase 1",
5
5
  "main": "index.js",
6
6
  "type": "module",
@@ -32,7 +32,7 @@
32
32
  "@sunknudsen/totp": "^1.1.0",
33
33
  "@web-atoms/fetch-builder": "1.0.21",
34
34
  "acme-client": "^5.3.0",
35
- "clamscan": "^2.2.1",
35
+ "clamscan": "^2.4.0",
36
36
  "console-log-colors": "^0.4.0",
37
37
  "dkim": "^0.8.0",
38
38
  "dns2": "^2.1.0",
@@ -26,6 +26,7 @@ export const globalEnv = {
26
26
  cdn: process.env.SOCIAL_MAIL_CDN,
27
27
  path: process.env.SOCIAL_MAIL_PATH || "/",
28
28
  externalLogin: process.env.SOCIAL_MAIL_EXTERNAL_LOGIN,
29
+ signupEnabled: /^(true|yes)/i.test(process.env.SOCIAL_MAIL_SIGNUP_ENABLED),
29
30
  dns: {
30
31
  enabled: /^(true|yes)$/i.test(process.env.SOCIAL_MAIL_DNS_ENABLED),
31
32
  soa: (process.env.SOCIAL_MAIL_DNS_SOA || "admin.socialmail.in somewhere.com").split(/[\s\,\;]/g).map((txt: string) => txt.endsWith(".") ? txt : txt + "."),
@@ -43,6 +43,14 @@ export type userStatusType = typeof userStatuses[number];
43
43
  descending: false
44
44
  }]
45
45
  })
46
+ @Index({
47
+ name: "IX_Unique_Users_PhoneNumber",
48
+ columns: [
49
+ { name: (x) => x.uniquePhoneNumber, descending: false }
50
+ ],
51
+ unique: true,
52
+ filter: (x) => x.uniquePhoneNumber !== null
53
+ })
46
54
  export class User {
47
55
 
48
56
  @Column({ key: true, dataType: "BigInt" , generated: "identity" })
@@ -83,6 +91,11 @@ export class User {
83
91
  @ReadOnlyJsonProperty
84
92
  public storage: number;
85
93
 
94
+ /** This is for external user who can signup and can have only one unique phone number */
95
+ @Column({ dataType: "Char", length: 20, nullable: true })
96
+ @IgnoreJsonProperty
97
+ public uniquePhoneNumber: string;
98
+
86
99
  @Column({ dataType: "BigInt", default: () => 0 })
87
100
  public maxStorage: number;
88
101
 
@@ -1,10 +1,12 @@
1
1
  import EntityEvents, { ForeignKeyFilter } from "@entity-access/entity-access/dist/model/events/EntityEvents.js";
2
2
  import { IEntityQuery } from "@entity-access/entity-access/dist/model/IFilterWithParameter.js";
3
- import Inject from "@entity-access/entity-access/dist/di/di.js";
3
+ import Inject, { ServiceProvider } from "@entity-access/entity-access/dist/di/di.js";
4
4
  import AuthenticatedEvents from "./AuthenticatedEvents.js";
5
5
  import Domain from "../entities/Domain.js";
6
6
  import EntityAccessError from "@entity-access/entity-access/dist/common/EntityAccessError.js";
7
7
  import ChangeEntry from "@entity-access/entity-access/dist/model/changes/ChangeEntry.js";
8
+ import ExternalQuery from "@entity-access/server-pages/dist/decorators/ExternalQuery.js";
9
+ import SocialMailContext from "../SocialMailContext.js";
8
10
 
9
11
  export default class DomainEvents extends AuthenticatedEvents<Domain> {
10
12
 
@@ -19,6 +21,13 @@ export default class DomainEvents extends AuthenticatedEvents<Domain> {
19
21
  return query.where({ userID}, (p) => (x) => x.hostedDomain.domainUsers.some((u) => u.userID === p.userID));
20
22
  }
21
23
 
24
+
25
+ @ExternalQuery
26
+ forSignup() {
27
+ const db = ServiceProvider.resolve(this, SocialMailContext);
28
+ return db.domains.where(void 0, (p) => (x) => x.hostedDomain.allowSignup === true);
29
+ }
30
+
22
31
  modify(query: IEntityQuery<Domain>) {
23
32
  if (this.verify) {
24
33
  this.sessionUser.ensureLoggedIn();
@@ -9,6 +9,7 @@ import SocialMailContext from "../SocialMailContext.js";
9
9
  import EntityAccessError from "@entity-access/entity-access/dist/common/EntityAccessError.js";
10
10
  import SyncDnsZoneRecordsWorkflow from "../../workflows/dns/SyncDnsZoneRecordsWorkflow.js";
11
11
  import WorkflowContext from "@entity-access/entity-access/dist/workflows/WorkflowContext.js";
12
+ import ExternalQuery from "@entity-access/server-pages/dist/decorators/ExternalQuery.js";
12
13
 
13
14
  export default class HostedDomainEvents extends AuthenticatedEvents<HostedDomain> {
14
15
 
@@ -244,6 +244,11 @@ export default class UserEvents extends AuthenticatedEvents<User> {
244
244
  preJson(entity: User): User {
245
245
  entity.passwordHash = void 0;
246
246
  entity.passwordSalt = void 0;
247
+ if (!this.sessionUser.isAdmin) {
248
+ if (entity.userID !== this.sessionUser.userID) {
249
+ entity.uniquePhoneNumber = void 0;
250
+ }
251
+ }
247
252
  return entity;
248
253
  }
249
254