diff --git a/cmd/serve/ftp/ftp.go b/cmd/serve/ftp/ftp.go index a4403fcce..6e2122a2a 100644 --- a/cmd/serve/ftp/ftp.go +++ b/cmd/serve/ftp/ftp.go @@ -123,7 +123,7 @@ You can set a single username and password with the --user and --pass flags. }, Run: func(command *cobra.Command, args []string) { var f fs.Fs - if proxyflags.Opt.AuthProxy == "" { + if proxy.Opt.AuthProxy == "" { cmd.CheckArgs(1, 1, command, args) f = cmd.NewFsSrc(args) } else { @@ -174,8 +174,8 @@ func newServer(ctx context.Context, f fs.Fs, opt *Options) (*driver, error) { ctx: ctx, opt: *opt, } - if proxyflags.Opt.AuthProxy != "" { - d.proxy = proxy.New(ctx, &proxyflags.Opt, &vfscommon.Opt) + if proxy.Opt.AuthProxy != "" { + d.proxy = proxy.New(ctx, &proxy.Opt, &vfscommon.Opt) d.userPass = make(map[string]string, 16) } else { d.globalVFS = vfs.New(f, &vfscommon.Opt) diff --git a/cmd/serve/http/http.go b/cmd/serve/http/http.go index 1b829e3c9..4d8fbda83 100644 --- a/cmd/serve/http/http.go +++ b/cmd/serve/http/http.go @@ -83,7 +83,7 @@ control the stats printing. }, Run: func(command *cobra.Command, args []string) { var f fs.Fs - if proxyflags.Opt.AuthProxy == "" { + if proxy.Opt.AuthProxy == "" { cmd.CheckArgs(1, 1, command, args) f = cmd.NewFsSrc(args) } else { @@ -145,8 +145,8 @@ func run(ctx context.Context, f fs.Fs, opt Options) (s *HTTP, err error) { opt: opt, } - if proxyflags.Opt.AuthProxy != "" { - s.proxy = proxy.New(ctx, &proxyflags.Opt, &vfscommon.Opt) + if proxy.Opt.AuthProxy != "" { + s.proxy = proxy.New(ctx, &proxy.Opt, &vfscommon.Opt) // override auth s.opt.Auth.CustomAuthFn = s.auth } else { diff --git a/cmd/serve/http/http_test.go b/cmd/serve/http/http_test.go index a336ec429..06266334d 100644 --- a/cmd/serve/http/http_test.go +++ b/cmd/serve/http/http_test.go @@ -12,7 +12,7 @@ import ( "time" _ "github.com/rclone/rclone/backend/local" - "github.com/rclone/rclone/cmd/serve/proxy/proxyflags" + "github.com/rclone/rclone/cmd/serve/proxy" "github.com/rclone/rclone/fs" "github.com/rclone/rclone/fs/filter" libhttp "github.com/rclone/rclone/lib/http" @@ -39,7 +39,7 @@ func start(ctx context.Context, t *testing.T, f fs.Fs) (s *HTTP, testURL string) }, } opts.HTTP.ListenAddr = []string{testBindAddress} - if proxyflags.Opt.AuthProxy == "" { + if proxy.Opt.AuthProxy == "" { opts.Auth.BasicUser = testUser opts.Auth.BasicPass = testPass } @@ -110,9 +110,9 @@ func testGET(t *testing.T, useProxy bool) { cmd := "go run " + prog + " " + files // FIXME this is untidy setting a global variable! - proxyflags.Opt.AuthProxy = cmd + proxy.Opt.AuthProxy = cmd defer func() { - proxyflags.Opt.AuthProxy = "" + proxy.Opt.AuthProxy = "" }() f = nil diff --git a/cmd/serve/proxy/proxy.go b/cmd/serve/proxy/proxy.go index ca1d040a5..bdac912a0 100644 --- a/cmd/serve/proxy/proxy.go +++ b/cmd/serve/proxy/proxy.go @@ -106,14 +106,23 @@ backend that rclone supports. `, "|", "`") +// OptionsInfo descripts the Options in use +var OptionsInfo = fs.Options{{ + Name: "auth_proxy", + Default: "", + Help: "A program to use to create the backend from the auth", +}} + // Options is options for creating the proxy type Options struct { - AuthProxy string + AuthProxy string `config:"auth_proxy"` } -// DefaultOpt is the default values uses for Opt -var DefaultOpt = Options{ - AuthProxy: "", +// Opt is the default options +var Opt Options + +func init() { + fs.RegisterGlobalOptions(fs.OptionsInfo{Name: "proxy", Opt: &Opt, Options: OptionsInfo}) } // Proxy represents a proxy to turn auth requests into a VFS diff --git a/cmd/serve/proxy/proxy_test.go b/cmd/serve/proxy/proxy_test.go index 1495c2dff..574a7aa15 100644 --- a/cmd/serve/proxy/proxy_test.go +++ b/cmd/serve/proxy/proxy_test.go @@ -20,7 +20,7 @@ import ( ) func TestRun(t *testing.T) { - opt := DefaultOpt + opt := Opt cmd := "go run proxy_code.go" opt.AuthProxy = cmd p := New(context.Background(), &opt, &vfscommon.Opt) diff --git a/cmd/serve/proxy/proxyflags/proxyflags.go b/cmd/serve/proxy/proxyflags/proxyflags.go index 33fa5512d..1e1334d2b 100644 --- a/cmd/serve/proxy/proxyflags/proxyflags.go +++ b/cmd/serve/proxy/proxyflags/proxyflags.go @@ -7,12 +7,7 @@ import ( "github.com/spf13/pflag" ) -// Options set by command line flags -var ( - Opt = proxy.DefaultOpt -) - // AddFlags adds the non filing system specific flags to the command func AddFlags(flagSet *pflag.FlagSet) { - flags.StringVarP(flagSet, &Opt.AuthProxy, "auth-proxy", "", Opt.AuthProxy, "A program to use to create the backend from the auth", "") + flags.AddFlagsFromOptions(flagSet, "", proxy.OptionsInfo) } diff --git a/cmd/serve/s3/s3.go b/cmd/serve/s3/s3.go index 6eb3ad582..504da1a52 100644 --- a/cmd/serve/s3/s3.go +++ b/cmd/serve/s3/s3.go @@ -7,6 +7,7 @@ import ( "github.com/rclone/rclone/cmd" "github.com/rclone/rclone/cmd/serve" + "github.com/rclone/rclone/cmd/serve/proxy" "github.com/rclone/rclone/cmd/serve/proxy/proxyflags" "github.com/rclone/rclone/fs" "github.com/rclone/rclone/fs/config/flags" @@ -65,7 +66,7 @@ var Command = &cobra.Command{ Long: help() + httplib.AuthHelp(flagPrefix) + httplib.Help(flagPrefix) + vfs.Help(), RunE: func(command *cobra.Command, args []string) error { var f fs.Fs - if proxyflags.Opt.AuthProxy == "" { + if proxy.Opt.AuthProxy == "" { cmd.CheckArgs(1, 1, command, args) f = cmd.NewFsSrc(args) } else { diff --git a/cmd/serve/s3/s3_test.go b/cmd/serve/s3/s3_test.go index aaece7e5b..106154693 100644 --- a/cmd/serve/s3/s3_test.go +++ b/cmd/serve/s3/s3_test.go @@ -18,7 +18,7 @@ import ( "github.com/minio/minio-go/v7" "github.com/minio/minio-go/v7/pkg/credentials" _ "github.com/rclone/rclone/backend/local" - "github.com/rclone/rclone/cmd/serve/proxy/proxyflags" + "github.com/rclone/rclone/cmd/serve/proxy" "github.com/rclone/rclone/cmd/serve/servetest" "github.com/rclone/rclone/fs" "github.com/rclone/rclone/fs/config/configmap" @@ -173,9 +173,9 @@ func testListBuckets(t *testing.T, cases []TestCase, useProxy bool) { cmd := "go run " + prog + " " + files // FIXME: this is untidy setting a global variable! - proxyflags.Opt.AuthProxy = cmd + proxy.Opt.AuthProxy = cmd defer func() { - proxyflags.Opt.AuthProxy = "" + proxy.Opt.AuthProxy = "" }() f = nil diff --git a/cmd/serve/s3/server.go b/cmd/serve/s3/server.go index fad51c91f..6627a1195 100644 --- a/cmd/serve/s3/server.go +++ b/cmd/serve/s3/server.go @@ -15,7 +15,6 @@ import ( "github.com/rclone/gofakes3" "github.com/rclone/gofakes3/signature" "github.com/rclone/rclone/cmd/serve/proxy" - "github.com/rclone/rclone/cmd/serve/proxy/proxyflags" "github.com/rclone/rclone/fs" "github.com/rclone/rclone/fs/hash" httplib "github.com/rclone/rclone/lib/http" @@ -80,8 +79,8 @@ func newServer(ctx context.Context, f fs.Fs, opt *Options) (s *Server, err error w.handler = http.NewServeMux() w.handler = w.faker.Server() - if proxyflags.Opt.AuthProxy != "" { - w.proxy = proxy.New(ctx, &proxyflags.Opt, &vfscommon.Opt) + if proxy.Opt.AuthProxy != "" { + w.proxy = proxy.New(ctx, &proxy.Opt, &vfscommon.Opt) // proxy auth middleware w.handler = proxyAuthMiddleware(w.handler, w) w.handler = authPairMiddleware(w.handler, w) diff --git a/cmd/serve/servetest/servetest.go b/cmd/serve/servetest/servetest.go index b11a01627..2b217b3b2 100644 --- a/cmd/serve/servetest/servetest.go +++ b/cmd/serve/servetest/servetest.go @@ -13,7 +13,7 @@ import ( "strings" "testing" - "github.com/rclone/rclone/cmd/serve/proxy/proxyflags" + "github.com/rclone/rclone/cmd/serve/proxy" "github.com/rclone/rclone/fs" "github.com/rclone/rclone/fs/config/configmap" "github.com/rclone/rclone/fstest" @@ -50,9 +50,9 @@ func run(t *testing.T, name string, start StartFn, useProxy bool) { cmd := "go run " + prog + " " + fremote.Root() // FIXME this is untidy setting a global variable! - proxyflags.Opt.AuthProxy = cmd + proxy.Opt.AuthProxy = cmd defer func() { - proxyflags.Opt.AuthProxy = "" + proxy.Opt.AuthProxy = "" }() } config, cleanup := start(f) diff --git a/cmd/serve/sftp/server.go b/cmd/serve/sftp/server.go index e26f0fb0c..5ee8d0c68 100644 --- a/cmd/serve/sftp/server.go +++ b/cmd/serve/sftp/server.go @@ -22,7 +22,6 @@ import ( "strings" "github.com/rclone/rclone/cmd/serve/proxy" - "github.com/rclone/rclone/cmd/serve/proxy/proxyflags" "github.com/rclone/rclone/fs" "github.com/rclone/rclone/fs/config" "github.com/rclone/rclone/lib/env" @@ -52,8 +51,8 @@ func newServer(ctx context.Context, f fs.Fs, opt *Options) *server { opt: *opt, waitChan: make(chan struct{}), } - if proxyflags.Opt.AuthProxy != "" { - s.proxy = proxy.New(ctx, &proxyflags.Opt, &vfscommon.Opt) + if proxy.Opt.AuthProxy != "" { + s.proxy = proxy.New(ctx, &proxy.Opt, &vfscommon.Opt) } else { s.vfs = vfs.New(f, &vfscommon.Opt) } @@ -134,12 +133,12 @@ func (s *server) serve() (err error) { var authorizedKeysMap map[string]struct{} // ensure the user isn't trying to use conflicting flags - if proxyflags.Opt.AuthProxy != "" && s.opt.AuthorizedKeys != "" && s.opt.AuthorizedKeys != Opt.AuthorizedKeys { + if proxy.Opt.AuthProxy != "" && s.opt.AuthorizedKeys != "" && s.opt.AuthorizedKeys != Opt.AuthorizedKeys { return errors.New("--auth-proxy and --authorized-keys cannot be used at the same time") } // Load the authorized keys - if s.opt.AuthorizedKeys != "" && proxyflags.Opt.AuthProxy == "" { + if s.opt.AuthorizedKeys != "" && proxy.Opt.AuthProxy == "" { authKeysFile := env.ShellExpand(s.opt.AuthorizedKeys) authorizedKeysMap, err = loadAuthorizedKeys(authKeysFile) // If user set the flag away from the default then report an error diff --git a/cmd/serve/sftp/sftp.go b/cmd/serve/sftp/sftp.go index e73c68c6b..c39f31dd8 100644 --- a/cmd/serve/sftp/sftp.go +++ b/cmd/serve/sftp/sftp.go @@ -154,7 +154,7 @@ provided by OpenSSH in this case. }, Run: func(command *cobra.Command, args []string) { var f fs.Fs - if proxyflags.Opt.AuthProxy == "" { + if proxy.Opt.AuthProxy == "" { cmd.CheckArgs(1, 1, command, args) f = cmd.NewFsSrc(args) } else { diff --git a/cmd/serve/webdav/webdav.go b/cmd/serve/webdav/webdav.go index 2dc3e03a8..1e3b9f5e2 100644 --- a/cmd/serve/webdav/webdav.go +++ b/cmd/serve/webdav/webdav.go @@ -137,7 +137,7 @@ done by the permissions on the socket. }, RunE: func(command *cobra.Command, args []string) error { var f fs.Fs - if proxyflags.Opt.AuthProxy == "" { + if proxy.Opt.AuthProxy == "" { cmd.CheckArgs(1, 1, command, args) f = cmd.NewFsSrc(args) } else { @@ -204,8 +204,8 @@ func newWebDAV(ctx context.Context, f fs.Fs, opt *Options) (w *WebDAV, err error ctx: ctx, opt: *opt, } - if proxyflags.Opt.AuthProxy != "" { - w.proxy = proxy.New(ctx, &proxyflags.Opt, &vfscommon.Opt) + if proxy.Opt.AuthProxy != "" { + w.proxy = proxy.New(ctx, &proxy.Opt, &vfscommon.Opt) // override auth w.opt.Auth.CustomAuthFn = w.auth } else {