From 522ddba3d715e7d506d6e1d39a946dcbf6e91e52 Mon Sep 17 00:00:00 2001 From: syuilo Date: Sat, 9 Jul 2022 13:22:35 +0900 Subject: [PATCH 1/5] enhance(server): tweak identicon generation --- packages/backend/src/misc/gen-identicon.ts | 49 +++++++++++++--------- 1 file changed, 29 insertions(+), 20 deletions(-) diff --git a/packages/backend/src/misc/gen-identicon.ts b/packages/backend/src/misc/gen-identicon.ts index 9b30e5dbd..322ffee22 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 { 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); From 75d516011b7169cee6db8aa6e0550d8f84dfde5a Mon Sep 17 00:00:00 2001 From: syuilo Date: Sat, 9 Jul 2022 15:05:55 +0900 Subject: [PATCH 2/5] enhance: make active email validation configurable --- CHANGELOG.md | 7 +++++++ locales/ja-JP.yml | 1 + .../1657346559800-active-email-validation.js | 11 +++++++++++ packages/backend/src/models/entities/meta.ts | 5 +++++ .../src/server/api/endpoints/admin/meta.ts | 5 +++++ .../server/api/endpoints/admin/update-meta.ts | 5 +++++ .../services/validate-email-for-account.ts | 19 +++++++++++-------- packages/client/src/pages/admin/security.vue | 16 ++++++++++++++++ 8 files changed, 61 insertions(+), 8 deletions(-) create mode 100644 packages/backend/migration/1657346559800-active-email-validation.js diff --git a/CHANGELOG.md b/CHANGELOG.md index 8354d72ba..29f91596c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -9,6 +9,13 @@ You should also include the user name that made the change. --> +## 12.x.x (unreleased) + +### Improvements +- Make active email validation configurable + +### Bugfixes + ## 12.112.2 (2022/07/08) ### Bugfixes diff --git a/locales/ja-JP.yml b/locales/ja-JP.yml index 3eecc3b57..0e278bead 100644 --- a/locales/ja-JP.yml +++ b/locales/ja-JP.yml @@ -886,6 +886,7 @@ cannotUploadBecauseNoFreeSpace: "ドライブの空き容量が無いためア beta: "ベータ" enableAutoSensitive: "自動NSFW判定" enableAutoSensitiveDescription: "利用可能な場合は、機械学習を利用して自動でメディアにNSFWフラグを設定します。この機能をオフにしても、インスタンスによっては自動で設定されることがあります。" +activeEmailValidationDescription: "ユーザーのメールアドレスのバリデーションを、捨てアドかどうかや実際に通信可能かどうかなどを判定しより積極的に行います。オフにすると単に文字列として正しいかどうかのみチェックされます。" _sensitiveMediaDetection: description: "機械学習を使って自動でセンシティブなメディアを検出し、モデレーションに役立てることができます。サーバーの負荷が少し増えます。" 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 000000000..f8e03eeb0 --- /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 ebc082dfb..d33ff2519 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 cb50e128a..874611968 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 cc32e73c5..f14aa4105 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 132168fb3..b5fa99b93 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 c4a4994bb..07ee412f3 100644 --- a/packages/client/src/pages/admin/security.vue +++ b/packages/client/src/pages/admin/security.vue @@ -57,6 +57,19 @@ + + + + + +
+ {{ i18n.ts.activeEmailValidationDescription }} + + + +
+
+ @@ -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(); }); From 53e54c22fa3d0bec780441c07b5fd00e02193275 Mon Sep 17 00:00:00 2001 From: MeiMei <30769358+mei23@users.noreply.github.com> Date: Sat, 9 Jul 2022 18:18:39 +0900 Subject: [PATCH 3/5] Fix Attempts to update all notifications (#8974) * Fix massive update notification parameters * CHANGELOG * CHANGELOG --- CHANGELOG.md | 1 + packages/backend/src/server/api/common/read-notification.ts | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 29f91596c..cfd54f74d 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -15,6 +15,7 @@ You should also include the user name that made the change. - Make active email validation configurable ### Bugfixes +- Server: Fix Attempts to update all notifications @mei23 ## 12.112.2 (2022/07/08) diff --git a/packages/backend/src/server/api/common/read-notification.ts b/packages/backend/src/server/api/common/read-notification.ts index 8c4ba41a3..17dd8e6f0 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 ) { - const notificationIds = await Notifications.find({ + const notificationIds = await Notifications.findBy({ ...query, notifieeId: userId, isRead: false, From 49012f83521cf17be738fca5ac7257ad615a609f Mon Sep 17 00:00:00 2001 From: syuilo Date: Sat, 9 Jul 2022 18:23:21 +0900 Subject: [PATCH 4/5] update summaly --- packages/backend/package.json | 2 +- packages/backend/yarn.lock | 51 ++++++++++------------------------- 2 files changed, 15 insertions(+), 38 deletions(-) diff --git a/packages/backend/package.json b/packages/backend/package.json index 8f7cd34a8..b50aa601d 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/yarn.lock b/packages/backend/yarn.lock index 4fdbc8335..a2090a5e9 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" From 111d4d014942e661242db78c03d3a798823ff3cb Mon Sep 17 00:00:00 2001 From: syuilo Date: Sat, 9 Jul 2022 18:32:45 +0900 Subject: [PATCH 5/5] 12.112.3 --- CHANGELOG.md | 2 +- package.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index cfd54f74d..37e3d52a0 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -9,7 +9,7 @@ You should also include the user name that made the change. --> -## 12.x.x (unreleased) +## 12.112.3 (2022/07/09) ### Improvements - Make active email validation configurable diff --git a/package.json b/package.json index e07da5ca0..402ae906d 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "misskey", - "version": "12.112.2", + "version": "12.112.3", "codename": "indigo", "repository": { "type": "git",