Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

가입 승인제 추가 #20

Open
wants to merge 21 commits into
base: neko
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from 8 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
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 @@ -152,6 +152,10 @@ export interface Locale extends ILocale {
* ユーザー
*/
"users": string;
/**
* 承認
*/
"approvals": string;
/**
* ユーザーを追加
*/
Expand Down Expand Up @@ -612,6 +616,14 @@ export interface Locale extends ILocale {
* 凍結しますか?
*/
"suspendConfirm": string;
/**
* 登録を承認しますか?
*/
"registerApproveConfirm": string;
/**
* この操作は取り消せません。承認後、このユーザーに登録が承認された旨が記載されたメールが送信されます。
*/
"registerApproveConfirmDescription": string;
/**
* 解凍しますか?
*/
Expand Down Expand Up @@ -3648,6 +3660,14 @@ export interface Locale extends ILocale {
* アカウント登録にメールアドレスを必須にする
*/
"emailRequiredForSignup": string;
/**
* アカウント登録を承認制にする
*/
"approvalRequiredForSignup": string;
/**
* アカウント登録の承認
*/
"signupPendingApprovals": string;
/**
* 未読
*/
Expand Down Expand Up @@ -3848,6 +3868,10 @@ export interface Locale extends ILocale {
* 未対応の通報があります。
*/
"thereIsUnresolvedAbuseReportWarning": string;
/**
* 承認待ちのユーザーがいます。
*/
"pendingUserApprovals": string;
/**
* 推奨
*/
Expand Down Expand Up @@ -3880,6 +3904,26 @@ export interface Locale extends ILocale {
* アカウント削除
*/
"deleteAccount": string;
/**
* 承認する
*/
"approveAccount": string;
/**
* 拒否してアカウント削除
*/
"denyAccount": string;
/**
* 承認済み
*/
"approved": string;
/**
* 未承認
*/
"notApproved": string;
/**
* 承認状況
*/
"approvalStatus": string;
/**
* ドキュメント
*/
Expand Down Expand Up @@ -4248,6 +4292,22 @@ export interface Locale extends ILocale {
* 現在このサーバーは招待制です。招待コードをお持ちの方のみ登録できます。
*/
"invitationRequiredToRegister": string;
/**
* 現在このサーバーは承認制です。参加したい理由を記入し、承認された方のみ登録できます。
*/
"approvalRequiredToRegister": string;
/**
* 登録理由
*/
"registerReason": string;
/**
* サーバーへの登録はまだ承認されていません。しばらくしてから再度お試しください。登録時にメールアドレスを記入した場合は、登録が承認されたらメールでお知らせします。
*/
"registerHasNotBeenApprovedYet": string;
/**
* サーバーへの登録が承認されたかどうかの通知を行うために、併せてアカウント登録にメールアドレスを必須にすることを強く推奨します。
*/
"registerApprovalEmailRecommended": string;
/**
* このサーバーではメール配信はサポートされていません
*/
Expand Down Expand Up @@ -7017,6 +7077,14 @@ export interface Locale extends ILocale {
* 入力されたメールアドレス({email})宛に確認のメールが送信されました。メールに記載されたリンクにアクセスすると、アカウントの作成が完了します。メールに記載されているリンクの有効期限は30分です。
*/
"emailSent": ParameterizedString<"email">;
/**
* アカウントが作成され、承認待ちの状態です。
*/
"approvalPending": string;
/**
* このサーバーに参加したい理由を入力してください。
*/
"reasonInfo": string;
};
"_accountDelete": {
/**
Expand Down Expand Up @@ -9679,6 +9747,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 @@ -34,6 +34,7 @@ signup: "新規登録"
uploading: "アップロード中"
save: "保存"
users: "ユーザー"
approvals: "承認"
addUser: "ユーザーを追加"
favorite: "お気に入り"
favorites: "お気に入り"
Expand Down Expand Up @@ -149,6 +150,8 @@ unsuspend: "解凍"
blockConfirm: "ブロックしますか?"
unblockConfirm: "ブロック解除しますか?"
suspendConfirm: "凍結しますか?"
registerApproveConfirm: "登録を承認しますか?"
registerApproveConfirmDescription: "この操作は取り消せません。承認後、このユーザーに登録が承認された旨が記載されたメールが送信されます。"
unsuspendConfirm: "解凍しますか?"
selectList: "リストを選択"
editList: "リストを編集"
Expand Down Expand Up @@ -908,6 +911,8 @@ itsOff: "オフになっています"
on: "オン"
off: "オフ"
emailRequiredForSignup: "アカウント登録にメールアドレスを必須にする"
approvalRequiredForSignup: "アカウント登録を承認制にする"
signupPendingApprovals: "アカウント登録の承認"
unread: "未読"
filter: "フィルタ"
controlPanel: "コントロールパネル"
Expand Down Expand Up @@ -958,6 +963,7 @@ recentNHours: "直近{n}時間"
recentNDays: "直近{n}日"
noEmailServerWarning: "メールサーバーの設定がされていません。"
thereIsUnresolvedAbuseReportWarning: "未対応の通報があります。"
pendingUserApprovals: "承認待ちのユーザーがいます。"
recommended: "推奨"
check: "チェック"
driveCapOverrideLabel: "このユーザーのドライブ容量上限を変更"
Expand All @@ -966,6 +972,11 @@ requireAdminForView: "閲覧するには管理者アカウントでログイン
isSystemAccount: "システムにより自動で作成・管理されているアカウントです。"
typeToConfirm: "この操作を行うには {x} と入力してください"
deleteAccount: "アカウント削除"
approveAccount: "承認する"
denyAccount: "拒否してアカウント削除"
approved: "承認済み"
notApproved: "未承認"
approvalStatus: "承認状況"
document: "ドキュメント"
numberOfPageCache: "ページキャッシュ数"
numberOfPageCacheDescription: "多くすると利便性が向上しますが、負荷とメモリ使用量が増えます。"
Expand Down Expand Up @@ -1058,6 +1069,10 @@ disableFederationConfirm: "連合なしにしますか?"
disableFederationConfirmWarn: "連合なしにしても投稿は非公開になりません。ほとんどの場合、連合なしにする必要はありません。"
disableFederationOk: "連合なしにする"
invitationRequiredToRegister: "現在このサーバーは招待制です。招待コードをお持ちの方のみ登録できます。"
approvalRequiredToRegister: "現在このサーバーは承認制です。参加したい理由を記入し、承認された方のみ登録できます。"
registerReason: "登録理由"
registerHasNotBeenApprovedYet: "サーバーへの登録はまだ承認されていません。しばらくしてから再度お試しください。登録時にメールアドレスを記入した場合は、登録が承認されたらメールでお知らせします。"
registerApprovalEmailRecommended: "サーバーへの登録が承認されたかどうかの通知を行うために、併せてアカウント登録にメールアドレスを必須にすることを強く推奨します。"
emailNotSupported: "このサーバーではメール配信はサポートされていません"
postToTheChannel: "チャンネルに投稿"
cannotBeChangedLater: "後から変更できません。"
Expand Down Expand Up @@ -1817,6 +1832,8 @@ _signup:
almostThere: "ほとんど完了です"
emailAddressInfo: "あなたが使っているメールアドレスを入力してください。メールアドレスが公開されることはありません。"
emailSent: "入力されたメールアドレス({email})宛に確認のメールが送信されました。メールに記載されたリンクにアクセスすると、アカウントの作成が完了します。メールに記載されているリンクの有効期限は30分です。"
approvalPending: "アカウントが作成され、承認待ちの状態です。"
reasonInfo: "このサーバーに参加したい理由を入力してください。"

_accountDelete:
accountDelete: "アカウントの削除"
Expand Down Expand Up @@ -2567,6 +2584,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 @@ -97,6 +97,8 @@ type Source = {
perUserNotificationsMaxCount?: number;
deactivateAntennaThreshold?: number;
pidFile: string;

approvalRequiredForSignup: boolean;
};

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

approvalRequiredForSignup: boolean;
};

const _filename = fileURLToPath(import.meta.url);
Expand Down Expand Up @@ -298,6 +302,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 @@ -76,6 +76,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 @@ -189,6 +191,7 @@ function toPackedUserLite(user: MiUser, override?: Packed<'UserLite'>): Packed<'
emojis: user.emojis,
onlineStatus: 'active',
badgeRoles: [],
approved: override?.approved ?? false,
...override,
};
}
Expand Down
Loading
Loading