Add Cloudflare Turnstile CAPTCHA support (#9111)
* Add Cloudflare Turnstile CAPTCHA support * Update packages/client/src/components/MkCaptcha.vue Co-authored-by: Acid Chicken (硫酸鶏) <root@acid-chicken.com> Co-authored-by: Acid Chicken (硫酸鶏) <root@acid-chicken.com>
This commit is contained in:
		| @@ -61,6 +61,12 @@ export class SignupApiService { | ||||
| 					ctx.throw(400, e); | ||||
| 				}); | ||||
| 			} | ||||
|  | ||||
| 			if (instance.enableTurnstile && instance.turnstileSecretKey) { | ||||
| 				await this.captchaService.verifyTurnstile(instance.turnstileSecretKey, body['turnstile-response']).catch(e => { | ||||
| 					ctx.throw(400, e); | ||||
| 				}); | ||||
| 			} | ||||
| 		} | ||||
| 	 | ||||
| 		const username = body['username']; | ||||
|   | ||||
| @@ -47,6 +47,14 @@ export const meta = { | ||||
| 				type: 'string', | ||||
| 				optional: false, nullable: true, | ||||
| 			}, | ||||
| 			enableTurnstile: { | ||||
| 				type: 'boolean', | ||||
| 				optional: false, nullable: false, | ||||
| 			}, | ||||
| 			turnstileSiteKey: { | ||||
| 				type: 'string', | ||||
| 				optional: false, nullable: true, | ||||
| 			}, | ||||
| 			swPublickey: { | ||||
| 				type: 'string', | ||||
| 				optional: false, nullable: true, | ||||
| @@ -197,6 +205,10 @@ export const meta = { | ||||
| 				type: 'string', | ||||
| 				optional: true, nullable: true, | ||||
| 			}, | ||||
| 			turnstileSecretKey: { | ||||
| 				type: 'string', | ||||
| 				optional: true, nullable: true, | ||||
| 			} | ||||
| 			sensitiveMediaDetection: { | ||||
| 				type: 'string', | ||||
| 				optional: true, nullable: false, | ||||
| @@ -374,6 +386,8 @@ export default class extends Endpoint<typeof meta, typeof paramDef> { | ||||
| 				hcaptchaSiteKey: instance.hcaptchaSiteKey, | ||||
| 				enableRecaptcha: instance.enableRecaptcha, | ||||
| 				recaptchaSiteKey: instance.recaptchaSiteKey, | ||||
| 				enableTurnstile: instance.enableTurnstile, | ||||
| 				turnstileSiteKey: instance.turnstileSiteKey, | ||||
| 				swPublickey: instance.swPublicKey, | ||||
| 				themeColor: instance.themeColor, | ||||
| 				mascotImageUrl: instance.mascotImageUrl, | ||||
| @@ -400,6 +414,7 @@ export default class extends Endpoint<typeof meta, typeof paramDef> { | ||||
| 				blockedHosts: instance.blockedHosts, | ||||
| 				hcaptchaSecretKey: instance.hcaptchaSecretKey, | ||||
| 				recaptchaSecretKey: instance.recaptchaSecretKey, | ||||
| 				turnstileSecretKey: instance.turnstileSecretKey, | ||||
| 				sensitiveMediaDetection: instance.sensitiveMediaDetection, | ||||
| 				sensitiveMediaDetectionSensitivity: instance.sensitiveMediaDetectionSensitivity, | ||||
| 				setSensitiveFlagAutomatically: instance.setSensitiveFlagAutomatically, | ||||
|   | ||||
| @@ -52,6 +52,9 @@ export const paramDef = { | ||||
| 		enableRecaptcha: { type: 'boolean' }, | ||||
| 		recaptchaSiteKey: { type: 'string', nullable: true }, | ||||
| 		recaptchaSecretKey: { type: 'string', nullable: true }, | ||||
| 		enableTurnstile: { type: 'boolean' }, | ||||
| 		turnstileSiteKey: { type: 'string', nullable: true }, | ||||
| 		turnstileSecretKey: { type: 'string', nullable: true }, | ||||
| 		sensitiveMediaDetection: { type: 'string', enum: ['none', 'all', 'local', 'remote'] }, | ||||
| 		sensitiveMediaDetectionSensitivity: { type: 'string', enum: ['medium', 'low', 'high', 'veryLow', 'veryHigh'] }, | ||||
| 		setSensitiveFlagAutomatically: { type: 'boolean' }, | ||||
| @@ -231,6 +234,18 @@ export default class extends Endpoint<typeof meta, typeof paramDef> { | ||||
| 				set.recaptchaSecretKey = ps.recaptchaSecretKey; | ||||
| 			} | ||||
|  | ||||
| 			if (ps.enableTurnstile !== undefined) { | ||||
| 				set.enableTurnstile = ps.enableTurnstile; | ||||
| 			} | ||||
|  | ||||
| 			if (ps.turnstileSiteKey !== undefined) { | ||||
| 				set.turnstileSiteKey = ps.turnstileSiteKey; | ||||
| 			} | ||||
|  | ||||
| 			if (ps.turnstileSecretKey !== undefined) { | ||||
| 				set.turnstileSecretKey = ps.turnstileSecretKey; | ||||
| 			} | ||||
|  | ||||
| 			if (ps.sensitiveMediaDetection !== undefined) { | ||||
| 				set.sensitiveMediaDetection = ps.sensitiveMediaDetection; | ||||
| 			} | ||||
|   | ||||
| @@ -119,6 +119,14 @@ export const meta = { | ||||
| 				type: 'string', | ||||
| 				optional: false, nullable: true, | ||||
| 			}, | ||||
| 			enableTurnstile: { | ||||
| 				type: 'boolean', | ||||
| 				optional: false, nullable: false, | ||||
| 			}, | ||||
| 			turnstileSiteKey: { | ||||
| 				type: 'string', | ||||
| 				optional: false, nullable: true, | ||||
| 			}, | ||||
| 			swPublickey: { | ||||
| 				type: 'string', | ||||
| 				optional: false, nullable: true, | ||||
| @@ -372,6 +380,8 @@ export default class extends Endpoint<typeof meta, typeof paramDef> { | ||||
| 				hcaptchaSiteKey: instance.hcaptchaSiteKey, | ||||
| 				enableRecaptcha: instance.enableRecaptcha, | ||||
| 				recaptchaSiteKey: instance.recaptchaSiteKey, | ||||
| 				enableTurnstile: instance.enableTurnstile, | ||||
| 				turnstileSiteKey: instance.turnstileSiteKey, | ||||
| 				swPublickey: instance.swPublicKey, | ||||
| 				themeColor: instance.themeColor, | ||||
| 				mascotImageUrl: instance.mascotImageUrl, | ||||
| @@ -423,6 +433,7 @@ export default class extends Endpoint<typeof meta, typeof paramDef> { | ||||
| 					elasticsearch: this.config.elasticsearch ? true : false, | ||||
| 					hcaptcha: instance.enableHcaptcha, | ||||
| 					recaptcha: instance.enableRecaptcha, | ||||
| 					turnstile: instance.enableTurnstile, | ||||
| 					objectStorage: instance.useObjectStorage, | ||||
| 					twitter: instance.enableTwitterIntegration, | ||||
| 					github: instance.enableGithubIntegration, | ||||
|   | ||||
		Reference in New Issue
	
	Block a user
	 CyberRex
					CyberRex