summaryrefslogtreecommitdiff
path: root/packages/backend/src
diff options
context:
space:
mode:
authorMomentQYC <62551256+MomentQYC@users.noreply.github.com>2023-12-29 17:23:29 +0800
committerGitHub <noreply@github.com>2023-12-29 18:23:29 +0900
commit7948018e6a4735fc32d61e8690319802e38baf3a (patch)
treefef4bb1664b9e5a5d0b86bd329d3aa29411f1764 /packages/backend/src
parentenhance(frontend): ハッシュタグ入力時に、本文の末尾の行に... (diff)
downloadsharkey-7948018e6a4735fc32d61e8690319802e38baf3a.tar.gz
sharkey-7948018e6a4735fc32d61e8690319802e38baf3a.tar.bz2
sharkey-7948018e6a4735fc32d61e8690319802e38baf3a.zip
feat: Add support for TrueMail (#12850)
Co-authored-by: MarryDream <2190758465@qq.com>
Diffstat (limited to 'packages/backend/src')
-rw-r--r--packages/backend/src/core/EmailService.ts69
-rw-r--r--packages/backend/src/models/Meta.ts17
-rw-r--r--packages/backend/src/server/api/endpoints/admin/meta.ts15
-rw-r--r--packages/backend/src/server/api/endpoints/admin/update-meta.ts23
4 files changed, 123 insertions, 1 deletions
diff --git a/packages/backend/src/core/EmailService.ts b/packages/backend/src/core/EmailService.ts
index 7fc7800783..7e812b4df2 100644
--- a/packages/backend/src/core/EmailService.ts
+++ b/packages/backend/src/core/EmailService.ts
@@ -156,7 +156,7 @@ export class EmailService {
@bindThis
public async validateEmailForAccount(emailAddress: string): Promise<{
available: boolean;
- reason: null | 'used' | 'format' | 'disposable' | 'mx' | 'smtp' | 'banned';
+ reason: null | 'used' | 'format' | 'disposable' | 'mx' | 'smtp' | 'banned' | 'network' | 'blacklist';
}> {
const meta = await this.metaService.fetch();
@@ -173,6 +173,8 @@ export class EmailService {
if (meta.enableActiveEmailValidation) {
if (meta.enableVerifymailApi && meta.verifymailAuthKey != null) {
validated = await this.verifyMail(emailAddress, meta.verifymailAuthKey);
+ } else if (meta.enableTruemailApi && meta.truemailInstance && meta.truemailAuthKey != null) {
+ validated = await this.trueMail(meta.truemailInstance, emailAddress, meta.truemailAuthKey);
} else {
validated = await validateEmail({
email: emailAddress,
@@ -201,6 +203,8 @@ export class EmailService {
validated.reason === 'disposable' ? 'disposable' :
validated.reason === 'mx' ? 'mx' :
validated.reason === 'smtp' ? 'smtp' :
+ validated.reason === 'network' ? 'network' :
+ validated.reason === 'blacklist' ? 'blacklist' :
null,
};
}
@@ -265,4 +269,67 @@ export class EmailService {
reason: null,
};
}
+
+ private async trueMail<T>(truemailInstance: string, emailAddress: string, truemailAuthKey: string): Promise<{
+ valid: boolean;
+ reason: 'used' | 'format' | 'blacklist' | 'mx' | 'smtp' | 'network' | T | null;
+ }> {
+ const endpoint = truemailInstance + '?email=' + emailAddress;
+ try {
+ const res = await this.httpRequestService.send(endpoint, {
+ method: 'POST',
+ headers: {
+ 'Content-Type': 'application/json',
+ Accept: 'application/json',
+ Authorization: truemailAuthKey
+ },
+ });
+
+ const json = (await res.json()) as {
+ email: string;
+ success: boolean;
+ errors?: {
+ list_match?: string;
+ regex?: string;
+ mx?: string;
+ smtp?: string;
+ } | null;
+ };
+
+ if (json.email === undefined || (json.email !== undefined && json.errors?.regex)) {
+ return {
+ valid: false,
+ reason: 'format',
+ };
+ }
+ if (json.errors?.smtp) {
+ return {
+ valid: false,
+ reason: 'smtp',
+ };
+ }
+ if (json.errors?.mx) {
+ return {
+ valid: false,
+ reason: 'mx',
+ };
+ }
+ if (!json.success) {
+ return {
+ valid: false,
+ reason: json.errors?.list_match as T || 'blacklist',
+ };
+ }
+
+ return {
+ valid: true,
+ reason: null,
+ };
+ } catch (error) {
+ return {
+ valid: false,
+ reason: 'network',
+ };
+ }
+ }
}
diff --git a/packages/backend/src/models/Meta.ts b/packages/backend/src/models/Meta.ts
index 84ca762492..f5a75ed28a 100644
--- a/packages/backend/src/models/Meta.ts
+++ b/packages/backend/src/models/Meta.ts
@@ -458,6 +458,23 @@ export class MiMeta {
public verifymailAuthKey: string | null;
@Column('boolean', {
+ default: false,
+ })
+ public enableTruemailApi: boolean;
+
+ @Column('varchar', {
+ length: 1024,
+ nullable: true,
+ })
+ public truemailInstance: string | null;
+
+ @Column('varchar', {
+ length: 1024,
+ nullable: true,
+ })
+ public truemailAuthKey: string | null;
+
+ @Column('boolean', {
default: true,
})
public enableChartsForRemoteUser: boolean;
diff --git a/packages/backend/src/server/api/endpoints/admin/meta.ts b/packages/backend/src/server/api/endpoints/admin/meta.ts
index febc4ab1b1..281f6c484c 100644
--- a/packages/backend/src/server/api/endpoints/admin/meta.ts
+++ b/packages/backend/src/server/api/endpoints/admin/meta.ts
@@ -284,6 +284,18 @@ export const meta = {
type: 'string',
optional: false, nullable: true,
},
+ enableTruemailApi: {
+ type: 'boolean',
+ optional: false, nullable: false,
+ },
+ truemailInstance: {
+ type: 'string',
+ optional: false, nullable: true,
+ },
+ truemailAuthKey: {
+ type: 'string',
+ optional: false, nullable: true,
+ },
enableChartsForRemoteUser: {
type: 'boolean',
optional: false, nullable: false,
@@ -520,6 +532,9 @@ export default class extends Endpoint<typeof meta, typeof paramDef> { // eslint-
enableActiveEmailValidation: instance.enableActiveEmailValidation,
enableVerifymailApi: instance.enableVerifymailApi,
verifymailAuthKey: instance.verifymailAuthKey,
+ enableTruemailApi: instance.enableTruemailApi,
+ truemailInstance: instance.truemailInstance,
+ truemailAuthKey: instance.truemailAuthKey,
enableChartsForRemoteUser: instance.enableChartsForRemoteUser,
enableChartsForFederatedInstances: instance.enableChartsForFederatedInstances,
enableServerMachineStats: instance.enableServerMachineStats,
diff --git a/packages/backend/src/server/api/endpoints/admin/update-meta.ts b/packages/backend/src/server/api/endpoints/admin/update-meta.ts
index 5a215696fb..3a6426435d 100644
--- a/packages/backend/src/server/api/endpoints/admin/update-meta.ts
+++ b/packages/backend/src/server/api/endpoints/admin/update-meta.ts
@@ -116,6 +116,9 @@ export const paramDef = {
enableActiveEmailValidation: { type: 'boolean' },
enableVerifymailApi: { type: 'boolean' },
verifymailAuthKey: { type: 'string', nullable: true },
+ enableTruemailApi: { type: 'boolean' },
+ truemailInstance: { type: 'string', nullable: true },
+ truemailAuthKey: { type: 'string', nullable: true },
enableChartsForRemoteUser: { type: 'boolean' },
enableChartsForFederatedInstances: { type: 'boolean' },
enableServerMachineStats: { type: 'boolean' },
@@ -469,6 +472,26 @@ export default class extends Endpoint<typeof meta, typeof paramDef> { // eslint-
set.verifymailAuthKey = ps.verifymailAuthKey;
}
}
+
+ if (ps.enableTruemailApi !== undefined) {
+ set.enableTruemailApi = ps.enableTruemailApi;
+ }
+
+ if (ps.truemailInstance !== undefined) {
+ if (ps.truemailInstance === '') {
+ set.truemailInstance = null;
+ } else {
+ set.truemailInstance = ps.truemailInstance;
+ }
+ }
+
+ if (ps.truemailAuthKey !== undefined) {
+ if (ps.truemailAuthKey === '') {
+ set.truemailAuthKey = null;
+ } else {
+ set.truemailAuthKey = ps.truemailAuthKey;
+ }
+ }
if (ps.enableChartsForRemoteUser !== undefined) {
set.enableChartsForRemoteUser = ps.enableChartsForRemoteUser;