config: use SpaceSepList for argument to --password-command

This is to enable arguments with spaces in.
This commit is contained in:
Nick Craig-Wood 2020-01-23 14:14:58 +00:00
parent 62dbdcdbcc
commit 3afb2a4798
5 changed files with 21 additions and 11 deletions

View file

@ -880,12 +880,24 @@ Rclone will do its best to transfer the best file it has so in
practice this should not cause a problem. Think of `--order-by` as practice this should not cause a problem. Think of `--order-by` as
being more of a best efforts flag rather than a perfect ordering. being more of a best efforts flag rather than a perfect ordering.
### --password-command=STRING ### ### --password-command SpaceSepList ###
This flag supplies a program which should supply the config password This flag supplies a program which should supply the config password
when run. This is an alternative to rclone prompting for the password when run. This is an alternative to rclone prompting for the password
or setting the `RCLONE_CONFIG_PASS` variable. or setting the `RCLONE_CONFIG_PASS` variable.
The argument to this should be a command with a space separated list
of arguments. If one of the arguments has a space in then enclose it
in `"`, if you want a literal `"` in an argument then enclose the
argument in `"` and double the `"`. See [CSV encoding](https://godoc.org/encoding/csv)
for more info.
Eg
--password-command echo hello
--password-command echo "hello with space"
--password-command echo "hello with ""quotes"" and space"
See the [Configuration Encryption](#configuration-encryption) for more info. See the [Configuration Encryption](#configuration-encryption) for more info.
### -P, --progress ### ### -P, --progress ###

View file

@ -89,7 +89,7 @@ type ConfigInfo struct {
StreamingUploadCutoff SizeSuffix StreamingUploadCutoff SizeSuffix
StatsFileNameLength int StatsFileNameLength int
AskPassword bool AskPassword bool
PasswordCommand string PasswordCommand SpaceSepList
UseServerModTime bool UseServerModTime bool
MaxTransfer SizeSuffix MaxTransfer SizeSuffix
MaxBacklog int MaxBacklog int

View file

@ -274,13 +274,11 @@ func loadConfigFile() (*goconfig.ConfigFile, error) {
} }
if len(configKey) == 0 { if len(configKey) == 0 {
pwc := fs.Config.PasswordCommand if len(fs.Config.PasswordCommand) != 0 {
if pwc != "" {
var stdout bytes.Buffer var stdout bytes.Buffer
var stderr bytes.Buffer var stderr bytes.Buffer
args := strings.Fields(pwc) cmd := exec.Command(fs.Config.PasswordCommand[0], fs.Config.PasswordCommand[1:]...)
cmd := exec.Command(args[0], args[1:]...)
cmd.Stdout = &stdout cmd.Stdout = &stdout
cmd.Stderr = &stderr cmd.Stderr = &stderr

View file

@ -275,12 +275,12 @@ func TestConfigLoadEncryptedWithValidPassCommand(t *testing.T) {
oldConfig := fs.Config oldConfig := fs.Config
ConfigPath = "./testdata/encrypted.conf" ConfigPath = "./testdata/encrypted.conf"
// using fs.Config.PasswordCommand, correct password // using fs.Config.PasswordCommand, correct password
fs.Config.PasswordCommand = "echo asdf" fs.Config.PasswordCommand = fs.SpaceSepList{"echo", "asdf"}
defer func() { defer func() {
ConfigPath = oldConfigPath ConfigPath = oldConfigPath
configKey = nil // reset password configKey = nil // reset password
fs.Config = oldConfig fs.Config = oldConfig
fs.Config.PasswordCommand = "" fs.Config.PasswordCommand = nil
}() }()
configKey = nil // reset password configKey = nil // reset password
@ -302,12 +302,12 @@ func TestConfigLoadEncryptedWithInvalidPassCommand(t *testing.T) {
oldConfig := fs.Config oldConfig := fs.Config
ConfigPath = "./testdata/encrypted.conf" ConfigPath = "./testdata/encrypted.conf"
// using fs.Config.PasswordCommand, incorrect password // using fs.Config.PasswordCommand, incorrect password
fs.Config.PasswordCommand = "echo asdf-blurfl" fs.Config.PasswordCommand = fs.SpaceSepList{"echo", "asdf-blurfl"}
defer func() { defer func() {
ConfigPath = oldConfigPath ConfigPath = oldConfigPath
configKey = nil // reset password configKey = nil // reset password
fs.Config = oldConfig fs.Config = oldConfig
fs.Config.PasswordCommand = "" fs.Config.PasswordCommand = nil
}() }()
configKey = nil // reset password configKey = nil // reset password

View file

@ -55,7 +55,7 @@ func AddFlags(flagSet *pflag.FlagSet) {
flags.BoolVarP(flagSet, &dumpBodies, "dump-bodies", "", false, "Dump HTTP headers and bodies - may contain sensitive info") flags.BoolVarP(flagSet, &dumpBodies, "dump-bodies", "", false, "Dump HTTP headers and bodies - may contain sensitive info")
flags.BoolVarP(flagSet, &fs.Config.InsecureSkipVerify, "no-check-certificate", "", fs.Config.InsecureSkipVerify, "Do not verify the server SSL certificate. Insecure.") flags.BoolVarP(flagSet, &fs.Config.InsecureSkipVerify, "no-check-certificate", "", fs.Config.InsecureSkipVerify, "Do not verify the server SSL certificate. Insecure.")
flags.BoolVarP(flagSet, &fs.Config.AskPassword, "ask-password", "", fs.Config.AskPassword, "Allow prompt for password for encrypted configuration.") flags.BoolVarP(flagSet, &fs.Config.AskPassword, "ask-password", "", fs.Config.AskPassword, "Allow prompt for password for encrypted configuration.")
flags.StringVarP(flagSet, &fs.Config.PasswordCommand, "password-command", "", fs.Config.PasswordCommand, "Command for supplying password for encrypted configuration.") flags.FVarP(flagSet, &fs.Config.PasswordCommand, "password-command", "", "Command for supplying password for encrypted configuration.")
flags.BoolVarP(flagSet, &deleteBefore, "delete-before", "", false, "When synchronizing, delete files on destination before transferring") flags.BoolVarP(flagSet, &deleteBefore, "delete-before", "", false, "When synchronizing, delete files on destination before transferring")
flags.BoolVarP(flagSet, &deleteDuring, "delete-during", "", false, "When synchronizing, delete files during transfer") flags.BoolVarP(flagSet, &deleteDuring, "delete-during", "", false, "When synchronizing, delete files during transfer")
flags.BoolVarP(flagSet, &deleteAfter, "delete-after", "", false, "When synchronizing, delete files on destination after transferring (default)") flags.BoolVarP(flagSet, &deleteAfter, "delete-after", "", false, "When synchronizing, delete files on destination after transferring (default)")