Compare commits

...

4 Commits

Author SHA1 Message Date
copilot-swe-agent[bot]
55944e9e8d Refactor captcha validation per review feedback
- Extract validation into checkMultipleCaptchaProviders function
- Use providerItem.Provider instead of DB lookup
- Add i18n wrapper for error message
- Include provider names in error message

Co-authored-by: hsluoyz <3787410+hsluoyz@users.noreply.github.com>
2026-02-07 18:13:47 +00:00
copilot-swe-agent[bot]
bc6d1c4b66 Optimize captcha provider validation logic
Co-authored-by: hsluoyz <3787410+hsluoyz@users.noreply.github.com>
2026-02-07 18:07:02 +00:00
copilot-swe-agent[bot]
f99485b493 Remove frontend captcha provider limitation and add backend validation
Co-authored-by: hsluoyz <3787410+hsluoyz@users.noreply.github.com>
2026-02-07 18:02:52 +00:00
copilot-swe-agent[bot]
27b7785e47 Initial plan 2026-02-07 18:00:13 +00:00
2 changed files with 21 additions and 4 deletions

View File

@@ -669,6 +669,21 @@ func GetAllowedApplications(applications []*Application, userId string, lang str
return res, nil
}
func checkMultipleCaptchaProviders(application *Application, lang string) error {
var captchaProviders []string
for _, providerItem := range application.Providers {
if providerItem.Provider != nil && providerItem.Provider.Category == "Captcha" {
captchaProviders = append(captchaProviders, providerItem.Name)
}
}
if len(captchaProviders) > 1 {
return fmt.Errorf(i18n.Translate(lang, "general:Multiple captcha providers are not allowed in the same application: %s"), strings.Join(captchaProviders, ", "))
}
return nil
}
func UpdateApplication(id string, application *Application, isGlobalAdmin bool, lang string) (bool, error) {
owner, name, err := util.GetOwnerAndNameFromIdWithError(id)
if err != nil {
@@ -707,6 +722,11 @@ func UpdateApplication(id string, application *Application, isGlobalAdmin bool,
return false, fmt.Errorf("only applications belonging to built-in organization can be shared")
}
err = checkMultipleCaptchaProviders(application, lang)
if err != nil {
return false, err
}
for _, providerItem := range application.Providers {
providerItem.Provider = nil
}

View File

@@ -90,10 +90,7 @@ class ProviderTable extends React.Component {
}
}} >
{
Setting.getDeduplicatedArray(this.props.providers, table, "name").filter(provider => provider.category !== "Captcha" || !table.some(tableItem => {
const existingProvider = Setting.getArrayItem(this.props.providers, "name", tableItem.name);
return existingProvider && existingProvider.category === "Captcha";
})).map((provider, index) => (
Setting.getDeduplicatedArray(this.props.providers, table, "name").map((provider, index) => (
<Option key={index} value={provider.name} label={`${provider.name} ${provider.displayName || ""}`}>
<div style={{display: "flex", alignItems: "center", gap: "8px"}}>
<img width={20} height={20} src={Setting.getProviderLogoURL(provider)} alt={provider.type} />