filesystem.go 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128
  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. // SetNilSecretsIfEmpty set the secrets to nil if empty.
  46. // This is useful before rendering as JSON so the empty fields
  47. // will not be serialized.
  48. func (f *Filesystem) SetNilSecretsIfEmpty() {
  49. if f.S3Config.AccessSecret != nil && f.S3Config.AccessSecret.IsEmpty() {
  50. f.S3Config.AccessSecret = nil
  51. }
  52. if f.GCSConfig.Credentials != nil && f.GCSConfig.Credentials.IsEmpty() {
  53. f.GCSConfig.Credentials = nil
  54. }
  55. if f.AzBlobConfig.AccountKey != nil && f.AzBlobConfig.AccountKey.IsEmpty() {
  56. f.AzBlobConfig.AccountKey = nil
  57. }
  58. if f.CryptConfig.Passphrase != nil && f.CryptConfig.Passphrase.IsEmpty() {
  59. f.CryptConfig.Passphrase = nil
  60. }
  61. if f.SFTPConfig.Password != nil && f.SFTPConfig.Password.IsEmpty() {
  62. f.SFTPConfig.Password = nil
  63. }
  64. if f.SFTPConfig.PrivateKey != nil && f.SFTPConfig.PrivateKey.IsEmpty() {
  65. f.SFTPConfig.PrivateKey = nil
  66. }
  67. }
  68. // GetACopy returns a copy
  69. func (f *Filesystem) GetACopy() Filesystem {
  70. f.SetEmptySecretsIfNil()
  71. fs := Filesystem{
  72. Provider: f.Provider,
  73. S3Config: S3FsConfig{
  74. Bucket: f.S3Config.Bucket,
  75. Region: f.S3Config.Region,
  76. AccessKey: f.S3Config.AccessKey,
  77. AccessSecret: f.S3Config.AccessSecret.Clone(),
  78. Endpoint: f.S3Config.Endpoint,
  79. StorageClass: f.S3Config.StorageClass,
  80. KeyPrefix: f.S3Config.KeyPrefix,
  81. UploadPartSize: f.S3Config.UploadPartSize,
  82. UploadConcurrency: f.S3Config.UploadConcurrency,
  83. },
  84. GCSConfig: GCSFsConfig{
  85. Bucket: f.GCSConfig.Bucket,
  86. CredentialFile: f.GCSConfig.CredentialFile,
  87. Credentials: f.GCSConfig.Credentials.Clone(),
  88. AutomaticCredentials: f.GCSConfig.AutomaticCredentials,
  89. StorageClass: f.GCSConfig.StorageClass,
  90. KeyPrefix: f.GCSConfig.KeyPrefix,
  91. },
  92. AzBlobConfig: AzBlobFsConfig{
  93. Container: f.AzBlobConfig.Container,
  94. AccountName: f.AzBlobConfig.AccountName,
  95. AccountKey: f.AzBlobConfig.AccountKey.Clone(),
  96. Endpoint: f.AzBlobConfig.Endpoint,
  97. SASURL: f.AzBlobConfig.SASURL,
  98. KeyPrefix: f.AzBlobConfig.KeyPrefix,
  99. UploadPartSize: f.AzBlobConfig.UploadPartSize,
  100. UploadConcurrency: f.AzBlobConfig.UploadConcurrency,
  101. UseEmulator: f.AzBlobConfig.UseEmulator,
  102. AccessTier: f.AzBlobConfig.AccessTier,
  103. },
  104. CryptConfig: CryptFsConfig{
  105. Passphrase: f.CryptConfig.Passphrase.Clone(),
  106. },
  107. SFTPConfig: SFTPFsConfig{
  108. Endpoint: f.SFTPConfig.Endpoint,
  109. Username: f.SFTPConfig.Username,
  110. Password: f.SFTPConfig.Password.Clone(),
  111. PrivateKey: f.SFTPConfig.PrivateKey.Clone(),
  112. Prefix: f.SFTPConfig.Prefix,
  113. DisableCouncurrentReads: f.SFTPConfig.DisableCouncurrentReads,
  114. },
  115. }
  116. if len(f.SFTPConfig.Fingerprints) > 0 {
  117. fs.SFTPConfig.Fingerprints = make([]string, len(f.SFTPConfig.Fingerprints))
  118. copy(fs.SFTPConfig.Fingerprints, f.SFTPConfig.Fingerprints)
  119. }
  120. return fs
  121. }