summaryrefslogtreecommitdiff
path: root/packages
diff options
context:
space:
mode:
authorsyuilo <Syuilotan@yahoo.co.jp>2022-07-09 15:05:55 +0900
committersyuilo <Syuilotan@yahoo.co.jp>2022-07-09 15:05:55 +0900
commit75d516011b7169cee6db8aa6e0550d8f84dfde5a (patch)
tree7b32ea8fec786a83b55999a13c154bbb756fbbec /packages
parentenhance(server): tweak identicon generation (diff)
downloadmisskey-75d516011b7169cee6db8aa6e0550d8f84dfde5a.tar.gz
misskey-75d516011b7169cee6db8aa6e0550d8f84dfde5a.tar.bz2
misskey-75d516011b7169cee6db8aa6e0550d8f84dfde5a.zip
enhance: make active email validation configurable
Diffstat (limited to 'packages')
-rw-r--r--packages/backend/migration/1657346559800-active-email-validation.js11
-rw-r--r--packages/backend/src/models/entities/meta.ts5
-rw-r--r--packages/backend/src/server/api/endpoints/admin/meta.ts5
-rw-r--r--packages/backend/src/server/api/endpoints/admin/update-meta.ts5
-rw-r--r--packages/backend/src/services/validate-email-for-account.ts19
-rw-r--r--packages/client/src/pages/admin/security.vue16
6 files changed, 53 insertions, 8 deletions
diff --git a/packages/backend/migration/1657346559800-active-email-validation.js b/packages/backend/migration/1657346559800-active-email-validation.js
new file mode 100644
index 0000000000..f8e03eeb07
--- /dev/null
+++ b/packages/backend/migration/1657346559800-active-email-validation.js
@@ -0,0 +1,11 @@
+export class activeEmailValidation1657346559800 {
+ name = 'activeEmailValidation1657346559800'
+
+ async up(queryRunner) {
+ await queryRunner.query(`ALTER TABLE "meta" ADD "enableActiveEmailValidation" boolean NOT NULL DEFAULT true`);
+ }
+
+ async down(queryRunner) {
+ await queryRunner.query(`ALTER TABLE "meta" DROP COLUMN "enableActiveEmailValidation"`);
+ }
+}
diff --git a/packages/backend/src/models/entities/meta.ts b/packages/backend/src/models/entities/meta.ts
index ebc082dfbb..d33ff2519e 100644
--- a/packages/backend/src/models/entities/meta.ts
+++ b/packages/backend/src/models/entities/meta.ts
@@ -454,4 +454,9 @@ export class Meta {
default: false,
})
public enableIpLogging: boolean;
+
+ @Column('boolean', {
+ default: true,
+ })
+ public enableActiveEmailValidation: boolean;
}
diff --git a/packages/backend/src/server/api/endpoints/admin/meta.ts b/packages/backend/src/server/api/endpoints/admin/meta.ts
index cb50e128af..8746119687 100644
--- a/packages/backend/src/server/api/endpoints/admin/meta.ts
+++ b/packages/backend/src/server/api/endpoints/admin/meta.ts
@@ -324,6 +324,10 @@ export const meta = {
type: 'boolean',
optional: true, nullable: false,
},
+ enableActiveEmailValidation: {
+ type: 'boolean',
+ optional: true, nullable: false,
+ },
},
},
} as const;
@@ -421,5 +425,6 @@ export default define(meta, paramDef, async (ps, me) => {
deeplAuthKey: instance.deeplAuthKey,
deeplIsPro: instance.deeplIsPro,
enableIpLogging: instance.enableIpLogging,
+ enableActiveEmailValidation: instance.enableActiveEmailValidation,
};
});
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 cc32e73c53..f14aa41050 100644
--- a/packages/backend/src/server/api/endpoints/admin/update-meta.ts
+++ b/packages/backend/src/server/api/endpoints/admin/update-meta.ts
@@ -101,6 +101,7 @@ export const paramDef = {
objectStorageSetPublicRead: { type: 'boolean' },
objectStorageS3ForcePathStyle: { type: 'boolean' },
enableIpLogging: { type: 'boolean' },
+ enableActiveEmailValidation: { type: 'boolean' },
},
required: [],
} as const;
@@ -421,6 +422,10 @@ export default define(meta, paramDef, async (ps, me) => {
set.enableIpLogging = ps.enableIpLogging;
}
+ if (ps.enableActiveEmailValidation !== undefined) {
+ set.enableActiveEmailValidation = ps.enableActiveEmailValidation;
+ }
+
await db.transaction(async transactionalEntityManager => {
const metas = await transactionalEntityManager.find(Meta, {
order: {
diff --git a/packages/backend/src/services/validate-email-for-account.ts b/packages/backend/src/services/validate-email-for-account.ts
index 132168fb31..b5fa99b935 100644
--- a/packages/backend/src/services/validate-email-for-account.ts
+++ b/packages/backend/src/services/validate-email-for-account.ts
@@ -1,34 +1,37 @@
import { validate as validateEmail } from 'deep-email-validator';
import { UserProfiles } from '@/models/index.js';
+import { fetchMeta } from '@/misc/fetch-meta.js';
export async function validateEmailForAccount(emailAddress: string): Promise<{
available: boolean;
reason: null | 'used' | 'format' | 'disposable' | 'mx' | 'smtp';
}> {
+ const meta = await fetchMeta();
+
const exist = await UserProfiles.countBy({
emailVerified: true,
email: emailAddress,
});
- const validated = await validateEmail({
+ const validated = meta.enableActiveEmailValidation ? await validateEmail({
email: emailAddress,
validateRegex: true,
validateMx: true,
validateTypo: false, // TLDを見ているみたいだけどclubとか弾かれるので
validateDisposable: true, // 捨てアドかどうかチェック
validateSMTP: false, // 日本だと25ポートが殆どのプロバイダーで塞がれていてタイムアウトになるので
- });
+ }) : { valid: true };
const available = exist === 0 && validated.valid;
return {
available,
reason: available ? null :
- exist !== 0 ? 'used' :
- validated.reason === 'regex' ? 'format' :
- validated.reason === 'disposable' ? 'disposable' :
- validated.reason === 'mx' ? 'mx' :
- validated.reason === 'smtp' ? 'smtp' :
- null,
+ exist !== 0 ? 'used' :
+ validated.reason === 'regex' ? 'format' :
+ validated.reason === 'disposable' ? 'disposable' :
+ validated.reason === 'mx' ? 'mx' :
+ validated.reason === 'smtp' ? 'smtp' :
+ null,
};
}
diff --git a/packages/client/src/pages/admin/security.vue b/packages/client/src/pages/admin/security.vue
index c4a4994bb8..07ee412f3e 100644
--- a/packages/client/src/pages/admin/security.vue
+++ b/packages/client/src/pages/admin/security.vue
@@ -58,6 +58,19 @@
</FormFolder>
<FormFolder class="_formBlock">
+ <template #label>Active Email Validation</template>
+ <template v-if="enableActiveEmailValidation" #suffix>Enabled</template>
+ <template v-else #suffix>Disabled</template>
+
+ <div class="_formRoot">
+ <span class="_formBlock">{{ i18n.ts.activeEmailValidationDescription }}</span>
+ <FormSwitch v-model="enableActiveEmailValidation" class="_formBlock" @update:modelValue="save">
+ <template #label>Enable</template>
+ </FormSwitch>
+ </div>
+ </FormFolder>
+
+ <FormFolder class="_formBlock">
<template #label>Log IP address</template>
<template v-if="enableIpLogging" #suffix>Enabled</template>
<template v-else #suffix>Disabled</template>
@@ -112,6 +125,7 @@ let sensitiveMediaDetectionSensitivity: number = $ref(0);
let setSensitiveFlagAutomatically: boolean = $ref(false);
let enableSensitiveMediaDetectionForVideos: boolean = $ref(false);
let enableIpLogging: boolean = $ref(false);
+let enableActiveEmailValidation: boolean = $ref(false);
async function init() {
const meta = await os.api('admin/meta');
@@ -128,6 +142,7 @@ async function init() {
setSensitiveFlagAutomatically = meta.setSensitiveFlagAutomatically;
enableSensitiveMediaDetectionForVideos = meta.enableSensitiveMediaDetectionForVideos;
enableIpLogging = meta.enableIpLogging;
+ enableActiveEmailValidation = meta.enableActiveEmailValidation;
}
function save() {
@@ -144,6 +159,7 @@ function save() {
setSensitiveFlagAutomatically,
enableSensitiveMediaDetectionForVideos,
enableIpLogging,
+ enableActiveEmailValidation,
}).then(() => {
fetchInstance();
});