@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.
- package/content/json/bad-names.json +591 -0
- package/dist/common/globalEnv.d.ts +1 -0
- package/dist/common/globalEnv.d.ts.map +1 -1
- package/dist/common/globalEnv.js +1 -0
- package/dist/common/globalEnv.js.map +1 -1
- package/dist/server/model/entities/User.d.ts +2 -0
- package/dist/server/model/entities/User.d.ts.map +1 -1
- package/dist/server/model/entities/User.js +13 -0
- package/dist/server/model/entities/User.js.map +1 -1
- package/dist/server/model/events/DomainEvents.d.ts +1 -0
- package/dist/server/model/events/DomainEvents.d.ts.map +1 -1
- package/dist/server/model/events/DomainEvents.js +22 -0
- package/dist/server/model/events/DomainEvents.js.map +1 -1
- package/dist/server/model/events/HostedDomainEvents.d.ts.map +1 -1
- package/dist/server/model/events/HostedDomainEvents.js.map +1 -1
- package/dist/server/model/events/UserEvents.d.ts.map +1 -1
- package/dist/server/model/events/UserEvents.js +5 -0
- package/dist/server/model/events/UserEvents.js.map +1 -1
- package/dist/server/seed/ui/seed-ui.js +1 -1
- package/dist/server/services/EmailAddressService.d.ts +1 -0
- package/dist/server/services/EmailAddressService.d.ts.map +1 -1
- package/dist/server/services/EmailAddressService.js +81 -58
- package/dist/server/services/EmailAddressService.js.map +1 -1
- package/dist/server/services/ui/renderUIClient.d.ts.map +1 -1
- package/dist/server/services/ui/renderUIClient.js +1 -0
- package/dist/server/services/ui/renderUIClient.js.map +1 -1
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/dist/wwwroot/routes/social-mail/user/password/reset/post.d.ts +24 -0
- package/dist/wwwroot/routes/social-mail/user/password/reset/post.d.ts.map +1 -0
- package/dist/wwwroot/routes/social-mail/user/password/reset/post.js +109 -0
- package/dist/wwwroot/routes/social-mail/user/password/reset/post.js.map +1 -0
- package/dist/wwwroot/routes/social-mail/user/signup/get.d.ts +5 -0
- package/dist/wwwroot/routes/social-mail/user/signup/get.d.ts.map +1 -0
- package/dist/wwwroot/routes/social-mail/user/signup/get.js +8 -0
- package/dist/wwwroot/routes/social-mail/user/signup/get.js.map +1 -0
- package/dist/wwwroot/routes/social-mail/user/signup/post.d.ts +4 -12
- package/dist/wwwroot/routes/social-mail/user/signup/post.d.ts.map +1 -1
- package/dist/wwwroot/routes/social-mail/user/signup/post.js +86 -97
- package/dist/wwwroot/routes/social-mail/user/signup/post.js.map +1 -1
- package/package.json +2 -2
- package/src/common/globalEnv.ts +1 -0
- package/src/server/model/entities/User.ts +13 -0
- package/src/server/model/events/DomainEvents.ts +10 -1
- package/src/server/model/events/HostedDomainEvents.ts +1 -0
- package/src/server/model/events/UserEvents.ts +5 -0
- package/src/server/seed/ui/seed-ui.ts +1 -1
- package/src/server/services/EmailAddressService.ts +9 -0
- package/src/server/services/ui/renderUIClient.tsx +1 -0
- package/src/wwwroot/routes/social-mail/user/password/reset/post.tsx +128 -0
- package/src/wwwroot/routes/social-mail/user/signup/get.tsx +9 -0
- 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 @@
|
|
|
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":"
|
|
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
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
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.
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
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
|
-
|
|
40
|
-
|
|
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.
|
|
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
|
|
52
|
-
|
|
53
|
-
|
|
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 (
|
|
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.
|
|
60
|
-
.where(
|
|
61
|
-
|
|
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
|
-
|
|
72
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
115
|
-
db.
|
|
116
|
-
|
|
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
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
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
|
-
|
|
144
|
-
|
|
145
|
-
status: "created"
|
|
138
|
+
status: "created",
|
|
139
|
+
invalid: false
|
|
146
140
|
});
|
|
147
141
|
await this.sessionUser.setAuthCookie({
|
|
148
|
-
userID:
|
|
149
|
-
id:
|
|
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
|
-
],
|
|
154
|
+
], default_1.prototype, "captchaService", void 0);
|
|
161
155
|
__decorate([
|
|
162
156
|
Inject,
|
|
163
157
|
__metadata("design:type", CryptoService)
|
|
164
|
-
],
|
|
158
|
+
], default_1.prototype, "cryptoService", void 0);
|
|
165
159
|
__decorate([
|
|
166
160
|
Inject,
|
|
167
161
|
__metadata("design:type", EmailAddressService)
|
|
168
|
-
],
|
|
162
|
+
], default_1.prototype, "emailAddressService", void 0);
|
|
169
163
|
__decorate([
|
|
170
164
|
Inject,
|
|
171
165
|
__metadata("design:type", ExternalOtpInService)
|
|
172
|
-
],
|
|
166
|
+
], default_1.prototype, "ois", void 0);
|
|
173
167
|
__decorate([
|
|
174
168
|
Inject,
|
|
175
169
|
__metadata("design:type", SocialMailContext)
|
|
176
|
-
],
|
|
177
|
-
__decorate([
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
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":";;;;;;;;;AAAA,OAAO,
|
|
1
|
+
{"version":3,"file":"post.js","sourceRoot":"","sources":["../../../../../../src/wwwroot/routes/social-mail/user/signup/post.tsx"],"names":[],"mappings":";;;;;;;;;AAAA,OAAO,MAAM,MAAM,4CAA4C,CAAC;AAChE,OAAO,IAAI,MAAM,0CAA0C,CAAC;AAC5D,OAAO,EAAE,OAAO,EAAE,MAAM,wDAAwD,CAAC;AACjF,OAAO,iBAAiB,MAAM,+DAA+D,CAAC;AAC9F,OAAO,QAAQ,MAAM,qDAAqD,CAAC;AAC3E,OAAO,EAAE,YAAY,EAAE,MAAM,IAAI,CAAC;AAClC,OAAO,iBAAiB,MAAM,kDAAkD,CAAC;AAEjF,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,cAAc,GAAG,CAAC,IAAY,EAAE,EAAE;IAEpC,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,+BAA+B,EAAC,MAAM,CAAC,CAA8C,CAAC;IAE3H,IAAG,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;QAC9B,MAAM,IAAI,iBAAiB,CAAC,uBAAuB,CAAC,CAAC;IACzD,CAAC;IACD,KAAK,MAAM,QAAQ,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;QAClC,IAAI,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC;YAC1B,MAAM,IAAI,iBAAiB,CAAC,6BAA6B,CAAC,CAAC;QAC/D,CAAC;IACL,CAAC;AACL,CAAC,CAAC;AAGa,gBAAA,KAAM,SAAQ,IAAI;IAiB7B,KAAK,CAAC,GAAG;QAEL,MAAM,EAAE,EAAE,EAAE,GAAG,IAAI,CAAC;QAEpB,EAAE,CAAC,aAAa,GAAG,KAAK,CAAC;QACzB,EAAE,CAAC,WAAW,GAAG,KAAK,CAAC;QAEvB,MAAM,KAAK,GAAG,IAAI,CAAC,IAAe,CAAC;QAEnC,KAAK,CAAC,YAAY,GAAG,KAAK,CAAC,YAAY,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;QAE7D,MAAM,CAAC,QAAQ,EAAE,MAAM,CAAC,GAAG,KAAK,CAAC,YAAY,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC;QAC5D,KAAK,CAAC,QAAQ,GAAG,QAAQ,CAAC;QAE1B,IAAI,CAAC,uCAAuC,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC;YAC1D,MAAM,IAAI,iBAAiB,CAAC,uBAAuB,CAAC,CAAC;QACzD,CAAC;QAED,KAAK,CAAC,QAAQ,GAAG,KAAK,CAAC,QAAQ,EAAE,IAAI,EAAE,CAAC;QACxC,KAAK,CAAC,QAAQ,GAAG,KAAK,CAAC,QAAQ,EAAE,IAAI,EAAE,EAAE,WAAW,EAAE,CAAC;QACvD,IAAI,CAAC,KAAK,CAAC,QAAQ,EAAE,CAAC;YAClB,MAAM,IAAI,iBAAiB,CAAC,sBAAsB,CAAC,CAAC;QACxD,CAAC;QACD,cAAc,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;QAC/B,IAAI,CAAC,KAAK,CAAC,QAAQ,EAAE,CAAC;YAClB,MAAM,IAAI,iBAAiB,CAAC,sBAAsB,CAAC,CAAC;QACxD,CAAC;QAED,IAAI,KAAK,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC5B,MAAM,IAAI,iBAAiB,CAAC,8CAA8C,CAAC,CAAC;QAChF,CAAC;QAED,IAAI,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,EAAE,CAAC;YAC7B,MAAM,IAAI,iBAAiB,CAAC,6CAA6C,CAAC,CAAC;QAC/E,CAAC;QAED,KAAK,CAAC,WAAW,GAAG,IAAI,KAAK,CAAC,WAAW,CAAC,OAAO,CAAC,SAAS,EAAE,EAAE,CAAC,EAAE,CAAC;QAEnE,sBAAsB;QAEtB,0CAA0C;QAE1C,KAAI,MAAM,EAAE,IAAI,CAAC,KAAK,CAAC,OAAO,EAAE,KAAK,CAAC,KAAK,CAAC,EAAE,CAAC;YAC3C,MAAM,EAAE,cAAc,EAAG,UAAU,EAAE,GAAG,EAAE,CAAC;YAC3C,MAAM,EAAE,GAAG,MAAM,EAAE,CAAC,kBAAkB,CAAC,UAAU,CAAC,MAAM,CAAC,EAAE,EAAE,EAAE,cAAc,EAAE,UAAU,EAAE,CAAC,CAAC;YAC7F,IAAI,CAAC,EAAE,CAAC,QAAQ,EAAE,CAAC;gBACf,MAAM,IAAI,iBAAiB,CAAC,gBAAgB,EAAE,EAAE,IAAI,IAAI,cAAc,gBAAgB,CAAC,CAAC;YAC5F,CAAC;QACL,CAAC;QAED,MAAM,YAAY,GAAG,MAAM,IAAI,CAAC,mBAAmB,CAAC,eAAe,CAAC,MAAM,CAAC,CAAC;QAC5E,IAAG,CAAC,YAAY,IAAI,CAAC,YAAY,CAAC,WAAW,EAAE,CAAC;YAC5C,MAAM,IAAI,iBAAiB,CAAC,4BAA4B,KAAK,CAAC,YAAY,2BAA2B,MAAM,EAAE,CAAC,CAAC;QACnH,CAAC;QACD,MAAM,YAAY,GAAG,KAAK,CAAC,YAAY,CAAC;QACxC,MAAM,IAAI,GAAG,MAAM,EAAE,CAAC,SAAS,CAAC,KAAK,CAAC,EAAE,YAAY,EAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,YAAY,CAAC,YAAY,KAAK,CAAC,CAAC,YAAY,CAAC;aAC/G,IAAI,EAAE,CAAC;QACZ,IAAI,IAAI,EAAE,CAAC;YACP,MAAM,IAAI,iBAAiB,CAAC,+BAA+B,CAAC,CAAC;QACjE,CAAC;QAGD,2BAA2B;QAC3B,MAAM,MAAM,GAAG,MAAM,EAAE,CAAC,KAAK;aACxB,KAAK,CAAC,KAAK,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,iBAAiB,KAAK,CAAC,CAAC,WAAW,CAAC;aACjE,IAAI,EAAE,CAAC;QACZ,IAAI,MAAM,EAAE,CAAC;YACT,MAAM,IAAI,iBAAiB,CAAC,qCAAqC,CAAC,CAAC;QACvE,CAAC;QAED,MAAM,YAAY,GAAG,IAAI,CAAC,aAAa,CAAC,YAAY,EAAE,CAAC;QACvD,MAAM,YAAY,GAAG,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,YAAY,EAAE,KAAK,CAAC,QAAQ,CAAC,CAAC;QAE3E,MAAM,WAAW,GAAG,QAAQ,CAAC,GAAG,CAAC;QACjC,MAAM,cAAc,GAAG,KAAK,CAAC,WAAW,CAAC;QACzC,MAAM,IAAI,GAAG,KAAK,CAAC,IAAI,CAAC;QAExB,MAAM,SAAS,GAAG,MAAM,IAAI,CAAC,mBAAmB,CAAC,KAAK,CAAC,YAAY,EAAE,IAAI,CAAC,CAAC;QAC3E,MAAM,EAAE,QAAQ,EAAE,GAAG,YAAY,CAAC;QAElC,iBAAiB;QACjB,MAAM,OAAO,GAAG,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC;YACzB,QAAQ,EAAE,KAAK,CAAC,YAAY;YAC5B,WAAW,EAAE,IAAI;YACjB,YAAY;YACZ,YAAY;YACZ,WAAW,EAAE,KAAK;YAClB,WAAW,EAAE,WAAW;YACxB,iBAAiB,EAAE,cAAc;YACjC,KAAK,EAAE;gBACH,EAAE,CAAC,SAAS,CAAC,GAAG,CAAC;oBACb,QAAQ,EAAE,MAAM;iBACnB,CAAC;aACL;YACD,WAAW,EAAE;gBACT,EAAE,CAAC,eAAe,CAAC,GAAG,CAAC;oBACnB,WAAW,EAAE,cAAc;oBAC3B,QAAQ,EAAE,IAAI;oBACd,MAAM,EAAE,QAAQ;oBAChB,WAAW,EAAE,WAAW;iBAC3B,CAAC;aACL;YACD,aAAa,EAAC;gBACV,EAAE,CAAC,aAAa,CAAC,GAAG,CAAC;oBACjB,OAAO,EAAE,EAAE,CAAC,SAAS,CAAC,GAAG,CAAC;wBACtB,SAAS;wBACT,QAAQ;wBACR,aAAa,EAAE,KAAK,CAAC,QAAQ,CAAC,OAAO,CAAC,SAAS,EAAE,EAAE,CAAC,GAAG,GAAG,GAAG,YAAY,CAAC,MAAM,CAAC,IAAI;wBACrF,UAAU,EAAE,IAAI,GAAC,IAAI,GAAC,IAAI;qBAC7B,CAAC;iBACL,CAAC;aACL;SACJ,CAAC,CAAC;QAEH,MAAM,EAAE,CAAC,WAAW,EAAE,CAAC;QAEvB,sBAAsB;QACtB,0DAA0D;QAE1D,KAAK,CAAC,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;QAE9B,MAAM,KAAK,GAAG,QAAQ,CAAC,GAAG,CAAC;QAE3B,qBAAqB;QACrB,MAAM,MAAM,GAAG,KAAK,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;QAEjC,KAAK,CAAC,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;QAC9B,MAAM,OAAO,GAAG,MAAM,EAAE,CAAC,aAAa,CAAC,UAAU,CAAC,MAAM,CAAC;YACrD,MAAM,EAAE,OAAO,CAAC,MAAM;YACtB,KAAK;YACL,MAAM;YACN,MAAM,EAAE,SAAS;YACjB,OAAO,EAAE,KAAK;SACjB,CAAC,CAAC;QACH,MAAM,IAAI,CAAC,WAAW,CAAC,aAAa,CAAC;YACjC,MAAM,EAAE,OAAO,CAAC,MAAM;YACtB,EAAE,EAAE,OAAO,CAAC,SAAS;YACrB,MAAM,EAAE,OAAO,CAAC,MAAM,CAAC,QAAQ;YAC/B,OAAO,EAAE,KAAK;YACd,MAAM,EAAE,IAAI;SACf,CAAC,CAAC;QAEH,OAAO,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAC5B,CAAC;CAEJ,CAAA;AA/JG;IADC,MAAM;8BACS,cAAc;iDAAC;AAG/B;IADC,MAAM;8BACQ,aAAa;gDAAC;AAG7B;IADC,MAAM;8BACc,mBAAmB;sDAAC;AAGzC;IADC,MAAM;8BACF,oBAAoB;sCAAC;AAG1B;IADC,MAAM;8BACH,iBAAiB;qCAAC;AAfX;IADd,OAAO,CAAC,aAAa;aAmKrB"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@social-mail/social-mail-web-server",
|
|
3
|
-
"version": "1.7.
|
|
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.
|
|
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",
|
package/src/common/globalEnv.ts
CHANGED
|
@@ -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
|
|