filesystem.go 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104
  1. package vfs
  2. import "github.com/drakkan/sftpgo/kms"
  3. // FilesystemProvider defines the supported storage filesystems
  4. type FilesystemProvider int
  5. // supported values for FilesystemProvider
  6. const (
  7. LocalFilesystemProvider FilesystemProvider = iota // Local
  8. S3FilesystemProvider // AWS S3 compatible
  9. GCSFilesystemProvider // Google Cloud Storage
  10. AzureBlobFilesystemProvider // Azure Blob Storage
  11. CryptedFilesystemProvider // Local encrypted
  12. SFTPFilesystemProvider // SFTP
  13. )
  14. // Filesystem defines cloud storage filesystem details
  15. type Filesystem struct {
  16. RedactedSecret string `json:"-"`
  17. Provider FilesystemProvider `json:"provider"`
  18. S3Config S3FsConfig `json:"s3config,omitempty"`
  19. GCSConfig GCSFsConfig `json:"gcsconfig,omitempty"`
  20. AzBlobConfig AzBlobFsConfig `json:"azblobconfig,omitempty"`
  21. CryptConfig CryptFsConfig `json:"cryptconfig,omitempty"`
  22. SFTPConfig SFTPFsConfig `json:"sftpconfig,omitempty"`
  23. }
  24. // SetEmptySecretsIfNil sets the secrets to empty if nil
  25. func (f *Filesystem) SetEmptySecretsIfNil() {
  26. if f.S3Config.AccessSecret == nil {
  27. f.S3Config.AccessSecret = kms.NewEmptySecret()
  28. }
  29. if f.GCSConfig.Credentials == nil {
  30. f.GCSConfig.Credentials = kms.NewEmptySecret()
  31. }
  32. if f.AzBlobConfig.AccountKey == nil {
  33. f.AzBlobConfig.AccountKey = kms.NewEmptySecret()
  34. }
  35. if f.CryptConfig.Passphrase == nil {
  36. f.CryptConfig.Passphrase = kms.NewEmptySecret()
  37. }
  38. if f.SFTPConfig.Password == nil {
  39. f.SFTPConfig.Password = kms.NewEmptySecret()
  40. }
  41. if f.SFTPConfig.PrivateKey == nil {
  42. f.SFTPConfig.PrivateKey = kms.NewEmptySecret()
  43. }
  44. }
  45. // GetACopy returns a copy
  46. func (f *Filesystem) GetACopy() Filesystem {
  47. f.SetEmptySecretsIfNil()
  48. fs := Filesystem{
  49. Provider: f.Provider,
  50. S3Config: S3FsConfig{
  51. Bucket: f.S3Config.Bucket,
  52. Region: f.S3Config.Region,
  53. AccessKey: f.S3Config.AccessKey,
  54. AccessSecret: f.S3Config.AccessSecret.Clone(),
  55. Endpoint: f.S3Config.Endpoint,
  56. StorageClass: f.S3Config.StorageClass,
  57. KeyPrefix: f.S3Config.KeyPrefix,
  58. UploadPartSize: f.S3Config.UploadPartSize,
  59. UploadConcurrency: f.S3Config.UploadConcurrency,
  60. },
  61. GCSConfig: GCSFsConfig{
  62. Bucket: f.GCSConfig.Bucket,
  63. CredentialFile: f.GCSConfig.CredentialFile,
  64. Credentials: f.GCSConfig.Credentials.Clone(),
  65. AutomaticCredentials: f.GCSConfig.AutomaticCredentials,
  66. StorageClass: f.GCSConfig.StorageClass,
  67. KeyPrefix: f.GCSConfig.KeyPrefix,
  68. },
  69. AzBlobConfig: AzBlobFsConfig{
  70. Container: f.AzBlobConfig.Container,
  71. AccountName: f.AzBlobConfig.AccountName,
  72. AccountKey: f.AzBlobConfig.AccountKey.Clone(),
  73. Endpoint: f.AzBlobConfig.Endpoint,
  74. SASURL: f.AzBlobConfig.SASURL,
  75. KeyPrefix: f.AzBlobConfig.KeyPrefix,
  76. UploadPartSize: f.AzBlobConfig.UploadPartSize,
  77. UploadConcurrency: f.AzBlobConfig.UploadConcurrency,
  78. UseEmulator: f.AzBlobConfig.UseEmulator,
  79. AccessTier: f.AzBlobConfig.AccessTier,
  80. },
  81. CryptConfig: CryptFsConfig{
  82. Passphrase: f.CryptConfig.Passphrase.Clone(),
  83. },
  84. SFTPConfig: SFTPFsConfig{
  85. Endpoint: f.SFTPConfig.Endpoint,
  86. Username: f.SFTPConfig.Username,
  87. Password: f.SFTPConfig.Password.Clone(),
  88. PrivateKey: f.SFTPConfig.PrivateKey.Clone(),
  89. Prefix: f.SFTPConfig.Prefix,
  90. DisableCouncurrentReads: f.SFTPConfig.DisableCouncurrentReads,
  91. },
  92. }
  93. if len(f.SFTPConfig.Fingerprints) > 0 {
  94. fs.SFTPConfig.Fingerprints = make([]string, len(f.SFTPConfig.Fingerprints))
  95. copy(fs.SFTPConfig.Fingerprints, f.SFTPConfig.Fingerprints)
  96. }
  97. return fs
  98. }