diff --git a/cmd/bucket-handlers.go b/cmd/bucket-handlers.go index 3eb55eccc..37dddff25 100644 --- a/cmd/bucket-handlers.go +++ b/cmd/bucket-handlers.go @@ -538,9 +538,8 @@ func (api objectAPIHandlers) PutBucketHandler(w http.ResponseWriter, r *http.Req return } - if objectLockEnabled { - globalNotificationSys.LoadBucketMetadata(GlobalContext, bucket) - } + // Load updated bucket metadata into memory. + globalNotificationSys.LoadBucketMetadata(GlobalContext, bucket) // Make sure to add Location information here only for bucket w.Header().Set(xhttp.Location, @@ -572,9 +571,8 @@ func (api objectAPIHandlers) PutBucketHandler(w http.ResponseWriter, r *http.Req return } - if objectLockEnabled { - globalNotificationSys.LoadBucketMetadata(GlobalContext, bucket) - } + // Load updated bucket metadata into memory. + globalNotificationSys.LoadBucketMetadata(GlobalContext, bucket) // Make sure to add Location information here only for bucket w.Header().Set(xhttp.Location, path.Clean(r.URL.Path)) // Clean any trailing slashes. diff --git a/cmd/bucket-metadata-sys.go b/cmd/bucket-metadata-sys.go index 71bc746df..cdb438cef 100644 --- a/cmd/bucket-metadata-sys.go +++ b/cmd/bucket-metadata-sys.go @@ -74,6 +74,7 @@ func (sys *BucketMetadataSys) Update(bucket string, configFile string, configDat } if globalIsGateway { + // This code is needed only for gateway implementations. if configFile == bucketPolicyConfig { config, err := policy.ParseConfig(bytes.NewReader(configData), bucket) if err != nil { @@ -97,7 +98,7 @@ func (sys *BucketMetadataSys) Update(bucket string, configFile string, configDat case bucketPolicyConfig: meta.PolicyConfigJSON = configData case bucketNotificationConfig: - meta.NotificationXML = configData + meta.NotificationConfigXML = configData case bucketLifecycleConfig: meta.LifecycleConfigXML = configData case bucketSSEConfig: @@ -105,7 +106,7 @@ func (sys *BucketMetadataSys) Update(bucket string, configFile string, configDat case bucketTaggingConfigFile: meta.TaggingConfigXML = configData case objectLockConfig: - meta.ObjectLockConfigurationXML = configData + meta.ObjectLockConfigXML = configData case bucketQuotaConfigFile: meta.QuotaConfigJSON = configData default: diff --git a/cmd/bucket-metadata.go b/cmd/bucket-metadata.go index 59bf46abe..681ebd2d7 100644 --- a/cmd/bucket-metadata.go +++ b/cmd/bucket-metadata.go @@ -46,7 +46,7 @@ const ( ) var ( - defaultBucketObjectLockConfig = []byte(`Enabled`) + enabledBucketObjectLockConfig = []byte(`Enabled`) ) //go:generate msgp -file $GOFILE @@ -57,16 +57,16 @@ var ( // bucketMetadataFormat refers to the format. // bucketMetadataVersion can be used to track a rolling upgrade of a field. type BucketMetadata struct { - Name string - Created time.Time - LockEnabled bool // legacy not used anymore. - PolicyConfigJSON []byte - NotificationXML []byte - LifecycleConfigXML []byte - ObjectLockConfigurationXML []byte - EncryptionConfigXML []byte - TaggingConfigXML []byte - QuotaConfigJSON []byte + Name string + Created time.Time + LockEnabled bool // legacy not used anymore. + PolicyConfigJSON []byte + NotificationConfigXML []byte + LifecycleConfigXML []byte + ObjectLockConfigXML []byte + EncryptionConfigXML []byte + TaggingConfigXML []byte + QuotaConfigJSON []byte // Unexported fields. Must be updated atomically. policyConfig *policy.Policy @@ -83,6 +83,10 @@ func newBucketMetadata(name string) BucketMetadata { return BucketMetadata{ Name: name, Created: UTCNow(), + notificationConfig: &event.Config{ + XMLNS: "http://s3.amazonaws.com/doc/2006-03-01/", + }, + quotaConfig: &madmin.BucketQuota{}, } } @@ -142,15 +146,10 @@ func (b *BucketMetadata) parseAllConfigs(ctx context.Context, objectAPI ObjectLa b.policyConfig = nil } - if len(b.NotificationXML) != 0 { - if err = xml.Unmarshal(b.NotificationXML, b.notificationConfig); err != nil { + if len(b.NotificationConfigXML) != 0 { + if err = xml.Unmarshal(b.NotificationConfigXML, b.notificationConfig); err != nil { return err } - } else { - b.notificationConfig = &event.Config{ - XMLNS: "http://s3.amazonaws.com/doc/2006-03-01/", - } - b.notificationConfig.SetRegion(globalServerRegion) } if len(b.LifecycleConfigXML) != 0 { @@ -180,23 +179,22 @@ func (b *BucketMetadata) parseAllConfigs(ctx context.Context, objectAPI ObjectLa b.taggingConfig = nil } - if len(b.ObjectLockConfigurationXML) != 0 { - b.objectLockConfig, err = objectlock.ParseObjectLockConfig(bytes.NewReader(b.ObjectLockConfigurationXML)) + if len(b.ObjectLockConfigXML) != 0 { + b.objectLockConfig, err = objectlock.ParseObjectLockConfig(bytes.NewReader(b.ObjectLockConfigXML)) if err != nil { return err } } else { b.objectLockConfig = nil } + if len(b.QuotaConfigJSON) != 0 { - qcfg, err := parseBucketQuota(b.Name, b.QuotaConfigJSON) + b.quotaConfig, err = parseBucketQuota(b.Name, b.QuotaConfigJSON) if err != nil { return err } - b.quotaConfig = qcfg - } else { - b.quotaConfig = &madmin.BucketQuota{} } + return nil } @@ -216,9 +214,9 @@ func (b *BucketMetadata) convertLegacyConfigs(ctx context.Context, objectAPI Obj // Handle migration from lockEnabled to newer format. if b.LockEnabled { - configs[objectLockConfig] = defaultBucketObjectLockConfig + configs[objectLockConfig] = enabledBucketObjectLockConfig b.LockEnabled = false // legacy value unset it - // we are only interested in b.ObjectLockConfigurationXML or objectLockConfig value + // we are only interested in b.ObjectLockConfigXML or objectLockConfig value } for _, legacyFile := range legacyConfigs { @@ -245,14 +243,14 @@ func (b *BucketMetadata) convertLegacyConfigs(ctx context.Context, objectAPI Obj switch legacyFile { case legacyBucketObjectLockEnabledConfigFile: if string(configData) == legacyBucketObjectLockEnabledConfig { - b.ObjectLockConfigurationXML = defaultBucketObjectLockConfig + b.ObjectLockConfigXML = enabledBucketObjectLockConfig b.LockEnabled = false // legacy value unset it - // we are only interested in b.ObjectLockConfigurationXML + // we are only interested in b.ObjectLockConfigXML } case bucketPolicyConfig: b.PolicyConfigJSON = configData case bucketNotificationConfig: - b.NotificationXML = configData + b.NotificationConfigXML = configData case bucketLifecycleConfig: b.LifecycleConfigXML = configData case bucketSSEConfig: @@ -260,7 +258,7 @@ func (b *BucketMetadata) convertLegacyConfigs(ctx context.Context, objectAPI Obj case bucketTaggingConfigFile: b.TaggingConfigXML = configData case objectLockConfig: - b.ObjectLockConfigurationXML = configData + b.ObjectLockConfigXML = configData case bucketQuotaConfigFile: b.QuotaConfigJSON = configData } diff --git a/cmd/bucket-metadata_gen.go b/cmd/bucket-metadata_gen.go index 89fcaf946..5ec12ebdc 100644 --- a/cmd/bucket-metadata_gen.go +++ b/cmd/bucket-metadata_gen.go @@ -48,10 +48,10 @@ func (z *BucketMetadata) DecodeMsg(dc *msgp.Reader) (err error) { err = msgp.WrapError(err, "PolicyConfigJSON") return } - case "NotificationXML": - z.NotificationXML, err = dc.ReadBytes(z.NotificationXML) + case "NotificationConfigXML": + z.NotificationConfigXML, err = dc.ReadBytes(z.NotificationConfigXML) if err != nil { - err = msgp.WrapError(err, "NotificationXML") + err = msgp.WrapError(err, "NotificationConfigXML") return } case "LifecycleConfigXML": @@ -60,10 +60,10 @@ func (z *BucketMetadata) DecodeMsg(dc *msgp.Reader) (err error) { err = msgp.WrapError(err, "LifecycleConfigXML") return } - case "ObjectLockConfigurationXML": - z.ObjectLockConfigurationXML, err = dc.ReadBytes(z.ObjectLockConfigurationXML) + case "ObjectLockConfigXML": + z.ObjectLockConfigXML, err = dc.ReadBytes(z.ObjectLockConfigXML) if err != nil { - err = msgp.WrapError(err, "ObjectLockConfigurationXML") + err = msgp.WrapError(err, "ObjectLockConfigXML") return } case "EncryptionConfigXML": @@ -138,14 +138,14 @@ func (z *BucketMetadata) EncodeMsg(en *msgp.Writer) (err error) { err = msgp.WrapError(err, "PolicyConfigJSON") return } - // write "NotificationXML" - err = en.Append(0xaf, 0x4e, 0x6f, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x58, 0x4d, 0x4c) + // write "NotificationConfigXML" + err = en.Append(0xb5, 0x4e, 0x6f, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x58, 0x4d, 0x4c) if err != nil { return } - err = en.WriteBytes(z.NotificationXML) + err = en.WriteBytes(z.NotificationConfigXML) if err != nil { - err = msgp.WrapError(err, "NotificationXML") + err = msgp.WrapError(err, "NotificationConfigXML") return } // write "LifecycleConfigXML" @@ -158,14 +158,14 @@ func (z *BucketMetadata) EncodeMsg(en *msgp.Writer) (err error) { err = msgp.WrapError(err, "LifecycleConfigXML") return } - // write "ObjectLockConfigurationXML" - err = en.Append(0xba, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x4c, 0x6f, 0x63, 0x6b, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x58, 0x4d, 0x4c) + // write "ObjectLockConfigXML" + err = en.Append(0xb3, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x4c, 0x6f, 0x63, 0x6b, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x58, 0x4d, 0x4c) if err != nil { return } - err = en.WriteBytes(z.ObjectLockConfigurationXML) + err = en.WriteBytes(z.ObjectLockConfigXML) if err != nil { - err = msgp.WrapError(err, "ObjectLockConfigurationXML") + err = msgp.WrapError(err, "ObjectLockConfigXML") return } // write "EncryptionConfigXML" @@ -217,15 +217,15 @@ func (z *BucketMetadata) MarshalMsg(b []byte) (o []byte, err error) { // string "PolicyConfigJSON" o = append(o, 0xb0, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x4a, 0x53, 0x4f, 0x4e) o = msgp.AppendBytes(o, z.PolicyConfigJSON) - // string "NotificationXML" - o = append(o, 0xaf, 0x4e, 0x6f, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x58, 0x4d, 0x4c) - o = msgp.AppendBytes(o, z.NotificationXML) + // string "NotificationConfigXML" + o = append(o, 0xb5, 0x4e, 0x6f, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x58, 0x4d, 0x4c) + o = msgp.AppendBytes(o, z.NotificationConfigXML) // string "LifecycleConfigXML" o = append(o, 0xb2, 0x4c, 0x69, 0x66, 0x65, 0x63, 0x79, 0x63, 0x6c, 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x58, 0x4d, 0x4c) o = msgp.AppendBytes(o, z.LifecycleConfigXML) - // string "ObjectLockConfigurationXML" - o = append(o, 0xba, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x4c, 0x6f, 0x63, 0x6b, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x58, 0x4d, 0x4c) - o = msgp.AppendBytes(o, z.ObjectLockConfigurationXML) + // string "ObjectLockConfigXML" + o = append(o, 0xb3, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x4c, 0x6f, 0x63, 0x6b, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x58, 0x4d, 0x4c) + o = msgp.AppendBytes(o, z.ObjectLockConfigXML) // string "EncryptionConfigXML" o = append(o, 0xb3, 0x45, 0x6e, 0x63, 0x72, 0x79, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x58, 0x4d, 0x4c) o = msgp.AppendBytes(o, z.EncryptionConfigXML) @@ -280,10 +280,10 @@ func (z *BucketMetadata) UnmarshalMsg(bts []byte) (o []byte, err error) { err = msgp.WrapError(err, "PolicyConfigJSON") return } - case "NotificationXML": - z.NotificationXML, bts, err = msgp.ReadBytesBytes(bts, z.NotificationXML) + case "NotificationConfigXML": + z.NotificationConfigXML, bts, err = msgp.ReadBytesBytes(bts, z.NotificationConfigXML) if err != nil { - err = msgp.WrapError(err, "NotificationXML") + err = msgp.WrapError(err, "NotificationConfigXML") return } case "LifecycleConfigXML": @@ -292,10 +292,10 @@ func (z *BucketMetadata) UnmarshalMsg(bts []byte) (o []byte, err error) { err = msgp.WrapError(err, "LifecycleConfigXML") return } - case "ObjectLockConfigurationXML": - z.ObjectLockConfigurationXML, bts, err = msgp.ReadBytesBytes(bts, z.ObjectLockConfigurationXML) + case "ObjectLockConfigXML": + z.ObjectLockConfigXML, bts, err = msgp.ReadBytesBytes(bts, z.ObjectLockConfigXML) if err != nil { - err = msgp.WrapError(err, "ObjectLockConfigurationXML") + err = msgp.WrapError(err, "ObjectLockConfigXML") return } case "EncryptionConfigXML": @@ -330,6 +330,6 @@ func (z *BucketMetadata) UnmarshalMsg(bts []byte) (o []byte, err error) { // Msgsize returns an upper bound estimate of the number of bytes occupied by the serialized message func (z *BucketMetadata) Msgsize() (s int) { - s = 1 + 5 + msgp.StringPrefixSize + len(z.Name) + 8 + msgp.TimeSize + 12 + msgp.BoolSize + 17 + msgp.BytesPrefixSize + len(z.PolicyConfigJSON) + 16 + msgp.BytesPrefixSize + len(z.NotificationXML) + 19 + msgp.BytesPrefixSize + len(z.LifecycleConfigXML) + 27 + msgp.BytesPrefixSize + len(z.ObjectLockConfigurationXML) + 20 + msgp.BytesPrefixSize + len(z.EncryptionConfigXML) + 17 + msgp.BytesPrefixSize + len(z.TaggingConfigXML) + 16 + msgp.BytesPrefixSize + len(z.QuotaConfigJSON) + s = 1 + 5 + msgp.StringPrefixSize + len(z.Name) + 8 + msgp.TimeSize + 12 + msgp.BoolSize + 17 + msgp.BytesPrefixSize + len(z.PolicyConfigJSON) + 22 + msgp.BytesPrefixSize + len(z.NotificationConfigXML) + 19 + msgp.BytesPrefixSize + len(z.LifecycleConfigXML) + 20 + msgp.BytesPrefixSize + len(z.ObjectLockConfigXML) + 20 + msgp.BytesPrefixSize + len(z.EncryptionConfigXML) + 17 + msgp.BytesPrefixSize + len(z.TaggingConfigXML) + 16 + msgp.BytesPrefixSize + len(z.QuotaConfigJSON) return } diff --git a/cmd/bucket-notification-handlers.go b/cmd/bucket-notification-handlers.go index c602d8f41..36367d32b 100644 --- a/cmd/bucket-notification-handlers.go +++ b/cmd/bucket-notification-handlers.go @@ -74,6 +74,7 @@ func (api objectAPIHandlers) GetBucketNotificationHandler(w http.ResponseWriter, writeErrorResponse(ctx, w, toAPIError(ctx, err), r.URL, guessIsBrowserReq(r)) return } + config.SetRegion(globalServerRegion) if err = config.Validate(globalServerRegion, globalNotificationSys.targetList); err != nil { arnErr, ok := err.(*event.ErrARNNotFound) if ok { diff --git a/cmd/notification.go b/cmd/notification.go index a86609cdc..e1e0b29ea 100644 --- a/cmd/notification.go +++ b/cmd/notification.go @@ -616,6 +616,7 @@ func (sys *NotificationSys) load(buckets []BucketInfo, objAPI ObjectLayer) error if err != nil { return err } + config.SetRegion(globalServerRegion) if err = config.Validate(globalServerRegion, globalNotificationSys.targetList); err != nil { if _, ok := err.(*event.ErrARNNotFound); !ok { logger.LogIf(ctx, err) diff --git a/cmd/xl-zones.go b/cmd/xl-zones.go index 51231ed14..c8a794544 100644 --- a/cmd/xl-zones.go +++ b/cmd/xl-zones.go @@ -325,7 +325,7 @@ func (z *xlZones) MakeBucketWithLocation(ctx context.Context, bucket, location s // If it doesn't exist we get a new, so ignore errors meta := newBucketMetadata(bucket) if lockEnabled { - meta.ObjectLockConfigurationXML = defaultBucketObjectLockConfig + meta.ObjectLockConfigXML = enabledBucketObjectLockConfig } if err := meta.Save(ctx, z); err != nil { return toObjectErr(err, bucket) @@ -355,7 +355,7 @@ func (z *xlZones) MakeBucketWithLocation(ctx context.Context, bucket, location s // If it doesn't exist we get a new, so ignore errors meta := newBucketMetadata(bucket) if lockEnabled { - meta.ObjectLockConfigurationXML = defaultBucketObjectLockConfig + meta.ObjectLockConfigXML = enabledBucketObjectLockConfig } if err := meta.Save(ctx, z); err != nil { return toObjectErr(err, bucket)