summaryrefslogtreecommitdiff
path: root/packages/backend
diff options
context:
space:
mode:
Diffstat (limited to 'packages/backend')
-rw-r--r--packages/backend/migration/1657346559800-active-email-validation.js11
-rw-r--r--packages/backend/package.json2
-rw-r--r--packages/backend/src/misc/gen-identicon.ts49
-rw-r--r--packages/backend/src/models/entities/meta.ts5
-rw-r--r--packages/backend/src/server/api/common/read-notification.ts2
-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/backend/yarn.lock51
9 files changed, 82 insertions, 67 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/package.json b/packages/backend/package.json
index 8f7cd34a8d..b50aa601d9 100644
--- a/packages/backend/package.json
+++ b/packages/backend/package.json
@@ -104,7 +104,7 @@
"strict-event-emitter-types": "2.0.0",
"stringz": "2.1.0",
"style-loader": "3.3.1",
- "summaly": "2.6.0",
+ "summaly": "2.7.0",
"syslog-pro": "1.0.0",
"systeminformation": "5.11.22",
"tinycolor2": "1.4.2",
diff --git a/packages/backend/src/misc/gen-identicon.ts b/packages/backend/src/misc/gen-identicon.ts
index 9b30e5dbd4..322ffee22e 100644
--- a/packages/backend/src/misc/gen-identicon.ts
+++ b/packages/backend/src/misc/gen-identicon.ts
@@ -7,28 +7,31 @@ import { WriteStream } from 'node:fs';
import * as p from 'pureimage';
import gen from 'random-seed';
-const size = 256; // px
+const size = 128; // px
const n = 5; // resolution
-const margin = (size / n);
+const margin = (size / 4);
const colors = [
- '#e57373',
- '#F06292',
- '#BA68C8',
- '#9575CD',
- '#7986CB',
- '#64B5F6',
- '#4FC3F7',
- '#4DD0E1',
- '#4DB6AC',
- '#81C784',
- '#8BC34A',
- '#AFB42B',
- '#F57F17',
- '#FF5722',
- '#795548',
- '#455A64',
+ ['#FF512F', '#DD2476'],
+ ['#FF61D2', '#FE9090'],
+ ['#72FFB6', '#10D164'],
+ ['#FD8451', '#FFBD6F'],
+ ['#305170', '#6DFC6B'],
+ ['#00C0FF', '#4218B8'],
+ ['#009245', '#FCEE21'],
+ ['#0100EC', '#FB36F4'],
+ ['#FDABDD', '#374A5A'],
+ ['#38A2D7', '#561139'],
+ ['#121C84', '#8278DA'],
+ ['#5761B2', '#1FC5A8'],
+ ['#FFDB01', '#0E197D'],
+ ['#FF3E9D', '#0E1F40'],
+ ['#766eff', '#00d4ff'],
+ ['#9bff6e', '#00d4ff'],
+ ['#ff6e94', '#00d4ff'],
+ ['#ffa96e', '#00d4ff'],
+ ['#ffa96e', '#ff009d'],
+ ['#ffdd6e', '#ff009d'],
];
-const bg = '#e9e9e9';
const actualSize = size - (margin * 2);
const cellSize = actualSize / n;
@@ -42,11 +45,17 @@ export function genIdenticon(seed: string, stream: WriteStream): Promise<void> {
const canvas = p.make(size, size, undefined);
const ctx = canvas.getContext('2d');
+ const bgColors = colors[rand(colors.length)];
+
+ const bg = ctx.createLinearGradient(0, 0, size, size);
+ bg.addColorStop(0, bgColors[0]);
+ bg.addColorStop(1, bgColors[1]);
+
ctx.fillStyle = bg;
ctx.beginPath();
ctx.fillRect(0, 0, size, size);
- ctx.fillStyle = colors[rand(colors.length)];
+ ctx.fillStyle = '#ffffff';
// side bitmap (filled by false)
const side: boolean[][] = new Array(sideN);
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/common/read-notification.ts b/packages/backend/src/server/api/common/read-notification.ts
index 8c4ba41a36..17dd8e6f02 100644
--- a/packages/backend/src/server/api/common/read-notification.ts
+++ b/packages/backend/src/server/api/common/read-notification.ts
@@ -27,7 +27,7 @@ export async function readNotificationByQuery(
userId: User['id'],
query: Record<string, any>
) {
- const notificationIds = await Notifications.find({
+ const notificationIds = await Notifications.findBy({
...query,
notifieeId: userId,
isRead: false,
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/backend/yarn.lock b/packages/backend/yarn.lock
index 4fdbc83350..a2090a5e94 100644
--- a/packages/backend/yarn.lock
+++ b/packages/backend/yarn.lock
@@ -303,12 +303,7 @@
pluralize "^8.0.0"
yaml-ast-parser "0.0.43"
-"@sindresorhus/is@^3.0.0":
- version "3.1.2"
- resolved "https://registry.yarnpkg.com/@sindresorhus/is/-/is-3.1.2.tgz#548650de521b344e3781fbdb0ece4aa6f729afb8"
- integrity sha512-JiX9vxoKMmu8Y3Zr2RVathBL1Cdu4Nt4MuNWemt1Nc06A0RAin9c5FArkhGsyMBWfCu4zj+9b+GxtjAnE4qqLQ==
-
-"@sindresorhus/is@^4.6.0":
+"@sindresorhus/is@^4.0.0", "@sindresorhus/is@^4.6.0":
version "4.6.0"
resolved "https://registry.yarnpkg.com/@sindresorhus/is/-/is-4.6.0.tgz#3c7c9c46e678feefe7a2e5bb609d3dbd665ffb3f"
integrity sha512-t09vSN3MdfsyCHoFcTRCH/iUtG7OJ0CsjzB8cjAmKc/va/kIgeDI/TxsigdncE/4be734m0cvIYwNaV4i2XqAw==
@@ -1736,19 +1731,6 @@ cacheable-lookup@^5.0.3:
resolved "https://registry.yarnpkg.com/cacheable-lookup/-/cacheable-lookup-5.0.3.tgz#049fdc59dffdd4fc285e8f4f82936591bd59fec3"
integrity sha512-W+JBqF9SWe18A72XFzN/V/CULFzPm7sBXzzR6ekkE+3tLG72wFZrBiBZhrZuDoYexop4PHJVdFAKb/Nj9+tm9w==
-cacheable-request@^7.0.1:
- version "7.0.1"
- resolved "https://registry.yarnpkg.com/cacheable-request/-/cacheable-request-7.0.1.tgz#062031c2856232782ed694a257fa35da93942a58"
- integrity sha512-lt0mJ6YAnsrBErpTMWeu5kl/tg9xMAWjavYTN6VQXM1A/teBITuNcccXsCxF0tDQQJf9DfAaX5O4e0zp0KlfZw==
- dependencies:
- clone-response "^1.0.2"
- get-stream "^5.1.0"
- http-cache-semantics "^4.0.0"
- keyv "^4.0.0"
- lowercase-keys "^2.0.0"
- normalize-url "^4.1.0"
- responselike "^2.0.0"
-
cacheable-request@^7.0.2:
version "7.0.2"
resolved "https://registry.yarnpkg.com/cacheable-request/-/cacheable-request-7.0.2.tgz#ea0d0b889364a25854757301ca12b2da77f91d27"
@@ -3520,19 +3502,19 @@ google-protobuf@^3.9.2:
resolved "https://registry.yarnpkg.com/google-protobuf/-/google-protobuf-3.20.1.tgz#1b255c2b59bcda7c399df46c65206aa3c7a0ce8b"
integrity sha512-XMf1+O32FjYIV3CYu6Tuh5PNbfNEU5Xu22X+Xkdb/DUexFlCzhvv7d5Iirm4AOwn8lv4al1YvIhzGrg2j9Zfzw==
-got@11.5.1:
- version "11.5.1"
- resolved "https://registry.yarnpkg.com/got/-/got-11.5.1.tgz#bf098a270fe80b3fb88ffd5a043a59ebb0a391db"
- integrity sha512-reQEZcEBMTGnujmQ+Wm97mJs/OK6INtO6HmLI+xt3+9CvnRwWjXutUvb2mqr+Ao4Lu05Rx6+udx9sOQAmExMxA==
+got@11.8.5:
+ version "11.8.5"
+ resolved "https://registry.yarnpkg.com/got/-/got-11.8.5.tgz#ce77d045136de56e8f024bebb82ea349bc730046"
+ integrity sha512-o0Je4NvQObAuZPHLFoRSkdG2lTgtcynqymzg2Vupdx6PorhaT5MCbIyXG6d4D94kk8ZG57QeosgdiqfJWhEhlQ==
dependencies:
- "@sindresorhus/is" "^3.0.0"
+ "@sindresorhus/is" "^4.0.0"
"@szmarczak/http-timer" "^4.0.5"
"@types/cacheable-request" "^6.0.1"
"@types/responselike" "^1.0.0"
cacheable-lookup "^5.0.3"
- cacheable-request "^7.0.1"
+ cacheable-request "^7.0.2"
decompress-response "^6.0.0"
- http2-wrapper "^1.0.0-beta.5.0"
+ http2-wrapper "^1.0.0-beta.5.2"
lowercase-keys "^2.0.0"
p-cancelable "^2.0.0"
responselike "^2.0.0"
@@ -3734,7 +3716,7 @@ http-signature@~1.2.0:
jsprim "^1.2.2"
sshpk "^1.7.0"
-http2-wrapper@^1.0.0-beta.5.0:
+http2-wrapper@^1.0.0-beta.5.2:
version "1.0.3"
resolved "https://registry.yarnpkg.com/http2-wrapper/-/http2-wrapper-1.0.3.tgz#b8f55e0c1f25d4ebd08b3b0c2c079f9590800b3d"
integrity sha512-V+23sDMr12Wnz7iTcDeJr3O6AIxlnvT/bmaAAAP/Xda35C90p9599p0F1eHR/N1KILWSoWVAiOMFjBBXaXSMxg==
@@ -5380,11 +5362,6 @@ normalize-path@^3.0.0, normalize-path@~3.0.0:
resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65"
integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==
-normalize-url@^4.1.0:
- version "4.5.1"
- resolved "https://registry.yarnpkg.com/normalize-url/-/normalize-url-4.5.1.tgz#0dd90cf1288ee1d1313b87081c9a5932ee48518a"
- integrity sha512-9UZCFRHQdNrfTpGg8+1INIg93B6zE0aXMVFkw1WFwvO4SlZywU6aLg5Of0Ap/PgcbSw4LNxvMWXMeugwMCX0AA==
-
normalize-url@^6.0.1:
version "6.1.0"
resolved "https://registry.yarnpkg.com/normalize-url/-/normalize-url-6.1.0.tgz#40d0885b535deffe3f3147bec877d05fe4c5668a"
@@ -6974,15 +6951,15 @@ style-loader@3.3.1:
resolved "https://registry.yarnpkg.com/style-loader/-/style-loader-3.3.1.tgz#057dfa6b3d4d7c7064462830f9113ed417d38575"
integrity sha512-GPcQ+LDJbrcxHORTRes6Jy2sfvK2kS6hpSfI/fXhPt+spVzxF6LJ1dHLN9zIGmVaaP044YKaIatFaufENRiDoQ==
-summaly@2.6.0:
- version "2.6.0"
- resolved "https://registry.yarnpkg.com/summaly/-/summaly-2.6.0.tgz#aaac80eb8ae88b130318f44d9b98da9c2ccb328c"
- integrity sha512-wIv6fL3aeFfXcQoZISzeUfNUgD3u8Hwx8Rg0awZliQhans62w23K3nDezwfvmYAQCgXs6e0EF7jtGmJv/qeVTA==
+summaly@2.7.0:
+ version "2.7.0"
+ resolved "https://registry.yarnpkg.com/summaly/-/summaly-2.7.0.tgz#ccccec0477938edea13cb34412a33e705398c0c4"
+ integrity sha512-pEz9LL8Gp0oPIQfn6TrnBCcv/HkFE14hxhH3W6LPGdopXlPXjRcMlDMJaO+VupUNMOGaMjCsjq7+0rWnu8sp7w==
dependencies:
cheerio "0.22.0"
debug "4.3.3"
escape-regexp "0.0.1"
- got "11.5.1"
+ got "11.8.5"
html-entities "2.3.2"
iconv-lite "0.6.3"
jschardet "3.0.0"