storj.io/minio@v0.0.0-20230509071714-0cbc90f649b1/cmd/bucket-lifecycle-handlers.go (about) 1 /* 2 * MinIO Cloud Storage, (C) 2019 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 "github.com/gorilla/mux" 25 26 xhttp "storj.io/minio/cmd/http" 27 "storj.io/minio/cmd/logger" 28 "storj.io/minio/pkg/bucket/lifecycle" 29 "storj.io/minio/pkg/bucket/policy" 30 ) 31 32 const ( 33 // Lifecycle configuration file. 34 bucketLifecycleConfig = "lifecycle.xml" 35 ) 36 37 // PutBucketLifecycleHandler - This HTTP handler stores given bucket lifecycle configuration as per 38 // https://docs.aws.amazon.com/AmazonS3/latest/dev/object-lifecycle-mgmt.html 39 func (api ObjectAPIHandlers) PutBucketLifecycleHandler(w http.ResponseWriter, r *http.Request) { 40 ctx := NewContext(r, w, "PutBucketLifecycle") 41 42 defer logger.AuditLog(ctx, w, r, mustGetClaimsFromToken(r)) 43 44 objAPI := api.ObjectAPI() 45 if objAPI == nil { 46 WriteErrorResponse(ctx, w, errorCodes.ToAPIErr(ErrServerNotInitialized), r.URL, guessIsBrowserReq(r)) 47 return 48 } 49 50 vars := mux.Vars(r) 51 bucket := vars["bucket"] 52 53 // PutBucketLifecycle always needs a Content-Md5 54 if _, ok := r.Header[xhttp.ContentMD5]; !ok { 55 WriteErrorResponse(ctx, w, errorCodes.ToAPIErr(ErrMissingContentMD5), r.URL, guessIsBrowserReq(r)) 56 return 57 } 58 59 if s3Error := checkRequestAuthType(ctx, r, policy.PutBucketLifecycleAction, bucket, ""); s3Error != ErrNone { 60 WriteErrorResponse(ctx, w, errorCodes.ToAPIErr(s3Error), r.URL, guessIsBrowserReq(r)) 61 return 62 } 63 64 // Check if bucket exists. 65 if _, err := objAPI.GetBucketInfo(ctx, bucket); err != nil { 66 WriteErrorResponse(ctx, w, ToAPIError(ctx, err), r.URL, guessIsBrowserReq(r)) 67 return 68 } 69 70 bucketLifecycle, err := lifecycle.ParseLifecycleConfig(io.LimitReader(r.Body, r.ContentLength)) 71 if err != nil { 72 WriteErrorResponse(ctx, w, ToAPIError(ctx, err), r.URL, guessIsBrowserReq(r)) 73 return 74 } 75 76 // Validate the received bucket policy document 77 if err = bucketLifecycle.Validate(); err != nil { 78 WriteErrorResponse(ctx, w, ToAPIError(ctx, err), r.URL, guessIsBrowserReq(r)) 79 return 80 } 81 82 // Validate the transition storage ARNs 83 if err = validateLifecycleTransition(ctx, bucket, bucketLifecycle); err != nil { 84 WriteErrorResponse(ctx, w, ToAPIError(ctx, err), r.URL, guessIsBrowserReq(r)) 85 return 86 } 87 88 configData, err := xml.Marshal(bucketLifecycle) 89 if err != nil { 90 WriteErrorResponse(ctx, w, ToAPIError(ctx, err), r.URL, guessIsBrowserReq(r)) 91 return 92 } 93 94 if err = globalBucketMetadataSys.Update(bucket, bucketLifecycleConfig, configData); err != nil { 95 WriteErrorResponse(ctx, w, ToAPIError(ctx, err), r.URL, guessIsBrowserReq(r)) 96 return 97 } 98 99 // Success. 100 writeSuccessResponseHeadersOnly(w) 101 } 102 103 // GetBucketLifecycleHandler - This HTTP handler returns bucket policy configuration. 104 func (api ObjectAPIHandlers) GetBucketLifecycleHandler(w http.ResponseWriter, r *http.Request) { 105 ctx := NewContext(r, w, "GetBucketLifecycle") 106 107 defer logger.AuditLog(ctx, w, r, mustGetClaimsFromToken(r)) 108 109 objAPI := api.ObjectAPI() 110 if objAPI == nil { 111 WriteErrorResponse(ctx, w, errorCodes.ToAPIErr(ErrServerNotInitialized), r.URL, guessIsBrowserReq(r)) 112 return 113 } 114 115 vars := mux.Vars(r) 116 bucket := vars["bucket"] 117 118 if s3Error := checkRequestAuthType(ctx, r, policy.GetBucketLifecycleAction, bucket, ""); s3Error != ErrNone { 119 WriteErrorResponse(ctx, w, errorCodes.ToAPIErr(s3Error), r.URL, guessIsBrowserReq(r)) 120 return 121 } 122 123 // Check if bucket exists. 124 if _, err := objAPI.GetBucketInfo(ctx, bucket); err != nil { 125 WriteErrorResponse(ctx, w, ToAPIError(ctx, err), r.URL, guessIsBrowserReq(r)) 126 return 127 } 128 129 config, err := globalBucketMetadataSys.GetLifecycleConfig(bucket) 130 if err != nil { 131 WriteErrorResponse(ctx, w, ToAPIError(ctx, err), r.URL, guessIsBrowserReq(r)) 132 return 133 } 134 135 configData, err := xml.Marshal(config) 136 if err != nil { 137 WriteErrorResponse(ctx, w, ToAPIError(ctx, err), r.URL, guessIsBrowserReq(r)) 138 return 139 } 140 141 // Write lifecycle configuration to client. 142 WriteSuccessResponseXML(w, configData) 143 } 144 145 // DeleteBucketLifecycleHandler - This HTTP handler removes bucket lifecycle configuration. 146 func (api ObjectAPIHandlers) DeleteBucketLifecycleHandler(w http.ResponseWriter, r *http.Request) { 147 ctx := NewContext(r, w, "DeleteBucketLifecycle") 148 149 defer logger.AuditLog(ctx, w, r, mustGetClaimsFromToken(r)) 150 151 objAPI := api.ObjectAPI() 152 if objAPI == nil { 153 WriteErrorResponse(ctx, w, errorCodes.ToAPIErr(ErrServerNotInitialized), r.URL, guessIsBrowserReq(r)) 154 return 155 } 156 157 vars := mux.Vars(r) 158 bucket := vars["bucket"] 159 160 if s3Error := checkRequestAuthType(ctx, r, policy.PutBucketLifecycleAction, bucket, ""); s3Error != ErrNone { 161 WriteErrorResponse(ctx, w, errorCodes.ToAPIErr(s3Error), r.URL, guessIsBrowserReq(r)) 162 return 163 } 164 165 // Check if bucket exists. 166 if _, err := objAPI.GetBucketInfo(ctx, bucket); err != nil { 167 WriteErrorResponse(ctx, w, ToAPIError(ctx, err), r.URL, guessIsBrowserReq(r)) 168 return 169 } 170 171 if err := globalBucketMetadataSys.Update(bucket, bucketLifecycleConfig, nil); err != nil { 172 WriteErrorResponse(ctx, w, ToAPIError(ctx, err), r.URL, guessIsBrowserReq(r)) 173 return 174 } 175 176 // Success. 177 writeSuccessNoContent(w) 178 }