diff --git a/objectnode/acl.go b/objectnode/acl.go index d454d3092..2a87137f1 100644 --- a/objectnode/acl.go +++ b/objectnode/acl.go @@ -44,9 +44,8 @@ var ( ) type Grantee struct { - Xmlxsi string `xml:"xmlns:xsi,attr" json:"xmlns,omitempty"` - Xmlns string `xml:"xsi,attr" json:"xsi,omitempty"` - XsiType string `xml:"xsi:type,attr" json:"xsi_type,omitempty"` + Xmlxsi string `xml:"xmlns:xsi,attr" json:"-"` + XsiType string `xml:"xsi:type,attr" json:"-"` Type string `xml:"type,attr" json:"t"` Id string `xml:"ID,omitempty" json:"i,omitempty"` URI string `xml:"URI,omitempty" json:"u,omitempty"` @@ -68,7 +67,7 @@ type Owner struct { } type AccessControlPolicy struct { - Xmlns string `xml:"xmlns,attr" json:"x,omitempty"` + Xmlns string `xml:"xmlns,attr" json:"-"` Owner Owner `xml:"Owner,omitempty" json:"o,omitempty"` Acl AccessControlList `xml:"AccessControlList,omitempty" json:"a,omitempty"` } @@ -186,7 +185,6 @@ func (acp *AccessControlPolicy) AddGrant(idUri, granteeType, permission string) default: return } - g.Grantee.Xmlns = XMLNS g.Permission = permission acp.Acl.Grants = append(acp.Acl.Grants, g) } @@ -218,15 +216,12 @@ func (acp *AccessControlPolicy) SetAuthenticatedRead(ownerId string) { func (acp *AccessControlPolicy) XmlMarshal() ([]byte, error) { var grants []Grant for _, g := range acp.Acl.Grants { - if g.Grantee.Xmlns == "" { - g.Grantee.Xmlns = XMLNS - } - g.Grantee.Xmlxsi = g.Grantee.Xmlns + g.Grantee.Xmlxsi = XMLSI g.Grantee.XsiType = g.Grantee.Type grants = append(grants, g) } acp.Acl.Grants = grants - acp.Xmlns = "http://s3.amazonaws.com/doc/2006-03-01/" + acp.Xmlns = XMLNS data, err := xml.Marshal(acp) if err != nil { return nil, err @@ -234,20 +229,7 @@ func (acp *AccessControlPolicy) XmlMarshal() ([]byte, error) { return append([]byte(xml.Header), data...), nil } -func (acp *AccessControlPolicy) RemoveAttr() { - var grants []Grant - for _, g := range acp.Acl.Grants { - g.Grantee.Xmlxsi = "" - g.Grantee.XsiType = "" - g.Grantee.Xmlns = "" - grants = append(grants, g) - } - acp.Xmlns = "" - acp.Acl.Grants = grants -} - func (acp *AccessControlPolicy) Encode() string { - acp.RemoveAttr() data, err := json.Marshal(acp) if err != nil { log.LogWarnf("acl json marshal failed: %v", err) diff --git a/objectnode/acl_api.go b/objectnode/acl_api.go index 64cffa79e..801e4033f 100644 --- a/objectnode/acl_api.go +++ b/objectnode/acl_api.go @@ -176,7 +176,6 @@ func addGrants(acl *AccessControlPolicy, grants []grant, permission string) { } func putBucketACL(vol *Volume, acp *AccessControlPolicy) error { - acp.RemoveAttr() data, err := json.Marshal(acp) if err != nil { return err @@ -192,7 +191,9 @@ func getObjectACL(vol *Volume, path string, needDefault bool) (*AccessControlPol var acp *AccessControlPolicy data := xAttr.Get(XAttrKeyOSSACL) if len(data) > 0 { - err = json.Unmarshal(data, &acp) + if err = json.Unmarshal(data, &acp); err != nil { + err = xml.Unmarshal(data, &acp) + } } else if needDefault { acp = CreateDefaultACL(vol.owner) } @@ -200,7 +201,6 @@ func getObjectACL(vol *Volume, path string, needDefault bool) (*AccessControlPol } func putObjectACL(vol *Volume, path string, acp *AccessControlPolicy) error { - acp.RemoveAttr() data, err := json.Marshal(acp) if err != nil { return err diff --git a/objectnode/acl_enum.go b/objectnode/acl_enum.go index f59830ff5..05b11e105 100644 --- a/objectnode/acl_enum.go +++ b/objectnode/acl_enum.go @@ -48,7 +48,8 @@ const ( ) const ( - XMLNS = "http://www.w3.org/2001/XMLSchema-instance" + XMLNS = "http://s3.amazonaws.com/doc/2006-03-01/" + XMLSI = "http://www.w3.org/2001/XMLSchema-instance" GroupAllUser = "http://acs.amazonaws.com/groups/global/AllUsers" GroupAuthenticated = "http://acs.amazonaws.com/groups/global/AuthenticatedUsers" ) diff --git a/objectnode/acl_test.go b/objectnode/acl_test.go index 12b1eac94..d88e51523 100644 --- a/objectnode/acl_test.go +++ b/objectnode/acl_test.go @@ -58,14 +58,12 @@ func TestAccessControlPolicyXml(t *testing.T) { require.Equal(t, "CanonicalUser", result.Acl.Grants[0].Grantee.Type) require.Equal(t, "", result.Acl.Grants[0].Grantee.URI) require.Equal(t, "display-id1-name", result.Acl.Grants[0].Grantee.DisplayName) - require.Equal(t, "http://www.w3.org/2001/XMLSchema-instance", result.Acl.Grants[0].Grantee.Xmlns) require.Equal(t, "READ", result.Acl.Grants[1].Permission) require.Equal(t, "", result.Acl.Grants[1].Grantee.Id) require.Equal(t, "Group", result.Acl.Grants[1].Grantee.Type) require.Equal(t, "http://acs.amazonaws.com/groups/global/AllUsers", result.Acl.Grants[1].Grantee.URI) require.Equal(t, "", result.Acl.Grants[1].Grantee.DisplayName) - require.Equal(t, "http://www.w3.org/2001/XMLSchema-instance", result.Acl.Grants[1].Grantee.Xmlns) } func TestAccessControlPolicyXml_NoGrantIDAndURI(t *testing.T) { @@ -244,7 +242,6 @@ func TestSetPrivate(t *testing.T) { require.Equal(t, "", acp.Acl.Grants[0].Grantee.URI) require.Equal(t, "", acp.Acl.Grants[0].Grantee.DisplayName) require.Equal(t, "CanonicalUser", acp.Acl.Grants[0].Grantee.Type) - require.Equal(t, "http://www.w3.org/2001/XMLSchema-instance", acp.Acl.Grants[0].Grantee.Xmlns) } func TestSetPublicRead(t *testing.T) { @@ -257,14 +254,12 @@ func TestSetPublicRead(t *testing.T) { require.Equal(t, "", acp.Acl.Grants[0].Grantee.URI) require.Equal(t, "", acp.Acl.Grants[0].Grantee.DisplayName) require.Equal(t, "CanonicalUser", acp.Acl.Grants[0].Grantee.Type) - require.Equal(t, "http://www.w3.org/2001/XMLSchema-instance", acp.Acl.Grants[0].Grantee.Xmlns) require.Equal(t, "READ", acp.Acl.Grants[1].Permission) require.Equal(t, "", acp.Acl.Grants[1].Grantee.Id) require.Equal(t, "http://acs.amazonaws.com/groups/global/AllUsers", acp.Acl.Grants[1].Grantee.URI) require.Equal(t, "", acp.Acl.Grants[1].Grantee.DisplayName) require.Equal(t, "Group", acp.Acl.Grants[1].Grantee.Type) - require.Equal(t, "http://www.w3.org/2001/XMLSchema-instance", acp.Acl.Grants[1].Grantee.Xmlns) } func TestSetPublicReadWrite(t *testing.T) { @@ -277,21 +272,18 @@ func TestSetPublicReadWrite(t *testing.T) { require.Equal(t, "", acp.Acl.Grants[0].Grantee.URI) require.Equal(t, "", acp.Acl.Grants[0].Grantee.DisplayName) require.Equal(t, "CanonicalUser", acp.Acl.Grants[0].Grantee.Type) - require.Equal(t, "http://www.w3.org/2001/XMLSchema-instance", acp.Acl.Grants[0].Grantee.Xmlns) require.Equal(t, "READ", acp.Acl.Grants[1].Permission) require.Equal(t, "", acp.Acl.Grants[1].Grantee.Id) require.Equal(t, "http://acs.amazonaws.com/groups/global/AllUsers", acp.Acl.Grants[1].Grantee.URI) require.Equal(t, "", acp.Acl.Grants[1].Grantee.DisplayName) require.Equal(t, "Group", acp.Acl.Grants[1].Grantee.Type) - require.Equal(t, "http://www.w3.org/2001/XMLSchema-instance", acp.Acl.Grants[1].Grantee.Xmlns) require.Equal(t, "WRITE", acp.Acl.Grants[2].Permission) require.Equal(t, "", acp.Acl.Grants[2].Grantee.Id) require.Equal(t, "http://acs.amazonaws.com/groups/global/AllUsers", acp.Acl.Grants[2].Grantee.URI) require.Equal(t, "", acp.Acl.Grants[2].Grantee.DisplayName) require.Equal(t, "Group", acp.Acl.Grants[2].Grantee.Type) - require.Equal(t, "http://www.w3.org/2001/XMLSchema-instance", acp.Acl.Grants[2].Grantee.Xmlns) } func TestSetAuthenticatedRead(t *testing.T) { @@ -304,14 +296,12 @@ func TestSetAuthenticatedRead(t *testing.T) { require.Equal(t, "", acp.Acl.Grants[0].Grantee.URI) require.Equal(t, "", acp.Acl.Grants[0].Grantee.DisplayName) require.Equal(t, "CanonicalUser", acp.Acl.Grants[0].Grantee.Type) - require.Equal(t, "http://www.w3.org/2001/XMLSchema-instance", acp.Acl.Grants[0].Grantee.Xmlns) require.Equal(t, "READ", acp.Acl.Grants[1].Permission) require.Equal(t, "", acp.Acl.Grants[1].Grantee.Id) require.Equal(t, "http://acs.amazonaws.com/groups/global/AuthenticatedUsers", acp.Acl.Grants[1].Grantee.URI) require.Equal(t, "", acp.Acl.Grants[1].Grantee.DisplayName) require.Equal(t, "Group", acp.Acl.Grants[1].Grantee.Type) - require.Equal(t, "http://www.w3.org/2001/XMLSchema-instance", acp.Acl.Grants[1].Grantee.Xmlns) } func TestAccessControlPolicy_FULL_CONTROL(t *testing.T) { diff --git a/objectnode/fs_volume.go b/objectnode/fs_volume.go index c2e174914..ed9248dc2 100644 --- a/objectnode/fs_volume.go +++ b/objectnode/fs_volume.go @@ -233,6 +233,7 @@ func (v *Volume) loadBucketACL() (acp *AccessControlPolicy, err error) { } acp = &AccessControlPolicy{} if err = json.Unmarshal(raw, acp); err != nil { + err = xml.Unmarshal(raw, acp) return } return