filesystem.go 5.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156
  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.AzBlobConfig.SASURL == nil {
  36. f.AzBlobConfig.SASURL = kms.NewEmptySecret()
  37. }
  38. if f.CryptConfig.Passphrase == nil {
  39. f.CryptConfig.Passphrase = kms.NewEmptySecret()
  40. }
  41. if f.SFTPConfig.Password == nil {
  42. f.SFTPConfig.Password = kms.NewEmptySecret()
  43. }
  44. if f.SFTPConfig.PrivateKey == nil {
  45. f.SFTPConfig.PrivateKey = kms.NewEmptySecret()
  46. }
  47. }
  48. // SetNilSecretsIfEmpty set the secrets to nil if empty.
  49. // This is useful before rendering as JSON so the empty fields
  50. // will not be serialized.
  51. func (f *Filesystem) SetNilSecretsIfEmpty() {
  52. if f.S3Config.AccessSecret != nil && f.S3Config.AccessSecret.IsEmpty() {
  53. f.S3Config.AccessSecret = nil
  54. }
  55. if f.GCSConfig.Credentials != nil && f.GCSConfig.Credentials.IsEmpty() {
  56. f.GCSConfig.Credentials = nil
  57. }
  58. if f.AzBlobConfig.AccountKey != nil && f.AzBlobConfig.AccountKey.IsEmpty() {
  59. f.AzBlobConfig.AccountKey = nil
  60. }
  61. if f.AzBlobConfig.SASURL != nil && f.AzBlobConfig.SASURL.IsEmpty() {
  62. f.AzBlobConfig.SASURL = nil
  63. }
  64. if f.CryptConfig.Passphrase != nil && f.CryptConfig.Passphrase.IsEmpty() {
  65. f.CryptConfig.Passphrase = nil
  66. }
  67. if f.SFTPConfig.Password != nil && f.SFTPConfig.Password.IsEmpty() {
  68. f.SFTPConfig.Password = nil
  69. }
  70. if f.SFTPConfig.PrivateKey != nil && f.SFTPConfig.PrivateKey.IsEmpty() {
  71. f.SFTPConfig.PrivateKey = nil
  72. }
  73. }
  74. // IsEqual returns true if the fs is equal to other
  75. func (f *Filesystem) IsEqual(other *Filesystem) bool {
  76. if f.Provider != other.Provider {
  77. return false
  78. }
  79. switch f.Provider {
  80. case S3FilesystemProvider:
  81. return f.S3Config.isEqual(&other.S3Config)
  82. case GCSFilesystemProvider:
  83. return f.GCSConfig.isEqual(&other.GCSConfig)
  84. case AzureBlobFilesystemProvider:
  85. return f.AzBlobConfig.isEqual(&other.AzBlobConfig)
  86. case CryptedFilesystemProvider:
  87. return f.CryptConfig.isEqual(&other.CryptConfig)
  88. case SFTPFilesystemProvider:
  89. return f.SFTPConfig.isEqual(&other.SFTPConfig)
  90. default:
  91. return true
  92. }
  93. }
  94. // GetACopy returns a copy
  95. func (f *Filesystem) GetACopy() Filesystem {
  96. f.SetEmptySecretsIfNil()
  97. fs := Filesystem{
  98. Provider: f.Provider,
  99. S3Config: S3FsConfig{
  100. Bucket: f.S3Config.Bucket,
  101. Region: f.S3Config.Region,
  102. AccessKey: f.S3Config.AccessKey,
  103. AccessSecret: f.S3Config.AccessSecret.Clone(),
  104. Endpoint: f.S3Config.Endpoint,
  105. StorageClass: f.S3Config.StorageClass,
  106. KeyPrefix: f.S3Config.KeyPrefix,
  107. UploadPartSize: f.S3Config.UploadPartSize,
  108. UploadConcurrency: f.S3Config.UploadConcurrency,
  109. },
  110. GCSConfig: GCSFsConfig{
  111. Bucket: f.GCSConfig.Bucket,
  112. CredentialFile: f.GCSConfig.CredentialFile,
  113. Credentials: f.GCSConfig.Credentials.Clone(),
  114. AutomaticCredentials: f.GCSConfig.AutomaticCredentials,
  115. StorageClass: f.GCSConfig.StorageClass,
  116. KeyPrefix: f.GCSConfig.KeyPrefix,
  117. },
  118. AzBlobConfig: AzBlobFsConfig{
  119. Container: f.AzBlobConfig.Container,
  120. AccountName: f.AzBlobConfig.AccountName,
  121. AccountKey: f.AzBlobConfig.AccountKey.Clone(),
  122. Endpoint: f.AzBlobConfig.Endpoint,
  123. SASURL: f.AzBlobConfig.SASURL.Clone(),
  124. KeyPrefix: f.AzBlobConfig.KeyPrefix,
  125. UploadPartSize: f.AzBlobConfig.UploadPartSize,
  126. UploadConcurrency: f.AzBlobConfig.UploadConcurrency,
  127. UseEmulator: f.AzBlobConfig.UseEmulator,
  128. AccessTier: f.AzBlobConfig.AccessTier,
  129. },
  130. CryptConfig: CryptFsConfig{
  131. Passphrase: f.CryptConfig.Passphrase.Clone(),
  132. },
  133. SFTPConfig: SFTPFsConfig{
  134. Endpoint: f.SFTPConfig.Endpoint,
  135. Username: f.SFTPConfig.Username,
  136. Password: f.SFTPConfig.Password.Clone(),
  137. PrivateKey: f.SFTPConfig.PrivateKey.Clone(),
  138. Prefix: f.SFTPConfig.Prefix,
  139. DisableCouncurrentReads: f.SFTPConfig.DisableCouncurrentReads,
  140. BufferSize: f.SFTPConfig.BufferSize,
  141. },
  142. }
  143. if len(f.SFTPConfig.Fingerprints) > 0 {
  144. fs.SFTPConfig.Fingerprints = make([]string, len(f.SFTPConfig.Fingerprints))
  145. copy(fs.SFTPConfig.Fingerprints, f.SFTPConfig.Fingerprints)
  146. }
  147. return fs
  148. }