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  }