You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

257 lines
8.8 KiB

  1. // Copyright (c) 2015-2021 MinIO, Inc.
  2. //
  3. // This file is part of MinIO Object Storage stack
  4. //
  5. // This program is free software: you can redistribute it and/or modify
  6. // it under the terms of the GNU Affero General Public License as published by
  7. // the Free Software Foundation, either version 3 of the License, or
  8. // (at your option) any later version.
  9. //
  10. // This program is distributed in the hope that it will be useful
  11. // but WITHOUT ANY WARRANTY; without even the implied warranty of
  12. // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  13. // GNU Affero General Public License for more details.
  14. //
  15. // You should have received a copy of the GNU Affero General Public License
  16. // along with this program. If not, see <http://www.gnu.org/licenses/>.
  17. package cmd
  18. import (
  19. "net/http"
  20. "github.com/minio/minio/internal/logger"
  21. "github.com/minio/mux"
  22. "github.com/minio/pkg/v3/policy"
  23. )
  24. // Data types used for returning dummy tagging XML.
  25. // These variables shouldn't be used elsewhere.
  26. // They are only defined to be used in this file alone.
  27. // GetBucketWebsite - GET bucket website, a dummy api
  28. func (api objectAPIHandlers) GetBucketWebsiteHandler(w http.ResponseWriter, r *http.Request) {
  29. ctx := newContext(r, w, "GetBucketWebsite")
  30. defer logger.AuditLog(ctx, w, r, mustGetClaimsFromToken(r))
  31. vars := mux.Vars(r)
  32. bucket := vars["bucket"]
  33. objAPI := api.ObjectAPI()
  34. if objAPI == nil {
  35. writeErrorResponse(ctx, w, errorCodes.ToAPIErr(ErrServerNotInitialized), r.URL)
  36. return
  37. }
  38. // Allow GetBucketWebsite if policy action is set, since this is a dummy call
  39. // we are simply re-purposing the bucketPolicyAction.
  40. if s3Error := checkRequestAuthType(ctx, r, policy.GetBucketPolicyAction, bucket, ""); s3Error != ErrNone {
  41. writeErrorResponse(ctx, w, errorCodes.ToAPIErr(s3Error), r.URL)
  42. return
  43. }
  44. // Validate if bucket exists, before proceeding further...
  45. _, err := objAPI.GetBucketInfo(ctx, bucket, BucketOptions{})
  46. if err != nil {
  47. writeErrorResponse(ctx, w, toAPIError(ctx, err), r.URL)
  48. return
  49. }
  50. writeErrorResponse(ctx, w, errorCodes.ToAPIErr(ErrNoSuchWebsiteConfiguration), r.URL)
  51. }
  52. // GetBucketAccelerate - GET bucket accelerate, a dummy api
  53. func (api objectAPIHandlers) GetBucketAccelerateHandler(w http.ResponseWriter, r *http.Request) {
  54. ctx := newContext(r, w, "GetBucketAccelerate")
  55. defer logger.AuditLog(ctx, w, r, mustGetClaimsFromToken(r))
  56. vars := mux.Vars(r)
  57. bucket := vars["bucket"]
  58. objAPI := api.ObjectAPI()
  59. if objAPI == nil {
  60. writeErrorResponse(ctx, w, errorCodes.ToAPIErr(ErrServerNotInitialized), r.URL)
  61. return
  62. }
  63. // Allow GetBucketAccelerate if policy action is set, since this is a dummy call
  64. // we are simply re-purposing the bucketPolicyAction.
  65. if s3Error := checkRequestAuthType(ctx, r, policy.GetBucketPolicyAction, bucket, ""); s3Error != ErrNone {
  66. writeErrorResponse(ctx, w, errorCodes.ToAPIErr(s3Error), r.URL)
  67. return
  68. }
  69. // Validate if bucket exists, before proceeding further...
  70. _, err := objAPI.GetBucketInfo(ctx, bucket, BucketOptions{})
  71. if err != nil {
  72. writeErrorResponse(ctx, w, toAPIError(ctx, err), r.URL)
  73. return
  74. }
  75. const accelerateDefaultConfig = `<?xml version="1.0" encoding="UTF-8"?><AccelerateConfiguration xmlns="http://s3.amazonaws.com/doc/2006-03-01/"/>`
  76. writeSuccessResponseXML(w, []byte(accelerateDefaultConfig))
  77. }
  78. // GetBucketRequestPaymentHandler - GET bucket requestPayment, a dummy api
  79. func (api objectAPIHandlers) GetBucketRequestPaymentHandler(w http.ResponseWriter, r *http.Request) {
  80. ctx := newContext(r, w, "GetBucketRequestPayment")
  81. defer logger.AuditLog(ctx, w, r, mustGetClaimsFromToken(r))
  82. vars := mux.Vars(r)
  83. bucket := vars["bucket"]
  84. objAPI := api.ObjectAPI()
  85. if objAPI == nil {
  86. writeErrorResponse(ctx, w, errorCodes.ToAPIErr(ErrServerNotInitialized), r.URL)
  87. return
  88. }
  89. // Allow GetBucketRequestPaymentHandler if policy action is set, since this is a dummy call
  90. // we are simply re-purposing the bucketPolicyAction.
  91. if s3Error := checkRequestAuthType(ctx, r, policy.GetBucketPolicyAction, bucket, ""); s3Error != ErrNone {
  92. writeErrorResponse(ctx, w, errorCodes.ToAPIErr(s3Error), r.URL)
  93. return
  94. }
  95. // Validate if bucket exists, before proceeding further...
  96. _, err := objAPI.GetBucketInfo(ctx, bucket, BucketOptions{})
  97. if err != nil {
  98. writeErrorResponse(ctx, w, toAPIError(ctx, err), r.URL)
  99. return
  100. }
  101. const requestPaymentDefaultConfig = `<?xml version="1.0" encoding="UTF-8"?><RequestPaymentConfiguration xmlns="http://s3.amazonaws.com/doc/2006-03-01/"><Payer>BucketOwner</Payer></RequestPaymentConfiguration>`
  102. writeSuccessResponseXML(w, []byte(requestPaymentDefaultConfig))
  103. }
  104. // GetBucketLoggingHandler - GET bucket logging, a dummy api
  105. func (api objectAPIHandlers) GetBucketLoggingHandler(w http.ResponseWriter, r *http.Request) {
  106. ctx := newContext(r, w, "GetBucketLogging")
  107. defer logger.AuditLog(ctx, w, r, mustGetClaimsFromToken(r))
  108. vars := mux.Vars(r)
  109. bucket := vars["bucket"]
  110. objAPI := api.ObjectAPI()
  111. if objAPI == nil {
  112. writeErrorResponse(ctx, w, errorCodes.ToAPIErr(ErrServerNotInitialized), r.URL)
  113. return
  114. }
  115. // Allow GetBucketLoggingHandler if policy action is set, since this is a dummy call
  116. // we are simply re-purposing the bucketPolicyAction.
  117. if s3Error := checkRequestAuthType(ctx, r, policy.GetBucketPolicyAction, bucket, ""); s3Error != ErrNone {
  118. writeErrorResponse(ctx, w, errorCodes.ToAPIErr(s3Error), r.URL)
  119. return
  120. }
  121. // Validate if bucket exists, before proceeding further...
  122. _, err := objAPI.GetBucketInfo(ctx, bucket, BucketOptions{})
  123. if err != nil {
  124. writeErrorResponse(ctx, w, toAPIError(ctx, err), r.URL)
  125. return
  126. }
  127. const loggingDefaultConfig = `<?xml version="1.0" encoding="UTF-8"?><BucketLoggingStatus xmlns="http://s3.amazonaws.com/doc/2006-03-01/"><!--<LoggingEnabled><TargetBucket>myLogsBucket</TargetBucket><TargetPrefix>add/this/prefix/to/my/log/files/access_log-</TargetPrefix></LoggingEnabled>--></BucketLoggingStatus>`
  128. writeSuccessResponseXML(w, []byte(loggingDefaultConfig))
  129. }
  130. // DeleteBucketWebsiteHandler - DELETE bucket website, a dummy api
  131. func (api objectAPIHandlers) DeleteBucketWebsiteHandler(w http.ResponseWriter, r *http.Request) {
  132. writeSuccessResponseHeadersOnly(w)
  133. }
  134. // GetBucketCorsHandler - GET bucket cors, a dummy api
  135. func (api objectAPIHandlers) GetBucketCorsHandler(w http.ResponseWriter, r *http.Request) {
  136. ctx := newContext(r, w, "GetBucketCors")
  137. defer logger.AuditLog(ctx, w, r, mustGetClaimsFromToken(r))
  138. vars := mux.Vars(r)
  139. bucket := vars["bucket"]
  140. objAPI := api.ObjectAPI()
  141. if objAPI == nil {
  142. writeErrorResponse(ctx, w, errorCodes.ToAPIErr(ErrServerNotInitialized), r.URL)
  143. return
  144. }
  145. if s3Error := checkRequestAuthType(ctx, r, policy.GetBucketCorsAction, bucket, ""); s3Error != ErrNone {
  146. writeErrorResponse(ctx, w, errorCodes.ToAPIErr(s3Error), r.URL)
  147. return
  148. }
  149. // Validate if bucket exists, before proceeding further...
  150. _, err := objAPI.GetBucketInfo(ctx, bucket, BucketOptions{})
  151. if err != nil {
  152. writeErrorResponse(ctx, w, toAPIError(ctx, err), r.URL)
  153. return
  154. }
  155. writeErrorResponse(ctx, w, errorCodes.ToAPIErr(ErrNoSuchCORSConfiguration), r.URL)
  156. }
  157. // PutBucketCorsHandler - PUT bucket cors, a dummy api
  158. func (api objectAPIHandlers) PutBucketCorsHandler(w http.ResponseWriter, r *http.Request) {
  159. ctx := newContext(r, w, "PutBucketCors")
  160. defer logger.AuditLog(ctx, w, r, mustGetClaimsFromToken(r))
  161. vars := mux.Vars(r)
  162. bucket := vars["bucket"]
  163. objAPI := api.ObjectAPI()
  164. if objAPI == nil {
  165. writeErrorResponse(ctx, w, errorCodes.ToAPIErr(ErrServerNotInitialized), r.URL)
  166. return
  167. }
  168. if s3Error := checkRequestAuthType(ctx, r, policy.PutBucketCorsAction, bucket, ""); s3Error != ErrNone {
  169. writeErrorResponse(ctx, w, errorCodes.ToAPIErr(s3Error), r.URL)
  170. return
  171. }
  172. // Validate if bucket exists, before proceeding further...
  173. _, err := objAPI.GetBucketInfo(ctx, bucket, BucketOptions{})
  174. if err != nil {
  175. writeErrorResponse(ctx, w, toAPIError(ctx, err), r.URL)
  176. return
  177. }
  178. writeErrorResponse(ctx, w, errorCodes.ToAPIErr(ErrNotImplemented), r.URL)
  179. }
  180. // DeleteBucketCorsHandler - DELETE bucket cors, a dummy api
  181. func (api objectAPIHandlers) DeleteBucketCorsHandler(w http.ResponseWriter, r *http.Request) {
  182. ctx := newContext(r, w, "DeleteBucketCors")
  183. defer logger.AuditLog(ctx, w, r, mustGetClaimsFromToken(r))
  184. vars := mux.Vars(r)
  185. bucket := vars["bucket"]
  186. objAPI := api.ObjectAPI()
  187. if objAPI == nil {
  188. writeErrorResponse(ctx, w, errorCodes.ToAPIErr(ErrServerNotInitialized), r.URL)
  189. return
  190. }
  191. if s3Error := checkRequestAuthType(ctx, r, policy.DeleteBucketCorsAction, bucket, ""); s3Error != ErrNone {
  192. writeErrorResponse(ctx, w, errorCodes.ToAPIErr(s3Error), r.URL)
  193. return
  194. }
  195. // Validate if bucket exists, before proceeding further...
  196. _, err := objAPI.GetBucketInfo(ctx, bucket, BucketOptions{})
  197. if err != nil {
  198. writeErrorResponse(ctx, w, toAPIError(ctx, err), r.URL)
  199. return
  200. }
  201. writeErrorResponse(ctx, w, errorCodes.ToAPIErr(ErrNotImplemented), r.URL)
  202. }