Skip to content

Commit

Permalink
Merge branch 'neko-feat/user-approve' into update-neko/2024.11.0
Browse files Browse the repository at this point in the history
  • Loading branch information
HotoRas authored Nov 19, 2024
2 parents ac45775 + a95ab97 commit e16f251
Show file tree
Hide file tree
Showing 53 changed files with 803 additions and 50 deletions.
4 changes: 3 additions & 1 deletion Changelog-neko.md
Original file line number Diff line number Diff line change
@@ -1,6 +1,8 @@
## Unreleased
## Unreleased (2024.9.0+neko.rc-2)

### General
- Feat: 사용자 등록을 승인제로 할 수 있도록
(pull from 0e2e4c353f6d2fd2cc650007ec2f6a876acde8f7)

### Frontend

Expand Down
72 changes: 72 additions & 0 deletions locales/index.d.ts
Original file line number Diff line number Diff line change
Expand Up @@ -166,6 +166,10 @@ export interface Locale extends ILocale {
* ユーザー
*/
"users": string;
/**
* 承認
*/
"approvals": string;
/**
* ユーザーを追加
*/
Expand Down Expand Up @@ -626,6 +630,14 @@ export interface Locale extends ILocale {
* 凍結しますか?
*/
"suspendConfirm": string;
/**
* 登録を承認しますか?
*/
"registerApproveConfirm": string;
/**
* この操作は取り消せません。承認後、このユーザーに登録が承認された旨が記載されたメールが送信されます。
*/
"registerApproveConfirmDescription": string;
/**
* 解凍しますか?
*/
Expand Down Expand Up @@ -3654,6 +3666,14 @@ export interface Locale extends ILocale {
* アカウント登録にメールアドレスを必須にする
*/
"emailRequiredForSignup": string;
/**
* アカウント登録を承認制にする
*/
"approvalRequiredForSignup": string;
/**
* アカウント登録の承認
*/
"signupPendingApprovals": string;
/**
* 未読
*/
Expand Down Expand Up @@ -3870,6 +3890,10 @@ export interface Locale extends ILocale {
* 未対応の通報があります。
*/
"thereIsUnresolvedAbuseReportWarning": string;
/**
* 承認待ちのユーザーがいます。
*/
"pendingUserApprovals": string;
/**
* 推奨
*/
Expand Down Expand Up @@ -3902,6 +3926,26 @@ export interface Locale extends ILocale {
* アカウント削除
*/
"deleteAccount": string;
/**
* 承認する
*/
"approveAccount": string;
/**
* 拒否してアカウント削除
*/
"denyAccount": string;
/**
* 承認済み
*/
"approved": string;
/**
* 未承認
*/
"notApproved": string;
/**
* 承認状況
*/
"approvalStatus": string;
/**
* ドキュメント
*/
Expand Down Expand Up @@ -4270,6 +4314,22 @@ export interface Locale extends ILocale {
* 現在このサーバーは招待制です。招待コードをお持ちの方のみ登録できます。
*/
"invitationRequiredToRegister": string;
/**
* 現在このサーバーは承認制です。参加したい理由を記入し、承認された方のみ登録できます。
*/
"approvalRequiredToRegister": string;
/**
* 登録理由
*/
"registerReason": string;
/**
* サーバーへの登録はまだ承認されていません。しばらくしてから再度お試しください。登録時にメールアドレスを記入した場合は、登録が承認されたらメールでお知らせします。
*/
"registerHasNotBeenApprovedYet": string;
/**
* サーバーへの登録が承認されたかどうかの通知を行うために、併せてアカウント登録にメールアドレスを必須にすることを強く推奨します。
*/
"registerApprovalEmailRecommended": string;
/**
* このサーバーではメール配信はサポートされていません
*/
Expand Down Expand Up @@ -7164,6 +7224,14 @@ export interface Locale extends ILocale {
* 入力されたメールアドレス({email})宛に確認のメールが送信されました。メールに記載されたリンクにアクセスすると、アカウントの作成が完了します。メールに記載されているリンクの有効期限は30分です。
*/
"emailSent": ParameterizedString<"email">;
/**
* アカウントが作成され、承認待ちの状態です。
*/
"approvalPending": string;
/**
* このサーバーに参加したい理由を入力してください。
*/
"reasonInfo": string;
};
"_accountDelete": {
/**
Expand Down Expand Up @@ -9850,6 +9918,10 @@ export interface Locale extends ILocale {
* ロールのアサイン解除
*/
"unassignRole": string;
/**
* 承認済み
*/
"approve": string;
/**
* 凍結
*/
Expand Down
18 changes: 18 additions & 0 deletions locales/ja-JP.yml
Original file line number Diff line number Diff line change
Expand Up @@ -37,6 +37,7 @@ signup: "新規登録"
uploading: "アップロード中"
save: "保存"
users: "ユーザー"
approvals: "承認"
addUser: "ユーザーを追加"
favorite: "お気に入り"
favorites: "お気に入り"
Expand Down Expand Up @@ -152,6 +153,8 @@ unsuspend: "解凍"
blockConfirm: "ブロックしますか?"
unblockConfirm: "ブロック解除しますか?"
suspendConfirm: "凍結しますか?"
registerApproveConfirm: "登録を承認しますか?"
registerApproveConfirmDescription: "この操作は取り消せません。承認後、このユーザーに登録が承認された旨が記載されたメールが送信されます。"
unsuspendConfirm: "解凍しますか?"
selectList: "リストを選択"
editList: "リストを編集"
Expand Down Expand Up @@ -909,6 +912,8 @@ itsOff: "オフになっています"
on: "オン"
off: "オフ"
emailRequiredForSignup: "アカウント登録にメールアドレスを必須にする"
approvalRequiredForSignup: "アカウント登録を承認制にする"
signupPendingApprovals: "アカウント登録の承認"
unread: "未読"
filter: "フィルタ"
controlPanel: "コントロールパネル"
Expand Down Expand Up @@ -963,6 +968,7 @@ recentNHours: "直近{n}時間"
recentNDays: "直近{n}日"
noEmailServerWarning: "メールサーバーの設定がされていません。"
thereIsUnresolvedAbuseReportWarning: "未対応の通報があります。"
pendingUserApprovals: "承認待ちのユーザーがいます。"
recommended: "推奨"
check: "チェック"
driveCapOverrideLabel: "このユーザーのドライブ容量上限を変更"
Expand All @@ -971,6 +977,11 @@ requireAdminForView: "閲覧するには管理者アカウントでログイン
isSystemAccount: "システムにより自動で作成・管理されているアカウントです。"
typeToConfirm: "この操作を行うには {x} と入力してください"
deleteAccount: "アカウント削除"
approveAccount: "承認する"
denyAccount: "拒否してアカウント削除"
approved: "承認済み"
notApproved: "未承認"
approvalStatus: "承認状況"
document: "ドキュメント"
numberOfPageCache: "ページキャッシュ数"
numberOfPageCacheDescription: "多くすると利便性が向上しますが、負荷とメモリ使用量が増えます。"
Expand Down Expand Up @@ -1063,6 +1074,10 @@ disableFederationConfirm: "連合なしにしますか?"
disableFederationConfirmWarn: "連合なしにしても投稿は非公開になりません。ほとんどの場合、連合なしにする必要はありません。"
disableFederationOk: "連合なしにする"
invitationRequiredToRegister: "現在このサーバーは招待制です。招待コードをお持ちの方のみ登録できます。"
approvalRequiredToRegister: "現在このサーバーは承認制です。参加したい理由を記入し、承認された方のみ登録できます。"
registerReason: "登録理由"
registerHasNotBeenApprovedYet: "サーバーへの登録はまだ承認されていません。しばらくしてから再度お試しください。登録時にメールアドレスを記入した場合は、登録が承認されたらメールでお知らせします。"
registerApprovalEmailRecommended: "サーバーへの登録が承認されたかどうかの通知を行うために、併せてアカウント登録にメールアドレスを必須にすることを強く推奨します。"
emailNotSupported: "このサーバーではメール配信はサポートされていません"
postToTheChannel: "チャンネルに投稿"
cannotBeChangedLater: "後から変更できません。"
Expand Down Expand Up @@ -1856,6 +1871,8 @@ _signup:
almostThere: "ほとんど完了です"
emailAddressInfo: "あなたが使っているメールアドレスを入力してください。メールアドレスが公開されることはありません。"
emailSent: "入力されたメールアドレス({email})宛に確認のメールが送信されました。メールに記載されたリンクにアクセスすると、アカウントの作成が完了します。メールに記載されているリンクの有効期限は30分です。"
approvalPending: "アカウントが作成され、承認待ちの状態です。"
reasonInfo: "このサーバーに参加したい理由を入力してください。"

_accountDelete:
accountDelete: "アカウントの削除"
Expand Down Expand Up @@ -2612,6 +2629,7 @@ _moderationLogTypes:
updateRole: "ロールを更新"
assignRole: "ロールへアサイン"
unassignRole: "ロールのアサイン解除"
approve: "承認済み"
suspend: "凍結"
unsuspend: "凍結解除"
addCustomEmoji: "カスタム絵文字追加"
Expand Down
24 changes: 24 additions & 0 deletions packages/backend/migration/1697580470000-approvalSignup.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
/*
* SPDX-FileCopyrightText: syuilo and other misskey contributors
* SPDX-License-Identifier: AGPL-3.0-only
*/

export class ApprovalSignup1697580470000 {
name = 'ApprovalSignup1697580470000'

async up(queryRunner) {
await queryRunner.query(`ALTER TABLE "meta" ADD "approvalRequiredForSignup" boolean DEFAULT false NOT NULL`);
await queryRunner.query(`ALTER TABLE "user" ADD "approved" boolean DEFAULT false NOT NULL`);
//▼ 既存のユーザーについては全員Approveにする
await queryRunner.query(`UPDATE "user" SET "approved" = true`);
await queryRunner.query(`ALTER TABLE "user" ADD "signupReason" character varying(1000) NULL`);
await queryRunner.query(`ALTER TABLE "user_pending" ADD "reason" character varying(1000) NULL`);
}

async down(queryRunner) {
await queryRunner.query(`ALTER TABLE "meta" DROP COLUMN "approvalRequiredForSignup"`);
await queryRunner.query(`ALTER TABLE "user" DROP COLUMN "approved"`);
await queryRunner.query(`ALTER TABLE "user" DROP COLUMN "signupReason"`);
await queryRunner.query(`ALTER TABLE "user_pending" DROP COLUMN "reason"`);
}
}
5 changes: 5 additions & 0 deletions packages/backend/src/config.ts
Original file line number Diff line number Diff line change
Expand Up @@ -99,6 +99,8 @@ type Source = {
perUserNotificationsMaxCount?: number;
deactivateAntennaThreshold?: number;
pidFile: string;

approvalRequiredForSignup: boolean;
};

export type Config = {
Expand Down Expand Up @@ -190,6 +192,8 @@ export type Config = {
perUserNotificationsMaxCount: number;
deactivateAntennaThreshold: number;
pidFile: string;

approvalRequiredForSignup: boolean;
};

const _filename = fileURLToPath(import.meta.url);
Expand Down Expand Up @@ -302,6 +306,7 @@ export function loadConfig(): Config {
deactivateAntennaThreshold: config.deactivateAntennaThreshold ?? (1000 * 60 * 60 * 24 * 7),
pidFile: config.pidFile,
skebStatus: undefined,
approvalRequiredForSignup: config.approvalRequiredForSignup,
};
}

Expand Down
1 change: 1 addition & 0 deletions packages/backend/src/core/CreateSystemUserService.ts
Original file line number Diff line number Diff line change
Expand Up @@ -60,6 +60,7 @@ export class CreateSystemUserService {
isRoot: false,
isLocked: true,
isExplorable: false,
approved: true,
isBot: true,
}).then(x => transactionalEntityManager.findOneByOrFail(MiUser, x.identifiers[0]));

Expand Down
2 changes: 2 additions & 0 deletions packages/backend/src/core/SignupService.ts
Original file line number Diff line number Diff line change
Expand Up @@ -53,6 +53,7 @@ export class SignupService {
passwordHash?: MiUserProfile['password'] | null;
host?: string | null;
ignorePreservedUsernames?: boolean;
reason?: string | null;
}) {
const { username, password, passwordHash, host } = opts;
let hash = passwordHash;
Expand Down Expand Up @@ -130,6 +131,7 @@ export class SignupService {
host: this.utilityService.toPunyNullable(host),
token: secret,
isRoot: isTheFirstUser,
signupReason: opts.reason,
}));

await transactionalEntityManager.save(new MiUserKeypair({
Expand Down
3 changes: 3 additions & 0 deletions packages/backend/src/core/WebhookTestService.ts
Original file line number Diff line number Diff line change
Expand Up @@ -95,6 +95,8 @@ function generateDummyUser(override?: Partial<MiUser>): MiUser {
uri: null,
followersUri: null,
token: null,
approved: override?.approved ?? false,
signupReason: override?.signupReason ?? null,
...override,
};
}
Expand Down Expand Up @@ -208,6 +210,7 @@ function toPackedUserLite(user: MiUser, override?: Packed<'UserLite'>): Packed<'
emojis: user.emojis,
onlineStatus: 'active',
badgeRoles: [],
approved: override?.approved ?? false,
...override,
};
}
Expand Down
Loading

0 comments on commit e16f251

Please sign in to comment.