diff --git a/cmd/rcd/rcd.go b/cmd/rcd/rcd.go index 38094cf8a..668c7f12c 100644 --- a/cmd/rcd/rcd.go +++ b/cmd/rcd/rcd.go @@ -17,6 +17,7 @@ import ( "github.com/rclone/rclone/fs/rc/rcflags" "github.com/rclone/rclone/fs/rc/rcserver" "github.com/rclone/rclone/lib/errors" + "github.com/rclone/rclone/lib/random" "github.com/spf13/cobra" ) @@ -54,6 +55,20 @@ See the [rc documentation](/rc/) for more info on the rc flags. if err := checkRelease(rcflags.Opt.WebGUIUpdate); err != nil { log.Fatalf("Error while fetching the latest release of rclone-webui-react %v", err) } + if rcflags.Opt.NoAuth { + rcflags.Opt.NoAuth = false + fs.Infof(nil, "Cannot run web-gui without authentication, using default auth") + } + if rcflags.Opt.HTTPOptions.BasicUser == "" { + rcflags.Opt.HTTPOptions.BasicUser = "gui" + fs.Infof("Using default username: %s \n", rcflags.Opt.HTTPOptions.BasicUser) + } + if rcflags.Opt.HTTPOptions.BasicPass == "" { + randomPass := random.String(16) + rcflags.Opt.HTTPOptions.BasicPass = randomPass + fs.Infof("No password specified. Using random password: %s \n", randomPass) + } + rcflags.Opt.Serve = true } s, err := rcserver.Start(&rcflags.Opt) diff --git a/fs/rc/rcserver/rcserver.go b/fs/rc/rcserver/rcserver.go index d1e635f73..b74d7b4c5 100644 --- a/fs/rc/rcserver/rcserver.go +++ b/fs/rc/rcserver/rcserver.go @@ -2,6 +2,7 @@ package rcserver import ( + "encoding/base64" "encoding/json" "flag" "fmt" @@ -89,8 +90,17 @@ func (s *Server) Serve() error { } // Add username, password into the URL if they are set user, pass := s.opt.HTTPOptions.BasicUser, s.opt.HTTPOptions.BasicPass - if user != "" || pass != "" { + if user != "" && pass != "" { openURL.User = url.UserPassword(user, pass) + + // Base64 encode username and password to be sent through url + loginToken := user + ":" + pass + parameters := url.Values{} + encodedToken := base64.URLEncoding.EncodeToString([]byte(loginToken)) + fs.Debugf(nil, "login_token %q", encodedToken) + parameters.Add("login_token", encodedToken) + openURL.RawQuery = parameters.Encode() + openURL.RawPath = "/#/login" } // Don't open browser if serving in testing environment. if flag.Lookup("test.v") == nil {