enhance: アカウント登録時のメールアドレス認証に30分の有効期限を設定 (#12221)

* add: metaにemailVerificationExpiresInを追加

* enhance: 招待コード使用時, メアド認証時に認証期限を確認するように

* add: クライアント側に実装

* update: CHANGELOG.md

* add: コメントを追加

* Revert "add: metaにemailVerificationExpiresInを追加"

This reverts commit ceb6ccff51.

* Revert "add: コメントを追加"

This reverts commit 7ee301c3ee.

* change(client): メール認証の有効期限を30分で固定するように変更

* change(backend): メール認証の有効期限を30分で固定するように変更

* update: CHANGELOG.md
This commit is contained in:
yukineko 2023-11-03 14:54:28 +09:00 committed by GitHub
parent 1729307fcf
commit 025ae436b5
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
5 changed files with 26 additions and 3 deletions

View file

@ -24,6 +24,9 @@
- Enhance: 未読の通知数を表示できるように - Enhance: 未読の通知数を表示できるように
- Enhance: ローカリゼーションの更新 - Enhance: ローカリゼーションの更新
- Enhance: 依存関係の更新 - Enhance: 依存関係の更新
- Enhance: アカウント登録時のメールアドレス認証に30分の有効期限を設定
- 有効期限が切れた後であれば、登録時に使用した招待コードを再度利用できるように変更しました。
- ユーザーが誤ったメールアドレスを入力した場合に招待コードが失効してしまう問題が解消されます。
- Change: CWを使用する場合、注釈を空にすることは許可されなくなりました - Change: CWを使用する場合、注釈を空にすることは許可されなくなりました
### Client ### Client

1
locales/index.d.ts vendored
View file

@ -1158,6 +1158,7 @@ export interface Locale {
"pullDownToRefresh": string; "pullDownToRefresh": string;
"disableStreamingTimeline": string; "disableStreamingTimeline": string;
"useGroupedNotifications": string; "useGroupedNotifications": string;
"signupPendingError": string;
"cwNotationRequired": string; "cwNotationRequired": string;
"_announcement": { "_announcement": {
"forExistingUsers": string; "forExistingUsers": string;

View file

@ -1155,6 +1155,7 @@ refreshing: "リロード中"
pullDownToRefresh: "引っ張ってリロード" pullDownToRefresh: "引っ張ってリロード"
disableStreamingTimeline: "タイムラインのリアルタイム更新を無効にする" disableStreamingTimeline: "タイムラインのリアルタイム更新を無効にする"
useGroupedNotifications: "通知をグルーピングして表示する" useGroupedNotifications: "通知をグルーピングして表示する"
signupPendingError: "メールアドレスの確認中に問題が発生しました。リンクの有効期限が切れている可能性があります。"
cwNotationRequired: "「内容を隠す」がオンの場合は注釈の記述が必要です。" cwNotationRequired: "「内容を隠す」がオンの場合は注釈の記述が必要です。"
_announcement: _announcement:
@ -1554,7 +1555,7 @@ _ffVisibility:
_signup: _signup:
almostThere: "ほとんど完了です" almostThere: "ほとんど完了です"
emailAddressInfo: "あなたが使っているメールアドレスを入力してください。メールアドレスが公開されることはありません。" emailAddressInfo: "あなたが使っているメールアドレスを入力してください。メールアドレスが公開されることはありません。"
emailSent: "入力されたメールアドレス({email})宛に確認のメールが送信されました。メールに記載されたリンクにアクセスすると、アカウントの作成が完了します。" emailSent: "入力されたメールアドレス({email})宛に確認のメールが送信されました。メールに記載されたリンクにアクセスすると、アカウントの作成が完了します。メールに記載されているリンクの有効期限は30分です。"
_accountDelete: _accountDelete:
accountDelete: "アカウントの削除" accountDelete: "アカウントの削除"

View file

@ -136,7 +136,20 @@ export class SignupApiService {
return; return;
} }
if (ticket.usedAt) { // メアド認証が有効の場合
if (instance.emailRequiredForSignup) {
// メアド認証済みならエラー
if (ticket.usedBy) {
reply.code(400);
return;
}
// 認証しておらず、メール送信から30分以内ならエラー
if (ticket.usedAt && ticket.usedAt.getTime() + (1000 * 60 * 30) > Date.now()) {
reply.code(400);
return;
}
} else if (ticket.usedAt) {
reply.code(400); reply.code(400);
return; return;
} }
@ -224,6 +237,10 @@ export class SignupApiService {
try { try {
const pendingUser = await this.userPendingsRepository.findOneByOrFail({ code }); const pendingUser = await this.userPendingsRepository.findOneByOrFail({ code });
if (this.idService.parse(pendingUser.id).date.getTime() + (1000 * 60 * 30) < Date.now()) {
throw new FastifyReplyError(400, 'EXPIRED');
}
const { account, secret } = await this.signupService.signup({ const { account, secret } = await this.signupService.signup({
username: pendingUser.username, username: pendingUser.username,
passwordHash: pendingUser.password, passwordHash: pendingUser.password,

View file

@ -51,7 +51,8 @@ function submit() {
os.alert({ os.alert({
type: 'error', type: 'error',
text: i18n.ts.somethingHappened, title: i18n.ts.somethingHappened,
text: i18n.ts.signupPendingError,
}); });
}); });
} }