filesystem.go 5.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150
  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. // IsEqual returns true if the fs is equal to other
  69. func (f *Filesystem) IsEqual(other *Filesystem) bool {
  70. if f.Provider != other.Provider {
  71. return false
  72. }
  73. switch f.Provider {
  74. case S3FilesystemProvider:
  75. return f.S3Config.isEqual(&other.S3Config)
  76. case GCSFilesystemProvider:
  77. return f.GCSConfig.isEqual(&other.GCSConfig)
  78. case AzureBlobFilesystemProvider:
  79. return f.AzBlobConfig.isEqual(&other.AzBlobConfig)
  80. case CryptedFilesystemProvider:
  81. return f.CryptConfig.isEqual(&other.CryptConfig)
  82. case SFTPFilesystemProvider:
  83. return f.SFTPConfig.isEqual(&other.SFTPConfig)
  84. default:
  85. return true
  86. }
  87. }
  88. // GetACopy returns a copy
  89. func (f *Filesystem) GetACopy() Filesystem {
  90. f.SetEmptySecretsIfNil()
  91. fs := Filesystem{
  92. Provider: f.Provider,
  93. S3Config: S3FsConfig{
  94. Bucket: f.S3Config.Bucket,
  95. Region: f.S3Config.Region,
  96. AccessKey: f.S3Config.AccessKey,
  97. AccessSecret: f.S3Config.AccessSecret.Clone(),
  98. Endpoint: f.S3Config.Endpoint,
  99. StorageClass: f.S3Config.StorageClass,
  100. KeyPrefix: f.S3Config.KeyPrefix,
  101. UploadPartSize: f.S3Config.UploadPartSize,
  102. UploadConcurrency: f.S3Config.UploadConcurrency,
  103. },
  104. GCSConfig: GCSFsConfig{
  105. Bucket: f.GCSConfig.Bucket,
  106. CredentialFile: f.GCSConfig.CredentialFile,
  107. Credentials: f.GCSConfig.Credentials.Clone(),
  108. AutomaticCredentials: f.GCSConfig.AutomaticCredentials,
  109. StorageClass: f.GCSConfig.StorageClass,
  110. KeyPrefix: f.GCSConfig.KeyPrefix,
  111. },
  112. AzBlobConfig: AzBlobFsConfig{
  113. Container: f.AzBlobConfig.Container,
  114. AccountName: f.AzBlobConfig.AccountName,
  115. AccountKey: f.AzBlobConfig.AccountKey.Clone(),
  116. Endpoint: f.AzBlobConfig.Endpoint,
  117. SASURL: f.AzBlobConfig.SASURL,
  118. KeyPrefix: f.AzBlobConfig.KeyPrefix,
  119. UploadPartSize: f.AzBlobConfig.UploadPartSize,
  120. UploadConcurrency: f.AzBlobConfig.UploadConcurrency,
  121. UseEmulator: f.AzBlobConfig.UseEmulator,
  122. AccessTier: f.AzBlobConfig.AccessTier,
  123. },
  124. CryptConfig: CryptFsConfig{
  125. Passphrase: f.CryptConfig.Passphrase.Clone(),
  126. },
  127. SFTPConfig: SFTPFsConfig{
  128. Endpoint: f.SFTPConfig.Endpoint,
  129. Username: f.SFTPConfig.Username,
  130. Password: f.SFTPConfig.Password.Clone(),
  131. PrivateKey: f.SFTPConfig.PrivateKey.Clone(),
  132. Prefix: f.SFTPConfig.Prefix,
  133. DisableCouncurrentReads: f.SFTPConfig.DisableCouncurrentReads,
  134. BufferSize: f.SFTPConfig.BufferSize,
  135. },
  136. }
  137. if len(f.SFTPConfig.Fingerprints) > 0 {
  138. fs.SFTPConfig.Fingerprints = make([]string, len(f.SFTPConfig.Fingerprints))
  139. copy(fs.SFTPConfig.Fingerprints, f.SFTPConfig.Fingerprints)
  140. }
  141. return fs
  142. }