storj.io/minio@v0.0.0-20230509071714-0cbc90f649b1/cmd/bucket-versioning-handler.go (about) 1 /* 2 * MinIO Cloud Storage, (C) 2020 MinIO, Inc. 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17 package cmd 18 19 import ( 20 "encoding/xml" 21 "io" 22 "net/http" 23 24 humanize "github.com/dustin/go-humanize" 25 "github.com/gorilla/mux" 26 27 "storj.io/minio/cmd/logger" 28 "storj.io/minio/pkg/bucket/policy" 29 "storj.io/minio/pkg/bucket/versioning" 30 ) 31 32 const ( 33 bucketVersioningConfig = "versioning.xml" 34 35 // Maximum size of bucket versioning configuration payload sent to the PutBucketVersioningHandler. 36 maxBucketVersioningConfigSize = 1 * humanize.MiByte 37 ) 38 39 // PutBucketVersioningHandler - PUT Bucket Versioning. 40 // ---------- 41 func (api ObjectAPIHandlers) PutBucketVersioningHandler(w http.ResponseWriter, r *http.Request) { 42 ctx := NewContext(r, w, "PutBucketVersioning") 43 44 defer logger.AuditLog(ctx, w, r, mustGetClaimsFromToken(r)) 45 46 vars := mux.Vars(r) 47 bucket := vars["bucket"] 48 49 objectAPI := api.ObjectAPI() 50 if objectAPI == nil { 51 WriteErrorResponse(ctx, w, errorCodes.ToAPIErr(ErrServerNotInitialized), r.URL, guessIsBrowserReq(r)) 52 return 53 } 54 55 if s3Error := checkRequestAuthType(ctx, r, policy.PutBucketVersioningAction, bucket, ""); s3Error != ErrNone { 56 WriteErrorResponse(ctx, w, errorCodes.ToAPIErr(s3Error), r.URL, guessIsBrowserReq(r)) 57 return 58 } 59 60 v, err := versioning.ParseConfig(io.LimitReader(r.Body, maxBucketVersioningConfigSize)) 61 if err != nil { 62 WriteErrorResponse(ctx, w, ToAPIError(ctx, err), r.URL, guessIsBrowserReq(r)) 63 return 64 } 65 66 if rcfg, _ := globalBucketObjectLockSys.Get(bucket); rcfg.LockEnabled && v.Suspended() { 67 WriteErrorResponse(ctx, w, APIError{ 68 Code: "InvalidBucketState", 69 Description: "An Object Lock configuration is present on this bucket, so the versioning state cannot be changed.", 70 HTTPStatusCode: http.StatusConflict, 71 }, r.URL, guessIsBrowserReq(r)) 72 return 73 } 74 if _, err := getReplicationConfig(ctx, bucket); err == nil && v.Suspended() { 75 WriteErrorResponse(ctx, w, APIError{ 76 Code: "InvalidBucketState", 77 Description: "A replication configuration is present on this bucket, so the versioning state cannot be changed.", 78 HTTPStatusCode: http.StatusConflict, 79 }, r.URL, guessIsBrowserReq(r)) 80 return 81 } 82 83 configData, err := xml.Marshal(v) 84 if err != nil { 85 WriteErrorResponse(ctx, w, ToAPIError(ctx, err), r.URL, guessIsBrowserReq(r)) 86 return 87 } 88 89 if err = globalBucketMetadataSys.Update(bucket, bucketVersioningConfig, configData); err != nil { 90 WriteErrorResponse(ctx, w, ToAPIError(ctx, err), r.URL, guessIsBrowserReq(r)) 91 return 92 } 93 94 writeSuccessResponseHeadersOnly(w) 95 } 96 97 // GetBucketVersioningHandler - GET Bucket Versioning. 98 // ---------- 99 func (api ObjectAPIHandlers) GetBucketVersioningHandler(w http.ResponseWriter, r *http.Request) { 100 ctx := NewContext(r, w, "GetBucketVersioning") 101 102 defer logger.AuditLog(ctx, w, r, mustGetClaimsFromToken(r)) 103 104 vars := mux.Vars(r) 105 bucket := vars["bucket"] 106 107 objectAPI := api.ObjectAPI() 108 if objectAPI == nil { 109 WriteErrorResponse(ctx, w, errorCodes.ToAPIErr(ErrServerNotInitialized), r.URL, guessIsBrowserReq(r)) 110 return 111 } 112 113 if s3Error := checkRequestAuthType(ctx, r, policy.GetBucketVersioningAction, bucket, ""); s3Error != ErrNone { 114 WriteErrorResponse(ctx, w, errorCodes.ToAPIErr(s3Error), r.URL, guessIsBrowserReq(r)) 115 return 116 } 117 118 // Check if bucket exists. 119 if _, err := objectAPI.GetBucketInfo(ctx, bucket); err != nil { 120 WriteErrorResponse(ctx, w, ToAPIError(ctx, err), r.URL, guessIsBrowserReq(r)) 121 return 122 } 123 124 config, err := globalBucketVersioningSys.Get(bucket) 125 if err != nil { 126 WriteErrorResponse(ctx, w, ToAPIError(ctx, err), r.URL, guessIsBrowserReq(r)) 127 return 128 } 129 130 configData, err := xml.Marshal(config) 131 if err != nil { 132 WriteErrorResponse(ctx, w, ToAPIError(ctx, err), r.URL, guessIsBrowserReq(r)) 133 return 134 } 135 136 // Write bucket versioning configuration to client 137 WriteSuccessResponseXML(w, configData) 138 139 }