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  }