Compare commits

..

3 Commits

Author SHA1 Message Date
ZhaoYP 2001
a0d6f2125e feat: support reCAPTCHA v3 captcha provider (#3130) 2024-08-20 17:29:37 +08:00
Yang Luo
85cbb7d074 feat: add replaceAll polyfill to be compatible with Firefox 68 2024-08-17 18:37:21 +08:00
June
fdc1be9452 feat: add provider.Bucket to fileUrl response and TrimPrefix "/" before delete GCS object (#3129)
* feat: add provider.Bucket to fileUrl response

* feat: TrimPrefix "/" before Google Cloud Storage delete object
2024-08-17 11:46:58 +08:00
5 changed files with 51 additions and 13 deletions

View File

@@ -24,7 +24,9 @@ func GetCaptchaProvider(captchaType string) CaptchaProvider {
switch captchaType { switch captchaType {
case "Default": case "Default":
return NewDefaultCaptchaProvider() return NewDefaultCaptchaProvider()
case "reCAPTCHA": case "reCAPTCHA v2":
return NewReCaptchaProvider()
case "reCAPTCHA v3":
return NewReCaptchaProvider() return NewReCaptchaProvider()
case "Aliyun Captcha": case "Aliyun Captcha":
return NewAliyunCaptchaProvider() return NewAliyunCaptchaProvider()

View File

@@ -30,6 +30,13 @@ import (
var isCloudIntranet bool var isCloudIntranet bool
const (
ProviderTypeGoogleCloudStorage = "Google Cloud Storage"
ProviderTypeTencentCloudCOS = "Tencent Cloud COS"
ProviderTypeAzureBlob = "Azure Blob"
ProviderTypeLocalFileSystem = "Local File System"
)
func init() { func init() {
isCloudIntranet = conf.GetConfigBool("isCloudIntranet") isCloudIntranet = conf.GetConfigBool("isCloudIntranet")
} }
@@ -80,14 +87,14 @@ func GetUploadFileUrl(provider *Provider, fullFilePath string, hasTimestamp bool
objectKey := util.UrlJoin(util.GetUrlPath(provider.Domain), escapedPath) objectKey := util.UrlJoin(util.GetUrlPath(provider.Domain), escapedPath)
host := "" host := ""
if provider.Type != "Local File System" { if provider.Type != ProviderTypeLocalFileSystem {
// provider.Domain = "https://cdn.casbin.com/casdoor/" // provider.Domain = "https://cdn.casbin.com/casdoor/"
host = util.GetUrlHost(provider.Domain) host = util.GetUrlHost(provider.Domain)
} else { } else {
// provider.Domain = "http://localhost:8000" or "https://door.casdoor.com" // provider.Domain = "http://localhost:8000" or "https://door.casdoor.com"
host = util.UrlJoin(provider.Domain, "/files") host = util.UrlJoin(provider.Domain, "/files")
} }
if provider.Type == "Azure Blob" { if provider.Type == ProviderTypeAzureBlob || provider.Type == ProviderTypeGoogleCloudStorage {
host = util.UrlJoin(host, provider.Bucket) host = util.UrlJoin(host, provider.Bucket)
} }
@@ -100,7 +107,7 @@ func GetUploadFileUrl(provider *Provider, fullFilePath string, hasTimestamp bool
fileUrl = fmt.Sprintf("%s?t=%s", fileUrl, util.GetCurrentUnixTime()) fileUrl = fmt.Sprintf("%s?t=%s", fileUrl, util.GetCurrentUnixTime())
} }
if provider.Type == "Tencent Cloud COS" { if provider.Type == ProviderTypeTencentCloudCOS {
objectKey = escapePath(objectKey) objectKey = escapePath(objectKey)
} }
@@ -135,11 +142,7 @@ func uploadFile(provider *Provider, fullFilePath string, fileBuffer *bytes.Buffe
} }
fileUrl, objectKey := GetUploadFileUrl(provider, fullFilePath, true) fileUrl, objectKey := GetUploadFileUrl(provider, fullFilePath, true)
objectKeyRefined := refineObjectKey(provider, objectKey)
objectKeyRefined := objectKey
if provider.Type == "Google Cloud Storage" {
objectKeyRefined = strings.TrimPrefix(objectKeyRefined, "/")
}
_, err = storageProvider.Put(objectKeyRefined, fileBuffer) _, err = storageProvider.Put(objectKeyRefined, fileBuffer)
if err != nil { if err != nil {
@@ -184,5 +187,13 @@ func DeleteFile(provider *Provider, objectKey string, lang string) error {
return err return err
} }
return storageProvider.Delete(objectKey) objectKeyRefined := refineObjectKey(provider, objectKey)
return storageProvider.Delete(objectKeyRefined)
}
func refineObjectKey(provider *Provider, objectKey string) string {
if provider.Type == ProviderTypeGoogleCloudStorage {
return strings.TrimPrefix(objectKey, "/")
}
return objectKey
} }

View File

@@ -279,7 +279,11 @@ export const OtherProviderInfo = {
logo: `${StaticBaseUrl}/img/captcha_default.png`, logo: `${StaticBaseUrl}/img/captcha_default.png`,
url: "https://pkg.go.dev/github.com/dchest/captcha", url: "https://pkg.go.dev/github.com/dchest/captcha",
}, },
"reCAPTCHA": { "reCAPTCHA v2": {
logo: `${StaticBaseUrl}/img/social_recaptcha.png`,
url: "https://www.google.com/recaptcha",
},
"reCAPTCHA v3": {
logo: `${StaticBaseUrl}/img/social_recaptcha.png`, logo: `${StaticBaseUrl}/img/social_recaptcha.png`,
url: "https://www.google.com/recaptcha", url: "https://www.google.com/recaptcha",
}, },
@@ -1083,7 +1087,8 @@ export function getProviderTypeOptions(category) {
} else if (category === "Captcha") { } else if (category === "Captcha") {
return ([ return ([
{id: "Default", name: "Default"}, {id: "Default", name: "Default"},
{id: "reCAPTCHA", name: "reCAPTCHA"}, {id: "reCAPTCHA v2", name: "reCAPTCHA v2"},
{id: "reCAPTCHA v3", name: "reCAPTCHA v3"},
{id: "hCaptcha", name: "hCaptcha"}, {id: "hCaptcha", name: "hCaptcha"},
{id: "Aliyun Captcha", name: "Aliyun Captcha"}, {id: "Aliyun Captcha", name: "Aliyun Captcha"},
{id: "GEETEST", name: "GEETEST"}, {id: "GEETEST", name: "GEETEST"},

View File

@@ -27,7 +27,7 @@ export const CaptchaWidget = (props) => {
useEffect(() => { useEffect(() => {
switch (captchaType) { switch (captchaType) {
case "reCAPTCHA": { case "reCAPTCHA v2": {
const reTimer = setInterval(() => { const reTimer = setInterval(() => {
if (!window.grecaptcha) { if (!window.grecaptcha) {
loadScript("https://recaptcha.net/recaptcha/api.js"); loadScript("https://recaptcha.net/recaptcha/api.js");
@@ -42,6 +42,20 @@ export const CaptchaWidget = (props) => {
}, 300); }, 300);
break; break;
} }
case "reCAPTCHA v3": {
const reTimer = setInterval(() => {
if (!window.grecaptcha) {
loadScript(`https://recaptcha.net/recaptcha/api.js?render=${siteKey}`);
}
if (window.grecaptcha && window.grecaptcha.execute) {
window.grecaptcha.execute(siteKey, {action: "submit"}).then(function(token) {
onChange(token);
});
clearInterval(reTimer);
}
}, 300);
break;
}
case "hCaptcha": { case "hCaptcha": {
const hTimer = setInterval(() => { const hTimer = setInterval(() => {
if (!window.hcaptcha) { if (!window.hcaptcha) {

View File

@@ -24,6 +24,12 @@ import * as serviceWorker from "./serviceWorker";
import {BrowserRouter} from "react-router-dom"; import {BrowserRouter} from "react-router-dom";
import "./backend/FetchFilter"; import "./backend/FetchFilter";
if (!String.prototype.replaceAll) {
String.prototype.replaceAll = function(search, replace) {
return this.split(search).join(replace);
};
}
const container = document.getElementById("root"); const container = document.getElementById("root");
const app = createRoot(container); const app = createRoot(container);