增加注册邀请码功能
This commit is contained in:
@@ -58,6 +58,8 @@ export async function POST(request: NextRequest) {
|
||||
CustomAdFilterCode,
|
||||
CustomAdFilterVersion,
|
||||
EnableRegistration,
|
||||
RequireRegistrationInviteCode,
|
||||
RegistrationInviteCode,
|
||||
RegistrationRequireTurnstile,
|
||||
LoginRequireTurnstile,
|
||||
TurnstileSiteKey,
|
||||
@@ -103,6 +105,8 @@ export async function POST(request: NextRequest) {
|
||||
CustomAdFilterCode?: string;
|
||||
CustomAdFilterVersion?: number;
|
||||
EnableRegistration?: boolean;
|
||||
RequireRegistrationInviteCode?: boolean;
|
||||
RegistrationInviteCode?: string;
|
||||
RegistrationRequireTurnstile?: boolean;
|
||||
LoginRequireTurnstile?: boolean;
|
||||
TurnstileSiteKey?: string;
|
||||
@@ -148,6 +152,8 @@ export async function POST(request: NextRequest) {
|
||||
(CustomAdFilterCode !== undefined && typeof CustomAdFilterCode !== 'string') ||
|
||||
(CustomAdFilterVersion !== undefined && typeof CustomAdFilterVersion !== 'number') ||
|
||||
(EnableRegistration !== undefined && typeof EnableRegistration !== 'boolean') ||
|
||||
(RequireRegistrationInviteCode !== undefined && typeof RequireRegistrationInviteCode !== 'boolean') ||
|
||||
(RegistrationInviteCode !== undefined && typeof RegistrationInviteCode !== 'string') ||
|
||||
(RegistrationRequireTurnstile !== undefined && typeof RegistrationRequireTurnstile !== 'boolean') ||
|
||||
(LoginRequireTurnstile !== undefined && typeof LoginRequireTurnstile !== 'boolean') ||
|
||||
(TurnstileSiteKey !== undefined && typeof TurnstileSiteKey !== 'string') ||
|
||||
@@ -208,6 +214,8 @@ export async function POST(request: NextRequest) {
|
||||
CustomAdFilterCode,
|
||||
CustomAdFilterVersion,
|
||||
EnableRegistration,
|
||||
RequireRegistrationInviteCode,
|
||||
RegistrationInviteCode,
|
||||
RegistrationRequireTurnstile,
|
||||
LoginRequireTurnstile,
|
||||
TurnstileSiteKey,
|
||||
|
||||
@@ -60,7 +60,7 @@ export async function POST(req: NextRequest) {
|
||||
);
|
||||
}
|
||||
|
||||
const { username, password, turnstileToken } = await req.json();
|
||||
const { username, password, inviteCode, turnstileToken } = await req.json();
|
||||
|
||||
// 验证输入
|
||||
if (!username || typeof username !== 'string') {
|
||||
@@ -69,6 +69,9 @@ export async function POST(req: NextRequest) {
|
||||
if (!password || typeof password !== 'string') {
|
||||
return NextResponse.json({ error: '密码不能为空' }, { status: 400 });
|
||||
}
|
||||
if (inviteCode !== undefined && typeof inviteCode !== 'string') {
|
||||
return NextResponse.json({ error: '邀请码格式错误' }, { status: 400 });
|
||||
}
|
||||
|
||||
// 验证用户名格式(只允许字母、数字、下划线,长度3-20)
|
||||
if (!/^[a-zA-Z0-9_]{3,20}$/.test(username)) {
|
||||
@@ -94,6 +97,23 @@ export async function POST(req: NextRequest) {
|
||||
);
|
||||
}
|
||||
|
||||
if (siteConfig.RequireRegistrationInviteCode) {
|
||||
const expectedInviteCode = (siteConfig.RegistrationInviteCode || '').trim();
|
||||
if (!expectedInviteCode) {
|
||||
return NextResponse.json(
|
||||
{ error: '服务器未配置邀请码' },
|
||||
{ status: 500 }
|
||||
);
|
||||
}
|
||||
|
||||
if (!inviteCode || inviteCode.trim() !== expectedInviteCode) {
|
||||
return NextResponse.json(
|
||||
{ error: '邀请码错误' },
|
||||
{ status: 400 }
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
// 获取用户名锁,防止并发注册
|
||||
let releaseLock: (() => void) | null = null;
|
||||
try {
|
||||
|
||||
@@ -50,6 +50,7 @@ export async function GET(request: NextRequest) {
|
||||
WatchRoom: watchRoomConfig,
|
||||
EnableOfflineDownload: process.env.NEXT_PUBLIC_ENABLE_OFFLINE_DOWNLOAD === 'true',
|
||||
EnableRegistration: config.SiteConfig.EnableRegistration || false,
|
||||
RequireRegistrationInviteCode: config.SiteConfig.RequireRegistrationInviteCode || false,
|
||||
RegistrationRequireTurnstile: config.SiteConfig.RegistrationRequireTurnstile || false,
|
||||
LoginRequireTurnstile: config.SiteConfig.LoginRequireTurnstile || false,
|
||||
TurnstileSiteKey: config.SiteConfig.TurnstileSiteKey || '',
|
||||
|
||||
Reference in New Issue
Block a user