From dc06eb99485631087ba98ab644cc7c9fbc774ca8 Mon Sep 17 00:00:00 2001 From: HGZ-20 <2567430912@qq.com> Date: Mon, 11 Dec 2023 18:01:56 +0800 Subject: [PATCH] feat: fix secret information issue in the CAPTCHA provider code (#2531) --- controllers/account.go | 2 +- controllers/auth.go | 10 ++++++++ controllers/verification.go | 43 ++++++++++++++++++++++++++------ web/src/backend/UserBackend.js | 3 ++- web/src/common/CaptchaPreview.js | 2 +- 5 files changed, 49 insertions(+), 11 deletions(-) diff --git a/controllers/account.go b/controllers/account.go index d335f6de..4a1d535c 100644 --- a/controllers/account.go +++ b/controllers/account.go @@ -479,7 +479,7 @@ func (c *ApiController) GetCaptcha() { Type: captchaProvider.Type, SubType: captchaProvider.SubType, ClientId: captchaProvider.ClientId, - ClientSecret: captchaProvider.ClientSecret, + ClientSecret: "***", ClientId2: captchaProvider.ClientId2, ClientSecret2: captchaProvider.ClientSecret2, }) diff --git a/controllers/auth.go b/controllers/auth.go index 31e932ad..9f18a831 100644 --- a/controllers/auth.go +++ b/controllers/auth.go @@ -387,6 +387,16 @@ func (c *ApiController) Login() { c.ResponseError(err.Error()) return } else if enableCaptcha { + captchaProvider, err := object.GetCaptchaProviderByApplication(util.GetId(application.Owner, application.Name), "false", c.GetAcceptLanguage()) + if err != nil { + c.ResponseError(err.Error()) + return + } + + if captchaProvider.Type != "Default" { + authForm.ClientSecret = captchaProvider.ClientSecret + } + var isHuman bool isHuman, err = captcha.VerifyCaptchaByCaptchaType(authForm.CaptchaType, authForm.CaptchaToken, authForm.ClientSecret) if err != nil { diff --git a/controllers/verification.go b/controllers/verification.go index 91b67c82..8498a887 100644 --- a/controllers/verification.go +++ b/controllers/verification.go @@ -53,17 +53,34 @@ func (c *ApiController) SendVerificationCode() { return } - if vform.CaptchaType != "none" { - if captchaProvider := captcha.GetCaptchaProvider(vform.CaptchaType); captchaProvider == nil { - c.ResponseError(c.T("general:don't support captchaProvider: ") + vform.CaptchaType) - return - } else if isHuman, err := captchaProvider.VerifyCaptcha(vform.CaptchaToken, vform.ClientSecret); err != nil { - c.ResponseError(err.Error()) - return - } else if !isHuman { + provider, err := object.GetCaptchaProviderByApplication(vform.ApplicationId, "false", c.GetAcceptLanguage()) + if err != nil { + c.ResponseError(err.Error()) + return + } + + if provider != nil { + if vform.CaptchaType != provider.Type { c.ResponseError(c.T("verification:Turing test failed.")) return } + + if provider.Type != "Default" { + vform.ClientSecret = provider.ClientSecret + } + + if vform.CaptchaType != "none" { + if captchaProvider := captcha.GetCaptchaProvider(vform.CaptchaType); captchaProvider == nil { + c.ResponseError(c.T("general:don't support captchaProvider: ") + vform.CaptchaType) + return + } else if isHuman, err := captchaProvider.VerifyCaptcha(vform.CaptchaToken, vform.ClientSecret); err != nil { + c.ResponseError(err.Error()) + return + } else if !isHuman { + c.ResponseError(c.T("verification:Turing test failed.")) + return + } + } } application, err := object.GetApplication(vform.ApplicationId) @@ -225,6 +242,16 @@ func (c *ApiController) VerifyCaptcha() { return } + captchaProvider, err := object.GetCaptchaProviderByOwnerName(vform.ApplicationId, c.GetAcceptLanguage()) + if err != nil { + c.ResponseError(err.Error()) + return + } + + if captchaProvider.Type != "Default" { + vform.ClientSecret = captchaProvider.ClientSecret + } + provider := captcha.GetCaptchaProvider(vform.CaptchaType) if provider == nil { c.ResponseError(c.T("verification:Invalid captcha provider.")) diff --git a/web/src/backend/UserBackend.js b/web/src/backend/UserBackend.js index 925b5210..9af8ed15 100644 --- a/web/src/backend/UserBackend.js +++ b/web/src/backend/UserBackend.js @@ -153,11 +153,12 @@ export function sendCode(captchaType, captchaToken, clientSecret, method, countr }); } -export function verifyCaptcha(captchaType, captchaToken, clientSecret) { +export function verifyCaptcha(owner, name, captchaType, captchaToken, clientSecret) { const formData = new FormData(); formData.append("captchaType", captchaType); formData.append("captchaToken", captchaToken); formData.append("clientSecret", clientSecret); + formData.append("applicationId", `${owner}/${name}`); return fetch(`${Setting.ServerUrl}/api/verify-captcha`, { method: "POST", credentials: "include", diff --git a/web/src/common/CaptchaPreview.js b/web/src/common/CaptchaPreview.js index 6d209248..1eba2351 100644 --- a/web/src/common/CaptchaPreview.js +++ b/web/src/common/CaptchaPreview.js @@ -50,7 +50,7 @@ export const CaptchaPreview = (props) => { }; const onOk = (captchaType, captchaToken, clientSecret) => { - UserBackend.verifyCaptcha(captchaType, captchaToken, clientSecret).then(() => { + UserBackend.verifyCaptcha(owner, name, captchaType, captchaToken, clientSecret).then(() => { setVisible(false); }); };