github.com/rclone/rclone@v1.66.1-0.20240517100346-7b89735ae726/fs/config/crypt_test.go (about) 1 // These are in an external package because we need to import configfile 2 // 3 // Internal tests are in crypt_internal_test.go 4 5 package config_test 6 7 import ( 8 "context" 9 "testing" 10 11 "github.com/rclone/rclone/fs" 12 "github.com/rclone/rclone/fs/config" 13 "github.com/stretchr/testify/assert" 14 "github.com/stretchr/testify/require" 15 ) 16 17 func TestConfigLoadEncrypted(t *testing.T) { 18 var err error 19 oldConfigPath := config.GetConfigPath() 20 assert.NoError(t, config.SetConfigPath("./testdata/encrypted.conf")) 21 defer func() { 22 assert.NoError(t, config.SetConfigPath(oldConfigPath)) 23 config.ClearConfigPassword() 24 }() 25 26 // Set correct password 27 err = config.SetConfigPassword("asdf") 28 require.NoError(t, err) 29 err = config.Data().Load() 30 require.NoError(t, err) 31 sections := config.Data().GetSectionList() 32 var expect = []string{"nounc", "unc"} 33 assert.Equal(t, expect, sections) 34 35 keys := config.Data().GetKeyList("nounc") 36 expect = []string{"type", "nounc"} 37 assert.Equal(t, expect, keys) 38 } 39 40 func TestConfigLoadEncryptedWithValidPassCommand(t *testing.T) { 41 ctx := context.Background() 42 ci := fs.GetConfig(ctx) 43 oldConfigPath := config.GetConfigPath() 44 oldConfig := *ci 45 assert.NoError(t, config.SetConfigPath("./testdata/encrypted.conf")) 46 // using ci.PasswordCommand, correct password 47 ci.PasswordCommand = fs.SpaceSepList{"echo", "asdf"} 48 defer func() { 49 assert.NoError(t, config.SetConfigPath(oldConfigPath)) 50 config.ClearConfigPassword() 51 *ci = oldConfig 52 ci.PasswordCommand = nil 53 }() 54 55 config.ClearConfigPassword() 56 57 err := config.Data().Load() 58 require.NoError(t, err) 59 60 sections := config.Data().GetSectionList() 61 var expect = []string{"nounc", "unc"} 62 assert.Equal(t, expect, sections) 63 64 keys := config.Data().GetKeyList("nounc") 65 expect = []string{"type", "nounc"} 66 assert.Equal(t, expect, keys) 67 } 68 69 func TestConfigLoadEncryptedWithInvalidPassCommand(t *testing.T) { 70 ctx := context.Background() 71 ci := fs.GetConfig(ctx) 72 oldConfigPath := config.GetConfigPath() 73 oldConfig := *ci 74 assert.NoError(t, config.SetConfigPath("./testdata/encrypted.conf")) 75 // using ci.PasswordCommand, incorrect password 76 ci.PasswordCommand = fs.SpaceSepList{"echo", "asdf-blurfl"} 77 defer func() { 78 assert.NoError(t, config.SetConfigPath(oldConfigPath)) 79 config.ClearConfigPassword() 80 *ci = oldConfig 81 ci.PasswordCommand = nil 82 }() 83 84 config.ClearConfigPassword() 85 86 err := config.Data().Load() 87 require.Error(t, err) 88 assert.Contains(t, err.Error(), "using --password-command derived password") 89 } 90 91 func TestConfigLoadEncryptedFailures(t *testing.T) { 92 var err error 93 94 // This file should be too short to be decoded. 95 oldConfigPath := config.GetConfigPath() 96 assert.NoError(t, config.SetConfigPath("./testdata/enc-short.conf")) 97 defer func() { assert.NoError(t, config.SetConfigPath(oldConfigPath)) }() 98 err = config.Data().Load() 99 require.Error(t, err) 100 101 // This file contains invalid base64 characters. 102 assert.NoError(t, config.SetConfigPath("./testdata/enc-invalid.conf")) 103 err = config.Data().Load() 104 require.Error(t, err) 105 106 // This file contains invalid base64 characters. 107 assert.NoError(t, config.SetConfigPath("./testdata/enc-too-new.conf")) 108 err = config.Data().Load() 109 require.Error(t, err) 110 111 // This file does not exist. 112 assert.NoError(t, config.SetConfigPath("./testdata/filenotfound.conf")) 113 err = config.Data().Load() 114 assert.Equal(t, config.ErrorConfigFileNotFound, err) 115 }