From 6e1c6a4a8cb1fecfeddf10ada67618c90912336d Mon Sep 17 00:00:00 2001 From: Equim Date: Wed, 28 Feb 2018 01:12:54 +0800 Subject: [PATCH] alternative ReCaptcha, close #366 --- caddy/parser/parser.go | 17 +++++++++++++++++ cmd/filebrowser/main.go | 10 ++++++++++ filebrowser.go | 3 ++- http/auth.go | 8 ++++---- http/http.go | 13 +++++++------ 5 files changed, 40 insertions(+), 11 deletions(-) diff --git a/caddy/parser/parser.go b/caddy/parser/parser.go index 4c318e86..476c20d5 100644 --- a/caddy/parser/parser.go +++ b/caddy/parser/parser.go @@ -49,6 +49,7 @@ func Parse(c *caddy.Controller, plugin string) ([]*filebrowser.FileBrowser, erro scope := "." database := "" noAuth := false + alterRecaptcha := false reCaptchaKey := "" reCaptchaSecret := "" @@ -158,6 +159,16 @@ func Parse(c *caddy.Controller, plugin string) ([]*filebrowser.FileBrowser, erro if u.ViewMode != filebrowser.MosaicViewMode && u.ViewMode != filebrowser.ListViewMode { return nil, c.ArgErr() } + case "alternative_recaptcha": + if !c.NextArg() { + alterRecaptcha = true + continue + } + + alterRecaptcha, err = strconv.ParseBool(c.Val()) + if err != nil { + return nil, err + } case "recaptcha_key": if !c.NextArg() { return nil, c.ArgErr() @@ -227,10 +238,16 @@ func Parse(c *caddy.Controller, plugin string) ([]*filebrowser.FileBrowser, erro return nil, err } + recaptchaHost := "https://www.google.com" + if alterRecaptcha { + recaptchaHost = "https://recaptcha.net" + } + m := &filebrowser.FileBrowser{ NoAuth: noAuth, BaseURL: "", PrefixURL: "", + ReCaptchaHost: recaptchaHost, ReCaptchaKey: reCaptchaKey, ReCaptchaSecret: reCaptchaSecret, DefaultUser: u, diff --git a/cmd/filebrowser/main.go b/cmd/filebrowser/main.go index b9317b33..d2c06957 100644 --- a/cmd/filebrowser/main.go +++ b/cmd/filebrowser/main.go @@ -44,6 +44,7 @@ var ( allowNew bool allowPublish bool showVer bool + alterRecaptcha bool ) func init() { @@ -64,6 +65,7 @@ func init() { flag.BoolVar(&allowPublish, "allow-publish", true, "Default allow publish option for new users") flag.BoolVar(&allowNew, "allow-new", true, "Default allow new option for new users") flag.BoolVar(&noAuth, "no-auth", false, "Disables authentication") + flag.BoolVar(&alterRecaptcha, "alternative-recaptcha", false, "Use recaptcha.net for serving and handling, useful in China") flag.StringVar(&locale, "locale", "", "Default locale for new users, set it empty to enable auto detect from browser") flag.StringVar(&staticg, "staticgen", "", "Static Generator you want to enable") flag.BoolVarP(&showVer, "version", "v", false, "Show version") @@ -86,6 +88,7 @@ func setupViper() { viper.SetDefault("BaseURL", "") viper.SetDefault("PrefixURL", "") viper.SetDefault("ViewMode", filebrowser.MosaicViewMode) + viper.SetDefault("AlternativeRecaptcha", false) viper.SetDefault("ReCaptchaKey", "") viper.SetDefault("ReCaptchaSecret", "") @@ -105,6 +108,7 @@ func setupViper() { viper.BindPFlag("BaseURL", flag.Lookup("baseurl")) viper.BindPFlag("PrefixURL", flag.Lookup("prefixurl")) viper.BindPFlag("ViewMode", flag.Lookup("view-mode")) + viper.BindPFlag("AlternativeRecaptcha", flag.Lookup("alternative-recaptcha")) viper.BindPFlag("ReCaptchaKey", flag.Lookup("recaptcha-key")) viper.BindPFlag("ReCaptchaSecret", flag.Lookup("recaptcha-secret")) @@ -186,10 +190,16 @@ func handler() http.Handler { log.Fatal(err) } + recaptchaHost := "https://www.google.com" + if viper.GetBool("AlternativeRecaptcha") { + recaptchaHost = "https://recaptcha.net" + } + fm := &filebrowser.FileBrowser{ NoAuth: viper.GetBool("NoAuth"), BaseURL: viper.GetString("BaseURL"), PrefixURL: viper.GetString("PrefixURL"), + ReCaptchaHost: recaptchaHost, ReCaptchaKey: viper.GetString("ReCaptchaKey"), ReCaptchaSecret: viper.GetString("ReCaptchaSecret"), DefaultUser: &filebrowser.User{ diff --git a/filebrowser.go b/filebrowser.go index 3f9a70a0..2bd4d66f 100644 --- a/filebrowser.go +++ b/filebrowser.go @@ -71,7 +71,8 @@ type FileBrowser struct { // there will only exist one user, called "admin". NoAuth bool - // ReCaptcha Site key and secret. + // ReCaptcha host, key and secret. + ReCaptchaHost string ReCaptchaKey string ReCaptchaSecret string diff --git a/http/auth.go b/http/auth.go index 68ea6faf..a24c9676 100644 --- a/http/auth.go +++ b/http/auth.go @@ -12,7 +12,7 @@ import ( fm "github.com/filebrowser/filebrowser" ) -const reCaptchaAPI = "https://www.google.com/recaptcha/api/siteverify" +const reCaptchaAPI = "/recaptcha/api/siteverify" type cred struct { Password string `json:"password"` @@ -21,14 +21,14 @@ type cred struct { } // reCaptcha checks the reCaptcha code. -func reCaptcha(secret string, response string) (bool, error) { +func reCaptcha(host, secret, response string) (bool, error) { body := url.Values{} body.Set("secret", secret) body.Add("response", response) client := &http.Client{} - resp, err := client.Post(reCaptchaAPI, "application/x-www-form-urlencoded", strings.NewReader(body.Encode())) + resp, err := client.Post(host+reCaptchaAPI, "application/x-www-form-urlencoded", strings.NewReader(body.Encode())) if err != nil { return false, err } @@ -69,7 +69,7 @@ func authHandler(c *fm.Context, w http.ResponseWriter, r *http.Request) (int, er // If ReCaptcha is enabled, check the code. if len(c.ReCaptchaSecret) > 0 { - ok, err := reCaptcha(c.ReCaptchaSecret, cred.ReCaptcha) + ok, err := reCaptcha(c.ReCaptchaHost, c.ReCaptchaSecret, cred.ReCaptcha) if err != nil { return http.StatusForbidden, err } diff --git a/http/http.go b/http/http.go index 1fd4f319..4a1fd4d8 100644 --- a/http/http.go +++ b/http/http.go @@ -223,12 +223,13 @@ func renderFile(c *fm.Context, w http.ResponseWriter, file string) (int, error) w.Header().Set("Content-Type", contentType+"; charset=utf-8") data := map[string]interface{}{ - "BaseURL": c.RootURL(), - "NoAuth": c.NoAuth, - "Version": fm.Version, - "CSS": template.CSS(c.CSS), - "ReCaptcha": c.ReCaptchaKey != "" && c.ReCaptchaSecret != "", - "ReCaptchaKey": c.ReCaptchaKey, + "BaseURL": c.RootURL(), + "NoAuth": c.NoAuth, + "Version": fm.Version, + "CSS": template.CSS(c.CSS), + "ReCaptcha": c.ReCaptchaKey != "" && c.ReCaptchaSecret != "", + "ReCaptchaHost": c.ReCaptchaHost, + "ReCaptchaKey": c.ReCaptchaKey, } if c.StaticGen != nil {