github.com/minio/minio@v0.0.0-20240328213742-3f72439b8a27/internal/event/name.go (about) 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 18 package event 19 20 import ( 21 "encoding/json" 22 "encoding/xml" 23 ) 24 25 // Name - event type enum. 26 // Refer http://docs.aws.amazon.com/AmazonS3/latest/dev/NotificationHowTo.html#notification-how-to-event-types-and-destinations 27 // for most basic values we have since extend this and its not really much applicable other than a reference point. 28 // "s3:Replication:OperationCompletedReplication" is a MinIO extension. 29 type Name int 30 31 // Values of event Name 32 const ( 33 // Single event types (does not require expansion) 34 35 ObjectAccessedGet Name = 1 + iota 36 ObjectAccessedGetRetention 37 ObjectAccessedGetLegalHold 38 ObjectAccessedHead 39 ObjectAccessedAttributes 40 ObjectCreatedCompleteMultipartUpload 41 ObjectCreatedCopy 42 ObjectCreatedPost 43 ObjectCreatedPut 44 ObjectCreatedPutRetention 45 ObjectCreatedPutLegalHold 46 ObjectCreatedPutTagging 47 ObjectCreatedDeleteTagging 48 ObjectRemovedDelete 49 ObjectRemovedDeleteMarkerCreated 50 ObjectRemovedDeleteAllVersions 51 ObjectRemovedNoOP 52 BucketCreated 53 BucketRemoved 54 ObjectReplicationFailed 55 ObjectReplicationComplete 56 ObjectReplicationMissedThreshold 57 ObjectReplicationReplicatedAfterThreshold 58 ObjectReplicationNotTracked 59 ObjectRestorePost 60 ObjectRestoreCompleted 61 ObjectTransitionFailed 62 ObjectTransitionComplete 63 ObjectManyVersions 64 PrefixManyFolders 65 66 objectSingleTypesEnd 67 // Start Compound types that require expansion: 68 69 ObjectAccessedAll 70 ObjectCreatedAll 71 ObjectRemovedAll 72 ObjectReplicationAll 73 ObjectRestoreAll 74 ObjectTransitionAll 75 ObjectScannerAll 76 Everything 77 ) 78 79 // The number of single names should not exceed 64. 80 // This will break masking. Use bit 63 as extension. 81 var _ = uint64(1 << objectSingleTypesEnd) 82 83 // Expand - returns expanded values of abbreviated event type. 84 func (name Name) Expand() []Name { 85 switch name { 86 87 case ObjectAccessedAll: 88 return []Name{ 89 ObjectAccessedGet, ObjectAccessedHead, 90 ObjectAccessedGetRetention, ObjectAccessedGetLegalHold, ObjectAccessedAttributes, 91 } 92 case ObjectCreatedAll: 93 return []Name{ 94 ObjectCreatedCompleteMultipartUpload, ObjectCreatedCopy, 95 ObjectCreatedPost, ObjectCreatedPut, 96 ObjectCreatedPutRetention, ObjectCreatedPutLegalHold, 97 ObjectCreatedPutTagging, ObjectCreatedDeleteTagging, 98 } 99 case ObjectRemovedAll: 100 return []Name{ 101 ObjectRemovedDelete, 102 ObjectRemovedDeleteMarkerCreated, 103 ObjectRemovedNoOP, 104 ObjectRemovedDeleteAllVersions, 105 } 106 case ObjectReplicationAll: 107 return []Name{ 108 ObjectReplicationFailed, 109 ObjectReplicationComplete, 110 ObjectReplicationNotTracked, 111 ObjectReplicationMissedThreshold, 112 ObjectReplicationReplicatedAfterThreshold, 113 } 114 case ObjectRestoreAll: 115 return []Name{ 116 ObjectRestorePost, 117 ObjectRestoreCompleted, 118 } 119 case ObjectTransitionAll: 120 return []Name{ 121 ObjectTransitionFailed, 122 ObjectTransitionComplete, 123 } 124 case ObjectScannerAll: 125 return []Name{ 126 ObjectManyVersions, 127 PrefixManyFolders, 128 } 129 case Everything: 130 res := make([]Name, objectSingleTypesEnd-1) 131 for i := range res { 132 res[i] = Name(i + 1) 133 } 134 return res 135 default: 136 return []Name{name} 137 } 138 } 139 140 // Mask returns the type as mask. 141 // Compound "All" types are expanded. 142 func (name Name) Mask() uint64 { 143 if name < objectSingleTypesEnd { 144 return 1 << (name - 1) 145 } 146 var mask uint64 147 for _, n := range name.Expand() { 148 mask |= 1 << (n - 1) 149 } 150 return mask 151 } 152 153 // String - returns string representation of event type. 154 func (name Name) String() string { 155 switch name { 156 case BucketCreated: 157 return "s3:BucketCreated:*" 158 case BucketRemoved: 159 return "s3:BucketRemoved:*" 160 case ObjectAccessedAll: 161 return "s3:ObjectAccessed:*" 162 case ObjectAccessedGet: 163 return "s3:ObjectAccessed:Get" 164 case ObjectAccessedGetRetention: 165 return "s3:ObjectAccessed:GetRetention" 166 case ObjectAccessedGetLegalHold: 167 return "s3:ObjectAccessed:GetLegalHold" 168 case ObjectAccessedHead: 169 return "s3:ObjectAccessed:Head" 170 case ObjectAccessedAttributes: 171 return "s3:ObjectAccessed:Attributes" 172 case ObjectCreatedAll: 173 return "s3:ObjectCreated:*" 174 case ObjectCreatedCompleteMultipartUpload: 175 return "s3:ObjectCreated:CompleteMultipartUpload" 176 case ObjectCreatedCopy: 177 return "s3:ObjectCreated:Copy" 178 case ObjectCreatedPost: 179 return "s3:ObjectCreated:Post" 180 case ObjectCreatedPut: 181 return "s3:ObjectCreated:Put" 182 case ObjectCreatedPutTagging: 183 return "s3:ObjectCreated:PutTagging" 184 case ObjectCreatedDeleteTagging: 185 return "s3:ObjectCreated:DeleteTagging" 186 case ObjectCreatedPutRetention: 187 return "s3:ObjectCreated:PutRetention" 188 case ObjectCreatedPutLegalHold: 189 return "s3:ObjectCreated:PutLegalHold" 190 case ObjectRemovedAll: 191 return "s3:ObjectRemoved:*" 192 case ObjectRemovedDelete: 193 return "s3:ObjectRemoved:Delete" 194 case ObjectRemovedDeleteMarkerCreated: 195 return "s3:ObjectRemoved:DeleteMarkerCreated" 196 case ObjectRemovedNoOP: 197 return "s3:ObjectRemoved:NoOP" 198 case ObjectRemovedDeleteAllVersions: 199 return "s3:ObjectRemoved:DeleteAllVersions" 200 case ObjectReplicationAll: 201 return "s3:Replication:*" 202 case ObjectReplicationFailed: 203 return "s3:Replication:OperationFailedReplication" 204 case ObjectReplicationComplete: 205 return "s3:Replication:OperationCompletedReplication" 206 case ObjectReplicationNotTracked: 207 return "s3:Replication:OperationNotTracked" 208 case ObjectReplicationMissedThreshold: 209 return "s3:Replication:OperationMissedThreshold" 210 case ObjectReplicationReplicatedAfterThreshold: 211 return "s3:Replication:OperationReplicatedAfterThreshold" 212 case ObjectRestoreAll: 213 return "s3:ObjectRestore:*" 214 case ObjectRestorePost: 215 return "s3:ObjectRestore:Post" 216 case ObjectRestoreCompleted: 217 return "s3:ObjectRestore:Completed" 218 case ObjectTransitionAll: 219 return "s3:ObjectTransition:*" 220 case ObjectTransitionFailed: 221 return "s3:ObjectTransition:Failed" 222 case ObjectTransitionComplete: 223 return "s3:ObjectTransition:Complete" 224 case ObjectManyVersions: 225 return "s3:Scanner:ManyVersions" 226 case PrefixManyFolders: 227 return "s3:Scanner:BigPrefix" 228 } 229 230 return "" 231 } 232 233 // MarshalXML - encodes to XML data. 234 func (name Name) MarshalXML(e *xml.Encoder, start xml.StartElement) error { 235 return e.EncodeElement(name.String(), start) 236 } 237 238 // UnmarshalXML - decodes XML data. 239 func (name *Name) UnmarshalXML(d *xml.Decoder, start xml.StartElement) error { 240 var s string 241 if err := d.DecodeElement(&s, &start); err != nil { 242 return err 243 } 244 245 eventName, err := ParseName(s) 246 if err != nil { 247 return err 248 } 249 250 *name = eventName 251 return nil 252 } 253 254 // MarshalJSON - encodes to JSON data. 255 func (name Name) MarshalJSON() ([]byte, error) { 256 return json.Marshal(name.String()) 257 } 258 259 // UnmarshalJSON - decodes JSON data. 260 func (name *Name) UnmarshalJSON(data []byte) error { 261 var s string 262 if err := json.Unmarshal(data, &s); err != nil { 263 return err 264 } 265 266 eventName, err := ParseName(s) 267 if err != nil { 268 return err 269 } 270 271 *name = eventName 272 return nil 273 } 274 275 // ParseName - parses string to Name. 276 func ParseName(s string) (Name, error) { 277 switch s { 278 case "s3:BucketCreated:*": 279 return BucketCreated, nil 280 case "s3:BucketRemoved:*": 281 return BucketRemoved, nil 282 case "s3:ObjectAccessed:*": 283 return ObjectAccessedAll, nil 284 case "s3:ObjectAccessed:Get": 285 return ObjectAccessedGet, nil 286 case "s3:ObjectAccessed:GetRetention": 287 return ObjectAccessedGetRetention, nil 288 case "s3:ObjectAccessed:GetLegalHold": 289 return ObjectAccessedGetLegalHold, nil 290 case "s3:ObjectAccessed:Head": 291 return ObjectAccessedHead, nil 292 case "s3:ObjectAccessed:Attributes": 293 return ObjectAccessedAttributes, nil 294 case "s3:ObjectCreated:*": 295 return ObjectCreatedAll, nil 296 case "s3:ObjectCreated:CompleteMultipartUpload": 297 return ObjectCreatedCompleteMultipartUpload, nil 298 case "s3:ObjectCreated:Copy": 299 return ObjectCreatedCopy, nil 300 case "s3:ObjectCreated:Post": 301 return ObjectCreatedPost, nil 302 case "s3:ObjectCreated:Put": 303 return ObjectCreatedPut, nil 304 case "s3:ObjectCreated:PutRetention": 305 return ObjectCreatedPutRetention, nil 306 case "s3:ObjectCreated:PutLegalHold": 307 return ObjectCreatedPutLegalHold, nil 308 case "s3:ObjectCreated:PutTagging": 309 return ObjectCreatedPutTagging, nil 310 case "s3:ObjectCreated:DeleteTagging": 311 return ObjectCreatedDeleteTagging, nil 312 case "s3:ObjectRemoved:*": 313 return ObjectRemovedAll, nil 314 case "s3:ObjectRemoved:Delete": 315 return ObjectRemovedDelete, nil 316 case "s3:ObjectRemoved:DeleteMarkerCreated": 317 return ObjectRemovedDeleteMarkerCreated, nil 318 case "s3:ObjectRemoved:NoOP": 319 return ObjectRemovedNoOP, nil 320 case "s3:ObjectRemoved:DeleteAllVersions": 321 return ObjectRemovedDeleteAllVersions, nil 322 case "s3:Replication:*": 323 return ObjectReplicationAll, nil 324 case "s3:Replication:OperationFailedReplication": 325 return ObjectReplicationFailed, nil 326 case "s3:Replication:OperationCompletedReplication": 327 return ObjectReplicationComplete, nil 328 case "s3:Replication:OperationMissedThreshold": 329 return ObjectReplicationMissedThreshold, nil 330 case "s3:Replication:OperationReplicatedAfterThreshold": 331 return ObjectReplicationReplicatedAfterThreshold, nil 332 case "s3:Replication:OperationNotTracked": 333 return ObjectReplicationNotTracked, nil 334 case "s3:ObjectRestore:*": 335 return ObjectRestoreAll, nil 336 case "s3:ObjectRestore:Post": 337 return ObjectRestorePost, nil 338 case "s3:ObjectRestore:Completed": 339 return ObjectRestoreCompleted, nil 340 case "s3:ObjectTransition:Failed": 341 return ObjectTransitionFailed, nil 342 case "s3:ObjectTransition:Complete": 343 return ObjectTransitionComplete, nil 344 case "s3:ObjectTransition:*": 345 return ObjectTransitionAll, nil 346 case "s3:Scanner:ManyVersions": 347 return ObjectManyVersions, nil 348 case "s3:Scanner:BigPrefix": 349 return PrefixManyFolders, nil 350 default: 351 return 0, &ErrInvalidEventName{s} 352 } 353 }